---
# System prepended metadata

title: '0407'

---

# 0407

```arduino=
#include <SoftwareSerial.h>

double kP = 0;
double kI = 0.00;
double kD = 0;
int vB = 70;

int counter = 0;



class wheel
{
  const int EN;
  const int IN1;
  const int IN2;

 public:
  wheel(int, int, int);
  wheel power(int);
};

wheel wheel::power(int P)
{
  if(P > 255)
    P =255;
   else if(P < -255)
    P =-255;

  if(P >= 0){//go straight Or Stop
    analogWrite(EN, P);
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
  }
  else{//go back
    analogWrite(EN, -P);
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
  }
    
  return *this;
}

wheel::wheel(int a, int b, int c)
  :EN(a), IN1(b), IN2(c)
{
   pinMode(EN, OUTPUT);
   pinMode(IN1, OUTPUT);
   pinMode(IN2, OUTPUT);
}

void MotorWriting(wheel wheel_L, wheel wheel_R, int vL, int vR){
  wheel_L.power(vL);
  wheel_R.power(vR);
}


#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); // 接收腳, 傳送腳
char val;  // 儲存接收資料的變數

wheel wheel_L(L_ENA, L_IN1, L_IN2);
wheel wheel_R(L_ENB, L_IN3, L_IN4);


void MotorCheck(){
  //forward
  MotorWriting(wheel_L, wheel_R, 100, 100);
  delay(1500);
  //stop
  MotorWriting(wheel_L, wheel_R, 0, 0);
  delay(1500);
  //back
  MotorWriting(wheel_L, wheel_R, -100, -100);
  delay(1500);
  //turn right
  MotorWriting(wheel_L, wheel_R, 100, -60);
  delay(1500);
  //turn left
  MotorWriting(wheel_L, wheel_R, -60, 100);
  delay(1500);
}

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 error=l3*-2 + l2*-1 + r2*1 + r3*2;
  int sum=l3 + l2 + m + r2 + r3;
  
  if(sum!=0){
    error *= 100/(sum*2);
    double dError=(error-last);
    sumError += error;
    int vL = vB + kP*error + kD*dError + kI*sumError;
    int vR = vB - kP*error - kD*dError - kI*sumError;

  if(counter >= 150){
    sumError = 0;
    counter = 0;
    //Serial.println(counter);
    //Serial.println("sumError =", sumError);
    Serial.println(dError);Serial.println(error);
    Serial.println(" ");
    
  }
  else{
    counter += 1;
    //Serial.println(counter);
    //Serial.println(sumError);  
     Serial.println(dError);Serial.println(error);Serial.println(" ");
  }
  
    if (Serial.available()) {
      val = Serial.read();
    BT.write(val);
    BT.write(error);
    
    BT.write(dError);
    
    BT.write(sumError);
    
    BT.write(" ");
    }
    
    /*Serial.println(error);
    Serial.println(dError);*/
    
    //Serial.println(" ");
    MotorWriting(wheel_L,wheel_R,vL,vR);
  }
  else
  {
    MotorWriting(wheel_L,wheel_R,-150,-150);
  }

  last =error;
  
  return error;
  
}



void setup() {
   Serial.begin(9600);
   BT.begin(9600);  
   Serial.println("BT is ready!");
}

double last;

void loop() {
  double current =Tracking();
  

  last =current;

  //delay(10);
}
'''