URM37 V3.2超聲波測距儀的制作![]() 這個(gè)超聲波型號為URM37 V3.2的測距傳感器是一種智能傳感器,所謂智能傳感器就是信號采集,數(shù)字處理,和信息傳送為一體。用戶只要通過單片機(jī)TTL電平串口,向傳感器發(fā)出四個(gè)字節(jié)的信息讀取命令,傳感器接收命令后,會向單片機(jī)發(fā)回四個(gè)字節(jié)的信息,這四個(gè)字節(jié)里有兩個(gè)字節(jié)就是16位被測距離信息。如果高位字節(jié)和低位字節(jié)都是0xFF,這意味著測量無效,超出測量范圍,否則,高位字節(jié)乘以256再加上低位字節(jié)就是被測距離,單位是厘米。 實(shí)驗(yàn)照片: ![]() 通過Labview前面板顯示的距離信息與卷尺對比,測量比較精確。URM37V3.2超聲波測距模塊與單片機(jī)是通過TTL模式的串口連接的,只需四根線:VCC、GND、,具體接線圖如下: ![]() 其實(shí)這個(gè)智能傳感器除了測距,還有一些附加的實(shí)用功能,這樣我把它的說明書給大家看,請下載: URM37V3.2超聲波測距傳感器與Arduino控制器的串口連線,可通過4根杜邦線一端插在傳感器的引針上,另一端插在層疊在Arduino控制器的傳感器擴(kuò)展板的引針上。如圖所示: ![]() 注意:當(dāng)通過USB,下載Arduino程序,傳感器的RXD和TXD這兩根杜邦線要拔掉,否則無法下載程序。 講到這里,另外再提一個(gè)話題,Arduino用戶需特別注意,我曾經(jīng)出現(xiàn)過類似下載故障: 在使用Arduino的過程中,最令人頭痛的估計(jì)就是bootloade毀壞,需要重新燒寫bootloader了。最常見的一種情況就是,在Arduino IDE環(huán)境中下載程序的時(shí)候,較長時(shí)間沒有反應(yīng),這時(shí)很多人就直接選擇斷開USB連接線或者電源,然后就會出現(xiàn)無法再上傳程序的錯(cuò)誤。其實(shí)出現(xiàn)這種情況時(shí)正確的做法是一直等到Arduino超時(shí)返回出錯(cuò)信息,直接斷電的做法往往會導(dǎo)致bootloader毀壞。如果bootloader毀壞,唯一的辦法就是通過ISP下載線重新燒寫bootloader。 這個(gè)實(shí)驗(yàn)的Arduino程序的任務(wù)是: 向傳感器發(fā)出“讀取距離信息”的命令,再馬上接收傳感器返回的距離信息,并把兩個(gè)字節(jié)的距離信息換算為十進(jìn)制數(shù)據(jù),如果該數(shù)據(jù)小于等于30厘米,則連接在控制器數(shù)字接口的LED燈亮,否則熄滅。然后把兩個(gè)字節(jié)的距離信息上傳給上位機(jī)的Labview軟件,以便Labview前面板實(shí)時(shí)顯示傳感器所測距離。 int USValue = 0;//定義存放超聲波測量距離 int ledpin =11; //定義燈作顯示,小于30CM,燈亮 boolean flag=true; byte DMcmd[4] = {0x22, 0x00, 0x00, 0x22}; //距離命令 void setup() { Serial.begin(9600); //串口波特率設(shè)置 pinMode(ledpin,OUTPUT); //初始化,把燈熄滅 digitalWrite(ledpin,HIGH); delay(200); } void loop( ) { flag=true; for(int i=0;i<4;i++) { Serial.print(DMcmd,BYTE);//發(fā)送超聲波測距命令 } delay(75); //一個(gè)延時(shí) while(flag) { if(Serial.available()>0) //查詢串口有無數(shù)據(jù) { byte header=Serial.read(); //0x22開始接收距離數(shù)據(jù) byte highbyte=Serial.read();//距離數(shù)據(jù)高8位 byte lowbyte=Serial.read();//距離數(shù)據(jù)低8位 byte sum=Serial.read();//sum校驗(yàn)和 if(highbyte==255) //數(shù)據(jù)無效 { USValue=65525; // } else { USValue = highbyte*256+lowbyte; if (USValue <=30) {//如果距離小于30厘米小燈亮起 digitalWrite(ledpin,LOW); }//如果距離大于30厘米小燈熄滅 else digitalWrite(ledpin,HIGH); } Serial.print(highbyte,BYTE);//向上位機(jī)LABVIEW軟件 Serial.print(lowbyte,BYTE);//輸出距離 flag=false; } } delay(100); // } 上位機(jī)Labview前面板: ![]() 上位機(jī)Labview框圖程序: ![]() 從上圖Labview框圖程序看出,程序中“索引數(shù)組”VI,被索引出第4、5個(gè)元素就是超聲波智能傳感器提供的那兩個(gè)字節(jié)的距離信息,為啥第4、5個(gè)元素是距離信息那?你仔細(xì)看看Arduino程序,每一次主程序,即void loop( )循環(huán),它首先從串口向傳感器發(fā)出了四個(gè)字節(jié)的距離采集命令,Arduino控制器與傳感器連接的TTL模式的串口和Arduino控制器與PC機(jī)連接的串口是一個(gè)串口,接著主程序又向串口發(fā)出了采集到的兩個(gè)字節(jié)的距離信息給Labview。所以每次void loop( )循環(huán),Labview要讀取六個(gè)字節(jié),所以0~5個(gè)元素的數(shù)組里,第4、5個(gè)元素才是距離信息。 采用Labview、Arduino控制器和超聲波智能傳感器,象搭積木一樣很快組建出自己的超聲波測距儀。 實(shí)驗(yàn)時(shí),把手掌當(dāng)做障礙物,伸入到超聲波傳感器的視野里,前后晃動手掌,Labview前面板的滑動桿上的游標(biāo)也跟著晃動,蠻有意思的! |
2.36 MB, 下載積分: 積分 -1