搜尋程式碼

第24/31課:智能車第二部分:前進、後退、左右轉同控制車速

第24/31課:智能車第二部分:前進、後退、左右轉同控制車速

24-SunFounder-Car-Speed 喺行人路上

呢堂課專注喺砌你部智能車嘅第二階段:用Arduino代碼控制佢嘅移動。雖然第一個項目可能已經令部車以基本方式郁動,但呢個指南教你點樣命令部車精準咁向前、向後、轉左、轉右同停低。你亦都會學識點樣控制佢嘅速度,令加速同減速更順暢。呢個係任何機械人項目嘅基本步驟,因為佢畀你基礎邏輯去創造更複雜嘅自主行為。

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.00.000

掌握呢啲移動控制會打開好多可能性。以下係呢啲知識嘅幾個實際應用:

  • 循線機械人:用左轉同右轉功能令機械人保持喺軌道上。
  • 避障車輛:編程部車向前移動、停低,同埋喺偵測到前面有物件嗰陣轉彎。
  • 遙控探索:將呢啲命令同無線模組結合,喺屋企或者花園周圍揸部車。
  • 自動送貨系統:整一個小型機械人,可以喺設定點之間移動,需要嗰陣停低同啟動。

硬件同組件

呢個項目係基於SunFounder 3合1 Arduino套件。除咗基本套件之外唔需要額外組件,但你需要連接四條額外電線去Arduino嚟控制摩打驅動器。基本組件包括:

  • Arduino Uno(或兼容板)
  • SunFounder智能車底盤連摩打
  • 摩打驅動板(套件內包含)
  • 跳線
  • 車用電池盒
  • USB線用嚟編程
smarcar_turning_right  上面
smartcar_turning_left 上面

接線指南

呢個項目嘅接線對控制每個摩打嘅方向好重要。影片解釋咗驅動板嘅四條摩打控制線連接去Arduino嘅第5、6、9同10針腳。呢啲針腳特別在於佢哋支援脈寬調變(PWM),呢個對速度控制好重要。

喺影片入面,導師用黃色同藍色線以特定順序連接佢哋,如下圖所示。

影片中提到一個重要嘅安全提示:用USB編程Arduino嗰陣要斷開車嘅電池電源(紅色線去5V,黑色線去GND)。咁可以防止USB埠過載而可能關機。

代碼解釋

呢堂課嘅代碼結構容易修改同理解。控制部車嘅關鍵在於程式開頭嘅針腳定義。如果你決定用Arduino上唔同嘅針腳,你可以更改呢啲定義。

const int in1 = 5;
const int in2 = 6;
const int in3 = 9;
const int in4 = 10;

呢幾行定義咗連接去摩打驅動器輸入嘅Arduino針腳。in1in2控制一個摩打,而in3in4控制另一個。透過將呢啲針腳設為HIGH或LOW,你就可以控制每個摩打嘅旋轉方向。

為咗控制部車嘅速度,代碼用咗兩個自訂函數:moveForward(int speed)moveBackwards(int speed)。呢啲函數接受一個0到255之間嘅整數值作為參數。0值會令摩打停止,而255就係最大速度。例如,要令部車以全速向前移動,你可以呼叫moveForward(255)。要令佢慢慢向後移動,你可以用moveBackwards(100)

影片亦示範咗一個用for迴圈嘅「加速」同「減速」順序。呢個係實現順暢加速嘅強大技巧。

for(int i=0;i<=255;i+=5){
  moveForward(i);
  delay(100);
}

呢個迴圈由i等於0開始,每次加5,直到達到255。每次佢都會呼叫moveForward(i),逐漸增加部車嘅速度。delay(100)提供每個速度步驟100毫秒嘅暫停,令加速過程可見。一個類似嘅迴圈用遞減嘅i值嚟令部車減速。

現場項目示範

喺影片入面,導師分兩個主要階段示範呢個項目。首先,佢展示部車嘅基本移動。透過載入「move」代碼,部車執行一個預設順序:向前移動兩秒、停低、向後移動兩秒、停低、轉左、然後轉右。咁樣可以視覺上確認接線同邏輯係正確嘅。

