日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

#創(chuàng)客秀#借助超聲波傳感器實現(xiàn)避障的智能小車 | 雷鋒網(wǎng)

 ID被吃 2016-04-05

#創(chuàng)客秀#借助超聲波傳感器實現(xiàn)避障的智能小車

【編者按】本文的作者是宜昌城老張,轉載于他的個人博客。在這篇文章里面,他向我們介紹如何通過LabVIEW和Arduino、超聲波傳感器等設備來制作一款可以智能躲避障礙的小車。

實驗使用上位機軟件LabVIEW對以Arduino作為下位機的MakeBlock智能小車進行實時監(jiān)控。采用URM37V3.2超聲波測距傳感器實時測量小車在行駛的過程中與前方障礙物的距離,Arduino將檢測到的測距信息轉換為實際的距離值。在Arduino中實現(xiàn)避障算法,當MakeBlock小車與障礙物的距離小于設定值時,小車實施避障方案,從而躲避障礙物。同時,Arduino將檢測到的距離信息發(fā)送給上位機LabVIEW。

這次實驗的避障算法是在下位機Arduino中完成,而不是在遠端的PC機完成避障算法。上位機的LabVIEW界面只是對小車的運行狀態(tài)進行實時監(jiān)視。如果想了解如何用遠端的上位PC機來實現(xiàn)對智能車的無線避障遙控,可參見文章《基于LabVIEW測控的MakeBlock智能車避障控制》。

MakeBlock金屬智能車避障視頻:

在本文的實驗中,XBee模塊與Arduino之間通過串行接口(即Tx和Rx引腳)進行通信。本文使用點對點無線傳輸方式,通過串行接口向XBee模塊寫入命令數(shù)據(jù),實現(xiàn)數(shù)據(jù)的發(fā)送;當XBee模塊接收到數(shù)據(jù)時,通過讀串行接口獲得這些數(shù)據(jù),實現(xiàn)數(shù)據(jù)的讀取。對于Xbee模塊的使用方法,可詳見博客文章《美國DIGI公司的XBee模塊無線通訊實驗》。

 Xbee模塊與Arduino控制器連接方法

Xbee模塊與PC機連接方法

一、 硬件設計

實驗采用URM37V3.2超聲波傳感器作為外界環(huán)境信息的采集工具。下面,簡要介紹一下與本次實驗有關的URM37V3.2超聲波傳感器的一些知識。

URM37V3.2超聲波傳感器是一種多功能的智能傳感器,它可以測量4~500 cm的距離,并且有1cm的分辨率。能夠測量較遠的距離并且性能穩(wěn)定??赏ㄟ^脈寬輸出的方式來測量數(shù)據(jù),也可以使用R232串口通訊,有較好的可靠性。下面兩個圖分別是URM37V3.2超聲波傳感器的引腳定義、URM37V3.2超聲波傳感器與Arduino的連線圖。

 URM37V3.2超聲波傳感器引腳示意圖

URM37V3.2超聲波傳感器TTL方式串口接線圖

作為一種智能傳感器,該傳感器可以將信號采集、數(shù)字處理和信息傳送融為一體。用戶只需要使用單片機的TTL電平串口,向傳感器發(fā)出四個字節(jié)的信息讀取命令:0x22, 0x00, 0x00, 0x22。傳感器接收命令后,會向單片機回送四個字節(jié)的測距信息:0x22, highbyte, lowbyte, sum。這四個字節(jié)里有兩個字節(jié)就是16位被測距離信息。如果高位字節(jié)和低位字節(jié)都是 0xFF,這意味著測量無效,超出測量范圍。反之,被測距離就等于高位字節(jié)乘以256再加上低位字節(jié),實際距離的單位是厘米。

二、下位機程序設計

為了獲得距離信息,Arduino需要向URM37 V3.2測距傳感器發(fā)送四個字節(jié)的測距指令,等待超聲波測距傳感器完成測距任務后,再接受它返回的四個字節(jié)的距離信息。并按上文的方法轉換為實際的距離值。如果實測距離大于40cm,小車繼續(xù)前進;反之,小車實施避障策略,及時左轉,從而躲避障礙物。同時,Arduino控制器將距離信息通過無線傳輸模塊Xbee發(fā)送給遠程監(jiān)控的上位機LabVIEW處理。這里發(fā)送給上位機處理的有關距離信息的數(shù)據(jù)前面帶上了標識字符“10”,用于上位機判斷哪個字節(jié)是有效字符串信息的第一個字節(jié)。發(fā)送給上位機的數(shù)據(jù)(字符串)格式是:10+距離數(shù)據(jù)高8位+距離數(shù)據(jù)低8位。下位機Arduino程序的流程圖如圖所示。

基于超聲波傳感器避障的程序流程圖

Arduino程序:

int E_right =5; //連接電機1的使能端口到數(shù)字接口5
int M_right =4; //連接電機1的轉向端口到數(shù)字接口4
int E_left = 6; //連接電機2的使能端口到數(shù)字接口6
int M_left=7; //連接電機2的轉向端口到數(shù)字接口5
int velocity1=190; //右電機速度
int velocity2=250; //左電機速度
int USValue = 0; //超聲波實測距離變量
boolean flag=true; //設置循環(huán)標識符并初始化為真
byte DMcmd[4] = {0x22, 0x00, 0x00, 0x22}; //距離命令數(shù)組

