BERBAGI

ZONADUINO- Robot dizaman yang sudah canggih ini mungkin tak asing lagi bagi kawan-kawan pecinta Arduino. Nah, pada kesempatan kali ini juga Admin ingin membagikan kepada kawan-kawan pecinta Arduino untuk mengulas lebih tajam setajam pacul:D tentang “Cara Membuat Robot Line Followers Menggunakan Arduino” Untuk itu silahkan analisa terlebih dahulu cara kerja dari Robot tersebut :

Oke tujuan pada project kali ini adalah bagaimana cara menciptakan atau membuat sebuah robot line follower bagi kawan-kawan yang sedang belajar, dalam masa percobaan dan menerapkan kontrol PID, tentunya dengan cara yang mudah dan harga yang pas.

Cara Kerja Robot Line Followers
Sensor IR dipasang di depan robot digunakan sebagai sensor utama digital yang masing-masing sensor tersebut akan mengirimkan signal 1 (HIGH) atau 0 (LOW), tergantung pada lingkungan sekitarnya. Sebuah deskripsi singkat tentang bagaimana sensor ini bekerja adalah sebagai berikut: pada dasarnya setiap sensor terdiri dari kedua IR pemancar dan penerima IR. cahaya inframerah / sinar yang dipancarkan dari IR pemancar dan ketika dalam jarak dekat mengenai suatu objek kemudian dipantulkan kembali dan diterima oleh penerima sensor IR.

Langsung saja kita masuk ke pembahasan.

Alat dan Bahan:

  1. Arduino UNO & Genuino UNO × 1
  2. SparkFun Dual H-Bridge motor drivers L298 × 1
  3. 9V battery (generic) × 1
  4. Soket Battery 9V × 1
  5. Breadboard × 1
  6. Kabel Jumper × 1
  7. IR Sensors
  8. DC motor (generic) × 1

Skema:

Coding:

float pTerm, iTerm, dTerm;
int error;
int previousError;
float kp = 11; //11
float ki = 0;
float kd = 11; //11
float output;
int integral, derivative;
int irSensors[] = {13, 12, 11, 8, 7}; //IR sensor pins
int irReadings[5];
int motor1Forward = A0;
int motor1Backward = A1;
int motor1pwmPin = 5;
int motor2Forward = A3;
int motor2Backward = A2;
int motor2pwmPin = 3;
int motor1newSpeed;
int motor2newSpeed;
int motor2Speed = 70; //Default 70
int motor1Speed = 120; //Default 120

void setup() {
  //Declare all IR sensors as inputs
  for (int pin = 0; pin < 5; pin++) {
    int pinNum = irSensors[pin];
    pinMode(pinNum, INPUT);
  }
  pinMode(motor1Forward, OUTPUT);
  pinMode(motor1Backward, OUTPUT);
  pinMode(motor1pwmPin, OUTPUT);
  pinMode(motor2Forward, OUTPUT);
  pinMode(motor2Backward, OUTPUT);
  pinMode(motor2pwmPin, OUTPUT);
}

void loop() {
  //Put all of our functions here
  readIRSensors();
  calculateError();
  pidCalculations();
  changeMotorSpeed();
}

void readIRSensors() {
  //Read the IR sensors and put the readings in irReadings array
  for (int pin = 0; pin < 5; pin++) {
    int pinNum = irSensors[pin];
    irReadings[pin] = digitalRead(pinNum);
  }
}

void calculateError() {
  //Determine an error based on the readings
  if ((irReadings[0] == 0) && (irReadings[1] == 0) && (irReadings[2] == 0) && (irReadings[3] == 0) && (irReadings[4] == 1)) {
    error = 4;
  } else if ((irReadings[0] == 0) && (irReadings[1] == 0) && (irReadings[2] == 0) && (irReadings[3] == 1) && (irReadings[4] == 1)) {
    error = 3;
  } else if ((irReadings[0] == 0) && (irReadings[1] == 0) && (irReadings[2] == 0) && (irReadings[3] == 1) && (irReadings[4] == 0)) {
    error = 2;
  } else if ((irReadings[0] == 0) && (irReadings[1] == 0) && (irReadings[2] == 1) && (irReadings[3] == 1) && (irReadings[4] == 0)) {
    error = 1;
  } else if ((irReadings[0] == 0) && (irReadings[1] == 0) && (irReadings[2] == 1) && (irReadings[3] == 0) && (irReadings[4] == 0)) {
    error = 0;
  } else if ((irReadings[0] == 0) && (irReadings[1] == 1) && (irReadings[2] == 1) && (irReadings[3] == 0) && (irReadings[4] == 0)) {
    error = -1;
  } else if ((irReadings[0] == 0) && (irReadings[1] == 1) && (irReadings[2] == 0) && (irReadings[3] == 0) && (irReadings[4] == 0)) {
    error = -2;
  } else if ((irReadings[0] == 1) && (irReadings[1] == 1) && (irReadings[2] == 0) && (irReadings[3] == 0) && (irReadings[4] == 0)) {
    error = -3;
  } else if ((irReadings[0] == 1) && (irReadings[1] == 0) && (irReadings[2] == 0) && (irReadings[3] == 0) && (irReadings[4] == 0)) {
    error = -4;
  } else if ((irReadings[0] == 0) && (irReadings[1] == 0) && (irReadings[2] == 0) && (irReadings[3] == 0) && (irReadings[4] == 0)) {
    if (previousError == -4) {
      error = -5;
    } else {
      error = 5;
    }
  } else if ((irReadings[0] == 1) && (irReadings[1] == 1) && (irReadings[2] == 1) && (irReadings[3] == 1) && (irReadings[4] == 1)) {
    error = 0;
  }
}

void pidCalculations() {
  pTerm = kp * error;
  integral += error;
  iTerm = ki * integral;
  derivative = error - previousError;
  dTerm = kd * derivative;
  output = pTerm + iTerm + dTerm;
  previousError = error;
}

void changeMotorSpeed() {
  //Change motor speed of both motors accordingly
  motor2newSpeed = motor2Speed + output;
  motor1newSpeed = motor1Speed - output;
  //Constrain the new speed of motors to be between the range 0-255
  constrain(motor2newSpeed, 0, 255);
  constrain(motor1newSpeed, 0, 255);
  //Set new speed, and run motors in forward direction
  analogWrite(motor2pwmPin, motor2newSpeed);
  analogWrite(motor1pwmPin, motor1newSpeed);
  digitalWrite(motor2Forward, HIGH);
  digitalWrite(motor2Backward, LOW);
  digitalWrite(motor1Forward, HIGH);
  digitalWrite(motor1Backward, LOW);
}

LEAVE A REPLY