Untitled
unknown
plain_text
a year ago
12 kB
9
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