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