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

Mengontrol Robot Roomba Dengan Arduino Dan Perangkat Android

Komponen dan persediaan

Roomba Create2
× 1
Arduino UNO
× 1
Sakelar Tombol Tekan SparkFun 12mm
× 1

Aplikasi dan layanan online

Kontrol Jarak Jauh MJRoBot BT - Aplikasi Android

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

  • iRobot Create2
  • Arduino UNO
  • Modul Bluetooth HC-06
  • Tombol tekan

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):

  • Bersih
  • Tempat
  • Dok
  • Peringatan/Periksa
  • Kotoran/Puing

Sebagai sensor internal, kami memiliki antara lain:

  • Detektor tebing (4 di depan)
  • Detektor benturan (2 di depan)
  • Encoder roda

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:

  • "Bangunkan" robotnya
  • 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:

  • Hijau =0
  • Oranye =128
  • merah=255

Intensitas:

  • Rendah=0
  • Maks=255

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):

  • w:Maju
  • s:Mundur
  • d:Benar
  • a:Kiri
  • f:Berhenti
  • 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)
  • +:Kecepatan +
  • -:Kecepatan -

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

Proses manufaktur

  1. Mengontrol Efek dengan Sensor Nyata
  2. Buat pendeteksi kebakaran dalam hitungan menit dengan Samsung SAMIIO, Arduino UNO, dan Raspberry Pi
  3. Buat Robot Streaming Video Terkendali Internet Anda dengan Arduino dan Raspberry Pi
  4. Kontrol Jarak Jauh Universal menggunakan Arduino, 1Sheeld, dan Android
  5. Hambatan Menghindari Robot Dengan Motor Servo
  6. Termometer Portabel dengan Perangkat Android
  7. Mengontrol Motor Servo dengan Arduino dan MPU6050
  8. Mengontrol Kecerahan LED Menggunakan Bolt dan Arduino
  9. u-blox LEA-6H 02 Modul GPS dengan Arduino dan Python
  10. Pengenalan dan Sintesis Ucapan dengan Arduino