Arduino智能避障小車避障程序_第1頁
Arduino智能避障小車避障程序_第2頁
Arduino智能避障小車避障程序_第3頁
Arduino智能避障小車避障程序_第4頁
Arduino智能避障小車避障程序_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、首先建立一個名為modulecar.ino的主程序。/ modulecar.ino,玩轉智能小車主程序#include /導入舵機庫#include /導入NwePing庫/ 對照系統配線方案依次指定各I/Oconst int ENA = 3 ; /左電機PWM const int IN1 = 4 ; /左電機正const int IN2 = 5 ; /左電機負const int ENB = 6 ; /右電機PWMconst int IN3 = 7 ; /右電機正const int IN4 = 8 ; /右電機負const int trigger = 9 ; /定義超聲波傳感器發射腳為D9co

2、nst int echo = 10 ; /定義傳感器接收腳為D10const int max_read = 300; /設定傳感器最大探測距離。int no_good = 35; /*設定35cm警戒距離。int read_ahead; /實際距離讀數。Servo sensorStation; /設定傳感器平臺。NewPing sensor(trigger, echo, max_read); /設定傳感器引腳和最大讀數/系統初始化void setup() Serial.begin(9600); /啟用串行監視器可以給調試帶來極大便利 sensorStation.attach(11); /把D1

3、1分配給舵機 pinMode(ENA, OUTPUT); /依次設定各I/O屬性 pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(trigger, OUTPUT); pinMode(echo, INPUT); sensorStation.write(90); /舵機復位至90 delay(6000); /上電等待6s后進入主循環/主程序void loop() read_ahead = readDistance

4、(); /調用readDistance()函數讀出前方距離 Serial.println(AHEAD:); Serial.println(read_ahead); /串行監視器顯示機器人前方距離 if (read_ahead read_left) /如果右前方距離比較大turnRight(); /就向右轉,else turnLeft(); /否則就向左轉/此處也可以加入另一層邏輯:如果左右兩側讀數相等就調用turnAround()原地掉頭。但實際上觸發的幾率不大。/ I2C液晶測試程序,Arduino版本1.5.6-r2,LiquidCrystal_I2C庫版本2.0#include #inc

5、lude LiquidCrystal_I2C.h /導入I2C液晶庫LiquidCrystal_I2C lcd(0x27,16,2); /設定I2C地址及液晶屏參數void setup() lcd.init(); / 始化液晶屏 lcd.backlight(); lcd.print(Hello, world!); /開始打印信息 lcd.setCursor(3,1); /設定顯示位置,第3列,第1行 lcd.print(ZANG.HAIBO);void loop()/前進void goForward() Serial.println(FORWARD); /串行監視器顯示機器人狀態為FORWAR

6、D(前進) /左電機逆時針旋轉 int val1 = analogRead(A0); /手動調整左電機轉速。電位器兩端分別接至+5V和GND,中心抽頭接至A0 int leftSpeed = map(val1,0,1023,0,255); /把讀數映射為PWM analogWrite(ENA,leftSpeed); /寫入速度。下面的右電機同理 digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); / 右電機順時針旋轉 int val2 = analogRead(A1); int rightSpeed = map(val2,0,1023,0,255)

7、; analogWrite(ENB,rightSpeed); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);/ ping.ino,紅外測距模塊/ trigger腳沿用D9,echo腳換成A3int readDistance() digitalWrite(trigger,HIGH); /點亮紅外發射管 delayMicroseconds(200); /給接收管留出200s響應時間 IRvalue=analogRead(echo); /讀取自然光和紅外線下反射值的總和 digitalWrite(trigger,LOW); /關閉紅外發射管以讀取自然

8、光下的反射值 delayMicroseconds(200); /留出200s響應時間 IRvalue=IRvalue-analogRead(echo); /刨除自然光得出實際值(紅外發射管產生的部分) return map(IRvalue,120,930,30,0); /用map()函數把讀數轉換為距離代碼1:HC-SR04超聲波傳感器典型代碼digitalWrite(TrigPin, LOW);delayMicroseconds(2);digitalWrite(TrigPin, HIGH);/發送10s的高電平觸發信號delayMicroseconds(10);digitalWrite(Tr

9、igPin, LOW);distance = pulseIn(EchoPin, HIGH)*340/60/2; / 檢測脈沖寬度即為超聲波往返時間代碼2:簡易超聲波測距代碼const int TrigPin = 2; const int EchoPin = 3; /設定SR04連接的Arduino引腳float distance; void setup() / 初始化串口通信及連接SR04的引腳 Serial.begin(9600); pinMode(TrigPin, OUTPUT); / 要檢測引腳上輸入的脈沖寬度,需要先設置為輸入狀態 pinMode(EchoPin, INPUT); Se

10、rial.println(Ultrasonic sensor:); void loop() /產生一個10s的高脈沖去觸發TrigPin digitalWrite(TrigPin, LOW); delayMicroseconds(2); digitalWrite(TrigPin, HIGH); delayMicroseconds(10); digitalWrite(TrigPin, LOW); / 檢測脈沖寬度,并計算出距離 distance = pulseIn(EchoPin, HIGH) /58.00; Serial.print(distance); Serial.print(cm); S

11、erial.println(); delay(1000); 代碼3:具有溫度補償的超聲波測距代碼#include #include /設定SR04連接的Arduino引腳const int TrigPin = 2; const int EchoPin = 3; float distance; float temperature_value; #define ONE_WIRE_BUS 4OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);void setup() /初始化串口通信及連接SR04的引腳 Serial.b

12、egin(9600); pinMode(TrigPin, OUTPUT); /要檢測引腳上輸入的脈沖寬度,需要先設置為輸入狀態 pinMode(EchoPin, INPUT); sensors.begin();void loop() /產生一個10s的高脈沖去觸發TrigPin sensors.requestTemperatures(); temperature_value = sensors.getTempCByIndex(0); Serial.print(temperature = ); Serial.print(temperature_value); Serial.print(C );

13、digitalWrite(TrigPin, LOW); delayMicroseconds(2); digitalWrite(TrigPin, HIGH); delayMicroseconds(10); digitalWrite(TrigPin, LOW); /檢測脈沖寬度,并計算出距離 distance = pulseIn(EchoPin, HIGH) *(331.4+0.6*temperature_value)/2; Serial.print(distance = ); Serial.print(distance); Serial.print(cm); Serial.println();

14、delay(1000);代碼4:基于GP2D12的紅外測距系統代碼int i;float val;void setup() Serial.begin(9600);void loop() i=analogRead(A0); val=2547.8/(float)i*0.49-10.41)-0.42; Serial.println(val,2);/藍牙遙控小車/Arduino源程序/定稿日期:2016-3-16/程序功能簡介:/程序采用軟件PWM方式,控制兩支直流電機的運行行為,實現直行、后退、左轉和右轉動作。/操作者使用Android手機的藍牙功能發出指令,操控小車動作。/操作者還通過藍牙對小車的

15、動作參數進行調試。/使用自定義串口收發數據/使用軟件PWM,輸出引腳可任意制定/使用Atmega48芯片/Arduio版本#include #include #include #include usart.hunsigned int counter; /PWM計數器unsigned char wCnt = 0; /接收字計數unsigned int pwm_LH; /左電機高電平計數unsigned int pwm_RH; /右電機高電平計數unsigned char lDirect;/左電機運轉方向unsigned char rDirect;/右電機運轉方向unsigned int LP =

16、 0;unsigned int RP = 0;unsigned int LD = 0;unsigned int RD = 0;unsigned int PWM6; /存放當前PWM參數的整數型數組,全局變量unsigned char inputString8; /存輸入數據字符串變量boolean stringComplete = false;/數據串結束標志/定時器2初始化函數void timer2_init()cli();TCCR2B = 0x00; /TCNT2 = 0xF6; /TCCR2A = 0x00;TCCR2B = 0x02; /TIMSK2 = 0x01; /定時器2中斷允許

17、sei();/定時器2中斷服務函數/PWM波形產生器ISR(TIMER2_OVF_vect)TCNT2 = 0xF6; /counter+;if(counter = 0x3ff) if (rDirect = 1) bitSet(PORTD,5); else bitSet(PORTD,4); if (lDirect = 1) bitSet(PORTD,7); else bitSet(PORTD,6); counter = 0;if(counter = pwm_RH) bitClear(PORTD,4); bitClear(PORTD,5);if(counter = pwm_LH) bitClea

18、r(PORTD,6); bitClear(PORTD,7);/電機運行函數void Move(unsigned int LS,unsigned charLD,unsigned int RS,unsigned char RD) asm(BCLR 7);/關中斷pwm_LH = LS;pwm_RH = RS;lDirect = LD;rDirect = RD;asm(BSET 7);/開中斷 /獲取EEPROM數據函數/功能:從EEPROM里順序讀出六個PWM參數,存入PWM數組void GetData()unsigned char bytes2; /暫時存放PWM參數的字節數組,全局變量unsi

19、gned char i;unsigned char j;unsigned char k;for(i = 0;i 6;i+) /for循環,讀六個參數 for (j = 0;j 2;j+) /內循環,每次讀兩個字節 k = i * 2 + 1 - j; /地址計算 bytesj = EEPROM.read(k); /EEPROM讀操作 PWM= word(bytes0, bytes1); /將讀出的兩個字節合成一個PWM整數數據/數據發送函數/功能:將一個整數拆分成四個ASCII代碼,通過藍牙串口發出的函數。/例如:整數784,將拆分成; ,7,8,4四個字符void Number(int va

20、l)inttmp; /中間變量unsigned char i; /循環計數變量unsigned char buf4; /存字符數組tmp= val / 1000;buf0 = tmp + 0x30;/獲得千位val= val % 1000;tmp= val / 100;buf1 = tmp + 0x30;/獲得百位val= val % 100;tmp= val / 10;buf2 = tmp + 0x30;/獲得十位val= val % 10;buf3 = val + 0x30; /獲得個位for(i = 0;i 4;i+) if (buf= 0x30) /從高位整理,如果是0,則轉換成空格。

21、 buf= 0x20; else break;Usart_Transmit(buf0); /通過藍牙串口連續發出四個字符。Usart_Transmit(buf1);Usart_Transmit(buf2);Usart_Transmit(buf3);void setup() timer2_init();Usart_Init(9600);sei();PORTD = 0x00;DDRD= 0xF0;GetData(); /初始化PWM參數void loop() unsigned char buf6; /存連續字符的數組unsigned char index = 0; /存索引值變量unsigned

22、char i;unsigned char k;unsigned int para; /存PWM數據變量delay(500);if(stringComplete = true) /分解手機傳過來的參數 /格式是:#n%dddd k= 0; /其中:n為索引(地址);dddd為數據 index = 0; for (i = 0;i = wCnt ;i+) if (inputString= %) index = inputStringi-1 - 0x30; /獲得索引 k = 0; else bufk = inputString- 0x30; /獲得數據 k+; para = 0; for (i = 0;i k-1;i+) para = para * 10 + buf; PWMindex = para; /將得到的整數參數立即存入對應的PWM數組單元,修改當前運行參數 buf1 = lowByte(para); /將整數轉換成兩個字節。 buf0 = highByte(para); index = index * 2; /計算EEPROM地址 EEPROM.write(index, buf1);/寫入EEPROM低位在前 index+; EEPROM.write(index, buf0);/高位在后 stringComplete = false; wCnt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論