Robot Sederhana
Latar Belakang
Membuat robot sederhana dengan sensor ultrasonik, dua buah motor DC dengan driver L293 dan 3 buah sensor Ultrasonik ini adalah permintaan dari teman visitor mikroavr.com, alih alih ternyata orang medan juga, sama dengan saya.
Semua sudah ada, termasuk robot nya, saya hanya di minta buat program nya saja. Cara kerja nya cukup mudah, memiliki rule atau aturan yang sudah di tetapkan. Intinya adalah menghindari halangan.
Sensor jarak berfungsi untuk deteksi apakah halangan ada jarak sekian di sebelah kiri? kanan? atau depan.? jarak ini lah yang akan menentukan Robot Sederhana ini berputar atau berbelok ke arah mana.
Rule Robot
Setiap robot yang di rancang, apalagi robot sederhana,memiliki rule, bagaimana robot akan bekerja. Untuk itu kami membuat rule nya dulu. Rule ini lah yang akan di jadikan sebagai logaritma Pemrograman.
Untuk rule nya terbagi menjadi dua, pertama dari sisi jarak, kemudian dari kondisi hasil cacah sensor ultrasonik.
Rule pertama adalah jika jarak lebih lebih besar atau sama dengan 0 dan lebih kecil dari 15cm maka di anggap logika 1, sebalik nya, jika jarak lebih besar dari 15cm maka di anggap logika 0. Kondisi ini akan kita cacah, sehingga kondisi 3 sensor hanya menjadi dua kondisi, logika 0 atau logika satu.
Rule ke dua Ketika setelah di cacah, maka jadi lah tabel di bawah ini.
KIRI | TENGAH | KANAN | AKSI |
0 | 0 | 0 | MAJU |
0 | 0 | 1 | MAJU |
0 | 1 | 0 | PUTAR KANAN |
0 | 1 | 1 | PUTAR KIRI |
1 | 0 | 0 | MAJU |
1 | 0 | 1 | MAJU |
1 | 1 | 0 | PUTAR KANAN |
1 | 1 | 1 | PUTAR KANAN |
Setelah kita dapat logaritma di atas, sekarang adalah pengujian sensor
Pengujian Hardware
Sebelum kita menguji sensor nya, perhatikan program di bawah ini,
const byte IN1 = 2; //kontrol motor kiri ke port 2 const byte IN2 = 3; //kontrol motor kiri ke port 3 const byte IN3 = 4; //kontorl motor kanan ke port 4 const byte IN4 = 5; //kontorl motor kanan ke port 5 const byte Echo_kiri = 12; const byte Trig_kiri = 13; const byte Echo_kanan = A0; const byte Trig_kanan = A1; const byte Echo_depan = 8; const byte Trig_depan = 9;
Program di atas adalah konfigurasi antara motor DC dengan driver L293. Begitu juga dengan 3 sensor ultrasonik. Perhatikan pin nya terhubung ke mana. Untuk rangkain l293 bisa di lihat pada gambar rangkaian di bawah ini.
Perhatikan pin 2 dan pin 7 IC L293, begitu juga pin 15 dan 10, itu adalah pin control untuk kendali motor DC, yang terhubung ke Arduino nanti nya. Untuk configurasi nya bisa dilihat di cuplikan program di atas.
Uji Motor DC
Agar nanti program final Robot Sederhana kita berjalan dengan baik, Kita uji dulu Motor DC nya, apakah sudah berputar seperti yang kita program? Program uji nya bisa dilihat pada program di bawah ini.
const byte IN1 = 2; //kontrol motor kiri ke port 2 const byte IN2 = 3; //kontrol motor kiri ke port 3 const byte IN3 = 4; //kontorl motor kanan ke port 4 const byte IN4 = 5; //kontorl motor kanan ke port 5 void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { maju(); delay(3000); mundur(); delay(3000); putarkiri(); delay(3000); putarkanan(); delay(3000); berhenti(); delay(3000); } void maju() { // menggerakkan motor kiri maju digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // menggerakkan motor kanan maju digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void mundur() { // menggerakkan motor kiri mundur digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // menggerakkan motor kanan mundur digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void putarkiri() // motor kanan maju, kiri mundur { // menggerakkan motor kiri mundur digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // menggerakkan motor kanan maju digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void putarkanan() // motor KIRI maju, kanan mundur { // menggerakkan motor kiri maju digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // menggerakkan motor kanan mundur digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void berhenti() { // now turn off motors digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); }
Coba di upload ke arduino uno nya, lihat putaran motor DC, apakah sesuai dengan yang di program? Maju, Mundur, Kiri, Kanan, dan berhenti? jika sudah siap. Silahkan simpan program nya kemudian, kita lanjutkan program uji sensor ultrasonik nya.
Program uji motor DC sudah kami lakukan dan berhasil
Uji Sensor Ultrasonik
Tahapan selanjut nya adalah uji sensor jarak. Disini kita menggunakan 3 jenis sensor jarak ultrasonik. ketiga sensor ini harus berhasil deteksi jarak. Jika tidak maka program final akan menjadi fail, error, program akan tidak bekerja dengan normal. Pembahasan sensor jarak ini bisa di pelajari langsung di link di bawah ini. Cukup tekan tombol merah di bawah
Program pengujian nya sebagai berikut,
const byte Echo_kiri = 12; const byte Trig_kiri = 13; const byte Echo_kanan = A0; const byte Trig_kanan = A1; const byte Echo_depan = 8; const byte Trig_depan = 9; long duration; int distance; int dis_kiri; int dis_kanan; int dis_depan; bool dt_kiri, dt_kanan, dt_depan; byte bit_control; String data_sensor; void setup() { pinMode(Echo_kiri, INPUT); pinMode(Echo_kanan, INPUT); pinMode(Echo_depan, INPUT); pinMode(Trig_kiri, OUTPUT); pinMode(Trig_kanan, OUTPUT); pinMode(Trig_depan, OUTPUT); Serial.begin(9600); Serial.println(F("Mulai Baca sensor")); delay(2000); } void loop() { print_data(); delay(1000); } void baca_sensor(int trigPin, int echoPin){ digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin,LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034/2; } void get_data(){ baca_sensor(Trig_kiri,Echo_kiri); dis_kiri = distance; baca_sensor(Trig_kanan,Echo_kanan); dis_kanan = distance; baca_sensor(Trig_depan,Echo_depan); dis_depan = distance; } void print_data(){ get_data(); data_sensor = String("kiri: ")+ dis_kiri + ("depan: ") + dis_depan + ("kanan: ") + dis_kanan; Serial.println(data_sensor); }
Setelah program di atas teman-teman ketik di Arduino IDE nya, baru upload ke arduino uno nya. Buka serial monitor, kemudian check data-data jarak nya, apakah jalan? apakah tiap sensor nya membaca jarak. Jika tidak perhatikan pin pin configurasi sensor ultrasonik dengan arduino nya. Pengujian yang kami lakukan berhasil.
Program Final Robot Sederhana
Setelah semua langkah di atas terpenuhi, bagaimana kah program final nya? nah ingat acuan kita adalah rule yang sudah kita tetapkan di atas. Rule yang akan kita jadi kan program utama. Silahkan teman-teman scroll lagi ke atas untuk melihat logaritma nya.
Program final nya sebagai berikut.
const byte IN1 = 2; //kontrol motor kiri ke port 2 const byte IN2 = 3; //kontrol motor kiri ke port 3 const byte IN3 = 4; //kontorl motor kanan ke port 4 const byte IN4 = 5; //kontorl motor kanan ke port 5 const byte Echo_kiri = 12; const byte Trig_kiri = 13; const byte Echo_kanan = A0; const byte Trig_kanan = A1; const byte Echo_depan = 8; const byte Trig_depan = 9; const byte limit_jarak = 15; long duration; int distance; int dis_kiri; int dis_kanan; int dis_depan; bool dt_kiri, dt_kanan, dt_depan; byte bit_control; String data_sensor; void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(Echo_kiri, INPUT); pinMode(Echo_kanan, INPUT); pinMode(Echo_depan, INPUT); pinMode(Trig_kiri, OUTPUT); pinMode(Trig_kanan, OUTPUT); pinMode(Trig_depan, OUTPUT); Serial.begin(9600); Serial.println(F("Arduino Restart")); delay(3000); } void loop() { run_motor(); delay(40); } void baca_sensor(int trigPin, int echoPin){ digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin,LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034/2; } void get_data(){ baca_sensor(Trig_kiri,Echo_kiri); dis_kiri = distance; baca_sensor(Trig_kanan,Echo_kanan); dis_kanan = distance; baca_sensor(Trig_depan,Echo_depan); dis_depan = distance; } void cacah(){ if ( dis_kiri >= 0 && dis_kiri <= limit_jarak ){ dt_kiri = 1; } if ( dis_kiri > limit_jarak ){ dt_kiri = 0; } //------------------------------------------ if ( dis_kanan >= 0 && dis_kanan <= limit_jarak ){ dt_kanan = 1; } if ( dis_kanan > limit_jarak ){ dt_kanan = 0; } //------------------------------------------ if ( dis_depan >= 0 && dis_depan <= limit_jarak ){ dt_depan = 1; } if ( dis_depan > limit_jarak ){ dt_depan = 0; } } void control(){ if ( dt_kiri == 0 && dt_depan == 0 && dt_kanan == 0){ bit_control = 1; } if ( dt_kiri == 0 && dt_depan == 0 && dt_kanan == 1){ bit_control = 2; } if ( dt_kiri == 0 && dt_depan == 1 && dt_kanan == 0){ bit_control = 3; } if ( dt_kiri == 0 && dt_depan == 1 && dt_kanan == 1){ bit_control = 4; } if ( dt_kiri == 1 && dt_depan == 0 && dt_kanan == 0){ bit_control = 5; } if ( dt_kiri == 1 && dt_depan == 0 && dt_kanan == 1){ bit_control = 6; } if ( dt_kiri == 1 && dt_depan == 1 && dt_kanan == 0){ bit_control = 7; } if ( dt_kiri == 1 && dt_depan == 1 && dt_kanan == 1){ bit_control = 8; } data_sensor = String("Kr: ") + dis_kiri +(" /")+ ("T: ") + dis_depan +(" /") + ("Kn: ") + dis_kanan; Serial.println(data_sensor); data_sensor = String("DT_Kr: ") + dt_kiri +(" /")+ ("DT_T: ") + dt_depan +(" /") + ("DT_Kn: ") + dt_kanan; Serial.println(data_sensor); data_sensor = String("bit: ") + bit_control; Serial.println(data_sensor); } void run_motor(){ get_data(); cacah(); control(); switch(bit_control){ case 1: maju(); break; case 2: maju(); break; case 3: putarkanan(); break; case 4: putarkiri(); break; case 5: maju(); break; case 6: maju(); break; case 7: putarkanan(); break; case 8: putarkanan(); break; } } void maju() { // menggerakkan motor kiri maju digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // menggerakkan motor kanan maju digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void mundur() { // menggerakkan motor kiri mundur digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // menggerakkan motor kanan mundur digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void putarkiri() // motor kanan maju, kiri mundur { // menggerakkan motor kiri mundur digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // menggerakkan motor kanan maju digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void putarkanan() // motor KIRI maju, kanan mundur { // menggerakkan motor kiri maju digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // menggerakkan motor kanan mundur digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void berhenti() { // now turn off motors digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); }
Nah program di atas sudah kami uji, dan berhasil. Memang ada satu kelemahan, yaitu control speed yang belum di gabung di dalam. Maksud nya adalah, ketika motor berputar, speed nya tidak melambat. Semua ini karena estimasi waktu yang harus segera di selesaikan.
Silahkan teman-teman kembangkan robot di atas. Seperti robot pengikut garis dan lain lain.
Thanks, semoga bermanfaat
Learning and sharing