- Memilih Bahagian untuk Robot Mengimbangkan Diri
- Percetakan 3D dan Pemasangan Robot Mengimbangkan Diri kami
- Rajah Litar
- Kod Robot Mengimbangkan Diri
- Mengendalikan Arduino Self Balancing Robot
Setelah mendapat inspirasi dari motor RYNO dan skuter pengimbang diri yang lain dari Segway, saya selalu mahu membina sesuatu Arduino Segway Robot saya sendiri. Berfikir untuk sementara waktu, saya memutuskan untuk membina Robot Pengimbangan Diri menggunakan Arduino. Dengan cara ini saya dapat memahami konsep asas di sebalik semua skuter ini dan juga mengetahui bagaimana algoritma PID berfungsi.
Sebaik sahaja saya mula membina, saya menyedari bahawa bot ini agak sukar untuk dibina. Terdapat begitu banyak pilihan untuk dipilih dan oleh itu kekeliruan bermula dari bentuk yang betul memilih motor dan kekal sehingga menyesuaikan nilai PID. Terdapat banyak perkara yang perlu dipertimbangkan seperti jenis bateri, kedudukan bateri, pegangan roda, jenis pemandu motor, mengekalkan CoG (Pusat graviti) dan banyak lagi.
Tetapi izinkan saya menyampaikannya kepada anda, setelah anda membinanya, anda akan bersetuju bahawa ia tidak sesukar yang terdengar. Jadi mari kita hadapi, dalam tutorial ini saya akan mendokumentasikan pengalaman saya dalam membina robot pengimbang diri. Anda mungkin seorang pemula mutlak yang baru memulakan atau mungkin telah tiba di sini setelah kecewa lama kerana tidak dapat membuat bot anda bekerja. Tempat ini bertujuan untuk menjadi destinasi terakhir anda. Oleh itu mari kita mulakan……
Memilih Bahagian untuk Robot Mengimbangkan Diri
Sebelum saya memberitahu anda semua pilihan untuk membina bot, izinkan saya menyenaraikan item yang telah saya gunakan dalam projek robot pengimbangan diri ini
- Arduino UNO
- Motor DC gear (berwarna kuning) - 2Nos
- Modul Pemandu Motor L298N
- MPU6050
- Sepasang roda
- Bateri Li-ion 7.4V
- Menyambung wayar
- Badan Bercetak 3D
Anda boleh mencampurkan dan memilih salah satu komponen di atas berdasarkan ketersediaan untuk membuat kit robot pengimbang diri anda sendiri, pastikan komponen tersebut memenuhi kriteria berikut.
Pengawal: Alat kawalan yang saya gunakan di sini adalah Arduino UNO, mengapa kerana ia mudah digunakan. Anda juga boleh menggunakan Arduino Nano atau Arduino mini tetapi saya mengesyorkan anda untuk tetap menggunakan UNO kerana kami dapat memprogramnya secara langsung tanpa perkakasan luaran.
Motor: Pilihan motor terbaik yang boleh anda gunakan untuk robot pengimbang diri, tanpa ragu akan motor Stepper. Tetapi untuk memastikan semuanya mudah, saya telah menggunakan motor gear DC. Ya tidak wajib memiliki anak tangga; bot ini berfungsi dengan baik dengan motor gear DC berwarna kuning yang murah ini juga.
Pemandu Motor: Sekiranya anda memilih motor gear DC seperti saya, anda boleh menggunakan modul pemacu L298N seperti saya, atau L293D juga boleh berfungsi dengan baik. Ketahui lebih lanjut mengenai mengawal motor DC menggunakan L293D dan Arduino.
Roda: Jangan mengira lelaki ini; Saya mempunyai masa yang sukar untuk mengetahui bahawa masalahnya adalah dengan roda saya. Oleh itu, pastikan roda anda mempunyai cengkaman yang baik di atas lantai yang anda gunakan. Perhatikan dengan teliti, cengkaman anda tidak boleh membiarkan roda anda tergelincir di lantai.
Accelerometer and Gyroscope: Pilihan Accelerometer dan Gyroscope terbaik untuk bot anda ialah MPU6050. Oleh itu, jangan cuba membuatnya dengan Accelerometer biasa seperti ADXL345 atau seumpamanya, ia tidak akan berjaya. Anda akan mengetahui sebabnya di akhir artikel ini. Anda juga boleh melihat artikel khusus kami menggunakan MPU6050 dengan Arduino.
Bateri: Kami memerlukan bateri yang ringan dan voltan operasi harus lebih dari 5V sehingga kami dapat mengaktifkan Arduino kami secara langsung tanpa modul peningkatan. Jadi pilihan yang ideal ialah bateri Li-polimer 7.4V. Di sini, kerana bateri Li-ion 7.4V sudah tersedia, saya telah menggunakannya. Tetapi ingat Li-po lebih menguntungkan daripada Li-ion.
Casis: Tempat lain di mana anda tidak boleh berkompromi adalah dengan casis bot anda. Anda boleh menggunakan kadbod, kayu, plastik apa sahaja yang sesuai dengan anda. Tetapi, pastikan casisnya kukuh dan tidak boleh goyah ketika bot sedang berusaha mengimbangkan. Saya telah merancang dengan casis pada Solidworks yang menyimpulkan dari bot lain dan 3D mencetaknya. Sekiranya anda mempunyai pencetak, anda juga boleh mencetak reka bentuknya, fail reka bentuk akan dilampirkan pada tajuk yang akan datang.
Percetakan 3D dan Pemasangan Robot Mengimbangkan Diri kami
Sekiranya anda telah memutuskan untuk mencetak 3D casis yang sama yang saya gunakan untuk membina bot saya, maka fail STL boleh dimuat turun dari thingiverse. Saya juga telah menambahkan fail reka bentuk dengannya supaya anda juga dapat mengubahnya mengikut pilihan kakitangan anda.
Bahagiannya tidak mempunyai struktur gantung sehingga anda dapat mencetaknya dengan mudah tanpa sokongan dan pengisian 25% akan berfungsi dengan baik. Reka bentuknya cukup sederhana dan mana-mana pencetak asas mesti dapat mengatasinya dengan mudah. Saya menggunakan perisian Cura untuk memotong model dan mencetak menggunakan Tevo Tarantula saya, tetapannya ditunjukkan di bawah.
Anda mesti mencetak bahagian badan dan juga empat bahagian pemasangan motor. Pemasangan cukup lurus ke hadapan; gunakan mur dan bolt 3mm untuk menahan motor dan papan di tempatnya. Setelah dipasang, ia akan kelihatan seperti ini dalam gambar di bawah.
Reka bentuk sebenarnya dirancang dengan modul pemacu L298N di rak bawah Arduino dan bateri di atasnya seperti gambar di atas. Sekiranya anda mengikuti perintah yang sama, anda boleh mengacaukan papan secara langsung melalui lubang yang disediakan dan menggunakan tanda wayar untuk bateri Li-po. Susunan ini juga harus berfungsi, kecuali roda super polos yang saya harus ubah kemudian.
Di bot saya, saya telah menukar posisi bateri dan papan Arduino UNO untuk kemudahan pengaturcaraan dan juga harus memperkenalkan papan perf untuk menyelesaikan sambungan. Jadi bot saya tidak kelihatan seperti yang saya rancangkan pada peringkat awal. Setelah menyelesaikan ujian pengaturcaraan pendawaian dan segalanya, robot roda dua saya akhirnya kelihatan seperti ini
Rajah Litar
Membuat sambungan untuk Robot Pengimbang Diri berasaskan Arduino ini cukup mudah. Ini adalah robot pengimbang diri menggunakan Arduino dan MPU6050 jadi kami mengambil untuk menghubungkan MPU6050 dengan Arduino dan menghubungkan motor melalui modul pemandu Motor. Keseluruhan pemasangan dikuasakan oleh bateri li-ion 7.4V. Gambarajah litar yang sama ditunjukkan di bawah.
Modul pemandu Arduino dan L298N Motor dihidupkan secara langsung melalui pin Vin dan terminal 12V masing-masing. Pengatur on-board di papan Arduino akan menukar input 7.4V ke 5V dan ATmega IC dan MPU6050 akan dikuasakan olehnya. Motor DC boleh berjalan dari voltan 5V hingga 12V. Tetapi kita akan menghubungkan wayar positif 7.4V dari bateri ke terminal input 12V modul pemandu motor. Ini akan menjadikan motor beroperasi dengan 7.4V. Jadual berikut akan menyenaraikan bagaimana modul pemacu motor MPU6050 dan L298N dihubungkan dengan Arduino.
Pin Komponen |
Pin Arduino |
MPU6050 |
|
Vcc |
+ 5V |
Tanah |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
IN1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050 berkomunikasi dengan Arduino melalui antara muka I2C, jadi kami menggunakan pin SPI A4 dan A5 dari Arduino. Motor DC disambungkan ke pin PWM D6, D9 D10 dan D11 masing-masing. Kita perlu menghubungkannya ke pin PWM kerana kita akan mengawal kelajuan motor DC dengan mengubah kitaran tugas isyarat PWM. Sekiranya anda tidak biasa dengan dua komponen ini, adalah disyorkan untuk membaca tutorial pemacu Motor MPU6050 Interfacing dan L298N.
Kod Robot Mengimbangkan Diri
Sekarang kita harus memprogram papan Arduino UNO kita untuk mengimbangkan robot. Di sinilah semua sihir berlaku; konsep di sebalik itu mudah. Kita harus memeriksa apakah bot condong ke depan atau ke belakang menggunakan MPU6050 dan kemudian jika condong ke depan kita harus memutar roda ke arah depan dan jika condong ke belakang kita harus memutar roda ke arah terbalik.
Pada waktu yang sama kita juga harus mengontrol kecepatan putaran roda, jika bot sedikit bingung dari posisi tengah roda berputar perlahan dan kecepatan meningkat ketika semakin jauh dari posisi tengah. Untuk mencapai logik ini, kami menggunakan algoritma PID, yang mempunyai kedudukan tengah sebagai set-point dan tahap disorientasi sebagai output.
Untuk mengetahui kedudukan bot saat ini, kami menggunakan MPU6050, yang merupakan gabungan pecutan 6 paksi dan sensor giroskop. Untuk mendapatkan nilai kedudukan yang dapat dipercayai dari sensor, kita perlu menggunakan nilai akselerometer dan giroskop, kerana nilai dari akselerometer memiliki masalah kebisingan dan nilai dari giroskop cenderung melayang dengan waktu. Oleh itu, kita harus menggabungkan kedua-duanya dan mendapatkan nilai dari yaw pitch dan roll robot kita, yang mana kita hanya akan menggunakan nilai yaw.
Kedengaran kepalanya terasa gatal kan? Tetapi jangan risau, terima kasih kepada komuniti Arduino, kami telah menyediakan perpustakaan yang dapat melakukan pengiraan PID dan juga mendapatkan nilai menguap dari MPU6050. Perpustakaan ini dibangunkan oleh br3ttb dan jrowberg masing-masing. Sebelum meneruskan muat turun perpustakaan mereka bentuk pautan berikut dan tambahkannya ke direktori lib Arduino anda.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Sekarang, kami mempunyai perpustakaan yang ditambahkan ke Arduino IDE kami. Mari mulakan pengaturcaraan untuk Robot pengimbangan diri kami. Seperti biasa kod lengkap untuk robot pengimbang MPU6050 diberikan di akhir halaman ini, di sini saya hanya menerangkan potongan paling penting dalam kod tersebut. Seperti yang diberitahu sebelumnya, kod ini dibina di atas contoh kod MPU6050, kita hanya akan mengoptimumkan kod untuk tujuan kita dan menambahkan PID dan teknik kawalan untuk robot pengimbangan diri kita.
Mula-mula kami memasukkan perpustakaan yang diperlukan agar program ini berfungsi. Mereka termasuk perpustakaan I2C terbina dalam, Perpustakaan PID dan Perpustakaan MPU6050 yang baru sahaja kami muat turun.
#include "I2Cdev.h" #include
Kemudian kami menyatakan pemboleh ubah yang diperlukan untuk mendapatkan data dari sensor MPU6050. Kami membaca kedua-dua vektor graviti dan nilai kuarterion dan kemudian mengira nilai yaw pitch dan roll bot. The float lokasi YPR akan mengadakan keputusan akhir.
// MPU kawalan / status vars bool dmpReady = false; // tetapkan benar sekiranya DMP init berjaya uint8_t mpuIntStatus; // memegang byte status gangguan sebenar dari MPU uint8_t devStatus; // kembali status selepas setiap operasi peranti (0 = berjaya ,! 0 = ralat) uint16_t packetSize; // ukuran paket DMP yang dijangkakan (lalai adalah 42 bait) uint16_t fifoCount; // jumlah semua bait yang ada di FIFO uint8_t fifoBuffer; // Penyangga simpanan FIFO // orientasi / gerakan vars Quaternion q; // wadah quaternion VectorFloat graviti; // apungan vektor graviti ypr; // bekas yaw / pitch / roll dan vektor graviti
Seterusnya terdapat segmen kod yang sangat penting, dan di sinilah anda akan menghabiskan banyak masa untuk mengatur set nilai yang betul. Sekiranya robot anda dibina dengan pusat graviti yang sangat baik dan komponennya disusun secara simetri (yang pada kebiasaannya tidak), maka nilai set-point anda ialah 180. Jika tidak, sambungkan bot anda ke monitor bersiri Arduino dan condongkannya hingga anda dapati kedudukan pengimbangan yang baik, baca nilai yang dipaparkan pada monitor bersiri dan ini adalah nilai titik seting anda. Nilai Kp, Kd dan Ki harus disesuaikan mengikut bot anda. Tidak ada dua bot yang sama akan mempunyai nilai Kp, Kd dan Ki yang sama sehingga tidak ada yang melarikan diri daripadanya. Tonton video di hujung halaman ini untuk mendapatkan idea bagaimana menyesuaikan nilai-nilai ini.
/ ********* Tentukan 4 nilai ini untuk BOT ********* / setpoint berganda anda = 176; // tetapkan nilai ketika bot tegak lurus ke tanah menggunakan monitor bersiri. // Baca dokumentasi projek di circuitdigest.com untuk mengetahui cara menetapkan nilai ini berganda Kp = 21; // Tetapkan Kd berganda pertama ini = 0.8; // Set ini secound double Ki = 140; // Akhirnya tetapkan ini / ****** Tetapan nilai akhir ********* /
Pada baris seterusnya kita menginisialisasi algoritma PID dengan meneruskan input pemboleh ubah input, output, set point, Kp, Ki dan Kd. Daripada jumlah ini, kita sudah menetapkan nilai set-point Kp, Ki dan Kd dalam coretan kod di atas. Nilai input akan menjadi nilai yaw semasa yang dibaca dari sensor MPU6050 dan nilai output akan menjadi nilai yang dikira oleh algoritma PID. Jadi pada asasnya algoritma PID akan memberi kita nilai output yang harus digunakan untuk membetulkan nilai Input agar hampir dengan titik yang ditetapkan.
PID pid (& input, & output, & setpoint, Kp, Ki, Kd, LANGSUNG);
Di dalam fungsi setup void, kita menginisialisasi MPU6050 dengan mengkonfigurasi DMP (Digital Motion Processor). Ini akan membantu kita dalam menggabungkan data Accelerometer dengan data Giroskop dan memberikan nilai Yaw, Pitch and Roll yang boleh dipercayai. Kami tidak akan membahas perkara ini dengan mendalam kerana topik ini akan jauh melebihi topik ini. Bagaimanapun, satu segmen kod yang perlu anda cari dalam fungsi persediaan adalah nilai gsetro gset. Setiap sensor MPU6050 mempunyai nilai offset sendiri, anda boleh menggunakan lakaran Arduino ini untuk mengira nilai offset sensor anda dan mengemas kini baris berikut dengan tepat dalam program anda.
// sediakan offset gyro anda sendiri di sini, disesuaikan dengan kepekaan min mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Kita juga harus memulakan pin PWM Digital yang kita gunakan untuk menghubungkan motor kita. Dalam kes kami adalah D6, D9, D10 dan D11. Oleh itu, kami memulakan pin ini kerana pin output menjadikannya RENDAH secara lalai.
// Initialise Motor outpu pin pinMode (6, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); // Secara lalai mematikan kedua analogWrite motor (6, RENDAH); analogWrite (9, RENDAH); analogWrite (10, RENDAH); analogWrite (11, RENDAH);
Di dalam fungsi gelung utama, kami memeriksa apakah data dari MPU6050 siap dibaca . Sekiranya ya maka kami menggunakannya untuk menghitung nilai PID dan kemudian memaparkan nilai input dan output PID pada monitor bersiri hanya untuk memeriksa bagaimana PID bertindak balas. Kemudian berdasarkan nilai output kami memutuskan sama ada bot harus bergerak maju atau mundur atau diam.
Oleh kerana kita menganggap bahawa MPU6050 akan kembali 180 ketika bot itu tegak. Kita akan mendapat nilai pembetulan positif ketika bot jatuh ke depan dan kita akan mendapat nilai negatif jika bot jatuh ke arah belakang. Oleh itu, kami memeriksa keadaan ini dan memanggil fungsi yang sesuai untuk menggerakkan bot ke hadapan atau ke belakang.
sementara (! mpuInterrupt && fifoCount <packetSize) { // tiada data mpu - melakukan pengiraan PID dan output ke motor pid.Compute (); // Cetak nilai Input dan Output pada monitor bersiri untuk memeriksa bagaimana ia berfungsi. Cetakan bersiri (input); Serial.print ("=>"); Serial.println (output); if (input> 150 && input <200) {// Sekiranya Bot jatuh jika (output> 0) // Jatuh ke arah hadapan Maju (); // Putar roda ke hadapan yang lain jika (output <0) // Jatuh ke arah belakang Mundur (); // Putar roda ke belakang } lain // Sekiranya Bot tidak jatuh Berhenti (); // Pegang roda pegun }
The PID output berubah-ubah juga memutuskan berapa cepat motor perlu diputar. Sekiranya bot hampir jatuh maka kita akan membuat pembetulan kecil dengan memutar roda perlahan. Sekiranya pembetulan kecil ini berfungsi dan masih jika bot jatuh, kami akan meningkatkan kelajuan motor. Nilai seberapa pantas roda berpusing akan ditentukan oleh algoritma PI. Perhatikan bahawa untuk fungsi Terbalik kita telah melipatgandakan nilai output dengan -1 sehingga kita dapat mengubah nilai negatif menjadi positif.
batal Maju () // Kod untuk memutar roda ke hadapan { analogWrite (6, output); analogWrite (9,0); analogWrite (10, output); analogWrite (11,0); Cetakan bersiri ("F"); // Maklumat penyahpepijatan } batal Balik () // Kod untuk memutar roda ke belakang { analogWrite (6,0); analogWrite (9, output * -1); analogWrite (10,0); analogWrite (11, output * -1); Cetakan bersiri ("R"); } batal Berhenti () // Kod untuk menghentikan kedua-dua roda { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Cetakan bersiri ("S"); }
Mengendalikan Arduino Self Balancing Robot
Setelah anda siap menggunakan perkakasan, anda boleh memuat naik kod tersebut ke papan Arduino anda. Pastikan sambungannya betul kerana kita menggunakan bateri Li-ion sangat diperlukan. Oleh itu, periksa litar pintas dan pastikan terminal tidak akan bersentuhan walaupun bot anda mengalami sedikit kesan. Nyalakan modul anda dan buka monitor bersiri anda, jika Arduino anda dapat berkomunikasi dengan MPU6050 dengan jayanya dan jika semuanya berfungsi seperti yang diharapkan, anda harus melihat layar berikut.
Di sini kita melihat nilai input dan output dari algoritma PID dalam format input => output . Sekiranya bot seimbang, nilai output akan menjadi 0. Nilai input adalah nilai semasa dari sensor MPU6050. Huruf "F" menunjukkan bahawa bot bergerak ke depan dan "R" menunjukkan bahawa bot secara terbalik.
Semasa peringkat awal PID, saya cadangkan agar kabel Arduino anda disambungkan ke bot supaya anda dapat memantau nilai input dan output dengan mudah dan juga mudah untuk membetulkan dan memuat naik program anda untuk nilai Kp, Ki dan Kd. The video di bawah menunjukkan kerja lengkap bot dan juga menunjukkan bagaimana untuk membetulkan nilai PID anda.
Harap ini dapat membantu membina robot pengimbang diri anda sendiri sekiranya anda mempunyai masalah untuk membuatnya berfungsi, kemudian tinggalkan soalan anda di bahagian komen di bawah atau gunakan forum untuk lebih banyak pertanyaan teknikal. Sekiranya anda mahukan lebih banyak keseronokan, anda juga boleh menggunakan logik yang sama untuk membina robot pengimbang bola.