Arduino UNOgit
右輪dom
左輪函數
L298N模塊oop
#include <Servo.h> #define Trig 2 //引腳控制超聲波發出聲波 #define Echo 3 //引腳反應接收到返回聲波 #define LIN1 7 //左側輪子 #define LIN2 6 #define RIN1 5 //右側輪子 #define RIN2 4 //#define Steeringpin 9 //舵機控制端口 int S = 0; //初始化距離 Servo Steering; //轉向舵機 void setup() { // put your setup code here, to run once: Serial.begin(9600); //設置比特率 pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode(LIN1, OUTPUT); pinMode(LIN2, OUTPUT); pinMode(RIN1, OUTPUT); pinMode(RIN2, OUTPUT); // pinMode(Steeringpin, OUTPUT); Steering.attach(9); //定義舵機所用引腳 Steering.write(90); //初始化舵機角度 delay(2000); //開機延時 } void loop() { // put your main code here, to run repeatedly: Steering.write(90); Range(); //測距函數 if(S <= 5) //距離太近不足以轉彎 { Back(); //執行後退函數 delay(300); //後退持續時間 } else if(S >= 5 && S <= 15) //距離中等能夠轉彎 { Turn(); //執行轉彎判斷函數 } else //距離充足 { Line(); //執行直行函數 } } void Range() //測距函數 { digitalWrite(Trig,LOW); //測距 delay(2); //延時2微秒 digitalWrite(Trig,HIGH); delay(10); digitalWrite(Trig,LOW); float distance = pulseIn(Echo,HIGH); //讀取高電平時間 S = float( distance * 17 )/1000; //把值賦給S Serial.println(S); //向串口發送S的值,能夠在顯示器上顯示距離 } // float distance = pulseIn(Echo,HIGH); // S = float( distance * 17 )/1000; // 將回波時間換算成cm // 讀取一個引腳的脈衝(HIGH或LOW)。例如,若是value是HIGH,pulseIn()會等待引腳變爲HIGH,開始計時,再等待引腳變爲LOW並中止計時。 // 返回脈衝的長度,單位微秒。若是在指定的時間內無脈衝函數返回。 // 此函數的計時功能由經驗決定,長時間的脈衝計時可能會出錯。計時範圍從10微秒至3分鐘。(1秒=1000毫秒=1000000微秒) // 接收到的高電平的時間(us)* 340m/s / 2 = 接收到高電平的時間(us) * 17000 cm / 1000000 us = 接收到高電平的時間 * 17 / 1000 (cm) void Turn() //轉向函數 { Lull(); //中止 Steering.write(170); //使舵機轉到170度(左側) delay(1000); //留時間給舵機轉向 Range(); //測距 Steering.write(90); //使舵機回覆原位 delay(1000); if(S >= 15) //距離充足 { turnLeft(); //左轉彎後退 } else //距離不足 { Steering.write(10); //使舵機轉到10度(右側) delay(1000); Range(); Steering.write(90); //使舵機回覆原位 delay(1000); if(S >= 15) //距離充足 { turnRight(); //右轉彎後退 } else { Back(); //後退 int x = random(1); //產生一個隨機數使小車隨機轉向 if(x == 0) turnLeft(); else turnRight(); } } } void Back() //後退函數(使電機反轉) { digitalWrite(LIN1, LOW); digitalWrite(LIN2, HIGH); digitalWrite(RIN1, HIGH); digitalWrite(RIN2, LOW); } void Line() //直線行駛函數(使電機正轉) { digitalWrite(LIN1, HIGH); digitalWrite(LIN2, LOW); digitalWrite(RIN1, LOW); digitalWrite(RIN2, HIGH); } void turnLeft() //小車左轉後退 { digitalWrite(LIN1, LOW); digitalWrite(LIN2, HIGH); digitalWrite(RIN1, LOW); digitalWrite(RIN2, LOW); delay(1000); } void turnRight() //小車右轉後退 { digitalWrite(LIN1, LOW); digitalWrite(LIN2, LOW); digitalWrite(RIN1, HIGH); digitalWrite(RIN2, LOW); delay(1000); } void Lull() //中止 { digitalWrite(LIN1, LOW); digitalWrite(LIN2, LOW); digitalWrite(RIN1, LOW); digitalWrite(RIN2, LOW); }