Arduino智能避障小車避障程序匯編
《Arduino智能避障小車避障程序匯編》由會(huì)員分享,可在線閱讀,更多相關(guān)《Arduino智能避障小車避障程序匯編(13頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、首先建立一個(gè)名為modulecai.ino的主程序。
// modulecar.iiio,玩轉(zhuǎn)智能小車主程序
*include
2、const mt trigger = 9 ; 〃定義超聲波傳感器發(fā)射腳為D9 const int echo = 10 ; //定義傳感器接收腳為D10 const int max」ead = 300; 〃設(shè)定傳感器最大探測距離。 int no_good = 35; //* 設(shè)定 35cm 警戒距離。 int read_aliead; 〃實(shí)際距離讀數(shù)。 Seivo sensoiStation; 〃設(shè)定傳感器平臺(tái)。 NewPmg sensor(tngger, echo, max」ead); 〃設(shè)定傳感器弓|腳和最大讀數(shù) 〃系統(tǒng)初始化 void setupQ ( Senal.beg
3、in(9600); 〃啟用串行監(jiān)視器可以給調(diào)試帶來極大便利 sensorStation.attach(l 1); //IE Dll 分配給舵機(jī) pmMode(ENA, OUTPUT); 〃依次設(shè)定各 I O 屬性 puiMode(INl, OUTPUT); puiMode(IN2, OUTPUT); pmMode(ENB, OUTPUT); puiMode(IN3, OUTPUT); puiMode(IN4, OUTPUT); puiMode(Uigger, OUTPUT); puiMode(echo, INPUT); sensorStation.wnte(90); 〃舵機(jī)
4、更位至 90 1 delay(6000); 〃上電等待6s后進(jìn)入主循環(huán) } 〃主程序 void loopQ ( read_aliead = readDistanceO; 〃調(diào)用 readDistance。函數(shù)讀出前方距離 Serial.printlii(H AHEAD:"); Senal.pnntln(read_ahead); 〃串行監(jiān)視器顯示機(jī)器人前方距離 if (read_aliead < no_good) //如果前方距離小于警戒值 ( fastStopO; 〃就令機(jī)器人緊急剎車 waTchO; 〃然后左右查看,分析得出最佳路線 goFofwaidO;"*此處調(diào)
5、用看似多余,但可以確保機(jī)器人高速運(yùn)轉(zhuǎn)下動(dòng)作的連貫性 } else goFoiwa】d0; 〃否則就一直向前行駛 } 主程序用到了兩個(gè)庫,Sezo庫是IDE自帶的,NwePing庫是第三方庫,需要下載安裝。 接下來建立一個(gè)名為move. mo的標(biāo)簽。 //move.iiio,機(jī)動(dòng)模塊。 〃剎車 void fastStopQ ( SeriaLprintln(“STOP");〃串行監(jiān)視器顯示機(jī)器人狀態(tài)為STOP (停止) 〃左電機(jī)急停(注:L298N和L293D均帶有剎車功能,在使能成立的條件下,同時(shí)向兩 相寫入高電平可令電機(jī)急停,詳見芯片手冊) digitalWrite(E
6、NA, HIGH); digitalWnte(INh HIGH); digitalWnte(IN2, HIGH); 〃右電機(jī)急停 digitalWrite(ENB, HIGH); digitalWnte(IN3, HIGH); digitalWnte(IN4, HIGH); } 〃前進(jìn) void goFoiwaidQ ( Senal.pnntlnCTORWARD) 〃串行監(jiān)視器顯示機(jī)器人狀態(tài)為FORWARD (前進(jìn)) 〃左電機(jī)逆時(shí)針旋轉(zhuǎn) analogWnte(ENA,106); 〃左電機(jī)PWM,可微調(diào)這個(gè)數(shù)值使小車左右兩側(cè)車輪轉(zhuǎn)速相等,右 電機(jī)同理 digitalW
7、nte(INl, LOW); digitalWnte(IN2, HIGH); 〃右電機(jī)順時(shí)針旋轉(zhuǎn) analog Write(ENBJ 18); digitalWnte(IN3, HIGH); digitalWnte(IN4, LOW); } 〃原地左轉(zhuǎn) void mniLeftQ ( Senal.pimtln(“LEFT"); 〃串行監(jiān)視器顯示機(jī)器人狀態(tài)為LEFT (向左轉(zhuǎn)) 〃左電機(jī)正轉(zhuǎn) analogWrite(ENA, 106); digitalWnte(INh HIGH); digitalWnte(IN2, LOW); 〃右電機(jī)正轉(zhuǎn) analogWnte(
8、ENB,59);〃*微調(diào)這個(gè)數(shù)值,使轉(zhuǎn)彎時(shí)內(nèi)側(cè)車輪起主導(dǎo)作用。相當(dāng)于讓小車向后 打一把輪再拐彎。右轉(zhuǎn)同理 digitalWrite(IN3, HIGH); digitalWnte(IN4, LOW); delay(205);〃*延遲,數(shù)值以亳秒為單位,調(diào)節(jié)此值可使機(jī)器人動(dòng)作連貫 } 〃原地右轉(zhuǎn) void tuniRight() ( Senal.pnntln("RIGHT) 〃串行監(jiān)視器顯示機(jī)器人狀態(tài)為RIGHT (向右轉(zhuǎn)) 〃左電機(jī)反轉(zhuǎn) analogWrite(ENA,53); digitalWnte(INh LOW); digitalWnte(IN2, HIGH); 〃右
9、電機(jī)反轉(zhuǎn) analog Write(ENB J18); digitalWnte(IN3, LOW); digitalWnte(IN4, HIGH); delay (205); 〃*調(diào)節(jié)此值可使機(jī)器人動(dòng)作連貫 } 〃原地掉頭(暫時(shí)用不到) void tuniAioundQ ( Senal.pnnthi(HTURN 180) 〃串行監(jiān)視器顯示機(jī)器人狀態(tài)為TURN 180 (原地順時(shí)針旋轉(zhuǎn) 1800 ) 〃左電機(jī)反轉(zhuǎn) analogWrite(ENA, 106); digitalWnte(INh LOW); digitalWnte(IN2, HIGH); 〃右電機(jī)反轉(zhuǎn) ana
10、log Write(ENB J18); digitalWnte(IN3, LOW); digitalWnte(IN4, HIGH); delay (500); //* ) //pmg.ino,測距模塊 mt readDistanceQ delay(30);〃聲波發(fā)送間隔30ms,大約每秒探測33次。受系統(tǒng)所限,此值不可小于29ms int cm = sensoi.ping0 / US_ROUNDTRIP_CM; 〃把 Ping 值(Us)轉(zhuǎn)換為 cm retuin(cm); 〃1eadDistance()返回的數(shù)值是 cm } 最后是驅(qū)動(dòng)云臺(tái)掃描并分析左右兩側(cè)距離的watch.
11、ino模塊。 // watch.ino,查看模塊 void waTch() ( 〃測量右前方距離。 //*注意舵機(jī)旋轉(zhuǎn)方向,SG5010為逆時(shí)針旋轉(zhuǎn) sensoiStation.write(20);〃*舵機(jī)右轉(zhuǎn)至20。調(diào)節(jié)此值會(huì)影響傳感器掃描區(qū)域,夾角越小, 機(jī)器人轉(zhuǎn)彎越謹(jǐn)慎 delay(1200); 〃延遲1.2s待舵機(jī)穩(wěn)定 mt read_right = ieadDistance(); 〃調(diào)用】eadDistance()函數(shù)讀出右前方距離 Senal.pnnt(”RIGHT「); Senal.piintlii(reacl_nglit); 〃sensorStation.
12、write(90); 〃*舵機(jī)更位至90度。廉價(jià)舵機(jī)大角度旋轉(zhuǎn)會(huì)產(chǎn)生抖動(dòng),要加上這 兩行以求讀數(shù)準(zhǔn)確。 //delay (500); 〃延遲 0.5s 〃測量左前方距離 sensoiStation.wiite(160); //舵機(jī)左轉(zhuǎn)至 1601 delay(1200); //延遲L2s待舵機(jī)穩(wěn)定。 mt read」eft = leadDistanceO; 〃調(diào)用函數(shù)讀出距離左前方距離。 Senal.pnnt("LEFT: Senal.piintlii(read_left); sensorStation.wnte(90); 〃這一行確保只要小車處于行駛狀態(tài),傳感器就面向正前方
13、
delay (500); //延遲 0.5s。
//分析得出最佳行進(jìn)路線。
if (read_right > read」eft) 〃如果右前方距離比較大
(
nmiRight(); 〃就向右轉(zhuǎn),
}
else tinnLeftO; 〃否則就向左轉(zhuǎn)
〃此處也可以加入另一層邏輯:如果左右兩側(cè)讀數(shù)相等就調(diào)用mniAroundO原地掉頭。但 實(shí)際上觸發(fā)的幾率不大。
}
// FC 液晶測試程序,Aiduiiio 版本 L5.6-r2, LiquidCiystal_I2C 庫版本 2.0
#mclude
14、" 〃導(dǎo)入 I2C 液晶庫 LiquidCrystal_DC lcd(0x27,16,2); 〃設(shè)定 I2C 地址及液晶屏參數(shù) void setupQ Icd.uutQ; //始化液晶屏 Icd.backlightQ; lcd.piint("HeUo, world!1); 〃開始打印信息 lcd.setCursor(3,l);〃設(shè)定顯示位置,第3列,第1行 lcd.pnnt(nZANG.HAIBOH); } void loop() ( ) 〃前進(jìn) void goForwaid。 { Serial.pnndn("FORWARD) 〃串行監(jiān)視器顯示機(jī)器人狀態(tài)為FORWAR
15、D (前進(jìn)) 〃左電機(jī)逆時(shí)針旋轉(zhuǎn) mt vail = analogRead(AO); 〃手動(dòng)調(diào)整左電機(jī)轉(zhuǎn)速。電位器兩端分別接至+5V和GND, 中心抽頭接至A0 mt leftSpeed = map(vallQ1023,0,255); //把讀數(shù)映射為 PWM analogWrite(ENA,left Spued); 〃寫入速度。卜.面的右電機(jī)同理 digitalWnte(INl, LOW); digitalWnte(IN2, HIGH); //右電機(jī)順時(shí)針旋轉(zhuǎn) mt val2 = analogRead(Al); mt rightSpeed = map(val2.0,1023.0,
16、255); analogWnte(ENB4ightSpeed); digitalWnte(IN3, HIGH); digitalWnte(IN4, LOW); } //ping.mo,紅外測距模塊 〃山gge「腳沿用D9, echo腳換成A3 int readDistanceQ { digitalWHte(tngger,HIGH); 〃點(diǎn)亮紅外發(fā)射管 dulayMiciosecondsQOO); 〃給接收管留出200 u s響應(yīng)時(shí)間 IRvalue=analogRead(echo); 〃讀取自然光和紅外線下反射值的總和 digitalWrite(trigger,LOW);
17、 〃關(guān)閉紅外發(fā)射管以讀取自然光下的反射值 dulayMiciosecondsQOO);〃留出 200 us 響應(yīng)時(shí)間 IRvalue=IRvalue-aiialogRead(echo); //刨除自然光得出實(shí)際值(紅外發(fā)射管產(chǎn)生的部 分) return niap(IRvalue, 120.930,30.0); //ffl map()函數(shù)把讀數(shù)轉(zhuǎn)換為距離 ) 超聲波模塊SR04與Arduino連接: TRIG接Digital 5口,觸發(fā)測距;ECHO接Digital 4口,接收距離信號(hào)。 程序代碼: intinputPin=4;"定義超聲波信號(hào)接收接口 ECHO接4口 int ou
18、tputPin=5; //定義超聲波信號(hào)發(fā)出接口 TRIG接5口 void setup() ( Serial.begin(9600); pinMode(inputPin. INPUT); pinMode(outputPin. OUTPUT); ) void loop() ( u f digitalWrite(outputPin, LOW);//便發(fā)出發(fā)命超聲波信號(hào)接口低電平2ps , I<*. delayMicroseconds(2); digitalWrite(outputPin. HIGH); 〃使發(fā)出發(fā)出超聲波信號(hào)接口高電平1叩s,這里是至少 delayMicroseco
19、nds(10); digitalWrite(outputPin, LOW); //保持發(fā)出超聲波信號(hào)接口低電平 int distance = pulseln(inputPin. HIGH); 〃讀出脈沖時(shí)間 distance= distance/58; //將脈沖時(shí)間轉(zhuǎn)化為距離(單位:厘米) Serial .println(dlstance); /隔出距離值 delay(50); } 代碼1: HC-SR04超聲波傳感器典型代碼 digitalWrite(TrigPin, LOW); delayMicroseconds(2); digitalWnte(TngPin. HIGH);〃
20、發(fā)送10 ms的高電平觸發(fā)信號(hào) delayMicroseconds( 10); digitalWrite(TrigPin, LOW); distance - pukeIn(EchoPin, HIGH廣340/60/2; 〃檢測脈沖寬度即為超聲波往返時(shí)間 代碼2:簡易超聲波測距代碼 const int TrigPin - 2; const int EchoPni - 3; 〃設(shè)定 SR04 連接的 Arduino 引腳 float distance; void setupQ { 〃初始化串口通信及連接SR04的引腳 Serial.begin(9600); pmMode(Tng
21、Pin, OUTPUT); //要檢測引腳上輸入的脈沖寬度,需要先設(shè)置為輸入狀態(tài) pinMode(EchoPm. INPUT); Senal.prmtln(uUltrasomc sensor:**); } void loop() { 〃產(chǎn)生一個(gè)10 us的高脈沖去觸發(fā)TngPm digitalWrite(TrigPin, LOW); delayMicroseconds(2); digitalWrite(TrigPin, HIGH); delayMicroseconds( 10); digitalWrite(TrigPin, LOW); //檢測脈沖寬度,并計(jì)算出距離 d
22、istance - pulseIn(EchoPin. HIGH) /58.00;
Serial.prmt(distance);
Serial.prmt(Mcm,r);
Senal.printlnO; delay(1000);
}
代碼3:具有溫度補(bǔ)償?shù)某暡y距代碼
ffinclude
23、lue: ffdefine ONE_WIRE_BUS 4 OneWire oneWire(ONE_WIRE_BUS); DallasTempeiature sensors(&oneWue); void setupQ { 〃初始化串口通信及連接SR04的引腳 Serial.begin(9600); pmMode(TngPin, OUTPUT); 〃要檢測引腳上輸入的脈沖寬度,需要先設(shè)置為輸入狀態(tài) pinMode(EchoPm. INPUT); sensors.beginQ; } void loop() { 〃產(chǎn)生一個(gè)10 us的高脈沖去觸發(fā)TngPm sensors.ieq
24、uestTeinpeiatures(); teinperature_value - sensois.getTeixipCByliidex(O); Seiial.prmt(Mtemperauue -"); Sei ial.priiit(temperatui e_value); Serial.print(HC ”); digital\Vrite(TiigPin, LOW); delayMicioseconds(2); digital\Vrite(TiigPin, HIGH); delayMici oseconds( 10); digital\Vrite(TiigPin, LOW)
25、; 〃檢測脈沖寬度,并計(jì)算出距離 distance - pulseIn(EchoPm. HIGH) *(331.4+0.6*temperatuie_value)/2; Serial.print(Mdistance - ); Seiial.priiit(distance); Seiial.pnnt(”cm"); Seiial.prmtlnQ; delay(lOOO); 代碼4:基于GP2D12的紅外測距系統(tǒng)代碼 int i; float val; void setup(){ Serial.begin(9600); } void loop(){ i=analogRea
26、d(A0); val=2547.8/((float)i*0.49-10.41)-0.42; Serial.println(val/2); } 〃藍(lán)牙遙控小車 //Arduino源程序 〃定稿口期:2016-3-16 〃程序功能簡介: 〃程序采用軟件PWM方式,控制兩支直流電機(jī)的運(yùn)行行為,實(shí)現(xiàn)直行、后退、左轉(zhuǎn)和右轉(zhuǎn) 動(dòng)作。 〃操作者使用Android 機(jī)的藍(lán)牙功能發(fā)出指令,操控小車動(dòng)作。 〃操作者還通過藍(lán)牙對小車的動(dòng)作參數(shù)進(jìn)行調(diào)試。 〃使用自定義串口收發(fā)數(shù)據(jù) 〃使用軟件PWM,輸出引腳可任意制定 〃使用Atmega48芯片 //Arduio 版本 1.0.5
27、
#include
28、 = 0; unsigned int RP = 0; unsigned int LD = 0; unsigned int RD = 0; unsigned int PWM[6]; 〃存放當(dāng)前PWM參數(shù)的整數(shù)型數(shù)組,全局變量 unsigned char inputString[8]; //存輸入數(shù)據(jù)字符串變量 boolean stringComplete = false; // 數(shù)據(jù)串結(jié)束標(biāo)志 〃定時(shí)器2初始化函數(shù) void timer2Jnit() ( cli(); TCCR2B = 0x00; // TCNT2 = 0xF6; // TCCR2A = 0x00;
29、TCCR2B = 0x02; // TIMSK2 = 0x01; 〃定時(shí)器2中斷允許 sei(); ) 〃定時(shí)器2中斷服務(wù)函數(shù) //PWM波形產(chǎn)生器 ISR(TIMER2_OVF_vect) TCNT2 = 0xF6; // counter++; if(counter == Ox3ff) { if (rDirect == 1) bitSet(P0RTDz5); else bitSet(P0RTD,4); if (IDirect == 1) bitSet(P0RTD,7); else bitSet(P0RTD,6); counter = 0; } if(c
30、ounter == pwm_RH) { bitClearfPORTD^); bitClearfPORTD^); } if(counter == pwm_LH) { bitClearfPORTD^); bitClearfPORTDJ); } ) 〃電機(jī)運(yùn)行函數(shù) void Move(unsigned int LS,unsigned charLD,unsigned int RS,unsigned char RD) ( asm("BCLR7"); 〃關(guān)中斷 pwm_LH = LS; pwm_RH = RS; IDirect = LD; rDirect = RD; a
31、sm(”BSET7”); 〃開中斷 ) 〃獲取EEPROM數(shù)據(jù)函數(shù) 〃功能:從EEPROM里順序讀出六個(gè)PWM參數(shù),存入PWM數(shù)組 void GetData() ( unsigned char bytes[2]; 〃暫時(shí)存放PWM參數(shù)的字節(jié)數(shù)組,全局變量 unsigned char i; unsigned char j; unsigned char k; for(i = 0;i < 6;i++) //for 循環(huán),讀六個(gè)參數(shù) for (j = 0;j < 2;j++) 〃內(nèi)循環(huán),每次讀兩個(gè)字節(jié) { k = i*2 + l-j; 〃地址計(jì)算 bytes。] = EEPRO
32、M.read(k); //EEPROM 讀操作 } PWM = word(bytes[0], bytes[l]); 〃將讀出的兩個(gè)字節(jié)合成一個(gè)PWM整數(shù)數(shù)據(jù) } ) 〃數(shù)據(jù)發(fā)送函數(shù) 〃功能:將一個(gè)整數(shù)拆分成四個(gè)ASCH代碼,通過藍(lán)牙串口發(fā)出的函數(shù)。 〃例如:整數(shù)784,將拆分成;二7,8:星四個(gè)字符 void Numberfint val) ( inttmp; 〃中間變量 unsigned char i; //循環(huán)計(jì)數(shù)變量 unsigned char buf[4]; 〃存字符數(shù)組 tmp= val/1000; buf[O] = tmp + 0x30; 〃獲得千位
33、val= val % 1000; tmp= val/100; buf[l] = tmp + 0x30; 〃獲得百位 val= val % 100; tmp= val/10; buf[2] = tmp + 0x30; 〃獲得十位 val= val % 10; buf[3] = val + 0x30; 〃獲得個(gè)位 for(i = 0;i < 4;i++) { if (buf == 0x30) 〃從高位整理,如果是3則轉(zhuǎn)換成空格。 buf =0x20; else break; } Usart_Transmit(buf[O]); 〃通過藍(lán)牙串11連續(xù)發(fā)出四個(gè)字符。 Usa
34、rt_ Transmit(buf[ 1]); Usart_ Transmit(buf[2]); Usart_Transmit(buf[3]); } void setupf) { timer2_init(); UsartJnit(9600); sei(); PORTD = 0x00; DDRD = OxFO; GetDataf); 〃初始化PWM參數(shù) ) void loop() { unsigned char buf[6]; 〃存連續(xù)字符的數(shù)組 unsigned char index = 0; 〃存索引值變量 unsigned char i; unsigned char
35、 k; unsigned int para; 〃存 PWM 數(shù)據(jù)變量 delay(500); iffstringComplete == true) 〃分解手機(jī)傳過來的參數(shù) ( 〃格式是:#n%dddd k= 0; 〃其中:n為索引(地址);dddd為數(shù)據(jù) index = 0; for (i = 0;i <= wCnt ;i++) { if (inputString == %) ( index = inputstring卜 1] - 0x30; 〃獲得索引 k = 0; } else buf[k] = inputstring - 0x30; 〃獲得數(shù)據(jù) k++; par
36、a = 0; for(i = 0;i < k-l;i++) para = para * 10 + buf; PWM[index] = para; 〃將得到的整數(shù)參數(shù)立即存入對應(yīng)的PWM數(shù)組單元,修改當(dāng)前運(yùn) 行參數(shù) buf[l] = lowByte(para); 〃將整數(shù)轉(zhuǎn)換成兩個(gè)字節(jié)。 buf[O] = highByte(para); index = index * 2; 〃計(jì)算 EE PROM 地址 EEPROM.writefindex, buf[l]); 〃寫入 EEPROM 低位在前 index++; EEPROM.writefindex, buf[O]); 〃高位在后
37、 stringComplete = false; wCnt = 0; } ) ISR(USART_RX_vect) wCnt = 0; break; case d: 〃接收到d,右轉(zhuǎn) LP = PWM[4]; RP = PWM[5]; LD = 1; RD = O; wCnt = 0; break; case s: 〃接收到后,停止電機(jī) LP = 0; RP = O; LD = 1; RD = 1; wCnt = 0; break; default: LP = 0; RP = O; LD = 1; RD = 1; } Move(LRLD,RERD); }
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《比的意義》教學(xué)課件
- (精品)我們在行動(dòng) (2)
- 孤立奇點(diǎn)留數(shù)習(xí)題課
- 七年級(jí)語文下冊(人教版)13-葉圣陶先生二三事(作業(yè))課件
- 《童年》教學(xué)課件
- 61源遠(yuǎn)流長的中華文化
- 浙江中醫(yī)雜志投稿須知
- 底盤與主動(dòng)安全性系統(tǒng)
- 中國臨床解剖學(xué)雜志簡介及來稿須知
- 5《爺爺和小樹》
- (蘇教版)四年級(jí)語文上冊課件+桂花雨+1
- 氣管插管病人的醫(yī)療護(hù)理
- 小學(xué)道德講堂“六個(gè)一”模板
- 第29課《詩詞五首-長相思》PPT課件
- 湘科版四年級(jí)科學(xué)上冊全冊ppt課件