上一篇文章中试验了最简单的一个Arduino:LED的闪烁,这个文章里来讨论如何使用URM37超声波模块来进行距离测试。
环境搭建: Arduino基板一块
扩展板Expansion v4一块
URM37 V3.2模块一块
排线4根
基板自带的USB连接线一根
图 URM37 V3.2
图 电路连接图
URM37 V3.2的串口通信协议下的测距命令如下:
0x22+Degree+NC+SUM,degree为控制电机的角度,此处设置为0,NC设置为0,响应格式为0x22+High(distance)+Low(distance)+SUM,如果读取的值非法,则返回0x22+0xFF+0xFF+SUM。
URM37 V3.2支持两种模式的串口通信:RS232及TTL。我们在这个实验中,使用TTL模式,其跳线配置如下:
图 TTL模式
接线方式很简单,URM37的1号线接5V,2号线接GND, 8号线RXD接基板的1号I/O口(TX),9号线TXD接基板的0号I/O口(RX),这个是串口通信的标准接法。
应该注意的是,如果使用扩展板(我用的是DFRduino的扩展板Expansion V4)的话,需要将URM37的RXD和TXD与基板的Data行连接,用以传输数据。
1: int usval = 0;2: int timecount = 0;3: int ledpin = 13;4: boolean flag = true;5:6: uint8_t DMCmd[4] = {0x22, 0x00, 0x00, 0x22};7:8: void setup(){9: Serial.begin(9600);10: pinMode(ledpin, OUTPUT); //设置13号口为输出11: digitalWrite(ledpin, LOW); //灭掉LED12: delay(200);13: }14:15: void loop(){16: flag = true;17:18: for(int i = 0; i < 4; i++){19: Serial.write(DMCmd[i]);//发送命令20: }21:22: delay(100);23:24: while(flag){25: if(Serial.available() > 0){26: int header = Serial.read(); //读头,一个字节,下同27: int high = Serial.read(); //读高位28: int low = Serial.read(); //读低位29: int sum = Serial.read(); //读校验值30:31: if(high == 255){//invalid32: usval = 65525;33: }else{34: usval = high * 255 + low;35:36: //如果距离超过50厘米,则点亮LED37: if(usval > 50){38: digitalWrite(ledpin, HIGH);39: }else{40: digitalWrite(ledpin, LOW);41: }42:43: //实时输出距离信息44: Serial.print("distance = ");45: Serial.println(usval);46: flag = false;47: }48: }49: delay(100);50: }51: }
图 测试效果
URM37 V3.2的还具有RS232串口通信方式,温度测试等,我将在随后的实验中逐一记录。