void advance() //聲明前進子函數(shù)
{
digitalWrite(M_right,HIGH); //右電機反轉
analogWrite(E_right, velocity1); //右電機速度調節(jié)
digitalWrite(M_left,LOW); //左電機正轉
analogWrite(E_left, velocity2); //左電機速度調節(jié)
}
void back() //聲明后退子函數(shù)

{
digitalWrite(M_right,LOW); //右電機正轉
analogWrite(E_right,velocity1); //右電機速度調節(jié)
digitalWrite(M_left,HIGH); //左電機反轉
analogWrite(E_left,velocity2); //左電機速度調節(jié)
}
void right()//聲明右轉子函數(shù)

{
digitalWrite(M_right,LOW); //右電機正轉
analogWrite(E_right,velocity1); //右電機速度調節(jié)
digitalWrite(M_left,LOW); //左電機正轉
analogWrite(E_left,velocity2); //左電機速度調節(jié)
}
void left() //聲明左轉子函數(shù)

{
digitalWrite(M_right,HIGH); //右電機反轉
analogWrite(E_right,velocity1); //右電機速度調節(jié)
digitalWrite(M_left,HIGH); //左電機反轉
analogWrite(E_left,velocity2); //左電機速度調節(jié)
}
void Stop() //聲明停止子函數(shù)

{
digitalWrite(E_right, LOW); //右電機停
digitalWrite(E_left, LOW); //左電機停
}
void setup()
{
Serial.begin(9600); //串口波特率設置
pinMode(M_right, OUTPUT); //設置輸出引腳
pinMode(E_right, OUTPUT);
pinMode(M_left, OUTPUT);
pinMode(E_left, OUTPUT);
delay(20); //延時20ms
}
void loop( )
{
for(int i=0;i<>
{
Serial.print(DMcmd[i],BYTE); //發(fā)送四個字節(jié)的超聲波測距命令
}
delay(75); //延時75ms
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為校驗和
if(highbyte==255) //如果高位數(shù)據(jù)位255,超出測量范圍,數(shù)據(jù)無效
{
USValue=65525;
}
else
{
USValue = highbyte*256+lowbyte; //計算實際距離值
if (USValue <>
{
//如果距離小于40厘米小車左轉500ms
left();
delay(500);
}
//相反的情況,小車前進
else
advance();
}
Serial.print(10,BYTE); //上傳距離信息的標識符
Serial.print(highbyte,BYTE); //上傳距離數(shù)據(jù)高8位
Serial.print(lowbyte,BYTE); //上傳距離數(shù)據(jù)低8位
flag=false; //標識符變?yōu)榧?,退出該循環(huán)
}
}
delay(20); // 延時20ms
}

三、上位機LabVIEW程序設計

編寫LabVIEW程序,通過串口讀取下位機發(fā)送的距離信息,將提取的信息實時顯示在LabVIEW的前面板上,就可以實時觀察小車的運行狀態(tài)。LabVIEW只需要根據(jù)上文Arduino發(fā)送是信息數(shù)據(jù)格式提取相關的字符串信息即可。下面是LabVIEW程序的程序框圖。(點擊圖片可以看到大圖)

#創(chuàng)客秀#借助超聲波傳感器實現(xiàn)避障的智能小車基于超聲波的智能小車避障的LabVIEW程序框圖

LabVIEW程序先讀取一個標識字符,如果讀取的是標識字符“10”,程序會繼續(xù)讀取2個字節(jié)的字符串。通過“字符串值字節(jié)數(shù)組函數(shù)”將其轉換為一維數(shù)組后,通過“索引數(shù)組”得到距離數(shù)據(jù)高8位和距離數(shù)據(jù)低8位。LabVIEW將字節(jié)數(shù)據(jù)轉換為十進制的實際距離值。16位的二進制距離信息到十進制實際距離的轉換公式是:實際距離=256*距離數(shù)據(jù)高8位+距離數(shù)據(jù)低8位。

下圖是LabVIEW程序的前面板。在前面板上,可以實時觀察到小車運行時是否遇到障礙物。由于超聲波測距傳感器相對實驗的場地來說,有較大的測距范圍。因此,在這里顯示了小車運行時與前方障礙物的實測距離,并通過一定的微分取導算法,得出了小車運行時的近似速度值,以供參考。

基于超聲波的智能小車避障的LabVIEW前面板

LabVIEW和Arduino程序源文件請下載:http:///QGn6HWbKMUSjp。

四、系統(tǒng)調試

在LabVIEW的前面板選擇COM4(在實驗中,XBee模塊添加到計算機后,所獲得的串口號COM4),并設置波特率為9600bps。接通智能小車電機及控制器供電電源。運行上位機LabVIEW程序,通過前面板來觀察小車的運行狀態(tài),與小車實際避障情況比較。實驗結果表明,LabVIEW前面板讀到的信息與小車實際運行狀況相符,并且裝備超聲波測距傳感器的智能小車可以很好地躲避前方障礙物。

五、總結

本文采用超聲波測距傳感器檢測小車與前方障礙物的實際距離,通過與預先設定的小車轉向時機的值進行比較,在遇到障礙物時左轉一定的角度,實現(xiàn)避障。實驗中Arduino采集數(shù)據(jù),實現(xiàn)避障算法,LabVIEW作為上位機監(jiān)視小車的運行狀態(tài)。

相關文章:

全球創(chuàng)客馬拉松上海站:15個項目展示創(chuàng)客的“一本正經(jīng)”和“不務正業(yè)”

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多