Membangun Robot Roda Mecanum Arduino: Panduan DIY Mobilitas 360°
Dalam tutorial ini kita akan mempelajari cara membangun Robot Roda Mecanum Arduino yang mampu bergerak ke segala arah. Mobilitas unik robot ini dicapai dengan menggunakan jenis roda khusus, yang disebut Roda Mecanum.
Anda dapat menonton video berikut atau membaca tutorial tertulis di bawahnya.
Ringkasan
Sebenarnya saya merancang dan mencetak 3D roda ini karena mereka bisa agak mahal untuk dibeli. Mereka bekerja cukup baik dan saya harus berkata bahwa mengemudikan platform robot ini sangat menyenangkan. Kita dapat mengontrol robot secara nirkabel menggunakan modul transceiver radio NRF24L01, atau dalam kasus saya, saya menggunakan pengirim RC DIY saya yang saya buat dalam salah satu video saya sebelumnya.
Saya juga membuatnya dapat dikontrol menggunakan ponsel melalui komunikasi Bluetooth. Saya membuat aplikasi Android kustom melalui yang kita dapat mengontrol robot roda Mecanum untuk bergerak ke segala arah. Selain itu, menggunakan slider dalam aplikasi kita dapat mengontrol kecepatan pergerakan.
Otak dari platform robot ini adalah papan Arduino Mega yang mengontrol setiap roda secara individu. Setiap roda dipasang pada motor stepper NEMA 17, dan mengetahui fakta bahwa motor stepper dapat dikontrol dengan presisi, saya menambahkan satu fitur keren lagi dalam aplikasi melalui yang kita dapat memprogram robot untuk bergerak secara otomatis. Menggunakan tombol Save kita dapat menyimpan setiap posisi atau langkah dan kemudian 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 menyimpan yang baru.
Model 3D Robot Roda Mecanum
Untuk memulai, saya merancang Robot Roda Mecanum ini menggunakan perangkat lunak pemodelan 3D. Platform dasar robot ini adalah kotak sederhana yang akan saya buat dari papan MDF tebal 8mm.
Empat motor stepper dipasang pada platform ini dan Roda Mecanum dipasang pada poros motor.
Anda dapat menemukan dan mengunduh model 3D ini, serta menjelajahnya di browser Anda di Thangs.
Unduh model 3D perakitan dari Thangs.
File STL untuk Cetak 3D:
Cara Kerja Roda Mecanum
Roda Mecanum adalah roda dengan rol yang dipasang pada kelilingnya. Rol-rolet ini ditempatkan secara diagonal atau dengan sudut 45 derajat terhadap sumbu rotasi roda. Ini membuat roda memberikan gaya di arah diagonal saat bergerak maju atau mundur.
Jadi, dengan memutar roda dalam pola tertentu, kita memanfaatkan gaya diagonal ini dan jadi robot dapat bergerak ke segala arah.
Kita juga harus mencatat di sini bahwa kita memerlukan dua jenis Roda Mecanum, yang sering disebut sebagai, roda Mecanum kiri dan kanan. Perbedaan di antaranya adalah orientasi rol dan mereka harus dipasang di robot di lokasi tertentu. Sumbu rotasi rolet atas setiap roda harus menunjuk ke pusat robot.
Inilah demonstrasi cepat bagaimana robot bergerak tergantung pada arah rotasi roda.
Jika keempat roda bergerak maju, gerakan yang dihasilkan dari robot akan maju, dan sebaliknya jika semua roda bergerak mundur robot akan bergerak mundur. Untuk bergerak ke kanan, roda kanan perlu berputar ke dalam robot, sementara roda kiri perlu berputar ke luar robot. Gaya yang dihasilkan karena rol yang ditempatkan secara diagonal akan membuat robot bergerak ke kanan. Hal yang sama tetapi sebaliknya terjadi saat bergerak ke kiri. Dengan roda ini kita juga dapat mencapai gerakan diagonal dengan memutar hanya dua roda.
Membuat Robot Roda Mecanum
Namun, sekarang mari saya tunjukkan bagaimana saya membangun platform robot ini. Seperti yang saya sebutkan, untuk membuat dasar platform saya menggunakan papan MDF tebal 8mm. Menggunakan gergaji meja, pertama-tama saya memotong semua potongan sesuai dengan dimensi model 3D.
Selanjutnya, menggunakan bor 3mm dan bor Forstner 25mm saya membuat pembukaan pada panel sisi untuk memasang motor stepper. Setelah saya mendapatkan potongan siap, saya melanjutkan dengan merakitnya. Saya menggunakan perekat kayu dan beberapa baut untuk mengamankannya. Hal terpenting di sini adalah untuk memiliki pembukaan untuk motor yang dibuat dengan tepat sehingga semua roda memiliki kontak yang merata dengan permukaan nantinya.
Tentu saja, Anda juga dapat mencetak 3D platform dasar ini, alih-alih membuatnya dengan MDF, jadi saya akan menyertakan file 3D-nya di artikel situs web. Akhirnya, saya melumasi cat spray dasar dan tutupnya dengan warna putih.
Selanjutnya adalah Roda Mecanum. Seperti yang saya katakan sebelumnya, roda ini bisa agak mahal untuk dibeli, jadi itulah mengapa saya memutuskan untuk merancang dan mencetak 3D roda saya sendiri. Roda ini terbuat dari dua bagian, sisi luar dan dalam yang diikat bersama dengan beberapa baut dan nut M4. Mereka memiliki 10 rol masing-masing, dan kopling poros yang dirancang khusus untuk cocok dengan motor stepper NEMA 17.
Saya mencetak 3D semua bagian untuk Roda Mecanum menggunakan printer 3D Creality CR-10 saya.
Ini adalah tautan ke printer 3D ini jika Anda ingin memeriksanya.
Jadi, setelah saya mendapatkan bagian cetak 3D siap, saya melanjutkan dengan membuat poros untuk rol. Untuk tujuan itu, saya menggunakan kawat baja tebal 3 mm. Panjang poros perlu sekitar 40mm, jadi menggunakan alat rotary saya memotong kawat ke panjang itu.
Saya mulai merakit Roda Mecanum dengan mengamankan kedua sisi dan kopling poros menggunakan empat baut dan nut M4. Panjang baut perlu 45mm.
Untuk memasang rol, pertama kita perlu sedikit memasukkan poros melalui lubang yang terletak di keliling sisi dalam.
Kemudian kita dapat memasukkan pelat M3 kecil, memasukkan rol dan mendorong poros sepanjang jalan ke dalam slot di sisi luar roda. Saya menggunakan satu pelat saja karena saya tidak memiliki cukup ruang untuk memasukkan pelat kedua di sisi lain.
Saya mengulangi proses ini untuk semua 10 rol. Itu sebenarnya mudah dan menyenangkan untuk merakit roda ini. Yang penting di sini adalah rol perlu dapat bergerak bebas.
Di akhir saya menggunakan beberapa titik perekat AC di setiap lubang dalam untuk memastikan poros tidak akan longgar.
Oke jadi setelah roda siap sekarang kita dapat melanjutkan dengan merakit seluruh robot. Pertama, kita perlu memasang motor stepper ke platform dasar. Untuk mengamankannya di tempat saya menggunakan baut M3 dengan panjang 12mm.
Selanjutnya, kita perlu memasang roda pada poros motor. Kopling poros yang saya buat memiliki slot untuk memasukkan nut M3, melalui yang baut M3 dapat melewati dan jadi kita dapat mengamankan roda ke poros.
Selanjutnya, untuk mengamankan tutup atas ke dasar, saya memasang batang berulir di dua sudut dasar. Saya membuat lubang pada posisi yang sama pada tutup dan jadi saya dapat dengan mudah memasukkan dan mengamankan tutup ke dasar.
Di sisi belakang dasar saya membuat lubang 20mm untuk memasang saklar daya nantinya, serta lubang 5mm untuk memasang LED.
Diagram Rangkaian
Sekarang kita dapat melanjutkan dengan elektronik. Inilah diagram rangkaian lengkap proyek ini.
Jadi kita akan mengontrol empat motor stepper NEMA 17 menggunakan empat driver stepper DRV8825, atau kita juga dapat menggunakan driver stepper A4988. Untuk memadamkan steppers dan seluruh robot kita akan menggunakan sumber daya 12V, dan dalam kasus saya, saya akan menggunakan baterai Li-Po 3S yang menyediakan sekitar 12V. Untuk komunikasi radio kita menggunakan modul NRF24L01, dan untuk komunikasi Bluetooth kita menggunakan modul Bluetooth HC-05. Saya juga menyertakan pembagi tegangan sederhana yang akan digunakan untuk memantau tegangan baterai dan koneksi LED untuk menunjukkan saat tegangan baterai akan turun di bawah 11V.
Saya juga menyertakan regulator tegangan 5V khusus yang dapat menyediakan sekitar 3A arus. Ini opsional, tetapi saya berencana dalam video mendatang untuk menggabungkan proyek ini dengan proyek Lengan Robot Arduino saya, dan untuk tujuan itu saya akan membutuhkan 5V untuk mengemudikan motor servonya.
Anda dapat mendapatkan komponen yang diperlukan untuk proyek ini dari tautan di bawah ini:
Motor Stepper – NEMA 17………………
Driver Stepper DRV8825…………………
Modul Transceiver NRF24L01…….…
Modul Bluetooth HC-05 …………….…
Baterai Li-Po …………………………….……
Papan Arduino Mega ………………….…
Desain PCB
Namun, untuk menjaga komponen elektronik tetap teratur dan menghilangkan rantai kabel yang berantakan, saya merancang PCB kustom menggunakan perangkat lunak desain rangkaian online gratis EasyEDA. PCB ini sebenarnya akan berfungsi sebagai shield Arduino MEGA karena kita akan dapat langsung menghubungkannya di atas papan Arduino Mega. Saya menggunakan lapisan atas dan bawah untuk menjalankan koneksi. Untuk pin Arduino yang tidak saya gunakan, saya menyertakan koneksi pin header sehingga mereka tersedia jika kita ingin menggunakannya untuk sesuatu di masa depan. Saya juga menyertakan pin koneksi 12V, 5V dan GND, serta pin untuk memilih resolusi langkah driver.
Ini adalah tautan ke file proyek desain PCB ini. Jadi setelah saya selesai mendesain, saya menghasilkan file Gerber yang diperlukan untuk pembuatan PCB.
File Gerber:
Kemudian saya memesan PCB dari JLCPCB yang juga merupakan sponsor video ini.
Di sini kita cukup seret dan lepas file Gerber dan setelah diunggah, kita dapat meninjau PCB kita di penampil Gerber. Jika semuanya baik, kita dapat melanjutkan dan memilih properti yang kita inginkan untuk PCB kita. Kali ini saya memilih warna PCB biru agar cocok dengan warna papan Arduino. Dan itu saja, sekarang kita dapat dengan mudah memesan PCB kita dengan harga yang wajar. Perhatikan jika ini adalah pesanan pertama Anda dari JLCPCB, Anda dapat mendapatkan hingga 10 PCB hanya dengan $2.
Setelah beberapa hari PCB telah tiba. Kualitas PCB sangat bagus dan semuanya sama persis seperti dalam desain.
Merakit PCB
Oke sekarang kita dapat melanjutkan dan merakit PCB. Saya memulai dengan memasang komponen yang lebih kecil terlebih dahulu, resistor dan kapasitor. Kemudian saya memasukkan dan memasang pin header jantan pada PCB yang akan digunakan untuk menghubungkannya ke papan Arduino.
Selanjutnya, saya menempatkan semua pin header betina di tempat dan memasangnya juga. Seperti untuk koneksi motor stepper dan pin untuk memilih resolusi langkah saya menggunakan pin header jantan. Dengan cara ini kita dapat langsung menghubungkan motor ke PCB dan menggunakan jumper untuk memilih resolusi langkah. Kemudian saya memasang blok klem, trimmer dan regulator tegangan.
Dan itu saja, PCB sekarang siap dan kita dapat melanjutkan dengan memasukkan driver dan menghubungkan motor padanya. Pertama, saya menempatkan jumper untuk memilih resolusi langkah. Saya memilih resolusi langkah ke-16 dengan menghubungkan pin MS3 driver ke 5V.
Kemudian di atasnya saya menempatkan driver DRV8825, serta menghubungkan modul NRF24L01 dan modul Bluetooth HC-05. Sekarang kita dapat dengan mudah memasang PCB pada papan Arduino.
Selanjutnya, saya menghubungkan baterai ke blok klem yang sesuai dan menempatkannya ke dalam platform dasar.
Di sini saya memasang saklar daya di tempat dan menghubungkannya ke blok klem lainnya. Tepat di atas saklar daya saya juga memasang LED indikator baterai.
Yang tersisa sekarang adalah menghubungkan motor ke PCB. Kita harus mencatat di sini bahwa saat menghubungkan motor yang berseberangan, kita harus menghubungkan konektor mereka secara berseberangan juga. Ini dibutuhkan nanti saat memrogram robot, sehingga, misalnya, perintah maju akan mengemudikan kedua motor ke arah yang sama, meskipun mereka sebenarnya terbalik dan satu akan berputar searah jarum jam dan yang lain berlawanan arah jarum jam.
Di akhir saya dapat dengan mudah memasukkan tutup di atas, dan jadi kita selesai dengan proyek robot Roda Mecanum ini.
Kode Arduino Robot Roda Mecanum
Yang tersisa untuk video ini adalah untuk melihat kode Arduino. Sebenarnya, ada dua kode Arduino terpisah. Ini adalah untuk mengontrol robot menggunakan modul NRF24L01 dan yang lainnya adalah untuk mengontrol robot menggunakan ponsel.
Kode Arduino untuk mengontrol robot menggunakan modul NRF24L01:
/* === Arduino Mecanum Wheels Robot === Radio control with NRF24L01 by Dejan, www.HowToMechatronics.com Libraries: RF24, https://github.com/tmrh20/RF24/ AccelStepper by Mike McCauley: https://www.airspayce.com/mikem/arduino/AccelStepper/index.html */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <AccelStepper.h> RF24 radio(48, 49); // nRF24L01 (CE, CSN) const byte address[6] = "00001"; unsigned long lastReceiveTime = 0; unsigned long currentTime = 0; // Define the stepper motors and the pins the will use AccelStepper LeftBackWheel(1, 42, 43); // (Type:driver, STEP, DIR) - Stepper1 AccelStepper LeftFrontWheel(1, 40, 41); // Stepper2 AccelStepper RightBackWheel(1, 44, 45); // Stepper3 AccelStepper RightFrontWheel(1, 46, 47); // Stepper4 int wheelSpeed = 1500; // Max size of this struct is 32 bytes - NRF24L01 buffer limit struct Data_Package { byte j1PotX; byte j1PotY; byte j1Button; byte j2PotX; byte j2PotY; byte j2Button; byte pot1; byte pot2; byte tSwitch1; byte tSwitch2; byte button1; byte button2; byte button3; byte button4; }; Data_Package data; //Create a variable with the above structure void setup() { // Set initial seed values for the steppers LeftFrontWheel.setMaxSpeed(3000); LeftBackWheel.setMaxSpeed(3000); RightFrontWheel.setMaxSpeed(3000); RightBackWheel.setMaxSpeed(3000); radio.begin(); radio.openReadingPipe(0, address); radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_LOW); radio.startListening(); // Set the module as receiver Serial.begin(115200); } void loop() { // Check whether we keep receving data, or we have a connection between the two modules currentTime = millis(); if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function } // Check whether there is data to be received if (radio.available()) { radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure lastReceiveTime = millis(); // At this moment we have received the data } // Set speed - left potentiometer wheelSpeed = map(data.pot1, 0, 255, 100, 3000); if (data.j1PotX > 150) { moveSidewaysLeft(); } else if (data.j1PotX < 100) { moveSidewaysRight(); } else if (data.j1PotY > 160) { moveForward(); } else if (data.j1PotY < 100) { moveBackward(); } else if (data.j2PotX < 100 & data.j2PotY > 160) { moveRightForward(); } else if (data.j2PotX > 160 & data.j2PotY > 160) { moveLeftForward(); } else if (data.j2PotX < 100 & data.j2PotY < 100) { moveRightBackward(); } else if (data.j2PotX > 160 & data.j2PotY < 100) { moveLeftBackward(); } else if (data.j2PotX < 100) { rotateRight(); } else if (data.j2PotX > 150) { rotateLeft(); } else { stopMoving(); } // Execute the steps LeftFrontWheel.runSpeed(); LeftBackWheel.runSpeed(); RightFrontWheel.runSpeed(); RightBackWheel.runSpeed(); // Monitor the battery voltage int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i // If voltage is below 11V turn on the LED if (voltage < 11) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } void moveForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveSidewaysRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveSidewaysLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void rotateLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void rotateRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveRightForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(wheelSpeed); } void moveRightBackward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftForward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(-wheelSpeed); } void stopMoving() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(0); } void resetData() { // Reset the values when there is no radio connection - Set initial default values data.j1PotX = 127; data.j1PotY = 127; data.j2PotX = 127; data.j2PotY = 127; data.j1Button = 1; data.j2Button = 1; data.pot1 = 1; data.pot2 = 1; data.tSwitch1 = 1; data.tSwitch2 = 1; data.button1 = 1; data.button2 = 1; data.button3 = 1; data.button4 = 1; }Code language: Arduino (arduino)
Deskripsi: Jadi, di sini kita menggunakan pustaka RF24 untuk komunikasi radio dan pustaka AccelStepper untuk mengontrol motor stepper. Pertama kita perlu menentukan pin tempat mereka semua terhubung, menentukan beberapa variabel yang dibutuhkan untuk program di bawah, dan di bagian setup mengatur kecepatan maksimum steppers dan memulai komunikasi radio.
Di bagian loop kita mulai dengan membaca data yang datang dari pengirim RC. Kode pengirim RC serta lebih banyak detail cara kerja komunikasi ini dapat ditemukan pada tutorial khusus saya untuk itu.
Jadi tergantung pada data yang diterima, misalnya, jika Joystick kiri digerakkan ke depan, nilainya akan lebih besar dari 160 dan dalam hal ini akan memanggil fungsi kustom moveForward(). Jika kita melihat fungsi ini kita dapat melihat bahwa yang dilakukannya hanyalah mengatur kecepatan motor ke positif. Untuk bergerak mundur, kecepatan diatur ke negatif. Jadi untuk bergerak ke semua arah lain kita hanya perlu mengatur rotasi roda dengan benar seperti yang dijelaskan di awal.
Untuk mengeksekusi perintah ini, di bagian loop kita perlu memanggil fungsi runSpeed() untuk semua stepper. Di bagian loop kita juga membaca input analog dari pembagi tegangan yang datang dari baterai, dan sesuai dengan nilai ini kita dapat tahu kapan tegangan baterai akan turun di bawah 11V sehingga kita dapat menyalakan LED indikator.
Kode Arduino untuk mengontrol robot menggunakan ponsel:
/* === Arduino Mecanum Wheels Robot === Smartphone control via Bluetooth by Dejan, www.HowToMechatronics.com Libraries: RF24, https://github.com/tmrh20/RF24/ AccelStepper by Mike McCauley: https://www.airspayce.com/mikem/arduino/AccelStepper/index.html */ #include <SoftwareSerial.h> #include <AccelStepper.h> SoftwareSerial Bluetooth(A8, 38); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX) // Define the stepper motors and the pins the will use AccelStepper LeftBackWheel(1, 42, 43); // (Type:driver, STEP, DIR) - Stepper1 AccelStepper LeftFrontWheel(1, 40, 41); // Stepper2 AccelStepper RightBackWheel(1, 44, 45); // Stepper3 AccelStepper RightFrontWheel(1, 46, 47); // Stepper4 #define led 14 int wheelSpeed = 1500; int dataIn, m; int lbw[50], lfw[50], rbw[50], rfw[50]; // for storing positions/steps int index = 0; void setup() { // Set initial seed values for the steppers LeftFrontWheel.setMaxSpeed(3000); LeftBackWheel.setMaxSpeed(3000); RightFrontWheel.setMaxSpeed(3000); RightBackWheel.setMaxSpeed(3000); Serial.begin(38400); Bluetooth.begin(38400); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(1); delay(20); pinMode(led, OUTPUT); } void loop() { // Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); // Read the data if (dataIn == 0) { m = 0; } if (dataIn == 1) { m = 1; } if (dataIn == 2) { m = 2; } if (dataIn == 3) { m = 3; } if (dataIn == 4) { m = 4; } if (dataIn == 5) { m = 5; } if (dataIn == 6) { m = 6; } if (dataIn == 7) { m = 7; } if (dataIn == 8) { m = 8; } if (dataIn == 9) { m = 9; } if (dataIn == 10) { m = 10; } if (dataIn == 11) { m = 11; } if (dataIn == 12) { m = 12; } if (dataIn == 14) { m = 14; } // Set speed if (dataIn >= 16) { wheelSpeed = dataIn * 10; Serial.println(wheelSpeed); } } if (m == 4) { moveSidewaysLeft(); } if (m == 5) { moveSidewaysRight(); } if (m == 2) { moveForward(); } if (m == 7) { moveBackward(); } if (m == 3) { moveRightForward(); } if (m == 1) { moveLeftForward(); } if (m == 8) { moveRightBackward(); } if (m == 6) { moveLeftBackward(); } if (m == 9) { rotateLeft(); } if (m == 10) { rotateRight(); } if (m == 0) { stopMoving(); } //Serial.println(dataIn); // If button "SAVE" is pressed if (m == 12) { if (index == 0) { LeftBackWheel.setCurrentPosition(0); LeftFrontWheel.setCurrentPosition(0); RightBackWheel.setCurrentPosition(0); RightFrontWheel.setCurrentPosition(0); } lbw[index] = LeftBackWheel.currentPosition(); // save position into the array lfw[index] = LeftFrontWheel.currentPosition(); rbw[index] = RightBackWheel.currentPosition(); rfw[index] = RightFrontWheel.currentPosition(); index++; // Increase the array index m = 0; } if (m == 14) { runSteps(); if (dataIn != 14) { stopMoving(); memset(lbw, 0, sizeof(lbw)); // Clear the array data to 0 memset(lfw, 0, sizeof(lfw)); memset(rbw, 0, sizeof(rbw)); memset(rfw, 0, sizeof(rfw)); index = 0; // Index to 0 } } LeftFrontWheel.runSpeed(); LeftBackWheel.runSpeed(); RightFrontWheel.runSpeed(); RightBackWheel.runSpeed(); // Monitor the battery voltage int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i //Serial.println(voltage); // If voltage is below 11V turn on the LED if (voltage < 11) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } void runSteps() { for (int i = index - 1; i >= 0; i--) { // Run through all steps(index) LeftFrontWheel.moveTo(lfw[i]); LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.moveTo(lbw[i]); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.moveTo(rfw[i]); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.moveTo(rbw[i]); RightBackWheel.setSpeed(wheelSpeed); while (LeftBackWheel.currentPosition() != lbw[i] & LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) { LeftFrontWheel.runSpeedToPosition(); LeftBackWheel.runSpeedToPosition(); RightFrontWheel.runSpeedToPosition(); RightBackWheel.runSpeedToPosition(); if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.read(); if ( dataIn == 15) { // If button "PAUSE" is pressed while (dataIn != 14) { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); if ( dataIn == 13) { stopMoving(); break; } } } } if (dataIn >= 16) { wheelSpeed = dataIn * 10; dataIn = 14; } if ( dataIn == 13) { break; } } } } // Go back through steps for (int i = 1; i <= index - 1; i++) { // Run through all steps(index) LeftFrontWheel.moveTo(lfw[i]); LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.moveTo(lbw[i]); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.moveTo(rfw[i]); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.moveTo(rbw[i]); RightBackWheel.setSpeed(wheelSpeed); while (LeftBackWheel.currentPosition() != lbw[i]& LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) { LeftFrontWheel.runSpeedToPosition(); LeftBackWheel.runSpeedToPosition(); RightFrontWheel.runSpeedToPosition(); RightBackWheel.runSpeedToPosition(); //Serial.print(" current: "); //Serial.println(LeftBackWheel.currentPosition()); if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.read(); if ( dataIn == 15) { // If button "PAUSE" is pressed while (dataIn != 14) { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); if ( dataIn == 13) { stopMoving(); break; } } } } if (dataIn >= 16) { wheelSpeed = dataIn * 10; dataIn = 14; } if ( dataIn == 13) { //Serial.println("DEKI"); break; } } } } } void moveForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveSidewaysRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveSidewaysLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void rotateLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void rotateRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveRightForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(wheelSpeed); } void moveRightBackward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftForward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(-wheelSpeed); } void stopMoving() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(0); }Code language: Arduino (arduino)
Deskripsi: Kode lain untuk mengontrol robot menggunakan aplikasi Android sangat mirip dan bekerja dengan cara yang sama. Di sini alih-alih modul radio kita perlu mendefinisikan modul Bluetooth dan memulai komunikasi-nya di bagian setup. Jadi lagi, pertama kita membaca data masuk dari ponsel atau aplikasi Android, dan sesuai dengan itu, memberitahu robot ke arah mana harus bergerak.
Jika kita melihat aplikasi Android kita dapat melihat bahwa itu cukup mengirim angka dari 0 hingga 15 melalui Bluetooth saat tombol ditekan.
Aplikasi dibuat menggunakan aplikasi online MIT App Inventor dan Anda dapat menemukan lebih banyak detail tentangnya dalam tutorial khusus saya untuk itu.
Di sini Anda dapat mengunduh aplikasi ini serta file proyek yang dapat diedit:
Untuk memprogram gerakan otomatis robot dengan aplikasi ini, saat kita menekan tombol “SAVE” kita cukup menyimpan posisi saat ini motor stepper ke dalam array. Kemudian saat kita menekan tombol “RUN”, kita memanggil fungsi kustom runSteps() yang mengeksekusi atau melalui semua langkah yang disimpan menggunakan beberapa for dan while loops.
Saya harap Anda menyukai tutorial ini dan mempelajari hal baru. Jangan ragu untuk bertanya apa pun di bagian komentar di bawah dan periksa Koleksi Proyek Arduino saya.