請教各位大大,
以下是我的程式
按下循跡的Button就開始啟動,但就無法中斷跳出
Serial.begin(9600); // 引用 Serial 程式庫
pinMode(SLeftLeft, INPUT); //紅外線感測模組設定成「輸入」
pinMode(SMiddle, INPUT);
pinMode(SRightRight, INPUT);
pinMode(IN1, OUTPUT); // 馬達控制板的接腳全都設定成「輸出」
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void stop() // 馬達停止
{
Serial.println("停止!");
digitalWrite( ENA, 0);
digitalWrite( ENB, 0);
}
void forward() // 馬達前進
{
Serial.println("前進!");
analogWrite(ENA, speed);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENB, speed);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void backward() // 馬達後退
{
Serial.println("後退!");
analogWrite(ENA, speed);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENB, speed);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void turnLeft() // 馬達左轉
{
Serial.println("左轉!");
analogWrite(ENA, speed);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENB, speed);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void turnRight() // 馬達右轉
{
Serial.println("右轉!");
analogWrite(ENA, speed);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENB, speed);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void drivemotor(byte nStatus)
{
switch(nStatus) // 感測器 (黑色:1,白色:0)
{
case 7: // SL:1 SM:1 SR:1 (黑、黑、黑)
stop(); // 停止
break;
case 6: // SL:1 SM:1 SR:0 (黑、黑、白)
turnLeft(); // 左轉
break;
case 5: // SL:1 SM:0 SR:1 (黑、白、黑)
stop(); // 停止
break;
case 4: // SL:1 SM:0 SR:0 (黑、白、白)
turnLeft(); // 左轉
break;
case 3: // SL:0 SM:1 SR:1 (白、黑、黑)
turnRight(); // 右轉
break;
case 2: // SL:0 SM:1 SR:0 (白、黑、白)
forward(); // 前進
break;
case 1: // SL:0 SM:0 SR:1 (白、白、黑)
turnRight(); // 右轉
break;
case 0: // SL:0 SM:0 SR:0 (白、白、白)
forward(); // 前進
}
}
void loop()
{
while(sw==0)
{
int nIRStatus;
byteSensorStatus = 0; //清除感測器狀態值
nIRStatus = digitalRead(SLeftLeft); // 讀取左感測器狀態值
if(nIRStatus == 1)
byteSensorStatus = (byteSensorStatus | (0x01 << 2));
nIRStatus = digitalRead(SMiddle); // 讀取中間感測器狀態值
if(nIRStatus == 1)
byteSensorStatus = (byteSensorStatus | (0x01 << 1));
nIRStatus = digitalRead(SRightRight); // 讀取右邊感測器狀態值
if(nIRStatus == 1)
byteSensorStatus = (byteSensorStatus | 0x01);
drivemotor(byteSensorStatus);
}
if (Serial.available () > 0)
{
serialA = Serial.read();
Serial.println(serialA);
switch (serialA)
{
case 'e':
{
if(sw==0)
{
sw=1;
}
if(sw==1)
{
sw=0;
}
}
case 's' : // 接收 's',停止
stop();
break;
}
}
} |