# 節點控制 RFID ``` arduino= #include <SoftwareSerial.h> #include <SPI.h> #include <MFRC522.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 = 1.4; double kI = 0.02; double kD = 5; int vB = 80; int counter = 0; String string = ""; char val; char Forward = '1'; char Right = '3'; char Left = '4'; char GoBack = '2'; char Halt = '5'; 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:**")); mfrc522->PICC_DumpDetailsToSerial(&(mfrc522->uid)); mfrc522->PICC_HaltA(); mfrc522->PCD_StopCrypto1(); return true; } return false; } /*void translate(double target) { int output =target < 0 ? -1*target : target; int output2 =target < 0 ? int(-100*target)%100 : int(100*target)%100; Serial.println(target); if(target < 0) BT.write('-'); int temp[10] ={}; int i =0; for(; output > 0; ++i) { temp[i] +=output%10; output /=10; } for(;i >= 0; --i) BT.write(temp[i]+48); BT.write('.'); BT.write(output2/10+48); BT.write(output2%10+48); BT.write("\n"); }*/ 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; if(sum!=0){ error *= 100/(sum*2); dError=(error-last); sumError += error; int vL=0,vR=0; /*if(error<15 || error>-15){ vL = vB + 1*error ;//+ 3*dError; vR = vB - 1*error ;//- 3*dError; } else{ vL = vB + kP*error + kD*dError + kI*sumError; vR = vB - kP*error - kD*dError - kI*sumError; }*/ vL = vB + kP*error + kD*dError + kI*sumError; vR = vB - kP*error - kD*dError - kI*sumError; if (BT.available()) { val = BT.read(); string += val; } static int i=0; if(sum == 5){ if(string[i] == Forward){ MotorWriting(wheel_L,wheel_R,80,80); delay(800); } if(string[i] == Right){ MotorWriting(wheel_L,wheel_R,125,-75); delay(800); } if(string[i] == Left){ MotorWriting(wheel_L,wheel_R,-75,125); delay(800); } if(string[i] == GoBack){ while(!RFID()){ MotorWriting(wheel_L,wheel_R,50,50); } MotorWriting(wheel_L,wheel_R,125,-125); delay(800); } i++; } if(error >= 150){ //sumError = 0; counter = 0; } else{ counter += 1; } MotorWriting(wheel_L,wheel_R,vL,vR); } else { MotorWriting(wheel_L,wheel_R,-75,-75); sumError = 0; } /*translate(error); translate(dError); translate(0.2*sumError); BT.write("\n\n\n");*/ last =error; return error; } 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; void loop() { double current =Tracking(); last =current; } ```