# 4/29-30 ``` arduino= #include <SoftwareSerial.h> #include <SPI.h> #include <MFRC522.h> #include <time.h> #include "wheel.h" #define L_ENA 9 #define L_ENB 3 #define L_IN1 7 #define L_IN2 6 #define L_IN3 5 #define L_IN4 4 SoftwareSerial BT(2, 8); // 接收腳, 傳送腳 #define RST_PIN 9 #define SS_PIN 10 MFRC522 *mfrc522; double kP = 0.9; double kI = 0.0; double kD = 1.0; int vB = 70; int counter = 0; String string = "11143432115\0"; char val; char Forward = '1'; char GoBack = '2'; char Right = '3'; char Left = '4'; char Halt = '5'; bool flag =true; unsigned long t =0; static int i=0; void MotorWriting(wheel wheel_L, wheel wheel_R, int vL, int vR){ wheel_L.power(vL); wheel_R.power(vR); } wheel wheel_L(L_ENA, L_IN1, L_IN2); wheel wheel_R(L_ENB, L_IN3, L_IN4); 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]); } Serial.println(); mfrc522->PICC_HaltA(); mfrc522->PCD_StopCrypto1(); return true; } return false; } double Tracking(){ int m= digitalRead(A2); int l2= digitalRead(A1); int l3= digitalRead(A0); int r2= digitalRead(A3); int r3= digitalRead(A4); static double last =0; static double sumError=0; double dError=0; double error=l3*-2 + l2*-1 + r2*1 + r3*2; int sum=l3 + l2 + m + r2 + r3; static int vL=0,vR=0; if(sum == 0) { MotorWriting(wheel_L,wheel_R,-75,-75); vL=-75; vR=-75; } else if(sum >= 4){ if(string[i] == Forward &&(t == 0 || millis()-t >500)){ t =millis(); manual(); } else if(millis()-t <= 800) goto tag; else manual(); } else { tag: error *= 100/(sum*2); dError=(error-last); sumError += error; vL = vB + kP*error + kD*dError + kI*sumError; vR = vB - kP*error - kD*dError - kI*sumError; if (BT.available()) { val = BT.read(); string += val; } if(error >= 150){ sumError = 0; counter = 0; } else{ counter += 1; } MotorWriting(wheel_L,wheel_R,vL,vR); } last =error; return error; } void manual() { if(string[i] == '\0'){ while(1) {MotorWriting(wheel_L,wheel_R,0,0); delay(10000);} } if(string[i] != Forward){ MotorWriting(wheel_L,wheel_R,0,0); delay(300); } if(string[i] == Right){ /* MotorWriting(wheel_L,wheel_R,0,0); delay(500); MotorWriting(wheel_L,wheel_R,-80,-80); delay(350); MotorWriting(wheel_L,wheel_R,0,0); delay(100);*/ MotorWriting(wheel_L,wheel_R,0,0); delay(500); MotorWriting(wheel_L,wheel_R,200,0); delay(280); MotorWriting(wheel_L,wheel_R,200,0); delay(100); /*MotorWriting(wheel_L,wheel_R,120,-180); delay(600); MotorWriting(wheel_L,wheel_R,-180,120); delay(50); MotorWriting(wheel_L,wheel_R,0,0); delay(500); MotorWriting(wheel_L,wheel_R,70,70); delay(500);*/ /*MotorWriting(wheel_L,wheel_R,80,80); delay(100);*/ } else if(string[i] == Left){ /*MotorWriting(wheel_L,wheel_R,0,0); delay(500); MotorWriting(wheel_L,wheel_R,-80,-80); delay(80); MotorWriting(wheel_L,wheel_R,0,0); delay(100);*/ MotorWriting(wheel_L,wheel_R,0,0); delay(500); MotorWriting(wheel_L,wheel_R,0,200); delay(280); MotorWriting(wheel_L,wheel_R,0,200); delay(100); /*MotorWriting(wheel_L,wheel_R,-180,120); delay(600); MotorWriting(wheel_L,wheel_R,120,-180); delay(50); MotorWriting(wheel_L,wheel_R,0,0); delay(500); MotorWriting(wheel_L,wheel_R,70,70); delay(500);*/ /*MotorWriting(wheel_L,wheel_R,80,80); delay(100);*/ } else if(string[i] == GoBack){ while(!RFID()){ MotorWriting(wheel_L,wheel_R,0,0); MotorWriting(wheel_L,wheel_R,70,70); } MotorWriting(wheel_L,wheel_R,-180,120); delay(680); MotorWriting(wheel_L,wheel_R,120,-180); delay(50); MotorWriting(wheel_L,wheel_R,0,0); delay(500); MotorWriting(wheel_L,wheel_R,70,70); delay(500); /*MotorWriting(wheel_L,wheel_R,80,80); delay(100);*/ } else if(string[i] == Halt){ MotorWriting(wheel_L,wheel_R,0,0); delay(800); } /////// BT.write(i); //lastTime =millis(); i++; } void setup() { Serial.begin(9600); BT.begin(9600); Serial.println("BT is ready!"); SPI.begin(); mfrc522 = new MFRC522(SS_PIN, RST_PIN); mfrc522->PCD_Init(); Serial.println(F("Read UID on a MIFARE PICC:")); } double last; bool start = false; void loop() { double current =Tracking(); last =current; /*MotorWriting(wheel_L,wheel_R,-180,120); delay(680); MotorWriting(wheel_L,wheel_R,120,-180); delay(50); MotorWriting(wheel_L,wheel_R,0,0); delay(1000);*/ } ```