# 參考4/30之指定題版本 ```arduino= #include <SoftwareSerial.h> #include <SPI.h> #include <MFRC522.h> #include "wheel.h" //------------------------------------------L298N------------------------------------------- #define L_ENA 9 #define L_ENB 3 #define L_IN1 7 #define L_IN2 6 #define L_IN3 5 #define L_IN4 4 //-----------------------------------------mfrc522------------------------------------------ #define RST_PIN 9 #define SS_PIN 10 //----------------------------------------bluetooth----------------------------------------- #define rx 2 // 接收腳 #define tx 8 // 傳送腳 #define communicateRate 9600 //---------------------------------------PID control----------------------------------------- #define kP 1.0 #define kI 0 #define kD 1.0 #define vB 75 #define vT 95 //-----------------------------------------globals------------------------------------------ // 讀卡的 MFRC522 *mfrc522; SoftwareSerial BT(rx, tx); // 引擎 wheel wheel_L(L_ENA, L_IN1, L_IN2); wheel wheel_R(L_ENB, L_IN3, L_IN4); // 循跡 String string = ""; char Forward = '1'; char GoBack = '2'; char Right = '3'; char Left = '4'; char Halt = '5'; unsigned long t =0; int i=0; void MotorWriting(wheel wheel_L, wheel wheel_R, int vL, int vR) { wheel_L.power(vL); wheel_R.power(vR); } bool RFID() { if (mfrc522->PICC_IsNewCardPresent() && mfrc522->PICC_ReadCardSerial()) { Serial.println(F("**Card Detected:**")); byte *id = mfrc522->uid.uidByte; // 取得卡片的UID byte idSize = mfrc522->uid.size; for (byte i = 0; i < idSize; i++) // 逐一顯示UID碼 { Serial.print(F("id[")); Serial.print(i); Serial.print(F("]: ")); Serial.println(id[i], HEX); // 以16進位顯示UID值 BT.write(id[i]); // 把ID傳給python } Serial.println(); mfrc522->PICC_HaltA(); mfrc522->PCD_StopCrypto1(); return true; } return false; } void Tracking() { int l3 = digitalRead(A0); int l2 = digitalRead(A1); int m = digitalRead(A2); int r2 = digitalRead(A3); int r3 = digitalRead(A4); int sum =l3 + l2 + m + r2 + r3; static double error =0; static double sumError =0; static double dError =0; static int vL; static int vR; static int k=0; if(sum == 0){ MotorWriting(wheel_L,wheel_R,-vB,-vB); if(vL>0 && vR>0) k++; vL=-vB; vR=-vB; if(k>=5){ MotorWriting(wheel_L,wheel_R,vB,vB); delay(150); for(int i =0, d =50; !sum; ++i) { int time =d*i; while(time > 0 && !(digitalRead(A2) || digitalRead(A1) || digitalRead(A3) ) ) { int l3 = digitalRead(A0); int l2 = digitalRead(A1); int m = digitalRead(A2); int r2 = digitalRead(A3); int r3 = digitalRead(A4); sum =l3 + l2 + m + r2 + r3; i%2 ? MotorWriting(wheel_L, wheel_R, -95, 80) : MotorWriting(wheel_L, wheel_R, 80, -85); delay(10); time -=10; } k=0; } } } else if(sum >= 4 && (t == 0 || millis()-t > 950)) { if(string[i] == Forward) t = millis(); manual(); } else { dError =-error; error =l3*-2 + l2*-1 + r2*1 + r3*2; error *=100/(sum*2); dError +=error; sumError +=error; if(error*dError>0) { vL =vB + kP*error + kD*dError + kI*sumError; vR =2*vB-vL; } else { vL =vB + kP*error + kI*sumError; vR =2*vB-vL; } MotorWriting(wheel_L,wheel_R,vL,vR); } } void manual() { if(string[i] == Forward) { } else if(string[i] == Right) { delay(75); MotorWriting(wheel_L, wheel_R, -vB, -vB); /*if(i != 0 && string[i-1] == Forward) delay(200); else*/ delay(40); MotorWriting(wheel_L, wheel_R, vT, -0.8*vT); delay(400); MotorWriting(wheel_L, wheel_R, vT, -0.8*vT); while(!(digitalRead(A4) || digitalRead(A3) || digitalRead(A2))); } else if(string[i] == Left) { delay(150); MotorWriting(wheel_L, wheel_R, -vB, -vB); /*if(i != 0 && string[i-1] == Forward) delay(200); else*/ delay(40); MotorWriting(wheel_L, wheel_R, -1.2*vT, 1.4*vT); delay(350); while(!(digitalRead(A0) || digitalRead(A1) || digitalRead(A2))); } else if(string[i] == GoBack) { MotorWriting(wheel_L,wheel_R,0,0); //在偵測到RFID前都要前進 MotorWriting(wheel_L,wheel_R,-vB,-vB); if(i != 0 && string[i-1] == Forward){ MotorWriting(wheel_L, wheel_R, -vB, -vB); delay(200); } int k=0; while(!RFID()) { if(k<10){ MotorWriting(wheel_L,wheel_R,0,0); //在偵測到RFID前都要前進 delay(50); MotorWriting(wheel_L,wheel_R,vB,vB); delay(50); } else{ MotorWriting(wheel_L,wheel_R,0,0); //在偵測到RFID前都要前進 delay(50); MotorWriting(wheel_L,wheel_R,-1.3*vB,-1.3*vB); delay(50); } k++; } MotorWriting(wheel_L,wheel_R,0,0); delay(500); MotorWriting(wheel_L,wheel_R,-1.5*vT, vT); delay(500); while(!digitalRead(A2)); } else if(string[i] == Halt) { MotorWriting(wheel_L,wheel_R,0,0); while(1); } ++i; } void setup() { //藍芽 BT.begin(communicateRate); Serial.begin(communicateRate); Serial.println(F("BT is ready!")); //讀卡 SPI.begin(); mfrc522 =new MFRC522(SS_PIN, RST_PIN); mfrc522->PCD_Init(); Serial.println(F("Read UID on a MIFARE PICC:")); int length =0; while(length == 0 || string[length-1] != 's') { if (BT.available()) { char nxt =BT.read(); string +=nxt; length++; } } Serial.print(string); } void loop() { Tracking(); } ```