| 創(chuàng)澤機器人 |
| CHUANGZE ROBOT |
實驗器材
· 組裝好的機器人;
· 計算機及編程環(huán)境;
·USB 下載線;
· 復眼傳感器1個;
· 帶槳葉的直流小電機1個;
· 繼 電 器 1 個 ;
· 微觸開關傳感器1個。
實驗步驟
這次實驗需要為機器人在D3 端口安裝一個微觸開關傳感器,在D2 端口上裝上一個 繼電器,并且通過它驅動一個直流小電機。同時,我們將復眼傳感器連接到A0~A4 端 口。在安裝復眼傳感器的時候請同學們小心接線的順序,它與我們其他的傳感器、執(zhí)行器 稍有不同,雖然占用了5個端口,但是只要為它連接一根+5V的電源線和一根地線就可 以了。
先編寫程序,每按下一次微觸開關,就讓風扇的狀態(tài)變化一次。比如,如果風扇正 在旋轉,那么按下一次開關,就讓它立刻停止,反之亦然。對于如何讀取微觸開關傳感器 的狀態(tài)和如何通過繼電器驅動風扇,同學們都應該了然于胸了。但是這里的程序和本書 一開始做過的開關小燈的程序還是有所不同的,我們可能需要對按動微觸開關的次數(shù)進 行計數(shù),才能知道什么時候該驅動風扇轉動,什么時候該讓它停止。下面給出了一個示例 程序,請大家留意其中是如何處理微觸開關的計數(shù)的。
const int FanPort=2;
const int SwitchPort=3;
int counter=0;
void setup(){
pinMode(FanPort, OUTPUT);
pinMode(SwitchPort,INPUT);
void loop(){
if(digitalRead(SwitchPort)==HIGH){ counter++;
}
if(counter %2==0){
digitalWrite(FanPort,LOW);
}else(
digitalWrite(FanPort,HIGH);
}
delay(200);
在這個示例程序中,每次按下微觸開關就讓一個計數(shù)變量自動增1。然后,我們用了 一個取模的運算“%”,在這里,counter%2 的結果就是這個計數(shù)變量除以2的余數(shù)是多 少。顯然,如果余數(shù)是0,那么計數(shù)變量就是偶數(shù),否則就是奇數(shù)。之后的內容就很直觀 了,奇數(shù)時我們讓風扇轉動,偶數(shù)時停止就可以了。
這個示例看起來似乎很出色,可是實際上這里有一個很大的問題,如果同學們按動按 鍵的時候有一個很小的抖動,那么會不會被主控器認為是按了兩次呢?或者如果按下按 鍵的時間比較長,是不是也會被認為按了多次?幸運的是,我們可以用軟件的方法解決這 種抖動或按鍵時間過長的問題,請同學們自己嘗試設計一個改進的算法,讓開關能出色地 控制風扇的運行。
解決了風扇的問題,再來看看如何利用復眼傳感器找到火源。這個問題可以說是到 目前為止面對的Z富挑戰(zhàn)性的問題了,機器人需要在滅火的場地內以合理的方式探索尋 找火源的所在,并且運動到火源近前,它涉及機器人的滅火策略、路徑規(guī)劃、運動控制等多 方面的問題。 但同學們不要畏難,還記得我們講過的分而治之、簡化問題的思想嗎?這里就先將這 個問題簡化。假設現(xiàn)在已經(jīng)有一個火源就在機器人的探測范圍內。我們要讓機器人的行 為就像是一朵向日葵一樣,它需要找到火源的方向并且原地轉動,直到復眼中正對前方的 那一只眼睛正對火源方向為止,如圖13-5所示。
要解決這個簡化的問題,需要對復眼的5個讀數(shù)進行比較,找到信號Z強的方向應該 就是火源的方向了。隨后就可以讓機器人根據(jù)火源方向的不同,進行速度不同的原地轉動。如果火源在Z靠外的位置就可以轉得快些,靠內就轉得慢些,如果已經(jīng)是在正中了就 可以停止轉動了。假設復眼傳感器從左到右分別連接到了主控板的A0~A4 端口,下面 給出了讓機器人尋找火源的示例程序,請同學們留意其中是怎么找到Z強信號位置的。
#define COUNTER_CLOCKWISE 0
#define CLOCKWISE 1
…
void turn(int speed,int dir);
void loop(){
int maxValue=0;
int maxPort=A0;
int value;
for(int i=A0;int i
maxPort=i;
}
if(maxPort==A0){
turn(120,CLOCKWISE);
}else if(maxPort==A1){
turn(80,CLOCKWISE);
}else if(maxPort==A2){
turn(0,CLOCKWISE);
}else if(maxPort==A3){
turn(80,COUNTER_CLOCKWISE); }else if(maxPort==A4){
turn(120,COUNTER_CLOCKWISE); }else{
turn(0,CLOCKWISE); }
delay(100);
}
void turn(int speed,int dir){
analogWrite(LeftSpeedPort,speed);
analogWrite(RightSpeedPort,speed);
if(dir==CLOCK){
digitalWrite(LeftDirPort,HIGH); digitalWrite(RightDirPort,LOW);
}else(
digitalWrite(LeftDirPort,LOW);
digitalWrite(RightDirPort,HIGH);
![]() |
| 機器人底盤 Disinfection Robot 消毒機器人 講解機器人 迎賓機器人 移動機器人底盤 商用機器人 智能垃圾站 智能服務機器人 大屏機器人 霧化消毒機器人 展廳機器人 服務機器人底盤 具身智能教育機器人 智能配送機器人 導覽機器人 |