Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Komponen dan Perlengkapan

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Arduino Nano R3
×1
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
SparkFun RedBot Sensor - Line Follower
×1
TCRT5000 4CH Infrared Line Track Follower Sensor Module
×1
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
HC-06 Bluetooth Module
×1
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Android device
×1
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
4xAA battery holder
×2
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
RobotGeek Continuous Rotation Servo
×2

Aplikasi dan Layanan Online

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Arduino IDE
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
MIT App Inventor 2

Tentang Proyek Ini

Tujuan proyek ini adalah untuk membangun Robot Pengikut Garis dengan kontrol PID. Kami juga akan menggunakan perangkat Android untuk dengan mudah mengatur parameter kontrol utama untuk penyesuaian yang lebih baik dan cepat.

Proyek ini adalah bagian pertama dari proyek 2 bagian yang lebih kompleks di mana niat saya adalah untuk mengeksplorasi potensi Robot Pengikut Garis. Pada bagian 2: Robot Penyelesaian Labirin, menggunakan Kecerdasan Buatan dengan Arduino, robot akan menjelajahi dan menyelesaikan labirin, menggunakan teknik kecerdasan buatan sederhana.

Berikut adalah video yang menunjukkan robot mengikuti lintasan garis:

Langkah 1: Daftar Bahan

Daftar bahan yang diperlukan sangat sederhana dan robot akhir sangat murah (sekitar $ 75.00):

Badannya (dapat disesuaikan dengan kebutuhan Anda):

Langkah 2: Pengaturan Motor

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Untuk motor, 2 continuous servos (SM-S4303R) digunakan. Mereka akan "dilekatkan" bersama-sama membentuk satu blok padat seperti yang dapat Anda lihat pada foto (gunakan 3M Command strip, lem, atau double face tape). Servo ini akan berjalan pada kecepatan tertentu, ditentukan oleh lebar pulsa yang diterima pada input datanya. Untuk servo spesifik ini, lebar pulsa berkisar dari 1.0ms (1.000 mikrodetik) hingga 2.0ms (2.000 mikrodetik). Servo lain dapat bekerja dengan lebar pulsa yang berbeda.

Melihat secara detail:

Setelah Anda telah menghubungkan kedua servo secara fisik, ikuti gambar rangkaian di atas untuk memberi daya pada mereka (5V atau 6V eksternal) dan memberi mereka sinyal dari Arduino:

Setelah semuanya terhubung, hal pertama yang harus dilakukan adalah mengirim pulsa 1.5ms untuk memverifikasi apakah motor "berhenti" (tidak berjalan). Jika tidak, servo harus disesuaikan untuk berhenti sepenuhnya (cari baut kuning, di bawah servo).

CATATAN: Jika servo Anda tidak memiliki penyesuaian fisik ini, coba ubah parameter "1500" mikrodetik di dalam fungsi (naik atau turun) sampai Anda mendapatkan berhenti sepenuhnya.

Kode Arduino di bawah ini dapat melakukannya:

#include <Servo.h> // Servo library Servo leftServo; Servo rightServo; Void setup() { leftServo.attach(5); rightServo.attach(3); leftServo.writeMicroseconds(1500); rightServo.writeMicroseconds(1500); } void loop() { } 

Langkah 3: Rangkai Badan dan Motor untuk Uji Gerakan

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Perhatikan bahwa karena cara servo dipasang (berseberangan) rentang kecepatan adalah:

LED eksternal ditambahkan ke pin13, untuk sinyalisasi dan tujuan pengujian (Anda dapat menggunakan LED internal Arduino, bukan eksternal jika Anda mau, tetapi pertimbangkan bahwa akan sulit untuk melihatnya di tengah kabel).

Sebuah tombol juga terhubung ke pin 9. Tombol ini sangat berguna untuk tujuan pengujian dan untuk memulai robot.

Contoh:

while(digitalRead(buttonPin)) { } motorTurn (LEFT, 500); motorTurn (RIGHT, 500); 

