超声波是指频率高于20KHz的机械波, 我们能够利用其渡越时间TOF(time of flight)来测量它与障碍物间的距离。超声波测距的基本原理是先测出超声波从发射到遇到障碍物返回所经历的时间,然后再乘以超声波的速度就得到二倍声源与障碍物之间的距离。超声波传感器利用压电效应在电能和超声波间实现相互转化,即在发射的时候将电能转换成超声波;再在接收的时候再将超声波转换成电信号。
我们能够用超声波传感器和分立元件自己实现测距电路,当然也可以利用现成的超声波测距模块。手头的这个超声波测距模块测出的距离数值由三位LED数码管实时显示,同时也能够通过芯片上的10脚串行输出给Arduino,或者通过RS232或RS485电平转换后与PC机或者其它设备相连。该模块的测量范围为0.05m~9.99m,每测量一次就通过串口输出一组数据,波特率为9600,格式为8-N-1。输出的每组数据中都包括一个起始字节和三个数据字节,其具体格式如下表所示:
| 顺序 | 功能 | 取值 |
|---|---|---|
| 1 | 起始符 | ASCII码@(40) |
| 2 | 百位数 | 十六进制数 |
| 3 | 十位数 | 十六进制数 |
| 4 | 个位数 | 十六进制数 |
该测距模块同Arduino的连接非常简单,我们只需要将其串行输出连接到Arduino的RX引脚(即上面一排最右端的引脚),再将其正负极分别连到Arduino的5V和GND引脚步上就可以了,其原理图如下所示:
具体的连线如下图所示:
相应的Arduino工程代码为:
int val;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
val = Serial.read();
if (val != 64) {
Serial.print(val);
} else {
printByte(0);
}
}
}
本实验的最终目的是将超声波测距模块得到的障碍物距离显示在Flash中。在上面的代码里我们将该模块每组数据所带的起始字节(@)换成了0,利用其作为XMLSocke每次处理的分界符,这样每次传给Flash的都会是类似于“107”这样的字符串,大大方便了之后的处理过程。该Flash工程对应的的ActionScript脚本如下所示:
import Arduino;
var port:Number = 5331;
var a:Arduino = new Arduino(port);
aListener = new Object();
aListener.onConnect = function() {
}
aListener.onReceiveData = function(evtObj:Object){
trace(parseInt(evtObj.data) / 100 + "m");
}
a.addEventListener("onConnect", aListener);
a.addEventListener("onReceiveData", aListener);
整个实验在运行与在Arduino与Flash间的互动中描述的过程基本一致。首先将Arduino工程通过集成开发环境下载到Arduino模块中,然后在PC机上运行serproxy.exe程序,注意该程序的配置文件serproxy.cfg中对串口的设置要与Arduino工程保持一致,具体的内容如下所示:
newlines_to_nils=true
comm_ports=1
comm_baud=9600
comm_databits=8
comm_stopbits=1
comm_parity=none
timeout=300
net_port1=5331
最后再运行Flash工程,如果一切顺利,我们可以在其输出窗口中看到从超声波测距模块读出的距离数值:
No tags


