Tentang proyek ini
Tujuan dari tutorial ini adalah untuk mengembangkan proyek langkah demi langkah untuk mengendalikan dan memprogram Lengan Robot, mensimulasikan fungsi dasar robot industri.
Langkah 1:Spesifikasi
Robot memiliki dua fungsi dasar:
- Program :Rekam posisi lengan dalam tiga dimensi (setiap catatan adalah "langkah")
- Lari :Lakukan secara berurutan posisi yang direkam dalam "Program". Robot akan menjalankan program sampai perintah "ABORT" digunakan.
Karakteristik utama:
- Proyek ini dapat digunakan untuk mengontrol robot dengan 3 atau 4 DOF ("Derajat Kebebasan").
- Robot dapat dikontrol dalam mode "LOCAL" dan "REMOTE" (yang terakhir melalui perangkat Android)
- Selama fase program, pengguna dapat mengubah mode kontrol dari "LOCAL" menjadi "REMOTE" dan sebaliknya.
- Informasi kepada pengguna akan diberikan melalui LED berwarna, tampilan LED 2 baris, dan suara (buzzer).
- Alarm suara juga dapat dipicu dari jarak jauh.
Langkah 2:Proyek
Diagram blok pada langkah sebelumnya menunjukkan "Bill of Material" yang akan digunakan dalam proyek ini.
Saya memilih Arduino MEGA agar tidak khawatir dengan jumlah port Arduino (I/Os) yang tersedia. UNO misalnya, akan bekerja tanpa masalah tetapi metode perluasan port harus digunakan. Ada beberapa opsi yang dapat dengan mudah ditemukan di internet, seperti dekoder 74138 misalnya.
Di sini, prototipe Pertama diprogram dalam "mode lokal".
Untuk jaringan Bluetooth, HC-06 akan digunakan.
Aplikasi Android yang digunakan untuk "mode jarak jauh
", dikembangkan menggunakan alat MIT Appinventor2, yang merupakan platform tunggal yang kuat untuk jenis aplikasi berbasis perangkat Android ini. Aplikasi ini tersedia untuk diunduh secara gratis di Google store:MJRoBot Arduino Robot Arm Control.
Video di bawah ini dapat memberi Anda gambaran tentang apa yang seharusnya menjadi tugas akhir dengan pemrograman jarak jauh:
Langkah 3:Pengembangan Proyek
Lengan Robot dapat diklasifikasikan menurut jumlah "sendi" atau "Degrees Of Freedom" (DOF) yang mereka miliki.
- "Pangkalan ", atau "Pinggang ", biasanya dapat memutar lengan 180o atau 360o, tergantung dari jenis Servo yang digunakan (di sini dalam proyek ini, Servo 180o digunakan).
- "Bahu ", bertanggung jawab untuk "mengangkat atau menurunkan" lengan secara vertikal.
- "Siku " akan membuat lengan "maju atau mundur".
- "Cakar " atau "Gripper " bekerja dengan membuka atau menutup untuk "ambil barang."
Langkah 4:Sirkuit
Motor servo akan digunakan untuk menggerakkan sambungan yang terhubung langsung ke Arduino. Perhatikan bahwa tidak jarang melihat "Motor Stepper" digunakan di pangkalan untuk torsi dan presisi yang lebih besar. Pilihan servo yang tepat sangat penting (ada servo Cina murah yang konstruksinya sangat buruk seperti MG995, yang sayangnya adalah servo yang disertakan dengan AARM 3DOF SanSmart saya). Tapi untuk usulan proyek ini bekerja dengan baik.
Daya DC untuk servos harus dipisahkan dari Arduino dan komponen lainnya. Catu daya eksternal 5 atau 6V akan bekerja tanpa masalah (periksa Lembar Data dari servors Anda untuk memverifikasi rentang tegangan yang tepat). Praktik umum juga menggunakan kapasitor 470uF antara VCC dan GND untuk meminimalkan kebisingan yang dihasilkan oleh motor DC di dalam servors. Pastikan untuk menghubungkan semua "Pembumian" (Sumber Daya eksternal dengan pin Arduino GND).
Jika servo bermasalah dan banyak bergetar, lakukan penyesuaian pada "penundaan" kode Anda. Penting bahwa servo memiliki waktu untuk mencapai titik tertentu sebelum menerima perintah baru. Juga patut diperiksa apakah servos itu digital atau analog, seolah-olah mereka secara mekanis serupa, digital bekerja dengan frekuensi 300Hz sedangkan analog, 50Hz. Pustaka Arduino standar "Servo.h
" dikembangkan untuk servo analog dan dapat dimodifikasi jika perlu, agar berfungsi lebih baik dengan servo digital.
Gambar di atas menunjukkan rangkaian lengkapnya.
Langkah 5:Kode
Proyek ini tidak rumit, tetapi memiliki banyak variabel. Yang paling bijaksana adalah mendefinisikannya dengan jelas dan meninggalkan komentar pada file unik:
ArmDefine.h
File ini juga harus mengatur sudut servo minimum, maksimum dan awal. Kode yang disertakan dalam tutorial ini, memiliki dua set parameter untuk lengan robot yang saya uji dalam proyek saya (tentu saja hanya sekelompok konstanta yang harus digunakan):
// MeArm 4-DOF#define minGrip 15 #define minBase 0 #define minShou 60 #define minElbw 60 #define maxGrip 45 #define maxBase 170#define maxShou 180 #define maxElbw 150 #define midGrip 30#define midBase 87#define midShou 138#define midElbw 100/* SS 3-DOF#define minGrip 75 #define minBase 5 #define minShou 5 #define minElbw 0 #define maxGrip 125 #define maxBase 150#define maxShou 155 #define maxElbw 0 midGrip 100#define midBase 90#define midShou 90#define midElbw 0 */
Setiap jenis lengan memiliki serangkaian parameter yang berbeda dan penting bagi Anda untuk menemukan yang tepat untuk Anda. Apa yang saya sarankan adalah bahwa awalnya potensiometer (pot) tetap pada titik tengahnya dan Pemetaan output PWM diatur ke nilai default:Max =255
, Min =0
dan Mid =126
( "#defines
" di atas). Kemudian, mulailah memvariasikan pot (satu per satu) dan ikuti di Serial Monitor (atau LCD) apa yang harus menjadi nilai minimum dan maksimum di mana lengan bekerja dengan benar. Itu akan menjadi nilai akhir yang akan digunakan untuk pengaturan (ubah nilai asli saya di ArmDefine.h)
.
Untuk ”merekam” kumpulan koordinat (atau langkah) yang harus dimainkan robot, saya akan menggunakan larik data:
int gripPosition[100];int basePosition[100];int shouPosition[100];int elbwPosition[100];int positionIndex =0; // Indeks yang akan digunakan pada array posisi yang digunakan untuk tugas yang direkam
Perhatikan bahwa saya tidak menjaga posisi "tersimpan" dan di akhir program "robot", indeks kembali ke nol dan robot akan menunggu perekaman urutan baru (program hilang). Atau, Anda dapat menyimpan array data ini di Arduino EEPROM, misalnya. Dengan melakukan itu, program akan dijalankan kembali atau bahkan Anda dapat memiliki lebih dari satu program yang tersimpan.
Langkah 6:Logika program
Blok utama ("Loop") sangat sederhana:
Periksa apakah perintah untuk menjalankan "program" (urutan langkah) telah digunakan.
- Jika tidak, "program" belum selesai dan masih harus menulis langkah-langkah baru.
- Jika "posisi baru" ditentukan, tambahkan ke program.
- Pertama, periksa pesan yang tiba di buffer serial, dari perangkat Android.
- Selanjutnya, memverifikasi apakah mode kontrol adalah "Lokal" atau "Jarak Jauh" (defaultnya adalah Lokal).
- Kembali ke awal dan lakukan langkah 1 lagi.
void loop(){ checkBTcmd(); defineLocalRemote(); execTaskCmd =digitalRead (execTaskPin); if (execTaskCmd ==|| perintah HIGH =="runon") { RunProgram (); } else recArmPosition(); perintah ="";}
Fungsi checkBTcmd() merakit string menggunakan karakter individu yang berasal dari modul BT. String ini diteruskan ke variabel "command ".
Fungsi defineLocalRemote() menganggap variabel "perintah " memeriksa apakah satu perintah untuk mengubah mode ke remote diterima atau sebaliknya. Perintah alarm juga dianalisis di sini. Untuk logika program, jika "Alarm" dipicu di perangkat Android, lengan harus selalu pergi ke Remote modus.
Fungsi RunProgram() melakukan persiapan, menyalakan / mematikan LED, dll dan terutama menjalankan fungsi:ExecuteTask() . Yang terakhir adalah fungsi yang berisi logika eksekusi dari urutan langkah. Fungsi meningkatkan "positionIndex " mengirimkan data posisi ke lengan satu per satu menggunakan alat:armPosition(grip, base, shoulder, elbow) .
Terakhir, fungsi yang benar-benar memerintahkan servo dan menulis "langkah" adalah recArmPosition() . Bergantung pada penerimaan perintah Android, fungsi ini akan menentukan posisi servos yang dapat melalui pot, atau melalui "slider" aplikasi Android. Dengan setiap perubahan posisi, fungsi ini mengirimkan koordinat ke servos menggunakan armPosition
fungsi (pegangan, alas, bahu, siku). Pembacaan posisi sebenarnya dari pot atau slider dan aktivasi servo yang sesuai terjadi pada saat perintah "SAVE" atau "PROGRAM" dipicu. Pada saat itu, indeks posisi array bertambah dan langkah disimpan.
Untuk menyederhanakan pemahaman, semua kode didasarkan pada fungsi spesifiknya. "Penyiapan
", "Lingkaran
" dan fungsi yang dijelaskan di atas hampir semuanya ada dalam file:MJRoBot_Arm_Robot_Task_Prgm.ino
Fungsi yang lebih umum seperti perintah read BT:void checkBTcmd() ; generator suara:bip kosong (int pin, int freq, long ms) dan debouncing:debounce boolean (int pin) ; ada di file:General_Functions.ino
Fakta penting:saat Arduino mengeksekusi instruksi berdasarkan clock 16Mhz, diharapkan tombol kontrol dibaca ratusan atau bahkan ribuan kali per detik, oleh karena itu penting untuk membuat tombol "debouncing" yang mengatur langkah perekaman .
File keempat dan terakhir adalah:Arm_Ctrl_and_Display.ino
Dalam file ini adalah fungsi membaca potensiometer:bool readPotenciometers() ; membaca slider Android:bool readSliders() ; penempatan servo:void armPosition (int gripp, int basee, int shoulder, elbow int) . Fungsi lain yang disertakan dalam file adalah untuk tampilan data pada LCD, Serial Monitor, alarm, dll.
Video menunjukkan lengan robot 4DOF "meArm" diprogram dari jarak jauh melalui aplikasi Android .
Kode sumber lengkap untuk proyek ini dapat ditemukan di GITHUB:
https://github.com/Mjrovai/MJRoBot-Programmed-Arm
atau di sini:
F49C85FIL8CVX0P.ino FC4OQJNIL8CVX1C.h FBYPQAMIL8CVX1D.ino F2SBAXVIL8CVX1E.ino
Langkah 7:Kesimpulan
Seperti biasa, saya berharap proyek ini dapat membantu orang lain menemukan jalan mereka di dunia Elektronik, Robotika, dan IoT yang mengasyikkan! Untuk proyek lainnya, silakan kunjungi blog saya:MJRoBot.org
Saludos dari selatan dunia! Sampai jumpa di tutorial saya berikutnya!
Terima kasih
Marcelo
Kode
- Cuplikan kode #1
- Cuplikan kode #2
- Cuplikan kode #3
Cuplikan kode #1Arduino
// MeArm 4-DOF#define minGrip 15 #define minBase 0 #define minShou 60 #define minElbw 60 #define maxGrip 45 #define maxBase 170#define maxShou 180 #define maxElbw 150 #define midGrip 30#define midBase 87# define midShou 138#define midElbw 100/* SS 3-DOF#define minGrip 75 #define minBase 5 #define minShou 5 #define minElbw 0 #define maxGrip 125 #define maxBase 150#define maxShou 155 #define maxElbw 0 #define midGrip define midBase 90#define midShou 90#define midElbw 0 */
Cuplikan kode #2Arduino
int gripPosition[100];int basePosition[100];int shouPosition[100];int elbwPosition[100];int positionIndex =0; // Indeks yang akan digunakan pada array posisi yang digunakan untuk tugas yang direkam
Cuplikan kode #3Arduino
void loop(){ checkBTcmd(); defineLocalRemote(); execTaskCmd =digitalRead (execTaskPin); if (execTaskCmd ==|| perintah HIGH =="runon") { RunProgram (); } else recArmPosition(); perintah ="";}
Github
https://github.com/Mjrovai/MJRoBot-Programmed-Armhttps://github.com/Mjrovai/MJRoBot-Programmed-Arm Skema
Lengan Robot
https://github.com/Mjrovai/MJRoBot-Programmed-Arm/blob/master/Arm_Robot_Task_Program_Man_BT_16_fev_16/Arm%20Robot%20Diagram.png