Perhatikan bahwa 2 baris yang akan memerintahkan Robot untuk berbelok KIRI, tunggu 500ms dan berbelok KANAN hanya akan terjadi setelah Anda menekan tombol (buttonPin = 0). Sebelum itu, program akan terhenti dalam loop tak terbatas.

Kode di bawah ini dapat digunakan sebagai dasar untuk pengujian motor lengkap (Maju, Mundur, Berhenti Penuh, Belok Kiri, Belok Kanan). Jika perlu Anda harus menyesuaikan delay untuk sudut belokan yang diperlukan tergantung pada motor Anda (juga, terkadang nilai pulsa kiri dan kanan harus sedikit berbeda untuk mengkompensasi kurang seimbangnya motor.

FDDQRQOIN4TTVY0.ino

Langkah 4: Modul Bluetooth (opsional)

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Modul Bluetooth HC-06 harus dipasang di breadboard seperti yang ditunjukkan dalam gambar. Pustaka Arduino SoftSerial akan digunakan.

Berikut koneksi pin HC-06:

Robot akan bekerja dengan atau tanpa Bluetooth. Kode dibuat sedemikian rupa jika Anda tidak mengaktifkan BT, parameter default akan digunakan oleh robot. Jadi, jangan khawatir jika Anda memilih untuk tidak memasang modul HC-06, kode masih akan bekerja dengan baik. Di bagian akhir tutorial ini, saya akan menjelajahi cara menggunakan aplikasi Android untuk mengirim data untuk pengaturan parameter robot yang lebih baik dan/atau memindahkan robot dalam mode manual. Saya akan membiarkan penggunaan Bluetooth dan aplikasi sebagai opsional jika seseorang ingin menjelajahi lebih lanjut penggunaan Robot Pengikut Garis untuk kompetisi, misalnya.

Langkah 5: Menambahkan Sensor Garis

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Hubungkan kabel ke pin Arduino seperti di bawah ini:

Dalam kasus saya saya menggunakan modul dengan 4 sensor terintegrasi + 1 tambahan. Semuanya kompatibel. Untuk kesederhanaan, dalam diagram saya menyertakan 5 sensor mandiri yang terhubung bersama. Hasil akhir sama untuk kedua konfigurasi.

Langkah 6: Implementasi Logika Sensor IR

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Sensor IR terdiri dari satu LED IR dan satu Fotodioda IR. Cahaya IR yang dipancarkan oleh LED mengenai permukaan dan dipantulkan kembali ke Fotodioda IR. Fotodioda kemudian menghasilkan tegangan output yang proporsional dengan tingkat refleksi permukaan (nilai lebih tinggi untuk "permukaan terang" dan lebih rendah untuk "permukaan hitam/gelap").

Dalam kasus sensor yang digunakan, rangkaian terpadu di modul menghasilkan output sinyal digital sederhana (TINGGI: Gelap; RENDAH: Terang). Potensiometer yang dipasang di modul (lihat foto) akan menyesuaikan tingkat cahaya yang benar untuk dianggap "gelap" atau "terang". Ini bekerja dengan cara ketika warna cahaya yang dipantulkan adalah hitam/gelap, level digital TINGGI ("1") dihasilkan pada outputnya dan RENDAH ("0") untuk warna lain yang lebih terang. Saya menggunakan di sini modul terpadu dengan 4 sensor dan modul tambahan dengan satu sensor (bentuk berbeda, tetapi logika yang sama). Kombinasi adalah array 5 sensor yang saya temukan baik untuk kontrol yang halus dan mulus, seperti dijelaskan di bawah.

Array 5 sensor dipasang dengan cara jika hanya satu sensor terpusat dengan garis hitam, hanya sensor spesifik itu akan menghasilkan TINGGI. Di sisi lain, jarak antara sensor harus dihitung untuk memungkinkan 2 sensor menutupi lebar penuh garis hitam secara bersamaan, menghasilkan TINGGI juga pada kedua sensor (lihat gambar di atas).

Output array sensor yang mungkin saat mengikuti garis adalah:

Dengan 5 sensor, memungkinkan pembuatan "variabel error" yang akan membantu mengontrol posisi robot di atas garis, seperti yang ditunjukkan di bawah.

Misalkan kondisi optimum adalah ketika robot terpusat, dengan garis tepat di bawah "sensor tengah" (Sensor 2). Output array akan: 0 0 1 0 0 dan dalam situasi ini, "error" akan "nol". Jika robot mulai diarahkan ke kiri (garis "terlihat bergerak" ke kanan") error harus meningkat dengan sinyal positif. Jika robot mulai bergerak ke kanan (garis "terlihat bergerak" ke kiri"), dengan cara yang sama, error harus meningkat, tetapi sekarang dengan sinyal negatif.

Variabel error, terkait dengan status sensor akan:

0 0 1 0 0 ==> Error = 0

Melihat kode Arduino, setiap sensor akan didefinisikan dengan nama spesifik (asumsikan bahwa Line Follow Sensor paling kiri harus ditugaskan dengan label "0"):

const int lineFollowSensor0 = 12; const int lineFollowSensor1 = 18; const int lineFollowSensor2 = 17; const int lineFollowSensor3 = 16; const int lineFollowSensor4 = 19; 

Untuk menyimpan nilai setiap sensor, variabel array akan dibuat:

int LFSensor[5]={0, 0, 0, 0, 0}; 

Setiap posisi array akan terus diperbarui dengan output setiap sensor:

LFSensor[0] = digitalRead(lineFollowSensor0); LFSensor[1] = digitalRead(lineFollowSensor1); LFSensor[2] = digitalRead(lineFollowSensor2); LFSensor[3] = digitalRead(lineFollowSensor3); LFSensor[4] = digitalRead(lineFollowSensor4); 

Dengan nilai setiap sensor, logika harus diimplementasikan untuk menghasilkan variabel error:

if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 1 )) error = 4; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 1 )&&(LFSensor[4]== 1 )) error = 3; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 1 )&&(LFSensor[4]== 0 )) error = 2; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 1 )&&(LFSensor[3]== 1 )&&(LFSensor[4]== 0 )) error = 1; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 1 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) error = 0; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 1 )&&(LFSensor[2]== 1 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) error =- 1; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 1 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) error = -2; else if((LFSensor[0]== 1 )&&(LFSensor[1]== 1 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) error = -3; else if((LFSensor[0]== 1 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) error = -4; 

Langkah 7: Mengontrol Arah (Kontrol Proporsional - P)

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Sempurna! Pada titik ini, Robot kami telah dirangkaian dan operasional. Anda harus melakukan beberapa tes dasar dengan motor, membaca output sensor dan mengujinya di atas garis. Yang hilang adalah "otak" nyata, langkah pertama dari "kecerdasan buatan". Kami akan mendapatkan ini, mengimplementasikan logika kontrol yang akan menjamin Robot akan terus mengikuti garis.

Kontrol Proporsional Sederhana:

Misalkan Robot berjalan di atas garis dan output Sensor Array adalah: "0 0 1 0 0 ". Error yang sesuai adalah "0". Dalam situasi ini, kedua motor harus berjalan maju dengan kecepatan konstan.

Contoh:

Menentukan variabel: iniMotorSpeed = 250; berarti servo KIRI akan menerima pulsa 1.250us dan servo KANAN 1.750us. Dengan parameter ini, Robot akan bergerak maju pada setengah kecepatan. Ingatlah bahwa kecepatan maju servo KANAN akan bervariasi dengan panjang pulsa dari 1.500us (berhenti) hingga 2.000us (kecepatan penuh) dan servo KIRI dari 1.500us (berhenti) hingga 1.000us (kecepatan penuh).

rightServo.writeMicroseconds(1500 + iniMotorPower); leftServo.writeMicroseconds(1500 - iniMotorPower); 

Misalkan sekarang Robot diarahkan ke kiri (seperti "GARIS pergi ke kanan") dan juga menutupi sensor 3. Output Array akan: "0 0 1 1 0 " dan error = 1. Dalam situasi ini yang Anda butuhkan adalah memutar Robot ke kanan. Untuk melakukan itu, Anda harus menurunkan kecepatan servo KANAN yang berarti menurunkan panjang pulsa. Juga, kecepatan servo KIRI harus meningkat, yang berarti menurunkan panjang pulsa servo KIRI. Untuk melakukan itu, kita perlu mengubah fungsi kontrol motor:

rightServo.writeMicroseconds(1500 + iniMotorPower - error); ==> Positive error: decrease velocity leftServo.writeMicroseconds(1500 - iniMotorPower - error); ==> Positive error: increase velocity 

Logika di atas benar, tetapi mudah dipahami bahwa menambahkan atau mengurangi "1" mikrodetik pada panjang pulsa tidak akan menghasilkan koreksi yang diperlukan dalam waktu yang realistis. Intuitifnya angka yang harus ditambahkan atau dikurangi harus lebih besar, misalnya 50, 100, dll. Untuk mendapatkannya, "error" harus dikalikan dengan konstanta (sebutlah "K"). Karena pengaruh konstanta ini proporsional terhadap error, kita akan menamainya "Proportional Constant: Kp".

Fungsi motor akan:

int Kp = 50; rightServo.writeMicroseconds(1500 + iniMotorPower - Kp*error); leftServo.writeMicroseconds(1500 - iniMotorPower - Kp*error); 

Kami dapat merangkum apa yang akan terjadi dengan motor seperti di bawah ini:

Jika situasinya sebaliknya dan Robot diarahkan ke kanan, error akan "negatif" dan kecepatan servo harus berubah:

Pada titik ini jelas bahwa semakin banyak Robot diarahkan ke satu sisi, semakin besar error dan semakin cepat harus kembali ke tengah. Kecepatan dengan Robot akan bereaksi terhadap error akan proporsional dengannya. Ini disebut "Proportional Control", yang merupakan komponen "P" dari jaringan kontrol yang lebih kompleks, PID (Proportional, Derivative, Integral).

Langkah 8: Kontrol PID (opsional)

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Jika Anda ingin melompat ke bagian ini, itu juga OK. Anda dapat tinggal dengan kontrol proporsional yang dijelaskan pada langkah terakhir, atau membakar otak untuk mengimplementasikan sistem kontrol yang lebih kompleks di robot Anda, ini adalah pilihan Anda.

Jika Anda sudah memutuskan, ayo kita mulai!

PID (Proportional, Derivative and Integral) adalah salah satu skema kontrol yang paling umum. Sebagian besar loop kontrol industri menggunakan beberapa variasi kontrol PID. Ada banyak cara untuk menstel loop PID, termasuk teknik manual yang digunakan dalam contoh ini.

Bayangkan PID sebagai pegas sederhana. Sebuah pegas memiliki panjang asli, yang ketika terganggu dengan perluasan atau kontraksi, cenderung kembali ke panjang aslinya dalam waktu sesingkat mungkin. Demikian pula, algoritma PID dalam sistem memiliki nilai set dari suatu kuantitas fisik yang akan dikontrol, yang disebut 'set point ', yang ketika diubah karena beberapa alasan, sistem mengontrol fitur lain yang diperlukan di dalamnya, untuk kembali ke nilai set asli dalam waktu sesingkat mungkin. Pengontrol PID digunakan di mana pun ada kebutuhan untuk mengontrol suatu kuantitas fisik dan membuatnya sama dengan nilai yang ditentukan. Contoh, Cruise Controller di mobil, Robot, Regulator Suhu, Regulator Tegangan, dll.

Bagaimana PID bekerja?

Sistem menghitung 'error', atau 'deviasi' dari kuantitas fisik dari nilai set, dengan mengukur nilai saat ini dari kuantitas fisik tersebut menggunakan sensor(s). Untuk kembali ke nilai set, 'error' ini harus diminimalkan, dan idealnya harus dibuat sama dengan nol. Juga, proses ini harus terjadi secepat mungkin. Idealnya, tidak boleh ada keterlambatan dalam respons sistem terhadap perubahan nilai set-nya.

Informasi lebih lanjut dapat ditemukan di banyak buku dan situs web, termasuk di sini.

Mengimplementasikan PID

i) Error Term (e):

Ini sama dengan selisih antara nilai set dan nilai saat ini dari kuantitas yang dikontrol. Error = set_point – current_value (dalam kasus kami adalah variabel error yang didapatkan dari posisi Robot di atas garis

ii) Proportional Term (P):

Term ini proporsional terhadap error.

P = error

Nilai ini bertanggung jawab atas besaran perubahan yang diperlukan pada kuantitas fisik untuk mencapai nilai set. Termin proporsional adalah yang menentukan waktu naik loop kontrol atau secepatnya akan mencapai nilai set.

iii) Integral Term (I):

