序
好久没有更新关于Arduino方面的文章了,其实前几天一直在做,不过实现的功能都比较单一,也没有什么新奇的想法。也由于没钱的原因,来来去去也就只能围着一个小灯棒转,红外遥控、蓝牙远程控制、人体红外感应、红外避障传感,各种各样的去驱动点亮小灯棒。不过比较之后,除了蓝牙和红外,超声波测距模块是最为理想的传感方式了。
人体红外感应模块虽然最符合人来即亮,人走即灭的理念,但是灵敏度真的是太低,听说有算法解决的算法,但是最后也没有琢磨出来。最后几天将红外避障模块用做感应器,效果还是相当不错的,特别是灵敏度,红外以光的速度传播,丝毫没有延迟。美中不足的是,红外避障模块的最大感应距离上限40cm不到,而且线性的红外光在经过一些小空隙,比如说手指间的时候,也会触发低电平信息,导致灯熄灭。
而超声波测距模块就克服了两者的不足,此模块最大感应距离可以达到3m左右,并且超声波发出也有一个音波的广角,实验效果还是比较理想的。
下面是制作一个超声波测距模块为感应器,继电器为动作执行器的感应LED灯棒。实现的功能为:当30cm内有物体时,给继电器发送一个高电平,并持续3秒,3秒后如果物体依然存在在30cm范围内,继续输出高电平,反之则输出一个低电平,由此来控制继电器的通断。
模块原理

通过模块说明文档可知,给Arduino板的数字接口接上超声波测距传感器后,程序开始Trig口会想模块发送一个10μs长的高电平信号,此时模块开始工作,发射器发出8个40KHz的超声波脉冲,同时内部计时器开始运行。当超声波脉冲遇到障碍物后立即返回,接收器接收到返回脉冲的同时会从Echo口向Arduino发送一个持续高电平,高电平持续的时间即为超声波从发射到被接收的时间。然后再通过声速与时间的关系,从而测出被测物体与模块的距离。
我给程序添加了一个输出的串口,这个串口能实时输出障碍物距离,通过距离的测定,规定如果障碍物与模块距离小于30cm,则触发数字引脚4输出一个高电平,并持续3s。而引脚4我连接了一个继电器,使用继电器的通断来实现LED灯管的点亮与熄灭。
材料准备
- Arduino UNO 开发板。
- Arduino IDE 1.81。
- 超声波测距模块。
- 面包线、面包板。
- LED灯管。
线路连接
继电器我使用了外接电源供电,只将信号端口插在Arduino上:
继电器针脚:
DC+ -> 5V
DC- -> GND
IN -> 4
使用高电平触发。
超声波测距模块:
VCC -> 5V
GND -> GND
Trig -> 2
Echo -> 3
效果演示
http://player.youku.com/player.php/sid/XMjY1ODczNzk3Mg==
源代码
const int TrigPin = 2;
const int EchoPin = 3;
const int jdqPin = 4;
float distance;
void setup()
{ // 初始化串口通信
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(jdqPin, OUTPUT);
pinMode(EchoPin, INPUT);
Serial.println("Load Distance:");
}
void loop()
{
// 高脉冲去触发TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
//计算出距离
distance = pulseIn(EchoPin, HIGH) / 58.00;
Serial.print(distance);
Serial.print(" cm");
Serial.println();
delay(100); //串口输出距离结果的频率
if(distance<30){
digitalWrite(jdqPin,HIGH);
}
else
digitalWrite(jdqPin,LOW);
delay(3000);
}