---
# System prepended metadata

title: 4/29-30

---

# 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);*/
}
```