Term ini adalah jumlah semua nilai error sebelumnya.

I = I + error

Nilai ini bertanggung jawab atas kecepatan respons sistem terhadap perubahan dari nilai set. Termin integral digunakan untuk menghilangkan error steady state yang diperlukan oleh termin proporsional. Biasanya, Robot kecil tidak menggunakan termin integral karena kami tidak khawatir tentang error steady state dan itu dapat menyulitkan 'loop tuning'.

iv) Differential or Derivative Term (D):

Term ini adalah selisih antara error saat ini dari nilai set, dan error dari saat sebelumnya.

D = error - previousError

Nilai ini bertanggung jawab untuk memperlambat laju perubahan kuantitas fisik saat mendekati nilai set. Termin derivatif digunakan untuk mengurangi overshoot atau seberapa banyak sistem harus 'over correct'.

Equation:

PIDvalue = (Kp*P) + (Ki*I) + (Kd*D)

Where:

Kp adalah konstanta yang digunakan untuk mengubah besaran perubahan yang diperlukan untuk mencapai nilai set. Ki adalah konstanta yang digunakan untuk mengubah laju di mana perubahan harus dibawa pada kuantitas fisik untuk mencapai nilai set. Kd adalah konstanta yang digunakan untuk mengubah stabilitas sistem.

