Arduino調整小車速度

蜗牛的礼物發表於2024-07-21
#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();
  // }

}

場景:小車速度輪子轉速過快,調整轉速防止慣性撞牆

相關文章