這是一個使用 Arduino 控制兩個伺服馬達(Servo Motor)的程式碼。以下是程式碼的簡要說明: --- # Arduino 伺服馬達控制程式 ## 簡介 這個 Arduino 程式碼使用了 `Servo` 函式庫,控制兩個伺服馬達以實現機器人的運動。程式通過序列通信接收命令,根據命令來控制機器人的運動方向和速度。 ## 程式結構 ### 1. 包含函式庫和宣告變數 ```arduino #include <Servo.h> Servo servomotorL; Servo servomotorR; int servoPinL = 13; int servoPinR = 12; int motorL = 93; int motorR = 93; bool isMoving = false; ``` 這裡包含了 `Servo` 函式庫,並宣告了左右兩個伺服馬達的物件,以及相關的腳位和速度變數。 ### 2. 初始化 ```arduino void setup() { servomotorL.attach(servoPinL); servomotorR.attach(servoPinR); Serial.begin(9600); } ``` 在 `setup` 函式中,初始化了伺服馬達的腳位,並開啟序列通信。 ### 3. 主循環 ```arduino void loop() { if (Serial.available() > 0) { char command = Serial.read(); processCommand(command); } // 如果机器人在移动中,继续执行之前的命令 if (isMoving) { servomotorL.write(motorL); servomotorR.write(motorR); } } ``` 主循環中,程式等待序列通信中有新的字節可用。如果有,則讀取字節並調用 `processCommand` 函式來處理命令。同時,如果機器人正在移動中,則持續執行之前的命令。 ### 4. 處理命令 ```arduino void processCommand(char command) { // 增加或减少速度 int speedChange = 5; switch (command) { case 'A': // 向左轉 if (motorL > 0) { motorL -= speedChange; motorR -= (speedChange * 2); isMoving = true; } break; case 'D': // 向右轉 if (motorR < 180) { motorL += (speedChange * 2); motorR += speedChange; isMoving = true; } break; case 'W': // 向前移動 if (motorR < 180 && motorL < 180) { motorL += speedChange; motorR += speedChange; isMoving = true; } break; case 'S': // 向後移動 if (motorR > 0 && motorL > 0) { motorL -= speedChange; motorR -= speedChange; isMoving = true; } break; case 'X': // 停止移動 motorR = 93; motorL = 93; isMoving = true; break; } } ``` 根據收到的命令,處理運動方向和速度的變化。每個命令都會修改伺服馬達的速度,並設置 `isMoving` 為 `true`,表示機器人正在移動中。 ## 結論 這個程式碼實現了通過序列通信控制兩個伺服馬達,以控制機器人的運動方向和速度。你可以通過在序列監視器中輸入不同的命令,來控制機器人的行為。 ```arduino #include <Servo.h> Servo servomotorL; Servo servomotorR; int servoPinL = 13; int servoPinR = 12; int motorL = 93; int motorR = 93; bool isMoving = false; void setup() { servomotorL.attach(servoPinL); servomotorR.attach(servoPinR); Serial.begin(9600); } void loop() { if (Serial.available() > 0) { char command = Serial.read(); processCommand(command); } // 如果机器人在移动中,继续执行之前的命令 if (isMoving) { servomotorL.write(motorL); servomotorR.write(motorR); } } void processCommand(char command) { // 增加或减少速度 int speedChange = 5; switch (command) { case 'A': if (motorL > 0) { motorL -= speedChange; motorR -= (speedChange * 2); isMoving = true; } break; case 'D': if (motorR < 180) { motorL += (speedChange * 2); motorR += speedChange; isMoving = true; } break; case 'W': if (motorR < 180 && motorL < 180) { motorL += speedChange; motorR += speedChange; isMoving = true; } break; case 'S': if (motorR > 0 && motorL > 0) { motorL -= speedChange; motorR -= speedChange; isMoving = true; } break; case 'X': motorR = 93; motorL = 93; isMoving = true; break; } } ```