Salah satu pendekatan untuk menstel loop dapat Try-error tentative metod:

Setel Kd variable to 0 dan stel Kp terlebih dahulu. Kp of 25 adalah tempat yang baik untuk memulai dalam kasus kami di sini. Pada langkah terakhir kami menggunakan Kp 50 yang bekerja sangat baik dengan Robot saya. Setelah robot bereaksi wajar, stel bagian derivatif dari loop kontrol (Kd). Pertama setel nilai Kp dan Kd masing-masing 1/2 dari nilai Kp. Misalnya, jika robot bereaksi wajar dengan Kp = 50, maka setel Kp = 25 dan Kd = 25 untuk memulai. Tingkatkan Kd (derivatif) gain untuk mengurangi overshoot, turunkan jika robot menjadi tidak stabil.

Komponen lain dari loop yang perlu dipertimbangkan adalah Sample/Loop Rate sebenarnya. Mempercepat parameter ini atau memperlambatnya dapat membuat perbedaan signifikan pada kinerja robot. Ini ditetapkan oleh pernyataan delay yang Anda miliki dalam kode Anda. Ini adalah Try-error tentative metod untuk mendapatkan hasil optimum.

Berdasarkan pendekatan di atas, fungsi di bawah ini diimplementasikan:

void calculatePID() { P = error; I = I + error; D = error-previousError; PIDvalue = (Kp*P) + (Ki*I) + (Kd*D); previousError = error; } 

