// 腳位定義(使用 L/R 命名更直觀)
#define L_SPEED 3 // D3:左馬達速度(原 ENA)
#define R_SPEED 11 // D11:右馬達速度(原 ENB)
#define L_IN1 5 // D5:左馬達 IN1
#define L_IN2 6 // D6:左馬達 IN2
#define R_IN1 9 // D9:右馬達 IN3
#define R_IN2 10 // D10:右馬達 IN4
char command;
int speedValue = 150; // 初始速度值(範圍 0~255)
void setup() {
Serial.begin(9600);
pinMode(L_IN1, OUTPUT);
pinMode(L_IN2, OUTPUT);
pinMode(R_IN1, OUTPUT);
pinMode(R_IN2, OUTPUT);
pinMode(L_SPEED, OUTPUT);
pinMode(R_SPEED, OUTPUT);
stopCar();
}
void loop() {
if (Serial.available()) {
command = Serial.read();
// 處理 Vxxx 速度指令
if (command == 'V') {
while (Serial.available() < 3);
char s1 = Serial.read();
char s2 = Serial.read();
char s3 = Serial.read();
speedValue = (s1 - '0') * 100 + (s2 - '0') * 10 + (s3 - '0');
speedValue = constrain(speedValue, 0, 255);
}
switch (command) {
case 'F': forward(); break;
case 'B': backward(); break;
case 'L': turnLeft(); break;
case 'R': turnRight(); break;
case 'S': stopCar(); break;
}
}
}
void forward() {
analogWrite(L_SPEED, speedValue);
analogWrite(R_SPEED, speedValue);
digitalWrite(L_IN1, HIGH);
digitalWrite(L_IN2, LOW);
digitalWrite(R_IN1, HIGH);
digitalWrite(R_IN2, LOW);
}
void backward() {
analogWrite(L_SPEED, speedValue);
analogWrite(R_SPEED, speedValue);
digitalWrite(L_IN1, LOW);
digitalWrite(L_IN2, HIGH);
digitalWrite(R_IN1, LOW);
digitalWrite(R_IN2, HIGH);
}
void turnLeft() {
analogWrite(L_SPEED, speedValue);
analogWrite(R_SPEED, speedValue);
digitalWrite(L_IN1, LOW);
digitalWrite(L_IN2, HIGH);
digitalWrite(R_IN1, HIGH);
digitalWrite(R_IN2, LOW);
}
void turnRight() {
analogWrite(L_SPEED, speedValue);
analogWrite(R_SPEED, speedValue);
digitalWrite(L_IN1, HIGH);
digitalWrite(L_IN2, LOW);
digitalWrite(R_IN1, LOW);
digitalWrite(R_IN2, HIGH);
}
void stopCar() {
analogWrite(L_SPEED, 0);
analogWrite(R_SPEED, 0);
digitalWrite(L_IN1, LOW);
digitalWrite(L_IN2, LOW);
digitalWrite(R_IN1, LOW);
digitalWrite(R_IN2, LOW);
}