Untitled
unknown
plain_text
a year ago
12 kB
4
Indexable
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <EEPROM.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address int sensor[6]; int ref[6] = { 367, 360, 285, 337, 283, 308 }; //int ref[6]; int button1 = 10; int button2 = 11; int i, xsensor, var, start1, start2; int s0, s1, s2, s3, s4, s5, flag; unsigned char pwm_ka, pwm_ki; int j; const int in1 = 8; const int in2 = 9; const int in3 = 7; const int in4 = 4; const int ena_a = 5; const int ena_b = 6; int laju, kecepatan; int data_putih[6], data_gelap[6], data_sensor_depan[6]; int address = 0, address_speed = 10; void stopped() { digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } void maju(unsigned char kiri, unsigned char kanan) { pwm_ki = kiri; pwm_ka = kanan; analogWrite(ena_a, pwm_ka); analogWrite(ena_b, pwm_ki); digitalWrite(in1, HIGH); digitalWrite(in3, HIGH); digitalWrite(in2, LOW); digitalWrite(in4, LOW); } void mundur(unsigned char kiri, unsigned char kanan) { pwm_ki = kiri; pwm_ka = kanan; analogWrite(ena_a, pwm_ka); analogWrite(ena_b, pwm_ki); digitalWrite(in1, LOW); digitalWrite(in3, LOW); digitalWrite(in2, HIGH); digitalWrite(in4, HIGH); } void bel_ka(unsigned char kiri, unsigned char kanan) { pwm_ki = kiri; pwm_ka = kanan; analogWrite(ena_a, pwm_ka); analogWrite(ena_b, pwm_ki); digitalWrite(in1, LOW); digitalWrite(in3, HIGH); digitalWrite(in2, HIGH); digitalWrite(in4, LOW); } void bel_ki(unsigned char kiri, unsigned char kanan) { pwm_ki = kiri; pwm_ka = kanan; analogWrite(ena_a, pwm_ka); analogWrite(ena_b, pwm_ki); digitalWrite(in1, HIGH); digitalWrite(in3, LOW); digitalWrite(in2, LOW); digitalWrite(in4, HIGH); } void baca_button() { start1 = digitalRead(button1); start2 = digitalRead(button2); } void baca_sensor() { sensor[0] = analogRead(A0); sensor[1] = analogRead(A1); sensor[2] = analogRead(A2); sensor[3] = analogRead(A3); sensor[4] = analogRead(A6); sensor[5] = analogRead(A7); } void convert_sensor() { baca_sensor(); /*for(i=0;i<=5;i++){ ref[i]=EEPROM.read(i); }*/ xsensor = 63; xsensor &= 63; if (sensor[0] < ref[0]) { s0 = 0; var = 1; } else { s0 = 1; var = 0; flag = 1; } xsensor &= ~var; if (sensor[1] < ref[1]) { s1 = 0; var = 2; } else { s1 = 1; var = 0; } xsensor &= ~var; if (sensor[2] < ref[2]) { s2 = 0; var = 4; } else { s2 = 1; var = 0; } xsensor &= ~var; if (sensor[3] < ref[3]) { s3 = 0; var = 8; } else { s3 = 1; var = 0; } xsensor &= ~var; if (sensor[4] < ref[4]) { s4 = 0; var = 16; } else { s4 = 1; var = 0; } xsensor &= ~var; if (sensor[5] < ref[5]) { s5 = 0; var = 32; } else { s5 = 1; var = 0; flag = 0; } xsensor &= ~var; } void tampil_sensor() { convert_sensor(); lcd.setCursor(0, 1); lcd.print(s5); lcd.print(s4); lcd.print(s3); lcd.print(s2); lcd.print(s1); lcd.print(s0); } void tes_sensor() { baca_sensor(); lcd.setCursor(0, 0); lcd.print(sensor[5]); lcd.setCursor(4, 0); lcd.print(sensor[4]); lcd.setCursor(8, 0); lcd.print(sensor[3]); lcd.setCursor(12, 0); lcd.print(sensor[2]); lcd.setCursor(0, 1); lcd.print(sensor[1]); lcd.setCursor(4, 1); lcd.print(sensor[0]); delay(400); lcd.clear(); } void kalibrasi() { lcd.clear(); lcd.setCursor(5, 1); lcd.print("PUTIH"); delay(80); baca_button(); while (start1) { baca_button(); } while (!start1) { baca_button(); lcd.clear(); } baca_sensor(); data_putih[0] = sensor[0]; data_putih[1] = sensor[1]; data_putih[2] = sensor[2]; data_putih[3] = sensor[3]; data_putih[4] = sensor[4]; data_putih[5] = sensor[5]; lcd.clear(); lcd.setCursor(5, 1); lcd.print("HITAM"); delay(80); baca_button(); while (start1) { baca_button(); } while (!start1) { baca_button(); lcd.clear(); } baca_sensor(); data_gelap[0] = sensor[0]; data_gelap[1] = sensor[1]; data_gelap[2] = sensor[2]; data_gelap[3] = sensor[3]; data_gelap[4] = sensor[4]; data_gelap[5] = sensor[5]; delay(5); for (i = 0; i <= 5; i++) { ref[i] = ((data_gelap[i] - data_putih[i]) / 2) + data_putih[i]; EEPROM.write(address, ref[i]); address++; if (address == 6) { address = 0; } } lcd.clear(); lcd.setCursor(6, 1); lcd.print("DONE"); delay(1000); lcd.clear(); } void pid(unsigned char simpan) { unsigned int kec_maks = 175; unsigned int kec_min = 100; float kp = 2.1; //6 float kd = 1.2; //10 static unsigned char ki = 0; //146.5 //300 1130 1730 750 static int error, lastError, Error, LastError, SumError, right_speed, left_speed; convert_sensor(); switch (xsensor) { case 7: error = -7; break; case 1: error = -6; break; case 3: error = -5; break; case 2: error = -4; break; case 6: error = -3; break; case 4: error = -2; break; case 28: error = 1; break; case 0b001100: error = 0; break; case 14: error = 1; break; case 8: error = 2; break; case 24: error = 3; break; case 16: error = 4; break; case 48: error = 5; break; case 32: error = 6; break; case 56: error = 7; break; case 0: if (flag == 0) { error = 8; } else { error = -8; } break; } int SetPoint = 0; // Setpoint yang diinginkan Error = SetPoint - error; int outPID = kp * 0.1 * Error + kd * (Error - lastError) + ki * 0.1; lastError = Error; double motorKi = simpan - outPID; // Motor Kiri double motorKa = simpan + outPID; // Motor Kanan tampil_sensor(); /*** Pembatasan kecepatan ***/ if (motorKi > kec_maks) motorKi = kec_maks; if (motorKi < kec_min) motorKi = kec_min; if (motorKa > kec_maks) motorKa = kec_maks; if (motorKa < kec_min) motorKa = kec_min; if (motorKi == motorKa) { maju(simpan, simpan); lcd.setCursor(10, 0); lcd.print("F "); } else if (motorKi > motorKa) { bel_ki(motorKi, motorKa); lcd.setCursor(10, 0); lcd.print("L "); } else if (motorKa > motorKi) { bel_ka(motorKi, motorKa); lcd.setCursor(10, 0); lcd.print("R "); } } void pid_mundur(unsigned char simpan) { unsigned int kec_maks = 130; unsigned int kec_min = 80; float kp = 2.1; //6 float kd = 1.2; //10 static unsigned char ki = 0; //146.5 //300 1130 1730 750 static int error, lastError, Error, LastError, SumError, right_speed, left_speed; convert_sensor(); switch (xsensor) { case 7: error = -7; break; case 1: error = -6; break; case 3: error = -5; break; case 2: error = -4; break; case 6: error = -3; break; case 4: error = -2; break; case 28: error = 1; break; case 12: error = 0; break; case 14: error = 1; break; case 8: error = 2; break; case 24: error = 3; break; case 16: error = 4; break; case 48: error = 5; break; case 32: error = 6; break; case 56: error = 7; break; case 0: if (flag == 0) { error = 8; } else { error = -8; } break; } int SetPoint = 0; // Setpoint yang diinginkan Error = SetPoint - error; int outPID = kp * 0.1 * Error + kd * (Error - lastError) + ki * 0.1; lastError = Error; double motorKi = simpan - outPID; // Motor Kiri double motorKa = simpan + outPID; // Motor Kanan tampil_sensor(); /*** Pembatasan kecepatan ***/ if (motorKi > kec_maks) motorKi = kec_maks; if (motorKi < kec_min) motorKi = kec_min; if (motorKa > kec_maks) motorKa = kec_maks; if (motorKa < kec_min) motorKa = kec_min; if (motorKi == motorKa) { mundur(simpan, simpan); lcd.setCursor(10, 0); lcd.print("RF "); } else if (motorKi > motorKa) { bel_ki(motorKi, motorKa); lcd.setCursor(10, 0); lcd.print("L "); } else if (motorKa > motorKi) { bel_ka(motorKi, motorKa); lcd.setCursor(10, 0); lcd.print("R "); } } void kanan() { while (1) { pid(110); if (s5 && s0) break; } rem(); maju(100, 100); delay(50); //120 while (1) { bel_ka(110, 140); convert_sensor(); if (!s0 && !s1 && !s2 && !s3 && !s4 && !s5) break; } while (1) { bel_ka(80, 120); convert_sensor(); if (s1 || s2) break; } } void kiri() { while (1) { pid(110); if (s5 && s0) break; } rem(); maju(100, 100); delay(50); //120 while (1) { bel_ki(140, 120); convert_sensor(); if (!s0 && !s1 && !s2 && !s3 && !s4 && !s5) break; } while (1) { bel_ki(150, 110); convert_sensor(); if (s4 || s3) break; } } void siku_kanan() { while (1) { pid(110); if ((s3 && s2 && s1 && s0) || (s2 && s1 && s0) || (s2 && s1 && s3)) break; } rem(); maju(100, 100); delay(50); //120 while (1) { bel_ka(110, 140); convert_sensor(); if (!s0 && !s1 && !s2 && !s3 && !s4 && !s5) break; } while (1) { bel_ka(80, 120); convert_sensor(); if (s1 || s2) break; } } void siku_kiri() { while (1) { pid(110); if ((s5 && s4 && s3 && s2) || (s4 && s3 && s2) || (s5 && s4 && s3)) break; } rem(); maju(100, 100); delay(30); //120 while (1) { bel_ki(140, 120); convert_sensor(); if (!s0 && !s1 && !s2 && !s3 && !s4 && !s5) break; } while (1) { bel_ki(150, 110); convert_sensor(); if (s4 || s3) break; } } void pertigaan_kiri() { while (1) { pid(100); if (s5 && s4 && s3) break; } maju(100, 100); delay(70); stopped(); delay(100); while (1) { bel_ki(190, 130); convert_sensor(); if (s5) break; } } void pertigaan_kanan() { while (1) { pid(120); if ((s3 && s2 && s1 && s0) || (s2 && s1 && s0) || (s2 && s1 && s3)) break; } rem(); maju(100, 100); delay(50); while (1) { bel_ka(110, 140); convert_sensor(); if (!s0 && !s1 && !s2 && !s3 && !s4 && !s5) break; } while (1) { bel_ka(80, 120); convert_sensor(); if (s1 || s2) break; } } void lurus() { while (1) { pid(120); if (s1 && s5 || s1 || s5) break; } while (1) { maju(100, 100); delay(100); convert_sensor(); if (s1 || s2 || s3 || s4) break; } } void berhenti_putih() { while (1) { pid(120); if (!s0 && !s1 && !s2 && !s3 && !s5 && !s4) break; } while (1) { stopped(); break; } } void berhenti_hitam() { while (1) { pid(110); if (s0 && s5) break; } while (1) { stopped(); break; } rem(); } void putar_balik() { while (1) { bel_ka(140, 140); convert_sensor(); if (!s0 && !s1 && !s2 && !s3 && !s4 && !s5) break; } rem(); while (1) { convert_sensor(); bel_ka(100, 110); if (s0 || s1) break; } } void putar_balik2() { while (1) { bel_ka(100, 170); delay(850); break; } while (1) { convert_sensor(); bel_ka(100, 170); if (s0 || s1) { break; } } } void mundur_perempatan_kiri() { while (1) { pid_mundur(110); if (s5 || s0) break; } rem(); maju(100, 100); delay(90); //120 while (1) { bel_ki(110, 140); convert_sensor(); if (!s0 && !s1 && !s2 && !s3 && !s4 && !s5) break; } while (1) { bel_ki(80, 120); convert_sensor(); if (s3 || s4) break; } } void rem() { mundur(150, 150); delay(50); stopped(); } void setup() { lcd.begin(); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(ena_a, OUTPUT); pinMode(ena_b, OUTPUT); pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP); lcd.setCursor(0, 0); lcd.print(" Project UAS "); lcd.setCursor(0, 1); lcd.print("Line Follower "); delay(1000); lcd.clear(); } void loop() { lcd.setCursor(0, 0); lcd.print("1.Sensor"); lcd.setCursor(0, 1); lcd.print("2.Start"); baca_button(); while (start1 && start2) { baca_button(); } if (!start1) { while (!start1) { tes_sensor(); } } else if (!start2) { delay(100); lcd.clear(); while (!start2) { baca_button(); } while (1) { pid(150); pertigaan_kanan(); pertigaan_kiri(); kanan(); delay(40); pertigaan_kiri(); kanan(); delay(50); kiri(); kanan(); kiri(); berhenti_hitam(); while (1) { stopped(); } } } }
Editor is loading...
Leave a Comment