#include<Servo.h> //引用庫 //因為很多子函式要用這個變數,所以把servo定義稱全域性變數,作用域是整個程式碼檔案 Servo myServo; //全速:digitalWrite(2,3左輪;4,5右輪) //調速:analogWrite(pin,0~255)--2,3左輪;5, //analogWrite只支援3,5,6,9,10,11引腳 //所以對4,5的物理接線對換一下 //前進 void Forward(){ digitalWrite(2,LOW); //digitalWrite(3,HIGH); analogWrite(3,150); digitalWrite(4,LOW); //digitalWrite(5,LOW); analogWrite(5,150); } //後退 void BackOff(){ digitalWrite(2,LOW); analogWrite(3,100); digitalWrite(4,LOW); analogWrite(5,100); } //左轉 void TurnLeft(){ //小車左轉(左輪後退) digitalWrite(2,LOW); analogWrite(3,90); //小車左轉(右輪前進) digitalWrite(4,LOW); analogWrite(5,250); } //右轉 void TurnRight(){ //小車右轉(左輪前進) digitalWrite(2,LOW); analogWrite(3,250); //小車右轉(右輪後退) digitalWrite(4,LOW); analogWrite(5,90); } //停止 void Stop(){ digitalWrite(2,LOW); analogWrite(3,0); digitalWrite(4,LOW); analogWrite(5,0); } //獲取距離 long getLen(){ //傳送一個10us的訊號給超聲波 digitalWrite(9,LOW); delayMicroseconds(2); digitalWrite(9,HIGH); delayMicroseconds(10); digitalWrite(9,LOW);//超聲波內部開始震盪,準備傳送波 long time; long length; //關注Echo高電平維持的時間,代表超聲波傳送到返回的時間 time = pulseIn(8,HIGH); //距離= 時間(us) * 速度(340m/s)=》 微秒 * 釐米 / 往返 2 // 微秒轉秒;米轉釐米;=》(time/1000000) * (340*100) / 2 length = time * 0.017000; return length; } void Init(){ //put your setup code here, to run once: //串列埠初始化 //配置2,3口為輸出引腳(左輪初始化) pinMode(2,OUTPUT); pinMode(3,OUTPUT); //配置4,5口為輸出引腳(右輪初始化) pinMode(4,OUTPUT); pinMode(5,OUTPUT); //Trig接9,透過9傳送一個觸發訊號給超聲波 pinMode(9,OUTPUT); //Echo接8,透過讀取8高電平維持的實踐,確認超聲波哦在空氣中傳播的時間 pinMode(8,INPUT); //pinMode(LED_BUILTIN,OUTPUT); //監聽串列埠 Serial.begin(9600); //把舵機黃色訊號線插在ardino的引腳10 myServo.attach(10); } void setup() { // put your setup code here, to run once: Init(); } void loop() { // put your main code here, to run repeatedly: myServo.write(100);//居中 //TurnLeft(); // long centerLen; // long leftLen; // long rightLen; // myServo.write(100);//居中 // delay(500); // centerLen = getLen(); // Serial.print("中間的距離是:"); // Serial.println(centerLen); // //檢測到前方有障礙物 // if(centerLen < 50){ // Stop(); // //右邊搖頭確認距離 // myServo.write(30);//右邊 // delay(500); // rightLen = getLen(); // Serial.print("右邊的距離是:"); // Serial.println(rightLen); // //左邊搖頭確認距離 // myServo.write(170);//左邊 // delay(500); // leftLen = getLen(); // Serial.print("左邊邊的距離是:"); // Serial.println(leftLen); // //回正 // myServo.write(100);//居中 // delay(500); // //左邊大於右邊往左邊走 // if(leftLen > rightLen){ // TurnLeft(); // Serial.println("左轉"); // delay(100); // Stop(); // }else{ // TurnRight(); // Serial.println("右轉"); // delay(100); // Stop(); // } // }else{//前方無障礙物,前進 // Forward(); // } }
場景:小車速度輪子轉速過快,調整轉速防止慣性撞牆