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 :
https://www.youtube.com/watch?v=67vKmmUJT3Q
https://www.youtube.com/watch?v=HZi6r7K8YgI
https://www.youtube.com/watch?v=dw8ToA1B6kU
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:
- Arduino UNO & Genuino UNO × 1
- SparkFun Dual H-Bridge motor drivers L298 × 1
- 9V battery (generic) × 1
- Soket Battery 9V × 1
- Breadboard × 1
- Kabel Jumper × 1
- IR Sensors
- 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);
}