在Arduino上使用传感器:创建一个可以检测运动并作出响应的简单设备

超声波传感器是一种简洁的多功能传感器,可以应用到您的Arduino项目中。顾名思义,它利用超声波来检测出现的物体以及物体的距离。这种设备可用于动作识别,或者在检测范围内出现目标对象时作出响应。

当然,您也许会想知道的是Arduino超声波传感器究竟是如何工作的?
为了描述它的工作原理,本指南将向您展示如何使用超声波传感器来组装一个简单的乐器。
<h3超声波传感器的工作原理 我们今天要了解的超声波传感器是HC-SR05, 它是旧版HC-SR04的5引脚升级版本。该设备具有两个圆柱形模块。一个是发出超声波信号的发射器,另一个是接收器,会捕获到达物体后反弹回来的信号。通过测量信号返回的时间,传感器可以计算出物体的距离。
虽然其他传感器(如被动红外线运动传感器)也具有类似的功能,但是超声波传感器的功用更强,因为它使您的项目不仅可以检测到面前经过的物体,还可以区分出不同物体的距离远近。
我们使用这种技术来创建一个浮动的乐器。该项目不是通过按下钢琴键来弹奏音符,而是让您把一个物体—比如一根棍子或者您的手指—放在传感器前面,根据物体与传感器之间的距离来播放不同的音符。这并不能打造出钢琴的效果,但是通过创建该项目,您可以了解能用这款便利的Arduino声音传感器来做什么。

所需组件

为了创建该项目,您需要具备以下组件:

Arduino Uno
HC-SR05 超声波传感器 (可以使用HC-SR04或其他超声波传感器,但需要修改引脚配置)
Arduino IDE

您还需要使用以下硬件,都是比较通用的设备:
扬声器: 大多数简单的扬声器模块都可以,本项目使用的是该款简单的单声道扬声器
USB 电缆 如果您还没有设置Arduino IDE,可以先查阅我们之前发布的指南

代码

首先,我们先来看一下要上传到Arduino Uno的代码,了解将要执行的操作。
void setup() {
pinMode (6,OUTPUT); //Insert HC-SR-05 with VCC in pin 6
pinMode (5, INPUT); // Assign pin 5 to Echo
pinMode (4, OUTPUT);// Assign pin 4 to Trig
pinMode (2,OUTPUT); // Assign pin 2 to GND.
Serial.begin(9600); // This will allow you to read how far away your sensor is later
}
void loop()
{
long duration, cm; // Initialize variables for duration and cm
digitalWrite(6, HIGH); // Power the sensor
digitalWrite(4, LOW); // Clear pulse before sending a 10 microsecond ping,
delayMicroseconds(2);
digitalWrite(4, HIGH);
delayMicroseconds(10);
digitalWrite(4, LOW);
duration = pulseIn(5, HIGH); // Detect pulse length from the Echo pin, measured in microseconds
cm = (duration/2)/29.155; // Divide duration in half (due to round trip), then convert distance to centimeters (1cm per 29.155 microseconds), assign to cm variable
Serial.print(cm); // Print distance in cm to serial monitor
Serial.print(“cm”);
Serial.println();
delay(100); // Delay
int note = 0; // Assign note based on distance, spacing notes per 6cm
if(cm<=48&&cm>42) {
note = 523;
} else if(cm<=42&&cm>36) {
note = 493;
} else if(cm<=36&&cm>30) {
note = 440;
} else if(cm<=30&&cm>24) {
note = 392;
} else if(cm<=24&&cm>18) {
note = 349;
} else if(cm<=18&&cm>12) {
note = 329;
} else if(cm<=12&&cm>6) {
note = 294;
} else if(cm<=6) {
note = 261;
}
if (note == 0) { // If distance isn’t within 48cm, play nothing noTone(9);
} else {
tone(9, note, 200); // Play assigned note for 200 milliseconds
}
delay(10); // Brief pause
}
您可以将上述代码复制到您的IDE中,将其上传到Uno,如果您想运行该代码,可以继续进行下一部分,但是这部分的代码很重要,有必要对其进行分析和理解。首先:
digitalWrite(6, HIGH); // Power the sensor
digitalWrite(4, LOW); // Clear pulse before sending a 10 microsecond ping,
delayMicroseconds(2);
digitalWrite(4, HIGH);
delayMicroseconds(10);
digitalWrite(4, LOW);
duration = pulseIn(5, HIGH); // Detect pulse length from the Echo pin, measured in microseconds
cm = (duration/2)/29.155; // Divide duration in half (due to round trip), then convert distance to centimeters (1cm per 29.155 microseconds), assign to cm variable
这部分的操作是在Trig引脚上发出40KHz脉冲。这种超声波信号会在它接触的所有物体上发生反射,然后返回到接收器。
接下来,pulseIn() 函数测量从脉冲离开传感器到接收器检测到返回信号所用的时间,单位为微秒。
然后将该时间除以2,因为这是信号往返花费的总时间。这为我们提供了40KHz声音传播到物体所需的微秒数。由于声音传播1厘米大约需要29.155微秒,所以我们可以将计算出的时间除以29.155。以此我们就可以计算出目标对象的距离,单位为厘米,然后将该距离值分配给cm变量。
接下来的几行代码会将距离(以厘米为单位)打印到串行监视器,这有助于确认代码运行正常,并便于我们在运行程序时查看物体的距离。
代码的最后主要相关部分是这样的:
int note = 0; // Assign note based on distance, spacing notes per 6cm
if(cm<=48&&cm>42) {
note = 523;
} else if(cm<=42&&cm>36) {
note = 493;
} else if(cm<=36&&cm>30) {
note = 440;
} else if(cm<=30&&cm>24) {
note = 392;
} else if(cm<=24&&cm>18) {
note = 349;
} else if(cm<=18&&cm>12) {
note = 329;
} else if(cm<=12&&cm>6) {
note = 294;
} else if(cm<=6) { note = 261;
}
if (note == 0) { // If distance isn’t within 48cm, play nothing noTone(9);
} else {
tone(9, note, 200); // Play assigned note for 200 milliseconds
}
该代码块将根据物体的距离为扬声器分配一个频率。 此Arduino参考文档 列出了一系列音符的频率,我们将以此作为参考。 使用 if else 语句 来根据目标对象的距离(以6cm为增量)为音符变量分配一个频率,可在整个八度音阶范围内提供八个音符。如果没有检测到任何物体,音符变量值为0。
在最后一部分中,tone() 函数 用来播放音符,如果48cm内没有检测到物体,noTone()函数 将会停止前一个声音的播放。在开始循环之前的最后一个指令是delay()。这些延迟有助于避免程序更改音符过快,因为传感器的精确度没有那么高。

