Tentang proyek ini
Sebagai salah satu pemenang Instructables Robotics Contest 2016, saya menerima hadiah sebuah iRobot Roomba Create2. Ini adalah platform yang hebat dan sangat terjangkau untuk pengembangan robotika, dengan biaya sekitar US$200. Buat 2 memungkinkan untuk berbagai metode pemrograman. Sebagai permulaan, saya menggunakannya dengan Arduino dan APLIKASI Android untuk memindahkan robot. Dalam tutorial pertama ini, saya akan mengeksplorasi cara menghubungkan Arduino dengan Roomba melalui port serial dan cara mengatur motor, LED, dan suaranya. Pada proyek mendatang, saya akan mengeksplorasi sensornya dan juga menggunakan Raspberry Pi untuk menghubungkan Roomba dengan internet.
Di bawah ini, video yang menunjukkan hasil pertama saya memprogram robot Roomba:
Langkah 1:Daftar Bahan
Langkah 2:The Roomba Create2
Roomba adalah robot penggerak diferensial, dengan 2 roda dan kastor depan. Kecepatannya naik hingga 500 mm/s dan dapat diperintahkan untuk naik atau mundur.
Untuk sinyalisasi, kita dapat menghitung dengan empat tampilan 7 segmen dan 5 LED (lihat gambar):
Sebagai sensor internal, kami memiliki antara lain:
- Detektor tebing (4 di depan)
- Detektor benturan (2 di depan)
Untuk pemrograman, dokumen:iRobot® Create® 2 Open Interface (OI) harus digunakan. Roomba dapat diprogram dalam 3 mode:
Mode Pasif:
- Saat mengirim perintah Mulai atau salah satu dari perintah mode pembersihan (mis., Spot, Clean, Seek Dock), OI masuk ke mode Pasif. Saat OI dalam mode Pasif, Anda dapat meminta dan menerima data sensor menggunakan salah satu perintah sensor, tetapi Anda tidak dapat mengubah parameter perintah saat ini untuk aktuator (motor, speaker, lampu, driver sisi rendah, output digital) ke hal lain .
Safe Mode:Memberi Anda kendali penuh atas Roomba, dengan pengecualian kondisi terkait keselamatan berikut:
- Pengisi daya dicolokkan dan dialiri daya.
- Deteksi penurunan roda (pada roda mana pun).
- Deteksi tebing saat bergerak maju (atau bergerak mundur dengan radius putar kecil, kurang dari satu radius robot).
- Jika salah satu kondisi terkait keselamatan di atas terjadi saat OI dalam mode Aman, Roomba menghentikan semua motor dan kembali ke mode Pasif.
Mode penuh:
- Memberikan Anda kendali penuh atas Roomba, semua aktuatornya, dan semua kondisi terkait keselamatan yang dibatasi saat OI dalam mode Aman, karena mode Penuh mematikan fitur keselamatan tebing, wheel-drop, dan pengisi daya internal .
Langkah 3:Koneksi serial
Untuk komunikasi antara Roomba dan Arduino, Port Serial akan digunakan. Secara default, Roomba berkomunikasi pada 115.200 baud, tetapi untuk berkomunikasi dengan Arduino, kami akan mengalihkannya ke 19.200.
Ada 2 cara untuk mengatur baud rate Roomba:
- Saat mematikan Roomba, terus tahan tombol Bersihkan/Daya setelah lampu mati. Setelah sekitar 10 detik, Roomba memainkan nada nada menurun. Roomba akan berkomunikasi pada 19.200 baud hingga prosesor kehilangan daya baterai atau kecepatan baud diubah secara eksplisit melalui OI.
- Gunakan pin Perubahan Kecepatan Baud (pin 5 pada konektor Mini-DIN) untuk mengubah kecepatan baud Roomba. Setelah menyalakan Roomba, tunggu 2 detik lalu denyut Perubahan Baud Rate rendah tiga kali. Setiap pulsa harus berlangsung antara 50 dan 500 milidetik. Roomba akan berkomunikasi pada baud 19200 hingga prosesor kehilangan daya baterai atau kecepatan baud diubah secara eksplisit melalui OI.
Diagram di atas menunjukkan bagaimana Arduino harus terhubung ke konektor Roomba Mini-DIN
Langkah 4:Memulai Roomba
Hal pertama yang harus dilakukan saat memprogram Roomba adalah:
- Tentukan mode (Aman atau penuh)
Kita dapat "membangunkannya", mengirimkan pulsa Low ke Mini-DIN pin 5 (mendeteksi input perangkat) seperti yang ditunjukkan pada fungsi di bawah ini:
void wakeUp (void){ setWarningLED(ON); digitalWrite(ddPin, TINGGI); penundaan(100); digitalWrite(ddPin, RENDAH); penundaan (500); digitalWrite(ddPin, TINGGI); delay(2000);}
Untuk memulai Roomba selalu 2 kode harus dikirim:"MULAI" [128] dan mode, dalam kasus kami "SAFE MODE" [131]. Jika Anda menginginkan "FULL MODE", kode [132] harus dikirim sebagai gantinya.
void startSafe(){ Roomba.write(128); //Mulai Roomba.write(131); //penundaan mode aman(1000);}
Langkah 5:Menyalakan LED dan Tampilan
Menyalakan LED
Seperti yang dijelaskan pada pendahuluan, Roomba memiliki 5 LED:
- Daya/Bersih (dua warna merah/hijau dan intensitas terkontrol)
- Titik (Hijau, intensitas tetap)
- Dock (Hijau, intensitas tetap)
- Peringatan/Centang (Oranye, intensitas tetap)
- Kotoran/Puing (Biru, intensitas tetap)
Semua LED dapat diperintah menggunakan kode [139]. Untuk mengontrol LED Daya, Anda harus mengirim dua byte data ke Roomba:"warna" dan "intensitas".
Warna:
Intensitas:
Fungsi setPowerLED (byte setColor, byte setIntensity) melakukannya:
void setDigitLEDs(byte digit1, byte digit2, byte digit3, byte digit4){ Roomba.write(163); Roomba.write(digit1); Roomba.write(digit2); Roomba.write(digit3); Roomba.write(digit4);}
Misalnya, untuk menyalakan LED POWER dengan warna oranye pada setengah intensitasnya, Anda dapat memanggil fungsi seperti di bawah ini:
setPowerLED (128, 128);
Untuk MENGAKTIFKAN 4 LED yang tersisa, fungsi di bawah ini harus digunakan:
setDebrisLED(ON);setDockLED(ON); setSpotLED(ON); setWarningLED(ON);
Semua fungsi di atas memiliki kode yang mirip dengan yang ini:
void setDebrisLED(bool aktifkan){ debrisLED =aktifkan; Roomba.write(139); Roomba.write((debrisLED ? 1 :0) + (spotLED ? 2 :0) + (dockLED ? 4 :0) + (warningLED ? 8 :0)); Roomba.write((byte)warna); Roomba.write((byte)intensity);}
Pada dasarnya perbedaan akan garis:
debrisLED =aktifkan;
yang harus diubah untuk mengaktifkan setiap LED lainnya (spotLED, dockLED, warningLED ).
Mengirim Pesan untuk Ditampilkan
Roomba memiliki empat Tampilan 7 Segmen yang dapat Anda gunakan untuk mengirim pesan dengan dua cara berbeda:
- Kode [163]:LED Digit Mentah (Numerik)
- Kode [164]:Digit LED ASCII (Perkiraan huruf dan kode utama)
Untuk menampilkan angka sangat mudah. Anda harus mengirimkan kode [163], mengikuti 4 digit yang akan ditampilkan. Fungsinya:setDigitLEDs(byte digit1, byte digit2, byte digit3, byte digit4) melakukan ini untuk Anda:
void setDigitLEDs(byte digit1, byte digit2, byte digit3, byte digit4){ Roomba.write(163); Roomba.write(digit1); Roomba.write(digit2); Roomba.write(digit3); Roomba.write(digit4);}
Misalnya, untuk menampilkan "1, 2, 3, 4", Anda harus memanggil fungsi:
setDigitLEDs(1, 2, 3, 4);
Dengan kode [164], dimungkinkan mengirim perkiraan ASCII. Fungsi setDigitLEDFromASCII(byte digit, char letter) melakukan ini pada kami:
void setDigitLEDFromASCII(byte digit, char letter){ switch (digit){ case 1:digit1 =letter; merusak; kasus 2:angka2 =huruf; merusak; kasus 3:angka3 =huruf; merusak; kasus 4:digit4 =huruf; merusak; } Roomba.write(164); Roomba.write(digit1); Roomba.write(digit2); Roomba.write(digit3); Roomba.write(digit4);}
Untuk mempermudah, saya membuat fungsi baru untuk mengirim 4 digit sekaligus:
void writeLEDs (char a, char b, char c, char d){ setDigitLEDFromASCII(1, a); setDigitLEDFromASCII(2, b); setDigitLEDFromASCII(3, c); setDigitLEDFromASCII(4, d);}
Misalnya, untuk menampilkan "STOP", Anda harus memanggil fungsi:
writeLEDs ('s', 't', 'o', 'p');
Langkah 6:Memindahkan Roomba ke sekitar
Untuk mobilitas, Roomba memiliki 2 motor DC independen yang dapat diprogram untuk bekerja hingga 500mm/s. Ada beberapa perintah yang dapat digunakan untuk menggerakkan robot. Yang utama adalah:
- Kode [137]:Drive ==> Harus mengirim +/- Kecepatan dalam mm/s dan +/- Radius dalam mm
- Kode [145]:Drive Direct ==> Harus mengirim Kecepatan Kiri/Kanan dalam mm/s (+ untuk Maju dan - untuk Mundur)
- Kode [146]:Drive PWM ==> Harus mengirim +/- data PWM untuk roda Kiri dan Kanan
Di bawah ini adalah kode untuk 3 opsi tersebut:
void drive(kecepatan int, radius int){ clamp(kecepatan, -500, 500); //def kecepatan maks dan min dalam penjepit mm/s(jari-jari, -2000, 2000); //def radius maks dan min dalam mm Roomba.write(137); Roomba.write(kecepatan>> 8); Roomba.write(kecepatan); Roomba.write(jari-jari>> 8); Roomba.write(radius);}//-------------------------------------------------- -----------------------void driveWheels(int kanan, int kiri){ clamp(kanan, -500, 500); penjepit (kiri, -500, 500); Roomba.write(145); Roomba.write(kanan>> 8); Roomba.write(kanan); Roomba.write(kiri>> 8); Roomba.write(kiri); }//----------------------------------------------------------- ----------------void driveWheelsPWM(int rightPWM, int leftPWM){ clamp(PWM kanan, -255, 255); penjepit(PWM kiri, -255, 255); Roomba.write(146); Roomba.write(PWM kanan>> 8); Roomba.write(PWM kanan); Roomba.write(kiriPWM>> 8); Roomba.write(leftPWM);}
Perhatikan bahwa fungsi "penjepit" menentukan nilai maksimum dan minimum yang diizinkan untuk dimasukkan. Fungsi ini didefinisikan pada file rombaDefines.h:
#define clamp(nilai, min, maks) (nilai maks ? maks :nilai)
Dengan menggunakan kode di atas, fungsi yang lebih sederhana dapat dibuat untuk menggerakkan Roomba:
/----------------------------------------------------------------- --------------------void turnCW(kecepatan pendek tanpa tanda, derajat pendek tanpa tanda){ drive(kecepatan, -1); penjepit(kecepatan, 0, 500); penundaan (6600); drive(0,0);}//---------------------------------------- -----------------------void turnCCW (kecepatan pendek tanpa tanda, derajat pendek tanpa tanda){ drive (kecepatan, 1); penjepit(kecepatan, 0, 500); penundaan (6600); drive(0,0);}//---------------------------------------- -----------------------void driveStop(void){ drive(0,0);}//----------- -------------------------------------------------- --void driveLeft(int kiri){ driveWheels(kiri, 0);}//------------------------------- --------------------------------void driveRight(int right){ driveWheels(0, right);}
Perhatikan bahwa untuk mengubah sudut, argumen "penundaan" harus dihitung secara khusus untuk kecepatan tertentu. Di bawah ini beberapa contoh yang dapat digunakan untuk pengujian motor:
turnCW (40, 180); // putar searah jarum jam 180 derajat dan stopdriveWheels(20, -20); // putar driveLeft(20); // belok kiri
Untuk menguji motor, ada baiknya menambahkan tombol tekan eksternal (dalam kasus saya terhubung ke pin Arduino 12), sehingga Anda dapat mengunduh kode ke Arduino, memulai Roomba, tetapi menghentikan eksekusi hingga tombol tekan ditekan. Biasanya untuk pengujian motor bisa dilakukan pada bagian set-up code.
Sebagai contoh, silakan lihat kode Arduino sederhana di bawah ini (perhatikan bahwa kode tersebut menggunakan fungsi dan definisi yang dikembangkan sebelumnya):
#include "roombaDefines.h"#include // Roomba Create2 koneksiint rxPin=10;int txPin=11;SoftwareSerial Roomba(rxPin,txPin);//------ ---------------------------------------void setup() { Roomba.begin(19200); pinMode(ddPin, OUTPUT); pinMode(tombolPin, INPUT_PULLUP); // terhubung ke Arduino pin 12 dan digunakan untuk "starting" delay(2000); bangun (); // Bangun Roomba startSafe(); // Mulai Roomba dalam Safe Mode while (digitalRead(buttonPin)) { } // tombol tunggu untuk ditekan untuk menjalankan kode turnCW (40, 180); //test Roomba berputar searah jarum jam 180 derajat dan berhenti}//----------------------------------- ----------void loop() {}
Langkah 7:Mengontrol Roomba melalui Bluetooth
Untuk menyelesaikan bagian pertama dari proyek ini, mari pasang modul Bluetooth (HC-06) ke Arduino kita. Diagram di atas menunjukkan bagaimana melakukannya. Biasanya HC-06 adalah set-up dari pabrik dengan baud rate 9.600. Penting bahwa Anda mengubahnya menjadi 19.200 agar kompatibel dengan kecepatan komunikasi Arduino-Roomba. Anda dapat melakukannya dengan mengirimkan perintah AT ke modul (AT+BAUD5 di mana "5" adalah kode untuk 19.200).
Jika Anda ragu tentang cara kerja HC-06, silakan lihat tutorial saya:Menghubungkan "barang" melalui Bluetooth / Android / Arduino.
Untuk mengontrol Roomba, kami akan menggunakan Aplikasi generik yang saya kembangkan untuk mengontrol robot seluler, menggunakan MIT AppInventor 2:"MJRoBot BT Remote Control". Aplikasi ini dapat diunduh secara gratis dari Google store melalui tautan:Aplikasi:MJRoBot BT Remote Control.
Aplikasi ini memiliki antarmuka yang sederhana, memungkinkan Anda mengirim perintah ke modul BT dalam mode TEXT atau langsung melalui tombol yang telah diprogram sebelumnya (setiap kali tombol ditekan, karakter dikirim):
- p:ON / OFF (tidak digunakan pada bagian pertama ini)
- m:Manual / Otomatis (Digunakan untuk memulai ulang Roomba jika rintangan seperti tebing ditemukan di Safe Mode)
Anda juga dapat mengirim perintah lain sebagai teks jika perlu. Ada juga jendela teks untuk pesan yang diterima dari modul BT. Fitur ini sangat penting selama fase pengujian, dapat digunakan dengan cara yang sama seperti "Monitor Serial".
loop() bagian dari kode akan "mendengarkan" perangkat bluetooth dan tergantung dari perintah yang diterima, ambil tindakan:
void loop() { checkBTcmd(); // verifikasi jika perintah diterima dari BT remote control manualCmd ();}
Fungsi checkBTcmd() ditunjukkan di bawah ini:
void checkBTcmd() // verifikasi apakah perintah diterima dari remote control BT { if (BT1.available()) { command =BT1.read(); BT1.flush(); } }
Setelah perintah diterima, fungsi manualCmd() akan mengambil tindakan yang sesuai:
void manualCmd(){ switch (perintah) { case 'm':startSafe(); Serial.print("Roomba dalam mode Aman"); BT1.print("Roomba BT Ctrl OK - Safe mode"); BT1.println('\n'); perintah ='f'; playSound (3); merusak; huruf 'f':driveStop(); //matikan kedua motor writeLEDs ('s', 't', 'o', 'p'); negara =perintah; merusak; case 'w':drive (kecepatan motor, 0); writeLEDs(' ', 'g', 'o', ' '); negara =perintah; merusak; case 'd':driveRight (kecepatan motor); writeLEDs ('r', 'i', 'g', 'h'); merusak; case 'a':driveLeft(kecepatan motor); writeLEDs ('l', 'e', 'f', 't'); merusak; case 's':drive (-motorSpeed, 0); writeLEDs ('b', 'a', 'c', 'k'); negara =perintah; merusak; case '+':if (status =='w') { kecepatan motor =kecepatan motor + 10; if (Kecepatan motor> MAX_SPEED) { kecepatan motor =MAX_SPEED; } perintah ='w'; } else {perintah =keadaan;} istirahat; case '-':if (state =='w') { kecepatan motor =kecepatan motor - 10; } if (Kecepatan motor
Langkah 8:Kesimpulan
Kode Arduino lengkap yang digunakan di sini dan dokumen terkait dapat ditemukan di GITHUB saya:Roomba_BT_Ctrl.
Harap dicatat bahwa tidak semua aktuator Roomba dikomentari pada tutorial ini. Ada motor lain, digunakan untuk pembersihan, LED lain yang digunakan untuk jadwal, tombol, sensor, dll.
Beberapa fungsi yang saya buat pada program saya didasarkan pada perpustakaan Create 2 yang dikembangkan oleh Dom Amato. Anda dapat mengunduh perpustakaan lengkap di:https://github.com/brinnLabs/Create2 .
Niat saya di sini adalah tetap sederhana dan memberi Anda platform awal untuk mulai bermain dengan Roomba. Di masa depan, saya berpura-pura menerbitkan tutorial lain, menggunakan Raspberry-Pi, menghubungkan Roomba dengan internet, membaca sensornya, dll.
Seperti biasa, saya berharap proyek ini dapat membantu orang lain menemukan jalan mereka di dunia elektronik dan Robotika yang mengasyikkan!
Untuk proyek lainnya, silakan kunjungi blog saya (dalam bahasa Portugis):
MJRoBot.org
Saludos dari selatan dunia!
Sampai jumpa di tutorial saya berikutnya!
Terima kasih
Marcelo
Kode
Github
https://github.com/Mjrovai/Roomba_BT_Ctrl