第二個示範集中喺速度控制。導師載入「加速」程式碼,令車仔逐漸加速向前,直到達到最高速度,然後平穩噉減速至停低。佢跟住展示一個固定速度嘅版本,車仔以255向前移動,停低之後,再以較慢嘅速度100向後退,啲數值會打印到Serial Monitor度做驗證。

章節

  • [00:00] 車仔移動控制簡介
  • [01:44] 設定接線以進行程式碼控制
  • [02:07] 示範向前同向後移動
  • [03:18] 示範向左同向右轉彎
  • [05:05] 將電線連接到Arduino引腳
  • [07:00] 方向控制嘅程式碼解釋
  • [11:44] 速度控制簡介
  • [12:16] 速度漸變嘅程式碼解釋
  • [14:45] 使用Serial Monitor做除錯
  • [17:10] 速度控制嘅現場示範
  • [19:45] 最後戶外測試同總結

圖片

26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
Smartcar turning left
Smartcar turning left
Smartcar turning right
Smartcar turning right
24 SunFounder Car speed on the pavement
24 SunFounder Car speed on the pavement
900-Lesson 24/31: Smart code speeds up
語言: C++
/*
Lesson 24/31: Smart code speeds up
Get this code and watch video Download and resource page https://robojax.com/RJT607
YouTube video https://www.youtube.com/watch?v=QzcUig2L3dM

*/
const int in1 = 5;
const int in2 = 6;
const int in3 = 9;
const int in4 = 10;

void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(9600);
  Serial.println("SunFounder Arduino Course");
  Serial.println("Lesson 3: Speed up");
  Serial.println("www.Robojax.com");
  
}

void loop() {
    
    moveForward(255);
    Serial.print("Forward at: ");
    Serial.println(255);
    delay(5000);//for 5 seconds

    Serial.println("Stopped ");
    moveForward(0);//stop the car
    delay(2000);//for 2 seconds
    
    moveBackwards(100);
    Serial.print("Reverse at: ");    
    Serial.println(100);    
    delay(5000);//for 5 seconds

    Serial.println("Stopped ");
    moveForward(0);//stop the car
    delay(2000);//for 2 seconds   
 
}

void moveForward(int speed) {
  analogWrite(in1, 0);
  analogWrite(in2, speed);
  
  analogWrite(in3, speed);
  analogWrite(in4, 0);
}

void moveBackwards(int speed) {
  analogWrite(in1, speed);
  analogWrite(in2, 0);
  
  analogWrite(in3, 0);
  analogWrite(in4, speed);
}
901-Lesson 24/31: Smart code speeds up (Custome code)
語言: C++
/*
Lesson 24/31: Smart code speeds up (custom code)
Get this code and watch video Download and resource page https://robojax.com/RJT607
YouTube video https://www.youtube.com/watch?v=QzcUig2L3dM

*/
const int in1 = 5;
const int in2 = 6;
const int in3 = 9;
const int in4 = 10;

void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(9600);
  Serial.println("SunFounder Arduino Course");
  Serial.println("Lesson 3: Speed up");
  Serial.println("www.Robojax.com");
  
}

void loop() {
  Serial.println("Loop 1: Speeding Up"); 
  for(int i=0;i<=255;i+=5){
    moveForward(i);
    Serial.print("i= ");
    Serial.println(i);
    delay(100);
  }
    Serial.println("Loop 2: Slowing down "); 
  for(int i=255;i>=0;i-=5){
    moveForward(i);
    Serial.print("i= ");
    Serial.println(i);    
    delay(100);
  }
 
}

void moveForward(int speed) {
  analogWrite(in1, 0);
  analogWrite(in2, speed);
  
  analogWrite(in3, speed);
  analogWrite(in4, 0);
}

你可能需要嘅嘢

資源與參考資料

文件📁

Arduino 函式庫 (zip)