Membuat Lengan Robot Arduino Tanpa Kabel, Dikontrol dari Smartphone Anda
Dalam tutorial ini kita akan mempelajari cara membuat Lengan Robot Arduino yang dapat dikontrol dan diprogram secara nirkabel menggunakan aplikasi Android buatan sendiri. Saya akan menunjukkan seluruh proses pembuatannya, mulai dari merancang dan mencetak 3D bagian robot, menghubungkan komponen elektronik dan memprogram Arduino, hingga mengembangkan aplikasi Android kita sendiri untuk mengontrol Lengan Robot.
Anda dapat menonton video berikut atau membaca tutorial tulisan di bawahnya.
Tinjauan Umum
Menggunakan slider dalam aplikasi kita dapat secara manual mengontrol gerakan setiap servo atau sumbu lengan robot. Juga menggunakan tombol "Save" kita dapat merekam setiap posisi atau langkah dan kemudian lengan robot dapat secara otomatis berjalan dan mengulangi langkah-langkah ini. Dengan tombol yang sama kita dapat menjeda operasi otomatis serta mereset atau menghapus semua langkah sehingga kita dapat merekam yang baru.
Model 3D Lengan Robot Arduino
Untuk memulai, saya merancang Lengan Robot menggunakan perangkat lunak pemodelan 3D Solidworks. Lengan memiliki 5 derajat kebebasan.
Untuk 3 sumbu pertama, pinggang, bahu dan siku, saya menggunakan servo MG996R, dan untuk 2 sumbu lainnya, roll pergelangan tangan dan pitch pergelangan tangan, serta pegangan saya menggunakan servo mikro SG90 yang lebih kecil.
Anda dapat menemukan dan mengunduh model 3D ini, serta menjelajahinya di browser Anda di Thangs:
Unduh model 3D rangkaian dari Thangs.
Terima kasih Thangs telah mendukung tutorial ini.
File STL untuk Cetak 3D:
File STL Lengan Robot Arduino
1 file(s) 0.00 KB Download
Mencetak 3D Lengan Robot
Menggunakan printer 3D baru saya, Creality CR-10, saya mencetak 3D semua bagian untuk lengan robot Arduino.
Di sini saya ingin mengucapkan terima kasih kepada Banggood.com telah menyediakan printer 3D yang luar biasa ini bagi saya. Kualitas cetak Creality CR-10 luar biasa untuk harga titiknya dan yang juga hebat tentangnya adalah ia hampir 90% sudah terpasang.
Untuk menyelesaikan rangkaian kita hanya perlu menghubungkan bagian frame atas dan bawah dengan beberapa bout dan bracket, dan kemudian menghubungkan komponen elektronik dengan kotak kontrol menggunakan kabel yang disediakan.
Sebelum mencobanya, disarankan untuk memeriksa apakah roda gulung cukup rapat, dan jika tidak, Anda dapat dengan mudah menggunakan baut eksentrik untuk merapatkannya. Dan itu saja, setelah menlevelkan tempat cetak printer 3D Anda, Anda siap untuk mengubah kreasi 3D Anda menjadi kenyataan.
Saya sudah memiliki semua bagian untuk Lengan Robot Arduino siap dalam beberapa jam.
Baca selengkapnya: 15 Aksesori dan Alat Printer 3D yang Wajib Dimiliki
Mengrakit Lengan Robot
Oke, jadi pada titik ini kita siap untuk merakit lengan robot. Saya memulai dengan dasar tempat saya memasang motor servo pertama menggunakan baut yang disertakan dalam kemasan. Kemudian pada poros output servo saya memasang horn bundar dengan baut.
Dan di atasnya saya meletakkan bagian atas dan mengamankannya dengan dua baut.
Di sini lagi pertama servo, lalu horn bundar pada bagian selanjutnya, dan kemudian mereka diikat satu sama lain dengan baut pada poros output.
Kita dapat memperhatikan di sini bahwa di sumbu bahu merupakan ide baik untuk menyertakan jenis pegas atau dalam kasus saya saya menggunakan karet untuk memberikan sedikit bantuan pada servo karena servo ini memikul seluruh berat sisa lengan serta beban.
Dengan cara yang sama saya melanjutkan untuk merakit sisa lengan robot. Sebagai untuk mekanisme pegangan saya menggunakan beberapa baut dan baut 4 milimeter untuk merakitnya.
Terakhir saya memasang mekanisme pegangan pada servo terakhir dan Lengan Robot Arduino selesai.
Diagram Rangkaian Lengan Robot Arduino
Tahap selanjutnya adalah menghubungkan elektronik. Diagram rangkaian proyek ini sebenarnya cukup sederhana. Kita hanya membutuhkan papan Arduino dan modul Bluetooth HC-05 untuk komunikasi dengan smartphone. Pin kontrol enam motor servo terhubung ke enam pin digital papan Arduino.
Untuk menyuntikkan daya servo kita memerlukan 5V, tetapi ini harus datang dari sumber daya eksternal karena Arduino tidak mampu menangani jumlah arus yang dapat ditarik oleh semuanya. Sumber daya harus mampu menahan setidaknya 2A arus. Jadi setelah kita telah menghubungkan semuanya bersama kita dapat melanjutkan untuk memprogram Arduino dan membuat aplikasi Android.
Anda dapat mendapatkan komponen yang dibutuhkan untuk contoh ini dari tautan di bawah ini:
Motor Servo MG996R……………………….….
Motor Servo Mikro SG90 ……..…….….…….
Modul Bluetooth HC-05 ………………….…
Papan Arduino …………………………………….
Sumber Daya DC 5V 2A ………………….…..
Kode Lengan Robot Arduino
Karena kode cukup panjang, untuk pemahaman yang lebih baik, saya akan memposting kode sumber program dalam bagian-bagian dengan deskripsi untuk setiap bagian. Dan di akhir artikel ini saya akan memposting kode sumber lengkap.
Jadi pertama kita perlu menyertakan library SoftwareSerial untuk komunikasi serial modul Bluetooth serta library servo. Kedua library ini disertakan dengan Arduino IDE jadi Anda tidak perlu menginstalnya secara eksternal. Kemudian kita perlu menentukan enam servo, modul Bluetooth HC-05 dan beberapa variabel untuk menyimpan posisi saat ini dan sebelumnya dari servo, serta array untuk menyimpan posisi atau langkah untuk mode otomatis.
#include <SoftwareSerial.h> #include <Servo.h> Servo servo01; Servo servo02; Servo servo03; Servo servo04; Servo servo05; Servo servo06; SoftwareSerial Bluetooth(3, 4); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX) int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps int speedDelay = 20; int index = 0; String dataIn = "";Code language: Arduino (arduino)
Pada bagian setup kita perlu menginisialisasi servo dan modul Bluetooth dan memindahkan lengan robot ke posisi awalnya. Kita melakukan itu menggunakan fungsi write() yang cukup memindahkan servo ke posisi mana pun dari 0 hingga 180 derajat.
Selanjutnya, pada bagian loop, menggunakan fungsi Bluetooth.available(), kita terus memeriksa apakah ada data masuk dari Smartphone. Jika benar, menggunakan fungsi readString() kita membaca data sebagai string dan menyimpannya ke dalam variabel dataIn. Bergantung pada data yang tiba kita akan memberi tahu lengan robot apa yang harus dilakukan.
// Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.readString(); // Read the data as stringCode language: Arduino (arduino)
Aplikasi Kontrol Android
Mari kita lihat aplikasi Android sekarang dan lihat jenis data apa yang sebenarnya dikirim ke Arduino.
Saya membuat aplikasi menggunakan aplikasi online MIT App Inventor dan berikut ini cara kerjanya. Di atas kita memiliki dua tombol untuk menghubungkan smartphone ke modul Bluetooth HC-05. Kemudian di sisi kiri kita memiliki gambar lengan robot, dan di sisi kanan kita memiliki enam slider untuk mengontrol servo dan satu slider untuk kontrol kecepatan.
Setiap slider memiliki nilai awal, minimum dan maksimum yang berbeda yang cocok dengan sendi lengan robot. Di bagian bawah aplikasi, kita memiliki tiga tombol, SAVE, RUN dan RESET yang melalui mereka kita dapat memprogram lengan robot untuk berjalan secara otomatis. Ada juga label di bawah yang menunjukkan jumlah langkah yang telah kita simpan. Namun, untuk detail lebih lanjut bagaimana membuat aplikasi seperti ini menggunakan MIT App Inventor Anda dapat memeriksa tutorial detail lainnya saya untuk itu.
Baik, sekarang mari kita lihat program atau blok di balik aplikasi. Pertama, di sisi kiri kita memiliki blok untuk menghubungkan smartphone ke modul Bluetooth.
Kemudian kita memiliki blok slider untuk kontrol posisi servo dan blok tombol untuk pemrograman lengan robot. Jadi jika kita mengubah posisi slider, menggunakan fungsi Bluetooth .SendText, kita mengirim teks ke Arduino. Teks ini terdiri dari awalan yang menunjukkan slider mana yang telah diubah serta nilai saat ini dari slider.
Berikut adalah file unduhan dari proyek MIT App Inventor di atas, serta Aplikasi Android siap diinstal pada smartphone Anda:
File Proyek MIT App Inventor Kontrol Lengan Robot Arduino
1 file(s) 24.85 KB Download
Aplikasi Android Kontrol Lengan Robot Arduino
1 file(s) 2.57 MB Download
Jadi oleh karena itu, di Arduino, menggunakan fungsi startsWith() kita memeriksa awalan setiap data masuk dan jadi kita tahu apa yang harus dilakukan selanjutnya. Misalnya, jika awalan adalah "s1" kita tahu bahwa kita perlu memindahkan servo nomor satu. Menggunakan fungsi substring() kita mendapatkan teks yang tersisa, atau itu nilai posisi, kita mengonversinya menjadi integer dan menggunakan nilai untuk memindahkan servo ke posisi itu.
// If "Waist" slider has changed value - Move Servo 1 to position if (dataIn.startsWith("s1")) { String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120" servo1Pos = dataInS.toInt(); // Convert the string into integerCode language: Arduino (arduino)
Di sini kita cukup memanggil fungsi write() dan servo akan pergi ke posisi itu, tetapi dengan cara itu servo akan berjalan pada kecepatan maksimumnya yang terlalu besar untuk lengan robot. Sebaliknya kita perlu mengontrol kecepatan servo jadi saya menggunakan beberapa loop FOR untuk memindahkan servo secara bertahap dari posisi sebelumnya ke posisi saat ini dengan menerapkan waktu tunda antara setiap iterasi. Dengan mengubah waktu tunda Anda dapat mengubah kecepatan servo.
// We use for loops so we can control the speed of the servo // If previous position is bigger then current position if (servo1PPos > servo1Pos) { for ( int j = servo1PPos; j >= servo1Pos; j--) { // Run servo down servo01.write(j); delay(20); // defines the speed at which the servo rotates } } // If previous position is smaller then current position if (servo1PPos < servo1Pos) { for ( int j = servo1PPos; j <= servo1Pos; j++) { // Run servo up servo01.write(j); delay(20); } } servo1PPos = servo1Pos; // set current position as previous position }Code language: Arduino (arduino)
Metode yang sama digunakan untuk mengemudi setiap sumbu lengan robot.
Di bawahnya adalah tombol SAVE. Jika kita menekan tombol SAVE, posisi setiap motor servo disimpan dalam array. Dengan setiap penekanan indeks bertambah jadi array terisi langkah demi langkah.
// If button "SAVE" is pressed if (dataIn.startsWith("SAVE")) { servo01SP[index] = servo1PPos; // save position into the array servo02SP[index] = servo2PPos; servo03SP[index] = servo3PPos; servo04SP[index] = servo4PPos; servo05SP[index] = servo5PPos; servo06SP[index] = servo6PPos; index++; // Increase the array index }Code language: Arduino (arduino)
Kemudian jika kita menekan tombol RUN kita memanggil fungsi khusus runservo() yang menjalankan langkah yang disimpan. Mari kita lihat fungsi ini. Jadi di sini kita menjalankan langkah yang disimpan berulang-ulang hingga kita menekan tombol RESET. Menggunakan loop FOR kita melalui semua posisi yang disimpan dalam array dan pada saat yang sama kita memeriksa apakah ada data masuk dari smartphone. Data ini dapat tombol RUN/PAUSE, yang menjeda robot, dan jika diklik lagi melanjutkan gerakan otomatis. Juga jika kita mengubah posisi slider kecepatan, kita akan menggunakan nilai itu untuk mengubah waktu tunda antara setiap iterasi dalam loop FOR di bawah, yang mengontrol kecepatan motor servo.
// Automatic mode custom function - run the saved steps void runservo() { while (dataIn != "RESET") { // Run the steps over and over again until "RESET" button is pressed for (int i = 0; i <= index - 2; i++) { // Run through all steps(index) if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.readString(); if ( dataIn == "PAUSE") { // If button "PAUSE" is pressed while (dataIn != "RUN") { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.readString(); if ( dataIn == "RESET") { break; } } } } // If SPEED slider is changed if (dataIn.startsWith("ss")) { String dataInS = dataIn.substring(2, dataIn.length()); speedDelay = dataInS.toInt(); // Change servo speed (delay time) } } // Servo 1 if (servo01SP[i] == servo01SP[i + 1]) { } if (servo01SP[i] > servo01SP[i + 1]) { for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) { servo01.write(j); delay(speedDelay); } } if (servo01SP[i] < servo01SP[i + 1]) { for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) { servo01.write(j); delay(speedDelay); } }Code language: Arduino (arduino)
Dengan cara yang sama seperti yang dijelaskan sebelumnya dengan pernyataan IF dan loop FOR ini kita memindahkan servo ke posisi berikutnya. Terakhir jika kita menekan tombol RESET kita akan menghapus semua data dari array ke nol dan juga mengatur indeks ke nol sehingga kita dapat memrogram ulang lengan robot dengan gerakan baru.
// If button "RESET" is pressed if ( dataIn == "RESET") { memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0 memset(servo02SP, 0, sizeof(servo02SP)); memset(servo03SP, 0, sizeof(servo03SP)); memset(servo04SP, 0, sizeof(servo04SP)); memset(servo05SP, 0, sizeof(servo05SP)); memset(servo06SP, 0, sizeof(servo06SP)); index = 0; // Index to 0 }Code language: Arduino (arduino)
Dan itu saja, sekarang kita dapat menikmati dan bersenang-senang dengan lengan robot.
Berikut adalah kode lengkap Lengan Robot Arduino:
/* DIY Arduino Robot Arm Smartphone Control by Dejan, www.HowToMechatronics.com */ #include <SoftwareSerial.h> #include <Servo.h> Servo servo01; Servo servo02; Servo servo03; Servo servo04; Servo servo05; Servo servo06; SoftwareSerial Bluetooth(3, 4); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX) int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps int speedDelay = 20; int index = 0; String dataIn = ""; void setup() { servo01.attach(5); servo02.attach(6); servo03.attach(7); servo04.attach(8); servo05.attach(9); servo06.attach(10); Bluetooth.begin(38400); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(1); delay(20); // Robot arm initial position servo1PPos = 90; servo01.write(servo1PPos); servo2PPos = 150; servo02.write(servo2PPos); servo3PPos = 35; servo03.write(servo3PPos); servo4PPos = 140; servo04.write(servo4PPos); servo5PPos = 85; servo05.write(servo5PPos); servo6PPos = 80; servo06.write(servo6PPos); } void loop() { // Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.readString(); // Read the data as string // If "Waist" slider has changed value - Move Servo 1 to position if (dataIn.startsWith("s1")) { String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120" servo1Pos = dataInS.toInt(); // Convert the string into integer // We use for loops so we can control the speed of the servo // If previous position is bigger then current position if (servo1PPos > servo1Pos) { for ( int j = servo1PPos; j >= servo1Pos; j--) { // Run servo down servo01.write(j); delay(20); // defines the speed at which the servo rotates } } // If previous position is smaller then current position if (servo1PPos < servo1Pos) { for ( int j = servo1PPos; j <= servo1Pos; j++) { // Run servo up servo01.write(j); delay(20); } } servo1PPos = servo1Pos; // set current position as previous position } // Move Servo 2 if (dataIn.startsWith("s2")) { String dataInS = dataIn.substring(2, dataIn.length()); servo2Pos = dataInS.toInt(); if (servo2PPos > servo2Pos) { for ( int j = servo2PPos; j >= servo2Pos; j--) { servo02.write(j); delay(50); } } if (servo2PPos < servo2Pos) { for ( int j = servo2PPos; j <= servo2Pos; j++) { servo02.write(j); delay(50); } } servo2PPos = servo2Pos; } // Move Servo 3 if (dataIn.startsWith("s3")) { String dataInS = dataIn.substring(2, dataIn.length()); servo3Pos = dataInS.toInt(); if (servo3PPos > servo3Pos) { for ( int j = servo3PPos; j >= servo3Pos; j--) { servo03.write(j); delay(30); } } if (servo3PPos < servo3Pos) { for ( int j = servo3PPos; j <= servo3Pos; j++) { servo03.write(j); delay(30); } } servo3PPos = servo3Pos; } // Move Servo 4 if (dataIn.startsWith("s4")) { String dataInS = dataIn.substring(2, dataIn.length()); servo4Pos = dataInS.toInt(); if (servo4PPos > servo4Pos) { for ( int j = servo4PPos; j >= servo4Pos; j--) { servo04.write(j); delay(30); } } if (servo4PPos < servo4Pos) { for ( int j = servo4PPos; j <= servo4Pos; j++) { servo04.write(j); delay(30); } } servo4PPos = servo4Pos; } // Move Servo 5 if (dataIn.startsWith("s5")) { String dataInS = dataIn.substring(2, dataIn.length()); servo5Pos = dataInS.toInt(); if (servo5PPos > servo5Pos) { for ( int j = servo5PPos; j >= servo5Pos; j--) { servo05.write(j); delay(30); } } if (servo5PPos < servo5Pos) { for ( int j = servo5PPos; j <= servo5Pos; j++) { servo05.write(j); delay(30); } } servo5PPos = servo5Pos; } // Move Servo 6 if (dataIn.startsWith("s6")) { String dataInS = dataIn.substring(2, dataIn.length()); servo6Pos = dataInS.toInt(); if (servo6PPos > servo6Pos) { for ( int j = servo6PPos; j >= servo6Pos; j--) { servo06.write(j); delay(30); } } if (servo6PPos < servo6Pos) { for ( int j = servo6PPos; j <= servo6Pos; j++) { servo06.write(j); delay(30); } } servo6PPos = servo6Pos; } // If button "SAVE" is pressed if (dataIn.startsWith("SAVE")) { servo01SP[index] = servo1PPos; // save position into the array servo02SP[index] = servo2PPos; servo03SP[index] = servo3PPos; servo04SP[index] = servo4PPos; servo05SP[index] = servo5PPos; servo06SP[index] = servo6PPos; index++; // Increase the array index } // If button "RUN" is pressed if (dataIn.startsWith("RUN")) { runservo(); // Automatic mode - run the saved steps } // If button "RESET" is pressed if ( dataIn == "RESET") { memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0 memset(servo02SP, 0, sizeof(servo02SP)); memset(servo03SP, 0, sizeof(servo03SP)); memset(servo04SP, 0, sizeof(servo04SP)); memset(servo05SP, 0, sizeof(servo05SP)); memset(servo06SP, 0, sizeof(servo06SP)); index = 0; // Index to 0 } } } // Automatic mode custom function - run the saved steps void runservo() { while (dataIn != "RESET") { // Run the steps over and over again until "RESET" button is pressed for (int i = 0; i <= index - 2; i++) { // Run through all steps(index) if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.readString(); if ( dataIn == "PAUSE") { // If button "PAUSE" is pressed while (dataIn != "RUN") { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.readString(); if ( dataIn == "RESET") { break; } } } } // If speed slider is changed if (dataIn.startsWith("ss")) { String dataInS = dataIn.substring(2, dataIn.length()); speedDelay = dataInS.toInt(); // Change servo speed (delay time) } } // Servo 1 if (servo01SP[i] == servo01SP[i + 1]) { } if (servo01SP[i] > servo01SP[i + 1]) { for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) { servo01.write(j); delay(speedDelay); } } if (servo01SP[i] < servo01SP[i + 1]) { for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) { servo01.write(j); delay(speedDelay); } } // Servo 2 if (servo02SP[i] == servo02SP[i + 1]) { } if (servo02SP[i] > servo02SP[i + 1]) { for ( int j = servo02SP[i]; j >= servo02SP[i + 1]; j--) { servo02.write(j); delay(speedDelay); } } if (servo02SP[i] < servo02SP[i + 1]) { for ( int j = servo02SP[i]; j <= servo02SP[i + 1]; j++) { servo02.write(j); delay(speedDelay); } } // Servo 3 if (servo03SP[i] == servo03SP[i + 1]) { } if (servo03SP[i] > servo03SP[i + 1]) { for ( int j = servo03SP[i]; j >= servo03SP[i + 1]; j--) { servo03.write(j); delay(speedDelay); } } if (servo03SP[i] < servo03SP[i + 1]) { for ( int j = servo03SP[i]; j <= servo03SP[i + 1]; j++) { servo03.write(j); delay(speedDelay); } } // Servo 4 if (servo04SP[i] == servo04SP[i + 1]) { } if (servo04SP[i] > servo04SP[i + 1]) { for ( int j = servo04SP[i]; j >= servo04SP[i + 1]; j--) { servo04.write(j); delay(speedDelay); } } if (servo04SP[i] < servo04SP[i + 1]) { for ( int j = servo04SP[i]; j <= servo04SP[i + 1]; j++) { servo04.write(j); delay(speedDelay); } } // Servo 5 if (servo05SP[i] == servo05SP[i + 1]) { } if (servo05SP[i] > servo05SP[i + 1]) { for ( int j = servo05SP[i]; j >= servo05SP[i + 1]; j--) { servo05.write(j); delay(speedDelay); } } if (servo05SP[i] < servo05SP[i + 1]) { for ( int j = servo05SP[i]; j <= servo05SP[i + 1]; j++) { servo05.write(j); delay(speedDelay); } } // Servo 6 if (servo06SP[i] == servo06SP[i + 1]) { } if (servo06SP[i] > servo06SP[i + 1]) { for ( int j = servo06SP[i]; j >= servo06SP[i + 1]; j--) { servo06.write(j); delay(speedDelay); } } if (servo06SP[i] < servo06SP[i + 1]) { for ( int j = servo06SP[i]; j <= servo06SP[i + 1]; j++) { servo06.write(j); delay(speedDelay); } } } } }Code language: Arduino (arduino)
Saya harap Anda menyukai video ini dan mempelajari hal baru. Jangan ragu untuk bertanya apa pun di bagian komentar di bawah dan periksa Koleksi Proyek Arduino saya.