ARDUINO从入门到创客带师第二弹:超声波雷达
这期咱简单的做个超声波雷达,预算20
本期我们需要的材料有
ARDUINO UNO开发板,14包邮吧
HC SR04开发板超声波测距模块,不到5块钱,这个分新款和旧款,旧款只支持5V供电新款支持3.3
四根杜邦线用于传感器供电和连接
UNO我们之前说过,无论是改进版还是原版都是一样的,改进版因为加了排针所以对杜邦线的要求反倒更灵活,而ATMEGA328P这种单片机基本不会炸,如果炸了,再买块板子也就14包邮,没必要花20块钱买“标准版”
不过咱还真有标准版,咱当年用它玩起了播放生日歌在那天上传到了ACFUN之后就被封号了
现在这个开发板里面的程序都是自动放生日歌,我打算过两天拜寿的时候带上
所谓的意大利制造也就那么回事吧,这种东西我都会做,画板子的时候用人家开源的项目的设计图可以直接在生产出来的电路板上打上原版MADE IN ITALY的丝印,所以现在网上不少打着“意大利生产”的旗号卖高价的开发板可能和咱的20包邮的一样产自深圳华强北
随着国人版权意识增强,不少人见有利可图就打着“正版”旗号开始碰瓷钓鱼或者收智商税,所以作为消费者,我们应该加强健全法律意识,了解开源开放版权和改进设计的概念 开源的东西怎么存在正版呢?显然又是另一波割韭菜的幌子 20块钱就能买的东西,标个“正版”就能卖150甚至299了?卖家在想PEACH
如果你有像这样的ESP8266模块,也可以做本期教程。但是遗憾的是这种NODEMCU型的模块没有5V定义,需要在面包板上借助其他模块的5V供电才能驱动5V的模块,这里在采购超声波模块的时候可以买新版支持3.3V的
此外如果有12864显示屏,本篇教程还可以进阶直接利用模块将传感器的数据实时投射到屏幕上,这里因为预算原因不介绍 毕竟20块钱买了屏幕的话剩下的钱你只能买两个超声波模块了
其实咱日常生活中雷达这种东西是非常常见的,一般咱常用的这种东西也就是感应门感应开关之类的红外感应的设备,至于超声波,其实咱也不是见不到。现代汽车的倒车雷达,基本就都是超声波雷达,十多年前的汽车就可以用车载的液晶显示屏把倒车雷达测量出的距离显示在屏幕上了,而不是只会简单的滴滴滴响,而现代的汽车更是前后左右都放置了超声波雷达,甚至还搭配了自动泊车辅助系统
超声波雷达的原理
超声波雷达的工作原理是通过超声波发射装置向外发出超声波,遇到障碍物反射到接收器,通过接收器接收到发送过来超声波时的时间差来测算距离。目前,常用探头的工作频率有 40kHz, 48kHz 和 58kHz 三种。一般来说,频率越高,灵敏度越高,但水平与垂直方向的探测角度就越小,故一般采用 40kHz 的探头。超声波雷达防水、防尘,即使有少量的泥沙遮挡也不影响。探测范围在 0.1-3 米之间,因此非常适合应用于泊车。相比红外雷达,超声波也有它的缺点。在不同的天气情况下,超声波的传输速度不同,而且传播速度较慢,精度就不如红外了。毕竟声音是机械波,红外线是电磁波。超声波散射角大,方向性较差,在测量较远距离的目标时,其回波信号会比较弱,影响测量精度。但是,在短距离测量中,超声波测距传感器具有非常大的优势。
关于驻波
两列沿相反方向传播的振幅相同、频率相同的波叠加时形成的波叫做驻波。频率相同、传输方向相反的两种波(不一定是电磁波),其中的一个波一般是另一个波的反射波。在两者电压(或电流)相加的点出现波腹,在两者电压(或电流)相减的点形成波节。在波形上,波节和波腹的位置始终是不变的,给人“驻立不动”的印象,但它的瞬时值是随时间而改变的。如果这两种波的幅值相等,则波节的幅值为零。
HC-SR04模块工作原理
(1)采用IO口TRIG触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
(4)本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,即可以达到你移动测量的值
可以看到,模块本身是有一发一收两个压电模块的,其中一个发射超声波另一个接收超声波。因为压电效应可逆,所以理论上用一个探头也可以。
压电效应:某些电介质在沿一定方向上受到外力的作用而变形时,其内部会产生极化现象,同时在它的两个相对表面上出现正负相反的电荷。当外力去掉后,它又会恢复到不带电的状态,这种现象称为正压电效应。事实上,大部分超声波元件都是依靠压电效应而非常见扬声器的电磁感应原理。
硬件配置
我们要做的是把超声波模块通过杜邦线正确的接到开发板上,接线图如上 VCC接+5V GND要和开发板共地,ECHO接单片机2号数字端口TRIG接3号(这个其实后期可以通过更改代码定义修改)但是总体来说是这么回事,要按照正确的方法接线,一般来说供电不能反接,模块一般没有保护会爆炸,数据如果接错了也有可能GG,不过一般传感器模块的问题不大。USB数据接反是有点问题 不要接反
总之ARDUINO环境的配置和驱动的安装都老生常谈了我就不想说了,直接接在笔记本或者台式机的USB接口接开发板就行了,开发板用USB的供电够
驱动的安装
ARDUINO有JAVA环境,安装板经常容易出现丢环境的情况,这时候留着安装包把ARDUINO卸载重装就行了
代码方面,还是复读一遍吧,Arduino的程序结构与传统的c程序结构有所不同——Arduino程序中没有main函数。其实并不是Arduino程序中没有main函数,而是main函数的定义隐藏在了Arduino的核心库文件中。在进行Arduino开发中不直接操作main函数,而是使用setup和loop这两个函数。
setup() Arduino控制器通电或者复位后,就会开始执行Arduino的初始化配置(IO口 串口等);
loop() setup函数执行完毕后,Arduino会接着执行loop()函数中的程序。而loop函数是一个死循环,其中的程序会不断地重复运行。通常在loop函数中完成程序的主要功能,如驱动各种模块和采集数据等
以下是本期所需要的全代码:
const int TrigPin = 2; //发出超声波
const int EchoPin = 3; //收到反射回来的超声波 定义用哪个端口来驱动超声波模块
float cm; //因为测得的距离是浮点型的
void setup() {Serial.begin(9600); //设置波特率
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
// put your setup code here, to run once:这个括号里的代码只会执行一次
}
void loop() {
digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2); // delayMicroseconds在更小的时间内延时准确
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW); //通过这里控制超声波的发射
cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
cm = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print("Distance:");
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(1000);
// put your main code here, to run repeatedly:这个括号里的代码会执行无限次
}
关于波特率
波特率(Baud Rate) 单位 bps -- 每秒传送的字节数 Byte Per Second.。
为何要设置波特率
模拟线路信号的速率,也称调制速率,以波形每秒的振荡数来衡量。如果数据不压缩,波特率等于每秒钟传输的数据位数,如果数据进行了压缩,那么每秒钟传输的数据位数通常大于调制速率,使得交换使用波特和比特/秒偶尔会产生错误。为了保证有效通讯,需要设置波特率。
编译 因为这个项目的代码都是很成熟的也不需要什么库的调用,所以很快就编译成功了 也不容易报错
上传成功后,我们需要在工具中打开串口监视器
如果一切正常,这会儿你就可以读取这个超声波模块测得的距离了
这个造型让人看了想念诗