Konstanta Kp sederhana yang digunakan pada langkah terakhir akan diganti dengan PIDvalue yang lebih lengkap ini:

void motorPIDcontrol() { int leftMotorSpeed = 1500 - iniMotorPower - PIDvalue; int rightMotorSpeed = 1500 + iniMotorPower - PIDvalue; leftServo.writeMicroseconds(leftMotorSpeed); rightServo.writeMicroseconds(rightMotorSpeed); } 

Tetapi perhatikan jika Anda memiliki Kd dan Ki =0 , PIDvalue hanyalah Kp*error yang digunakan pada langkah terakhir.

Langkah 9: Kode Akhir

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Pada langkah ini, Robot dapat mengikuti loop konstan dan akan melakukannya tanpa berhenti. Program loop akan:

void loop () { readLFSsensors(); // read sensors, storage values at Sensor Array and calculate "error" calculatePID(); motorPIDcontrol(); } 

Tetapi untuk operasi yang lebih lengkap dan nyata, penting untuk menambah setidaknya beberapa perintah dasar "commands " done "with the line ". Misalnya, mari kita perkenalkan variabel baru: "mode ". Kami akan menentukan 3 status untuk variabel ini:

Mode:

Jika semua sensor menemukan garis hitam, output Sensor Array akan: 1 1 1 1 1. Dalam kondisi ini, kita dapat menentukan mode sebagai "STOPPED" dan Robot harus melakukan "full stop".

if((LFSensor[0]== 1 )&&(LFSensor[1]== 1 )&&(LFSensor[2]== 1 )&&(LFSensor[3]== 1 )&&(LFSensor[4]== 1 )) { mode = STOPPED; } 

Situasi umum lain dengan Robot Pengikut Garis adalah di mana menemukan "no line ", atau output Sensor Array adalah: 0 0 0 0 0. Dalam kasus ini kita dapat memprogramnya untuk berbalik 180o atau berbelok dalam sudut kecil sampai garis ditemukan dan kondisi Pengikut Garis normal dilanjutkan.

else if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) { mode = NO_LINE; } 