接线

了解了代码如何运行之后,您就可以将其上传到Arduino Uno上了,然后拔掉设备。现在,是时候将它们连接起来了。我们已经完成了代码的编写以尽可能简化该过程。您所要做的就是按照以下步骤进行操作:
● 将HC-SR05传感器插入数字引脚2到6,GND插入引脚2,VCC插入引脚6。这样连接可以使传感器朝向外侧,远离Arduino。
● 将扬声器上的正极线(通常为红色)插入引脚9。
● 将另一根扬声器线(通常为黑色)插入其中一个GND引脚。 连接好所有电线好,插入Arduino,并在传感器前留出大约50厘米的空间。接下来是最有趣的部分。将您的手或者一根小棍子放在传感器前面,您会听到扬声器发出的声音。物体放置的越远,音调越高。
您可以尝试使用delay()tone()所带来的持续时间使声音听起来更平滑,或调整频率值以获得不同的音符。该传感器还可以用作报警器,以在物体进入一定范围内的区域时发出警报,或者当您的手处于某一距离范围内时向您的计算机发送指令。

DevicePlus 编辑团队
DevicePlus 编辑团队
设备升级版适用于所有热爱电子和机电一体化的人。

Related post

  1. Arduino探索漫游车2—电子设备与布线

  2. car sensors

    汽车驻车辅助传感器的制造工艺

  3. arduino home security system

    采用ROHM传感器套件的DIY Arduino家庭安防系统 第2部分- Cayenne设置

  4. arduino rfid door lock

    自制Arduino RFID门锁—第二部分:用智能手机解锁

  5. PIR1

    如何构建动态感应灯

  6. 制作Arduino LED节日彩灯

  7. gui in matlab

    数字信号处理第4部分—在MATLAB中创建GUI

  8. DIY electric skateboard

    基于Arduino的DIY电动滑板

  9. 使用Arduino驱动LCD的DIY指南

TECH INFO

基础知识

  • SiC功率元器件
  • Si功率元器件
  • 热设计
  • 仿真
  • 开关噪声-EMC
  • AC/DC
  • DC/DC
  • 电机
  • 传递函数

工程技巧


PICK UP!

  1. “第三代 行驶中无线供电轮毂电机”开发成功:超小型SiC模块 助力实现无需担心充电的EV
  2. 以纳米级输出电容实现稳定控制的Nano Cap™技术:无需输出电容器的线性稳压器
  3. 模块配置
  4. arduino explorer rover
  5. 作为车载用二次电源而开发的同步整流降压型DC/DC转换器 : 车载设备中二次电源的优点
  6. 刘铭
  7. ROHM开发出业界先进的第4代低导通电阻SiC MOSFET:支持xEV/EV主机逆变器和电池提高电压
PAGE TOP