Pada Sore kali ini Whitecyber Team kembali sharing seputar pembuatan ROBOT !
Robot ? Huumb .. Robot …
Kamu suka mainan Robot kan, waktu masih kecil, sekarang saatnya kita akan membuatnya ..
Project yang kita kerjakan ini kita kasih nama : Project Membuat Robot Pengikut Garis ( Line Follower Robot ) – Arduino.
.
.
Sensor pelacakan garis IR terdiri dari modul analog ke digital dan komparator serta Papan Breakout Sensor IR TCRT5000. Cahaya IR yang dipancarkan oleh LED mengenai permukaan dan dipantulkan kembali ke fotodioda IR. Fotodioda kemudian memberikan tegangan keluaran sebanding dengan reflektansi permukaan (nilai tinggi untuk permukaan terang dan rendah untuk permukaan hitam / gelap).
Robot pengikut garis ini cukup lurus ke depan. Robot-robot ini memiliki kemampuan untuk mendeteksi garis hitam/gelap pada permukaan yang lebih terang tergantung pada kontrasnya. Mereka memperkirakan apakah garis di bawahnya bergeser ke kiri/kanan saat mereka bergerak melewatinya. Berdasarkan perkiraan tersebut, mereka memberikan sinyal masing-masing kepada motor untuk berbelok ke kiri/kanan agar tetap stabil di tengah garis.
.
.
Robot-robot ini biasanya menggunakan serangkaian sensor IR (Inframerah) untuk menghitung pantulan permukaan di bawahnya. Kriteria dasarnya adalah bahwa garis hitam akan memiliki nilai reflektansi yang lebih rendah (hitam menyerap cahaya) dibandingkan permukaan terang di sekitarnya. Nilai reflektansi yang rendah inilah yang menjadi parameter yang digunakan untuk mendeteksi posisi garis oleh robot. Semakin tinggi nilai reflektansi permukaan di sekitar garis. Jadi dalam susunan sensor IR linier ini, jika sensor IR paling kiri/paling kanan menunjukkan nilai reflektansi yang rendah, maka garis hitam juga mengarah ke kiri/kanan robot. Pengendali kemudian mengkompensasi hal ini dengan memberi sinyal pada motor untuk bergerak ke arah yang berlawanan dengan garis.
.
Langkah 1: Perencanaan Material
.
.
.
Untuk tutorial ini, kami memerlukan item berikut:
1.Arduino UNO
2. Sasis Mobil Pintar 2WD 2 Roda
3. Driver Motor DC Mini Arduino Kontrol PW H-Bridge Ganda (L293D)
4. Sensor Pelacakan Garis IR (4 bit)
5. Baterai
6. Pita sisi ganda
7. Kabel
8. Kawat pelompat
9. Pita hitam
.
.
Langkah 2: Instalasi Perangkat Keras
.
.
1. Rakit Sasis Mobil Pintar 2WD 2 Roda
2. Hubungkan sensor IR ke Modul Analog ke Digital dan Komparator
IN1 > Sensor IR 1
IN2 > Sensor IR 2
IN3 > Sensor IR 3
IN4 > Sensor IR 4
3. Kemudian sambungkan pin output ke pin analog Arduino UNO
KELUAR1 > A2
KELUAR2 > A3
KELUAR3 > A4
KELUAR4 > A5
4. Hubungkan Vin ke 5V dan GND ke GND di Arduino UNO
5. Kemudian sambungkan pin driver motor ke pin Arduino UNO
DALAM1 > D10
DALAM2 > D9
DALAM3 > D6
DALAM4 > D5
6. Hubungkan kedua motor ke driver motor
Motor A > Motor kanan
Motor B > Motor kiri
Setelah koneksi selesai, sambungkan Arduino ke catu daya dengan kabel USB.
.
Langkah 3: Masukkan Kode Sumber
.
1. Download kode tes dan buka dengan menggunakan software Arduino atau IDE.
2. Pastikan Anda telah memilih papan yang tepat dan port yang sesuai. (Dalam tutorial ini, Arduino Uno digunakan)
3. Kemudian upload kode tes ke Arduino Uno Anda.
.
Kode Test
. /************************************* * Line Follower Robot* * Code Written by MYBOTIC * *************************************/ #define SEN_1_PIN A2 #define SEN_2_PIN A3 #define SEN_3_PIN A4 #define SEN_4_PIN A5 #define IN1 10 #define IN2 9 #define IN3 6 #define IN4 5 #define MOT_RIGHT 0 #define MOT_LEFT 1 void setup() { pinMode(SEN_1_PIN, INPUT); pinMode(SEN_2_PIN, INPUT); pinMode(SEN_3_PIN, INPUT); pinMode(SEN_4_PIN, INPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); Serial.begin(9600); } void loop() { char cSen_Status = 0b00000000; cSen_Status = cRead_Sensor(); if((cSen_Status == 0b00000110) || (cSen_Status == 0b00000111) || (cSen_Status == 0b00001110)) //Forward { vMotor_Control(MOT_RIGHT, 80); vMotor_Control(MOT_LEFT, 80); } else if((cSen_Status == 0b00000010) || (cSen_Status == 0b00000011) || (cSen_Status == 0b00000001)) { vMotor_Control(MOT_RIGHT, 0); vMotor_Control(MOT_LEFT, 80); } else if((cSen_Status == 0b00000100) || (cSen_Status == 0b00001100) || (cSen_Status == 0b00001000)) { vMotor_Control(MOT_RIGHT, 80); vMotor_Control(MOT_LEFT, 0); } else { vMotor_Control(MOT_RIGHT, 0); vMotor_Control(MOT_LEFT, 0); } Serial.println((short)cSen_Status); } char cRead_Sensor(void) //stop { short sSen_Pin[4] = {SEN_1_PIN, SEN_2_PIN, SEN_3_PIN, SEN_4_PIN}; char cStatus = 0b00000000; for(short i=0; i<4; i++) { cStatus = cStatus | (digitalRead(sSen_Pin[i]) << i); } return cStatus; } void vMotor_Control(short sWhich_Mot, short sSpeed) { if(sWhich_Mot == MOT_RIGHT) { if(sSpeed < 0) //reverse { sSpeed = abs(sSpeed); analogWrite(IN1, sSpeed); digitalWrite(IN2, LOW); } else { digitalWrite(IN1, LOW); analogWrite(IN2, sSpeed); } } else { if(sSpeed < 0) //reverse { sSpeed = abs(sSpeed); analogWrite(IN3, sSpeed); digitalWrite(IN4, LOW); } else { digitalWrite(IN3, LOW); analogWrite(IN4, sSpeed); } } } , Kode bisa didownload disini .
Sederhana bukan …
Bisa juga menggunakan cara kedua … Ada banyak cara menuju Roma … hehehe
Bahan-bahan yang dibutuhkan adalah :
- Chasis Robot Line Follower
Untuk membuat chasis robot line follower bisa menggunakan bahan acrilic atau dari bahan lainnya yang penting bisa kuat dan ringan. Jika anda memiliki perlengkapan alat pemotong dan memiliki banyak waktu maka Chasis ini bisa anda buat sendiri, tetapi jika peralatan anda tidak lengkap atau anda tidak punya banyak waktu untuk membuatnya maka anda bisa membeli chasis robot line follower yang sudah jadi di belanja online. Chasis yang beli jadi umumnya kualitasnya baik karena pemotongan acrilicnya menggunakan laser sehingga hasilnya presisi. Acrilic ini dilapisi kertas pelindung agar saat proses pengerjaannya tidak tergores. Karena chasisnya sudah jadi maka sebaiknya kertas pelapis chasis dibuka saja. Chasis ini juga dilengkapi dengan baut dan penjepit motor DC. Bentuknya seperti gambar.
. - Motor DC + Roda
Sebagai tenaga penggerak robot ini adalah motor DC yang kecil. Motor DC ini bisa dicatu dengan tegangan DC 5 Volt. Motor ini telah dilengkapi dengan gear box sehingga torsinya cukup baik dan kecepatan putaran motor bisa rendah. Untuk rodanya ada 3 buah yaitu yang besar 2 buah dan yang kecil 1 buah. Bentuk motor DC dan rodanya seperti diatas.
. - Arduino Uno
Untuk mengontrol robot line follower membutuhkan mikrokontroller. Mikrokontroller yang digunakan adalah Arduino uno. Jenis ini bisa diganti dengan mikrokontroller lainnya sesuai keinginan.
. - Tempat Bateray + Bateray
Tempat bateray yang digunakan adalah untuk 2 buah bateray 18650 yang dihubung seri. Tegangan 1 buah bateray 18650 sekitar 3,7 Volt sehingga kalau 2 buah bateray ini dihubung seri maka tegangannya sekitar 7,4 Volt. Tegangan ini dimasukkan ke input tegangan eksternal Arduino Uno. Pada Arduino uno tegangan ini akan diregulasi dan diturunkan menjadi tegangan 5 volt dan 3,3 Volt.
. - Saklar ON/OFF
Untuk menyambungkan dan memutus tegangan dari batre ke rangkaian maka dibutuhkan saklar ON/OFF, sehingga bisa menghemat bateray saat tidak digunakan dengan mematikan saklar.
. - Sensor garis Infrared
Agar robot line follower bisa mendeteksi garis maka dibutuhkan sensor garis dengan menggunakan sinar infrared. Agar line follower bisa berbelok tajam misalnya berbelok 90o maka dibutuhkan banyak sensor. Dalam robot ini kita membutuhkan 6 buah sensor garis. Jumlah sensor ini bisa ditambah atau dikurangi sesuai kebutuhan jalur sircuit garisnya. Pada sensor garis ini kita hanya memanfaatkan output digitalnya saja, jadi output analognya tidak kita gunakan. Untuk pembahasan tentang prinsip kerja sensor garis ini dan bentuknya bisa buka materi sebelumnya di .Arduino-part-24-sensor-infrared.
. - Driver Motor DC
Guna mengatur arah putaran motor DC dan kecepatan motor DC maka dibutuhkan suatu rangkaian pengendali motor DC. Untuk pengendali motor DC ini adalah hasil rakitan sendiri. Untuk mengatur kecepatan motor DC menggunakan sistem PWM (Pulse Width Modulation).
. - Kabel jumper atau kabel penghubung
Kabel untuk sensor bisa gunakan kabel kacil dan kabel data digital sensor menggunakan kabel male. Jenis kabel ini bisa dibeli secara online.
. - Baut Spacer atau spiser
Untuk memasang sensor garis dibutuhkan baut spiser dengan ukuran panjang 2 cm, hal ini agar sensor garis bisa lebih dekat dengan garis jalur yang dibuat. Jika tidak ada ukuran 2 cm maka bisa saja gunakan 2 buah specer yang ukuran 1 cm yang disambung sehingga menjadi lebih panjang. Kebutuhan alat dan bahan diatas bisa dibeli toko elektronik atau bisa anda beli secara online. Belilah lapak jualan online yang bisa memberikan diskon ataupun bebas ongkos kirim. Jika di Tokopedia saat anda membeli dengan minimal pembelian total Rp. 50.000 umumnya anda akan mendapatkan bebas ongkos kirim. Jika anda tidak mau repot maka belilah chasis line follower 1 set lengkap sehingga anda bisa langsung merakitnya.
.
Langkah-langkah pembuatan :
• Siapkan chasis robot line follower
• Pasang Motor DC menggunakan baut
• Pasang tempat baterai bisa menggunakan lem double tip
• Pasang Ardunino Uno bisa menggunakan lem double tip
• Pasang saklar ON-OFF
• Pasang jack dan kabel catu daya lalu disolder
• Pasang bateray ketempatnya lalu tes saklarnya hidupkan dan matikan.
• Pasang semua sensor garis menggunakan baut piser
• Pasangkan driver motor DC
• Solderlah kabel +5 volt dan GND yang menuju sensor garis
• Solderlah kabel male dari sensor menuju arduino.
Untuk pemasangan kabel bisa dilihat pada skema dibawah ini :
.
Rapikan perkabelan dengan memberi lem bakar. Jika semua perkabelan sudah selesai maka hidupkan saklar lalu siapkan gambar circuit yang menggunakan jalur warna hitam dengan lebar sekitar 3 cm dan warna background-nya putih. Dekatkan sensor garis ke warna jalur hitam, sensor yang sudah benar adalah saat sensor mengenai jalur hitam maka salah satu lampu LED-nya akan padam dan jika diletakkan di background warna putih maka lampu sensor akan hidup kembali. Jika ada sensor yang belum bekerja baik maka putarlah trimpot pada sensor tersebut sehingga mendapatkan sensitifitas yang baik.
Sekarang saatnya ujicoba.
Untuk proses pembuatan, perakitan, pengujian sensor, dan pengujian hasil line follower secara detail maka bisa ditonton pada video di bawah ini :
Pemograman arduino bahasa C++ yang digunakan masih cukup sederhana karena belum menggunakan program algoritma PID (Proposional Integral Differential). Algoritma PID cukup lumayan rumit tetapi memang sudah teruji dengan algoritma PID sangat handal untuk membuat line follower yang cepat dan tepat yang biasanya digunakan untuk perlombaan. Karena pembahasan ini adalah dasar-dasar robot line follower sehingga penulis mencoba membuat program coding yang lebih sederhana dan mudah dipahami.
Sketch programnya sebagai berikut :
.
//——————————————-
//— ROBOT LINE FOLLOWER
//— www.whitecyber.co.id
//——————————————-
const int MOTOR_1A = 5;
const int MOTOR_1B = 3;
const int MOTOR_2A = 6;
const int MOTOR_2B = 9;
const int SENSOR1 = 13;
const int SENSOR2 = 12;
const int SENSOR3 = 11;
const int SENSOR4 = 10;
const int SENSOR5 = 8;
const int SENSOR6 = 7;
void setup()
{
pinMode(MOTOR_1A, OUTPUT);
pinMode(MOTOR_1B, OUTPUT);
pinMode(MOTOR_2A, OUTPUT);
pinMode(MOTOR_2B, OUTPUT);
pinMode(SENSOR1, INPUT);
pinMode(SENSOR2, INPUT);
pinMode(SENSOR3, INPUT);
pinMode(SENSOR4, INPUT);
pinMode(SENSOR5, INPUT);
pinMode(SENSOR6, INPUT);
}
void loop()
{
/* untuk mendeteksi 1 dan 0 sensor garis ini
maka lakukan pengujian pada garis sirkuit.
Catatlah data penyalaan lampu LED pada
6 buah sensor garis pada saat menyentuh
garis lurus, berbelok kanan atau kiri, berbelok
tajam dan lain-lain.
Logika yang digunakan adalah AND */
//deteksi sensor maju
if ((digitalRead(SENSOR1) == 0)&&
(digitalRead(SENSOR2) == 0)&&
(digitalRead(SENSOR3) == 1)&&
(digitalRead(SENSOR4) == 1)&&
(digitalRead(SENSOR5) == 0)&&
(digitalRead(SENSOR6) == 0))
{MAJU();}
if ((digitalRead(SENSOR1) == 0)&&
(digitalRead(SENSOR2) == 1)&&
(digitalRead(SENSOR3) == 1)&&
(digitalRead(SENSOR4) == 0)&&
(digitalRead(SENSOR5) == 0)&&
(digitalRead(SENSOR6) == 0))
{MAJU();}
if ((digitalRead(SENSOR1) == 0)&&
(digitalRead(SENSOR2) == 1)&&
(digitalRead(SENSOR3) == 0)&&
(digitalRead(SENSOR4) == 0)&&
(digitalRead(SENSOR5) == 0)&&
(digitalRead(SENSOR6) == 0))
{MAJU();}
//deteksi sensor belok kanan
if ((digitalRead(SENSOR1) == 0)&&
(digitalRead(SENSOR2) == 0)&&
(digitalRead(SENSOR3) == 1)&&
(digitalRead(SENSOR4) == 1)&&
(digitalRead(SENSOR5) == 1)&&
(digitalRead(SENSOR6) == 1))
{BELOK_KANAN();}
if ((digitalRead(SENSOR1) == 0)&&
(digitalRead(SENSOR2) == 0)&&
(digitalRead(SENSOR3) == 0)&&
(digitalRead(SENSOR4) == 0)&&
(digitalRead(SENSOR5) == 1)&&
(digitalRead(SENSOR6) == 1))
{BELOK_KANAN();}
if ((digitalRead(SENSOR1) == 0)&&
(digitalRead(SENSOR2) == 0)&&
(digitalRead(SENSOR3) == 0)&&
(digitalRead(SENSOR4) == 1)&&
(digitalRead(SENSOR5) == 0)&&
(digitalRead(SENSOR6) == 0))
{BELOK_KANAN();}
if ((digitalRead(SENSOR1) == 0)&&
(digitalRead(SENSOR2) == 0)&&
(digitalRead(SENSOR3) == 0)&&
(digitalRead(SENSOR4) == 0)&&
(digitalRead(SENSOR5) == 1)&&
(digitalRead(SENSOR6) == 1))
{BELOK_KANAN();}
//deteksi sensor belok kiri
if ((digitalRead(SENSOR1) == 0)&&
(digitalRead(SENSOR2) == 0)&&
(digitalRead(SENSOR3) == 1)&&
(digitalRead(SENSOR4) == 0)&&
(digitalRead(SENSOR5) == 0)&&
(digitalRead(SENSOR6) == 0))
{BELOK_KIRI();}
//deteksi sensor belok kiri sedikit
if ((digitalRead(SENSOR1) == 0)&&
(digitalRead(SENSOR2) == 1)&&
(digitalRead(SENSOR3) == 1)&&
(digitalRead(SENSOR4) == 0)&&
(digitalRead(SENSOR5) == 0)&&
(digitalRead(SENSOR6) == 0))
{BELOK_KIRI_SEDIKIT();}
if ((digitalRead(SENSOR1) == 0)&&
(digitalRead(SENSOR2) == 1)&&
(digitalRead(SENSOR3) == 0)&&
(digitalRead(SENSOR4) == 0)&&
(digitalRead(SENSOR5) == 0)&&
(digitalRead(SENSOR6) == 0))
{BELOK_KIRI_SEDIKIT();}
//deteksi sensor belok kiri
if ((digitalRead(SENSOR1) == 1)&&
(digitalRead(SENSOR2) == 1)&&
(digitalRead(SENSOR3) == 1)&&
(digitalRead(SENSOR4) == 1)&&
(digitalRead(SENSOR5) == 0)&&
(digitalRead(SENSOR6) == 0))
{BELOK_KIRI();}
if ((digitalRead(SENSOR1) == 1)&&
(digitalRead(SENSOR2) == 1)&&
(digitalRead(SENSOR3) == 0)&&
(digitalRead(SENSOR4) == 0)&&
(digitalRead(SENSOR5) == 0)&&
(digitalRead(SENSOR6) == 0))
{BELOK_KIRI();}
//deteksi sensor untuk stop
if ((digitalRead(SENSOR1) == 1)&&
(digitalRead(SENSOR2) == 1)&&
(digitalRead(SENSOR3) == 1)&&
(digitalRead(SENSOR4) == 1)&&
(digitalRead(SENSOR5) == 1)&&
(digitalRead(SENSOR6) == 1))
{STOP();}
}
//————————
void MAJU()
{
analogWrite(MOTOR_1A,200);
analogWrite(MOTOR_1B,0);
analogWrite(MOTOR_2A,200);
analogWrite(MOTOR_2B,0);
}
//————————
void BELOK_KANAN()
{
analogWrite(MOTOR_1A,200);
analogWrite(MOTOR_1B,0);
analogWrite(MOTOR_2A,0);
analogWrite(MOTOR_2B,0);
}
//————————
void BELOK_KIRI_SEDIKIT()
{
analogWrite(MOTOR_1A,0);
analogWrite(MOTOR_1B,100);
analogWrite(MOTOR_2A,100);
analogWrite(MOTOR_2B,0);
}
//————————
void BELOK_KIRI()
{
analogWrite(MOTOR_1A,0);
analogWrite(MOTOR_1B,0);
analogWrite(MOTOR_2A,200);
analogWrite(MOTOR_2B,0);
}
//————————
void STOP()
{
analogWrite(MOTOR_1A,0);
analogWrite(MOTOR_1B,0);
analogWrite(MOTOR_2A,0);
analogWrite(MOTOR_2B,0);
}
.
Data digital pada deteksi sensor program diatas bisa saja sama atau bisa saja berbeda, hal ini disesuaikan dengan bentuk garis sircuit yang anda gunakan. Jadi saat membuat program maka lakukanlah pengambilan data terlebih dahulu guna mendapatkan data akurat. Jika jalan robot line follower masih belum sesuai maka anda harus berulang kali eksperimen dengan mengganti data digital sensor dan mengatur kecepatan motor (nilai PWM) dengan tepat antara roda kiri dan kanan, sehingga saat berbelok bisa dilakukan dengan sempurna.
.
Ada 2 Cara diatas untuk membangun sebuah robot sederhana, yuk sekarang kita kembangkan dengan yang lebih canggih, yaitu dengan penggunaan teknologi PID.
.
PID LINE FOLLOWER ROBOT USING ARDUINO NANO
.
.
Perlengkapan yang kita butuhkan :
- Arduino Nano : https://amzn.to/3lkjSNR
- QTR 8 RC : https://amzn.to/3k6h4F0
- DRV8835 : https://www.pololu.com/product/2135
- Motor N20 dan penjepit *2 : https://amzn.to/3lhHZgj
- Pengatur AMS 1117 5.0*1
- saklar tombol*2
- Led SMD 0805*2
- Resistor 0805 1k *2
- Resistor 0805 10k *2
- Baterai 7,4 volt
- roda jarak
.
Langkah 1: Apa Itu Algoritma PID
Meskipun robot yang mengikuti garis mungkin bukan ide proyek terbaru , namun stabilitas dan kecepatan penting di sini. Robot pengikut garis adalah salah satu jenis robot paling sederhana yang melakukan tugas sederhana: melacak garis hitam atau putih pada garis putih, masing-masing pada permukaan hitam. Untuk mendapatkan kecepatan dan stabilitas yang baik mari kita gunakan Algoritma PID. Berkat umpan balik kontrol PID , bukan kontrol bang-bang tradisional seperti yang Anda lihat pada robot kelas bawah.
Jika gagasan PID masih baru bagi Anda, akronimnya adalah proporsional, integral, dan turunan . Untuk menentukan output pada waktu tertentu, Anda melihat posisi Anda dibandingkan dengan posisi yang Anda inginkan (nilai saat ini vs titik setel). Kemudian Anda menghitung kesalahan proporsional . mari kita bicarakan ini nanti
Langkah 2: Merancang Sirkuit dan Pencetakan PCB
.
.
Seperti biasa semuanya dimulai dari mendesain sirkuit saya menggunakan easyeda untuk mendesain sirkuit. Disini saya menggunakan Arduino nano, driver motor DRV 8835 , dan rangkaian sensor IR QTR 8RC . Kemudian saya mendesain PCB dengan rangkaian tersebut dan saat itu saya memutuskan untuk menggunakan PCB juga sebagai pengejar robot jadi saya membuat PCB seperti pengejar.
Setelah itu saya download file Gerber dan upload ke JLCPCB untuk mencetak PCB. Saya memilih JLCPCB karena mereka hanya menawarkan $2 untuk 5 PCB . Setelah mengunggah saya menyesuaikan PCB dan melakukan pemesanan.
unduh file Gerber dari sini
.
Langkah 3: Merakit PCB
Setelah 1 minggu saya menerima paketnya. PCB terlihat luar biasa dan kualitasnya juga sempurna. Sekarang saatnya menyolder semua komponen. Saya mulai dengan komponen SMD. Setelah menyelesaikannya saya menempatkan komponen melalui lubang dan menyoldernya. Kemudian saya menggunakan pin header perempuan untuk menghubungkan modul. Untuk mengontrol bot saya menggunakan Arduino nano untuk menggerakkan motor disini saya menggunakan penggerak motor Pololu drv8835 . Untuk merasakan garis saya menggunakan array reflektif qtr 8rc IR. Lalu saya menempatkan setiap modul pada soketnya.
.
.
Langkah 4: Menyelesaikan Robot Pengikut Garis
.
Setelah itu, saya mengambil motor n20 dan dengan bantuan klem motor saya memasang motor ke PCB juga menghubungkan kabelnya ke soket yang sesuai. Lalu saya pasang ban karet kecil ke motor. Untuk menghindari cengkeraman dan memberikan jarak yang diperlukan antara tanah dan sensor, saya menempatkan roda jarak di depan robot.
.
Langkah ke 5 Masukkan Kode PID
.
Seperti yang saya katakan sebelumnya saya menggunakan sensor QTR dan algoritma PID. jadi di programnya pertama saya sertakan perpustakaan qtr8rc Pololu.
#termasuk <QTRSensors.h>
Kemudian dengan bantuan fungsi perpustakaan QTR, saya mendefinisikan sensor dan parameter lainnya
QTRSensor qtr;
const uint8_t SensorJumlah = 8;
uint16_t sensorValues[SensorCount];
Kemudian saya mendefinisikan konstanta ki, kp, kd. Kita harus mencari nilai konstanta dengan metode coba-coba.
mengambang Kp = 0;
mengapung Ki = 0;
mengambang Kd = 0;
ke dalam P;
ke dalam aku;
ke dalam D;
int kesalahan terakhir = 0;
boolean onoff = salah;
Selanjutnya, saya mendefinisikan konstanta untuk menentukan kecepatan maksimum dan minimum robot. Juga, saya mendefinisikan pin untuk driver motor dan tombol
mode ke dalam = 8;
int afase = 9;
int aenbl = 6;
int bfase = 5;
int benbl = 3;
kalibrasi tombol int = 17
int tombolmulai = 2;
Di bagian pengaturan, saya menentukan mode pin dan menambahkan program kalibrasi
Serial.mulai(9600);
qtr.setTypeRC();
qtr.setSensorPins((const uint8_t[]){10, 11, 12, 14, 15, 16, 18, 19}, SensorCount);
qtr.setEmitterPin(7);
pinMode(mode, KELUARAN);
pinMode(aphase, OUTPUT);
pinMode(aenbl, KELUARAN);
pinMode(bfase, OUTPUT);
pinMode(benbl, KELUARAN);
digitalWrite(mode, TINGGI);
penundaan(500);
pinMode(LED_BUILTIN, KELUARAN);
boolean Oke = salah;
sementara (Oke == salah) {
if(digitalRead(tombolkalibrasi) == TINGGI)
{
kalibrasi();
Oke = benar;
}
}
rem_maju(0, 0);
}
batalkan kalibrasi() {
digitalWrite(LED_BUILTIN, TINGGI);
untuk (uint16_t saya = 0; saya < 400; saya++)
{
qtr.kalibrasi();
}
digitalWrite(LED_BUILTIN, RENDAH);
}
Akhirnya di bagian loop
Saya membaca nilai sensor qtr 8rc dan motor driver sesuai dengan pembacaan sensor qtr.
if(digitalRead(tombolmulai) == TINGGI) {
hidup mati =! hidup;
jika(onoff = benar) {
penundaan(1000);
}
kalau tidak {
penundaan(50);
}
}
jika (hidup mati == benar) {
PID_kontrol();
}
kalau tidak {
rem_maju(0,0);
}
}
void forward_brake(int posa, int posb) {
digitalWrite(aphase, RENDAH);
digitalWrite(bfase, TINGGI);
analogWrite(aenbl, posa);
analogWrite(benbl, posb);
}
batalkan PID_control() {
uint16_t posisi = qtr.readLineBlack(sensorValues);
int kesalahan = 3500 – posisi;
P = kesalahan;
Saya = Saya + kesalahan;
D = kesalahan – kesalahan terakhir;
lastError = kesalahan;
int kecepatan motor = P*Kp + I*Ki + D*Kd;
int kecepatan motora = kecepatan dasara + kecepatan motor;
int kecepatan motorb = kecepatan dasarb – kecepatan motor;
if (kecepatan motor > kecepatan maksimal) {
kecepatan motor = kecepatan maksimal;
}
if (kecepatan motor < 0) {
kecepatan motor = 0;
}
if (kecepatan motorb < 0) {
kecepatan motorb = 0;
}
forward_brake(kecepatan motor, kecepatan motorb);
}
.
Source Code
//Make sure to install the library #include <QTRSensors.h> QTRSensors qtr; const uint8_t SensorCount = 8; uint16_t sensorValues[SensorCount]; float Kp = 0; //set up the constants value float Ki = 0; float Kd = 0; int P; int I; int D; int lastError = 0; boolean onoff = false; //Increasing the maxspeed can damage the motors - at a value of 255 the 6V motors will receive 7,4 V const uint8_t maxspeeda = 150; const uint8_t maxspeedb = 150; const uint8_t basespeeda = 100; const uint8_t basespeedb = 100; //Set up the drive motor carrier pins int mode = 8; int aphase = 9; int aenbl = 6; int bphase = 5; int benbl = 3; //Set up the buttons pins int buttoncalibrate = 17 //pin A3 int buttonstart = 2; void setup() { Serial.begin(9600); qtr.setTypeRC(); //Set up the sensor array pins qtr.setSensorPins((const uint8_t[]){10, 11, 12, 14, 15, 16, 18, 19}, SensorCount); qtr.setEmitterPin(7);//LEDON PIN pinMode(mode, OUTPUT); pinMode(aphase, OUTPUT); pinMode(aenbl, OUTPUT); pinMode(bphase, OUTPUT); pinMode(benbl, OUTPUT); digitalWrite(mode, HIGH); delay(500); pinMode(LED_BUILTIN, OUTPUT); boolean Ok = false; while (Ok == false) { //the loop won't start until the robot is calibrated if(digitalRead(buttoncalibrate) == HIGH) { calibration(); //calibrate the robot for 10 seconds Ok = true; } } forward_brake(0, 0); } void calibration() { digitalWrite(LED_BUILTIN, HIGH); for (uint16_t i = 0; i < 400; i++) { qtr.calibrate(); } digitalWrite(LED_BUILTIN, LOW); } void loop() { if(digitalRead(buttonstart) == HIGH) { onoff =! onoff; if(onoff = true) { delay(1000);//a delay when the robot starts } else { delay(50); } } if (onoff == true) { PID_control(); } else { forward_brake(0,0); } } void forward_brake(int posa, int posb) { //set the appropriate values for aphase and bphase so that the robot goes straight digitalWrite(aphase, LOW); digitalWrite(bphase, HIGH); analogWrite(aenbl, posa); analogWrite(benbl, posb); } void PID_control() { uint16_t position = qtr.readLineBlack(sensorValues); int error = 3500 - position; P = error; I = I + error; D = error - lastError; lastError = error; int motorspeed = P*Kp + I*Ki + D*Kd; int motorspeeda = basespeeda + motorspeed; int motorspeedb = basespeedb - motorspeed; if (motorspeeda > maxspeeda) { motorspeeda = maxspeeda; } if (motorspeeda < 0) { motorspeeda = 0; } if (motorspeedb < 0) { motorspeedb = 0; } //Serial.print(motorspeeda);Serial.print(" ");Serial.println(motorspeedb); forward_brake(motorspeeda, motorspeedb); }
.
Source code bisa Anda download disini
.
Sekarang kita bisa lihat hasilnya :
.
.