Lengkap loop () akan:

void loop() { readLFSsensors(); switch (mode) { case STOPPED: motorStop(); break; case NO_LINE: motorStop(); motorTurn(LEFT, 180); break; case FOLLOWING_LINE: calculatePID(); motorPIDcontrol(); break; } } 

Kode akhir sebenarnya akan mengintegrasikan logika tambahan dan juga beberapa variabel yang harus diinisialisasi, dll. Durante penjelasan di atas saya menyisakannya untuk kesederhanaan, tetapi semuanya harus jelas dengan melihat kode akhir.

Berikut adalah Kode Arduino akhir:

FUXCUEAIN699SZC.inoFLD2J3KIN699SZF.hFOFYXFZIN699SZT.inoFMPX9KJIN699SZU.inoFFE5AZ3IN699T06.ino

Langkah 10: Menstel Kontrol PID menggunakan Aplikasi Android

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android
Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Dalam kode sebelumnya, Anda dapat menemukan di tab "robotDefines.h" definisi berikut untuk konstanta yang akan digunakan dengan kontrol PID:

float Kp=50; float Ki=0; float Kd=0; 

Seperti dijelaskan pada langkah sebelumnya, cara terbaik untuk menentukan konstanta yang benar untuk digunakan dengan pengontrol PID adalah menggunakan metodologi "Try-error". Sisi buruknya adalah Anda harus mengkompilasi ulang program setiap kali Anda harus mengubahnya. Satu cara untuk mempercepat proses adalah menggunakan aplikasi Android untuk mengirim konstanta pada "Set-Up Phase".

Saya mengembangkan aplikasi Android secara eksklusif untuk itu. Singkatnya ada perintah manual tradisional:

Juganya 3 slider disertakan, satu untuk setiap konstanta PID:

