求Arduino连接超声波传感器?

发布时间:2019-09-10 10:59:43

求Arduino连接超声波传感器?

推荐回答

今天我们以带温度补偿的URM37V3.2超声波传感器为例,简地单学习一下超声波测距原理,再利用Arduino做几个超声波测距传感器不同接口读取距离参数的应用实验。

超声波测距的工作原理就像蝙蝠的声纳一样,通过发射探头发出超声波信号,遇到物体反射回来被接收探头接收,然后计算反射回来所用的时间。信号反射时间越长,则目标越远。具体计算公式为:

式中 L——要测的距离; Δt——发射波和反射波之间的时间间隔; C0——超声波在空气中的声速,常温下取为340m/s;T 为绝对温度,单位K;

URM37V3.2超声波传感器是一款具有温度补偿的多功能超声波传感器。其特性如下:

1.传感器具有RS232和TTL电平的串口,使用串口通讯可靠性更高,同时可以通过电脑串口采集数据,编写通讯程序非常的便捷。

2.传感器具有PWM脉宽输出模式,可以使用Arduino直接读取脉冲。

3.传感器具有开关信号输出,可以预先设定一个比较值,在测量距离小于这个值后管脚输出一个低电平,这样模块能够方便的作为一个超声波接近开关使用。

4.传感器具有一个舵机控制端口,可以和一个舵机组组成一个空间扫描测量组件,用于机器人避障和绘制空间地图。

5.传感器具有温度补偿电路提高测量的精度,同时可以输出分辨率0.1摄氏度的环境温度数据。

下面我们来做几个超声波测距的实验,拿到URM37V3.2超声波测距传感器后,需要先设置串口电平,出厂默认设置为RS232电平(可直接接电脑串口),接Arduino则需要设置为TTL电平。设置方式如下图:

r232模式

ttl模式

通过Arduino的串口来读取距离数据,接线相当的简单,只需要四根线,传感器电源接到Arduino的5V上,传感器的9脚接Arduino的RX,传感器的8脚接Arduino的TX即可。

Arduino使用TTL串口读取距离数据代码:

int USValue = 0; int timecount = 0; int ledpin =13; //定义L灯作显示 boolean flag=true; uint8_t DMcmd[4] = {0x22, 0x00, 0x00, 0x22}; //距离命令 void setup() { Serial.begin(9600); pinMode(ledpin,OUTPUT); digitalWrite(ledpin,LOW); delay(200); } void loop() { flag=true; for(int i=0;i<4;i++) { Serial.print(DMcmd[i],BYTE);//发送超声波测距命令 } delay(75); //一个延时 while(flag) { if(Serial.available()>0) //查询串口有无数据 { int header=Serial.read(); //0x22开始接收距离数据 int highbyte=Serial.read();//距离数据高8位 int lowbyte=Serial.read();//距离数据低8位 int sum=Serial.read();//sum校验和 if(highbyte==255) //数据无效 { USValue=65525; // } else { USValue = highbyte*255+lowbyte; if (USValue >=50) {//如果距离大于50厘米小灯亮起 digitalWrite(ledpin,HIGH); }//如果距离小于50厘米小灯熄灭 else digitalWrite(ledpin,LOW); } Serial.print("Distance="); Serial.println(USValue);//输出距离 flag=false; } } delay(100); // }

顺便我们再使用TTL串口读取温度数据。Arduino使用TTL串口读取温度数据代码:

int val = 0; int USValue = 0; int sign = 0; // 0 + 1 - boolean flag=true; uint8_t DMcmd[4] = { 0x11, 0x00, 0x00, 0x11}; //温度读取命令 void setup() { Serial.begin(9600); // delay(200); } void loop() { flag=true; for(int i=0;i<4;i++)//温度命令发送 { Serial.print(DMcmd[i],BYTE); } delay(50); //延时 50 ms while(flag) { if(Serial.available()>0)//判断串口有无返回数据 { int header=Serial.read(); //0x11开始接收温度参数 int highbyte=Serial.read();//温度数据高8位 int lowbyte=Serial.read();//温度数据低8位 int sum=Serial.read();//sum校验和 if(highbyte==255&&lowbyte==255)//温度数据无效 { Serial.println("temperature disable!"); } else { if(highbyte&0xf0==240)sign=1; //判断温度正负, else if(highbyte&0xf0==0)sign=0; USValue = (highbyte&0x0f)*255+lowbyte; Serial.print("temperature="); if(sign)Serial.print("-"); else Serial.print("+"); Serial.print(USValue/100); Serial.print((USValue%100)/10); Serial.print("."); Serial.println(USValue%10); } flag=false; } } delay(50); }

以上问题属网友观点,不代表本站立场,仅供参考!