Tombol tambahan disertakan yang akan bekerja tepat seperti tombol yang terhubung pada Pin 9 Arduino. Anda dapat menggunakan salah satunya, tidak masalah.

Di bawah ini Anda dapat menemukan file .aia yang dapat dimodifikasi di MIT AppInventor dan file .apk untuk diinstal langsung di perangkat Android Anda.

FTH62BVIN699T4B.aiaF60H7R0IN699T4I.apk

Langkah 11: Mengubah Kode untuk pengaturan PID jarak jauh

Selama Setup, kami akan memperkenalkan loop di mana Anda dapat mengirim parameter PID ke Robot sebelum Anda meletakkannya di atas garis:

 while (digitalRead(buttonPin) && !mode) { checkBTcmd(); // verify if a comand is received from BT remote control manualCmd (); command = ""; } checkPIDvalues(); mode = STOPPED; 

Fungsi perintah manual akan:

void manualCmd() { switch (command[0]) { case 'g': mode = FOLLOWING_LINE; break; case 's': motorStop(); //turn off both motors break; case 'f': motorForward(); break; case 'r': motorTurn(RIGHT, 30); motorStop(); break; case 'l': motorTurn(LEFT, 30); motorStop(); break; case 'b': motorBackward(); break; case 'p': Kp = command[2]; break; case 'i': Ki = command[2]; break; case 'd': Kd = command[2]; break; } } 

Dalam video, Anda dapat melihat beberapa tes menggunakan aplikasi Android. Di bawah ini kode akhir termasuk pengaturan PID melalui Android:

FGAEB9BIN7QQQAW.inoFBMONSNIN7QQQCD.inoF8B3CDHIN7QQQCL.hFNOMRUNIN7QQQCP.inoFA3K57ZIN7QQQCR.ino

Langkah 12: Kesimpulan

Membangun Robot Pengikut Garis dengan Kontrol PID dan Integrasi Android

Ini adalah bagian pertama dari proyek yang lebih kompleks, mengeksplorasi potensi robot pengikut garis. Di bagian berikutnya, saya akan mengembangkan robot penyelesaian labirin, berdasarkan proyek ini di sini. Semoga saya dapat berkontribusi untuk orang lain untuk belajar lebih banyak tentang elektronika, robot, Arduino, dll.

File pembaruan untuk proyek ini dapat ditemukan di GITHUB. Untuk lebih banyak tutorial, silakan kunjungi Blog saya: MJRoBot.org

Salam dari selatan dunia!

Terima kasih

Marcelo

Kode

  • Code snippet #1
  • Code snippet #2
  • Code snippet #3
  • Code snippet #5
  • Code snippet #6
  • Code snippet #10
  • Code snippet #11
  • Code snippet #12
  • Code snippet #15
  • Code snippet #17
  • Code snippet #18
Code snippet #1Plain text
#include <Servo.h> // Servo library Servo leftServo; Servo rightServo; Void setup() { leftServo.attach(5); rightServo.attach(3); leftServo.writeMicroseconds(1500); rightServo.writeMicroseconds(1500); } void loop() { } 
Code snippet #2Plain text
while(digitalRead(buttonPin)) { } motorTurn (LEFT, 500); motorTurn (RIGHT, 500); 
Code snippet #3Plain text
const int lineFollowSensor0 = 12; const int lineFollowSensor1 = 18; const int lineFollowSensor2 = 17; const int lineFollowSensor3 = 16; const int lineFollowSensor4 = 19; 
Code snippet #5Plain text
LFSensor[0] = digitalRead(lineFollowSensor0); LFSensor[1] = digitalRead(lineFollowSensor1); LFSensor[2] = digitalRead(lineFollowSensor2); LFSensor[3] = digitalRead(lineFollowSensor3); LFSensor[4] = digitalRead(lineFollowSensor4); 
Code snippet #6Plain text
if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 1 )) error = 4; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 1 )&&(LFSensor[4]== 1 )) error = 3; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 1 )&&(LFSensor[4]== 0 )) error = 2; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 1 )&&(LFSensor[3]== 1 )&&(LFSensor[4]== 0 )) error = 1; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 1 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) error = 0; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 1 )&&(LFSensor[2]== 1 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) error =- 1; else if((LFSensor[0]== 0 )&&(LFSensor[1]== 1 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) error = -2; else if((LFSensor[0]== 1 )&&(LFSensor[1]== 1 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) error = -3; else if((LFSensor[0]== 1 )&&(LFSensor[1]== 0 )&&(LFSensor[2]== 0 )&&(LFSensor[3]== 0 )&&(LFSensor[4]== 0 )) error = -4; 
Code snippet #10Plain text
void calculatePID() { P = error; I = I + error; D = error-previousError; PIDvalue = (Kp*P) + (Ki*I) + (Kd*D); previousError = error; } 
Code snippet #11Plain text
void motorPIDcontrol() { int leftMotorSpeed = 1500 - iniMotorPower - PIDvalue; int rightMotorSpeed = 1500 + iniMotorPower - PIDvalue; leftServo.writeMicroseconds(leftMotorSpeed); rightServo.writeMicroseconds(rightMotorSpeed); } 
Code snippet #12Plain text
void loop () { readLFSsensors(); // read sensors, storage values at Sensor Array and calculate "error" calculatePID(); motorPIDcontrol(); } 
Code snippet #15Plain text
void loop() { readLFSsensors(); switch (mode) { case STOPPED: motorStop(); break; case NO_LINE: motorStop(); motorTurn(LEFT, 180); break; case FOLLOWING_LINE: calculatePID(); motorPIDcontrol(); break; } } 
Code snippet #17Plain text
 while (digitalRead(buttonPin) && !mode) { checkBTcmd(); // verify if a comand is received from BT remote control manualCmd (); command = ""; } checkPIDvalues(); mode = STOPPED; 
Code snippet #18Plain text
void manualCmd() { switch (command[0]) { case 'g': mode = FOLLOWING_LINE; break; case 's': motorStop(); //turn off both motors break; case 'f': motorForward(); break; case 'r': motorTurn(RIGHT, 30); motorStop(); break; case 'l': motorTurn(LEFT, 30); motorStop(); break; case 'b': motorBackward(); break; case 'p': Kp = command[2]; break; case 'i': Ki = command[2]; break; case 'd': Kd = command[2]; break; } } 
Github
https://github.com/Mjrovai/MJRoBot-Line-Followerhttps://github.com/Mjrovai/MJRoBot-Line-Follower

Skematik

oIDhLcHQ30lDgVBXZvb8.fzz

Proses manufaktur

  1. Robotika Abad 21: Sistem Terdistribusi, Telepresensi, dan Eksplorasi Angkasa
  2. Sensor Pelacakan Garis dengan Raspberry Pi – Detektor Pintu/Garis Sederhana KY-033
  3. Menguasai Kontrol Sensor dan Aktuator Raspberry Pi: Akselerometer, Servo, dan Streaming Data
  4. Membuat Robot yang Dikontrol WiFi dengan Raspberry Pi & Android Smart Phone
  5. Wittmann Battenfeld Meluncurkan WX153: Garis Robot Canggih untuk Otomatisasi Cetak Injeksi Gaya Tinggi
  6. FANUC Memperluas Garis Robot SCARA: Enam Model, Beban Muatan 3-20 kg, Jangkauan 400-1100 mm
  7. Membuat Remote Android Universal dengan Arduino, 1Sheeld & Kontrol IR
  8. Robot Pengikut Garis Industri untuk Pengiriman Bahan
  9. Menguasai Kontrol PID untuk Gripper Robot 3D di MATLAB/Simulink
  10. Sederhanakan Jaminan Kualitas Kemasan dengan Sistem Kontrol Otomatis Canggih