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

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Komponen dan Perlengkapan

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Arduino UNO
× 1
Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
SparkFun Dual H-Bridge motor drivers L298
× 1
Kit robotic tank DIY
× 1
Kontroler nirkabel Sony PS2
× 1

Aplikasi dan Layanan Online

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Arduino IDE

Tentang Proyek Ini

Dalam tutorial ini, saya akan menunjukkan cara menggunakan joystick nirkabel PlayStation 2 (PS2) untuk mengendalikan robotic tank. Papan Arduino Uno digunakan sebagai inti proyek ini. Papan tersebut menerima perintah dari kontroler nirkabel dan mengatur kecepatan motor. Papan pengembangan lainnya juga dapat digunakan (NodeMCU, Firebeetle, dll.), dan prinsip yang disajikan dalam tutorial ini dapat diterapkan pada model robot dan gadget lainnya.

Saya sebelumnya merancang robotic tank yang dikendalikan Blynk. Papan tersebut terhubung ke jaringan Wi-Fi dan menerima perintah dari server Blynk. Ponsel pintar yang menjalankan aplikasi Blynk digunakan sebagai pengendali jarak jauh, dan berbagai metode input digunakan: tombol tekan, slider bahkan akselerometer ponsel pintar. Anda dapat menemukan lebih banyak tentang proyek ini di sini: https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

Saya juga telah melakukan beberapa eksperimen dengan perintah suara. Ini mungkin berguna jika Anda ingin mengendalikan robot dari jarak jauh tanpa menggunakan tangan, atau jika Anda ingin membuatnya dapat diakses untuk seseorang dengan gerakan terbatas. Seseorang mungkin memikirkan kursi roda robotik yang dikendalikan suara, misalnya. Kit robotic DIY digunakan, bersama dengan beberapa alat favorit saya: Adafruit.io, IFTTT dan Arduino IDE. Instruksi lengkap di sini:

https://www.hackster.io/igorF2/wi-fi-voice-controlled-robot-using-google-assistant-79802c

Anda dapat menggunakan berbagai kit atau bahkan merancang robot Anda sendiri menggunakan bahan sederhana, tanpa perlu menggunakan alat kompleks seperti printer 3D dan mesin potong laser. Anda dapat menemukan contoh pada salah satu tutorial saya sebelumnya:

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Langkah 1: Alat dan Bahan

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Berikut adalah alat yang digunakan dalam proyek ini:

Saya menggunakan bagian hardware berikut untuk proyek saya:

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Link di atas hanya merupakan saran tempat Anda dapat menemukan item yang digunakan dalam tutorial ini (dan mungkin mendukung tutorial saya di masa depan). Silakan cari di tempat lain dan beli di toko lokal atau online favorit Anda.

Langkah 2: Merakit Robot

Bagian pertama dari proyek ini adalah merakit struktur robot.

Dalam proyek sebelumnya saya mengembangkan struktur robot saya sendiri, menggunakan bahan yang mudah diakses (tanpa perlu alat kompleks, printer 3D atau mesin potong laser). Anda dapat menemukan proyek ini di link di bawah ini:

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

Nanti saya memutuskan untuk memberi kesempatan pada kit robotik yang diperoleh dari toko online. Anda dapat menemukan link ke chassis robot di link berikut: https://bit.ly/2ycI8fP. Jika Anda mencari kit, saya pikir ini adalah opsi yang bagus! Saya menggunakannya dalam dua tutorial lain, seperti yang dapat Anda lihat di link di bawah ini:

https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

https://www.hackster.io/igorF2/wi-fi-voice-controlled-robot-using-google-assistant-79802c

Awalnya tampaknya merakit akan rumit atau saya akan mengalami masalah seperti kurangnya bagian (diberikan banyak bagian yang menyusun kit). Namun kit ini sangat mengejutkan saya! Semua potongan terlihat bagus menurut saya, dan beberapa bagian cadangan menyertai kit. Jadi, sekrup yang jatuh di bawah meja kerja tidak akan membuat tidak mungkin untuk menjalankan proyek Anda, yang saya temukan sangat baik (terutama setelah kehilangan beberapa sekrup).

Poin positif lainnya adalah semua alat yang diperlukan untuk merakit robot disertakan dalam kit (beberapa kunci Allen dan obeng). Saya yakin ini membuat kit sangat bagus untuk pemula yang tidak memiliki banyak alat!

Sebagai aspek negatif, saya akan menekankan kurangnya dokumentasi. Manual merakit robot (file spreadsheet dalam bahasa Cina) tidak terlalu ramah pengguna, dan tidak ada banyak tutorial online untuk tank itu. Dan jadi saya memutuskan untuk mendokumentasikan proses merakit robot saya dalam video di atas! Poin perhatian lainnya terkait dengan bahan struktur robot. Dasarnya terbuat sepenuhnya dari aluminium, yang dapat menyebabkan pendek listrik jika pin papan sirkuit menyentuh kerangka.

Ada kit online lain yang dapat Anda gunakan. Anda bahkan dapat membuat struktur Anda sendiri, seperti yang saya jelaskan di bawah ini.

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Langkah 3: Merangkaian Sirkuit

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Baterai yang terdiri dari tiga baterai 18650 dipasang di bagian belakang robot. Ini menyediakan 11.1V (3 x 3.7V) untuk robot. Itu cukup untuk menyiram motor DC 12V.

Modul L298N dual channel H-bridge digunakan untuk mengontrol motor. Papan menerima beberapa sinyal 5V dari papan Arduino, dan menyediakan tegangan yang lebih tinggi untuk motor. Ini juga memungkinkan motor berjalan ke kedua arah, tergantung pada kombinasi sinyal input tersebut.

Setiap perangkat dihubungkan sesuai skematik.

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Berikut daftar pin yang perlu Anda hubungkan:

Input/Output Arduino Uno:

Input/Output H-Bridge:

Penerima PS2:

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Langkah 4: Pengaturan Arduino IDE

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Untuk proyek ini saya menggunakan Arduino IDE untuk memprogram papan Arduino.

1. Unduh dan instal Arduino IDE versi terbaru

Anda dapat menemukan versi terbaru untuk Windows, Linux atau MAC OSX di situs web Arduino: https://www.arduino.cc/en/main/software

Unduh secara gratis, instal di komputer Anda dan jalankan.

2. Menambahkan perpustakaan

Dalam proyek ini, saya menggunakan perpustakaan Arduino PS2X.

Unduh perpustakaan di https://github.com/madsci1016/Arduino-PS2X. Ekstrak file, dan salin folder ke folder perpustakaan/alat Arduino IDE.

............

Sekarang lingkungan pengembangan Anda siap, mari lanjutkan ke langkah berikutnya!

Langkah 5: Perpustakaan Kontroler Nirkabel PS2 Dijelaskan

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Kontroler nirkabel PS2 adalah alat yang hebat untuk proyek robotika Anda. Papan memiliki jumlah tombol yang luar biasa: 20 tombol digital dan 2 stick analog. Dengan cara ini, ada kemungkinan tak terbatas untuk mengendalikan robot Anda.

Saya menggunakan perpustakaan PS2X Bill Porter (https://github.com/madsci1016/Arduino-PS2X) untuk menghubungkan kontroler ke papan Arduino Uno.

Ini mendefinisikan kelas PS2X untuk kontroler, yang berisi beberapa metode untuk membaca input analog dan digital dari joystick. Sebuah objek dari kelas ini dibuat menggunakan kode berikut (sebelum atau selama setup):

PS2X ps2x;

Setelah objek didefinisikan, harus dihubungkan ke pin I/O Arduino menggunakan fungsi berikut:

error = ps2x.config_gamepad(clock,command,attention,data, pressure?, rumble?);

Fungsi ini mungkin mengembalikan beberapa kesalahan jika ada kesalahan pada koneksi atau pada kontroler itu sendiri.

Fungsi utama yang digunakan dari perpustakaan adalah untuk membaca input digital dan analog. Untuk membaca input digital, metode berikut digunakan:

ps2x.Button(button);

Di mana button adalah nama tombol yang akan dibaca. Setiap tombol dipetakan sebagai berikut:

Tombol arah:

Tombol aksi:

Trigger:

Stick:

Menu:

Untuk membaca nilai analog (yang akan dikonversi menjadi integer antara 0 dan 255) dari stick gunakan metode berikut:

ps2x.Analog(stick_axis);

Di mana stick_axis mewakili stick dan arah yang akan dibaca, sebagai berikut:

Dengan fungsi dasar ini Anda akan siap menggunakan kontroler PS2 dalam proyek Anda! Pada langkah berikutnya saya menunjukkan beberapa contoh sketsa Arduino yang menggabungkan tombol ini!

Langkah 6: Sketsa #1 - Tombol Dpad

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Video game lama, seperti SEGA Master System dan Mega Drive dan Nintendo SNES, tidak memiliki tombol sensitif gaya. Tombol arah hanya tombol on/off. Untuk contoh pertama ini, saya ingin meniru jenis kontrol yang akan dimiliki dalam video game lama dari konsol tersebut.

Untuk sketsa pertama ini saya menggunakan tombol Dpad sebagai input untuk robot. Setiap tombol digunakan oleh robot untuk melakukan salah satu gerakan dasar: maju, belok kanan, belok kiri atau mundur.

Tombol ini memiliki output biner. Dengan cara ini, mikrokontroler hanya akan memahami bahwa tombol ditekan, tetapi tidak akan memahami seberapa kuat tombol ditekan. Dengan cara ini, setelah tombol tertentu diklik, motor akan berjalan dengan kecepatan penuh.

Jika Anda menghubungkan semuanya sesuai skematik saya, Anda akan memiliki output berikut:

Seperti yang saya katakan sebelumnya, motor akan bergerak dengan kecepatan tetap. Saat belok kiri atau kanan, motor akan berjalan ke arah berlawanan, sehingga robot akan berputar di sekitar sumbunya.

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Kode Arduino:

Unduh kode dan buka di Arduino IDE. Jika Anda menggunakan pinout yang sama seperti saya, Anda mungkin tidak perlu mengubah apa pun di kode (meskipun mungkin diperlukan, jika orientasi motor berbeda)

Untuk mengunggah kode, pilih papan 'Arduino/Genuino Uno', pilih port COM yang benar, colokkan papan ke port USB komputer Anda dan unggah kode.
Setelah unggahan selesai, colokkan kabel USB, dan pasang baterai. Kode akan mulai berjalan dan papan Arduino akan secara otomatis terhubung ke joystick PS2. Buka serial monitor pada penggunaan pertama dan periksa status koneksi. Jika gagal terhubung ke joystick, ada beberapa hal yang harus Anda lakukan:

Kode Dijelaskan:

Dalam proyek ini saya hanya perlu menggunakan perpustakaan PS2X_lib.h. Ini ditambahkan di awal kode.

#include <PS2X_lib.h>

Definisikan pin Arduino yang terhubung ke h-bridge. Jika Anda menggunakan koneksi yang sama seperti saya, Anda akan memiliki konfigurasi berikut. Jika Anda memilih untuk menggunakan pin yang berbeda, perbarui bagian kode ini.

// These are used to set the direction of the bridge driver. #define ENA 3 //ENA #define MOTORA_1 4 //IN3 #define MOTORA_2 5 //IN4 #define MOTORB_1 8 //IN1 #define MOTORB_2 7 //IN2 #define ENB 6 //ENB 

Beberapa variabel global dideklarasikan sebelum setup (p2sx, error, type dan vibrate). Yang pertama adalah instance dari kelas PS2X. Status kesalahan selama koneksi akan disimpan pada integer error. Type dan vibrate akan menunjukkan jenis kontroler (DualShock atau GuitarHero) dan apakah seharusnya bergetar pada perintah tertentu.

Pertama yang saya lakukan selama setup adalah mengonfigurasi status pin I/O (sebagai output) dan mengatur pin enable ke LOW. Dengan cara ini Anda akan menonaktifkan kedua motor saat startup, dan robot tidak akan bergerak secara acak saat menunggu bagian kode lainnya.

// Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); 

Kemudian saya memulai komunikasi port Serial (berguna untuk debugging kode). Pilih baudrate yang sesuai dan atur kecepatan yang sama pada Serial Monitor.

// Start serial communication Serial.begin(57600); 

Terakhir, konfigurasikan objek ps2x dengan pin Arduino yang terhubung ke penerima joystick (clock, command, attention dan data secara berurutan). Ini mungkin mengembalikan kesalahan (untuk ditampilkan pada Serial monitor). Jenis kontroler juga akan ditampilkan (meskipun Anda mungkin sudah tahu jenis kontroler yang Anda miliki pada titik ini :D).

error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error == 0){ Serial.println("Found Controller, configured successful"); } else if(error == 1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error == 2) Serial.println("Controller found but not accepting commands"); else if(error == 3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type = ps2x.readType(); switch(type) { case 0: Serial.println("Unknown Controller type"); break; case 1: Serial.println("DualShock Controller Found"); break; case 2: Serial.println("GuitarHero Controller Found"); break; } 

Selama loop utama Arduino akan membaca setiap tombol D-pad (UP, DOWN, LEFT dan RIGHT) dan mengatur nilai yang berbeda untuk pin output, untuk menggerakkan roda. Setelah jeda singkat, loop baru dimulai.

Bagian berikut menunjukkan cara menggerakkan robot maju jika tombol UP ditekan. Pin MOTORA_1 dan MOTORA_2 menentukan arah rotasi untuk Motor A. ENA akan menentukan apakah gerakan diaktifkan atau tidak (motor ON/OFF). Perhatikan ini adalah output "analog" (sebenarnya PWM). Nilainya harus antara 0 dan 1023. Ini akan memodulasi PWM, dan mengubah tegangan rata-rata di output h-bridge (antara 0 dan 12V). Jika tegangan rata-rata terlalu rendah, motor tidak akan bisa bergerak sama sekali.

// MOVE FORWARD if(ps2x.Button(PSB_PAD_UP)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move forward"); } 

*Saya menggunakan output PWM untuk pin ENA dan ENB. Dengan cara ini, 1023 akan mewakili pulsa dengan panjang terpanjang (pin selalu menyala) dan 0 kehadiran pulsa (pin selalu mati). Jika nilai yang berbeda (lebih kecil) digunakan di sini, motor diharapkan akan berjalan lebih lambat, karena tegangan rata-rata di terminalnya akan lebih kecil.

Langkah 7: Sketsa #2 - Stick Analog dan Tombol Digital (L2 dan R2)

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Pada suatu titik, semua konsol mengadopsi joystick dengan dua stick analog. Input baru ini memungkinkan input sensitif gaya yang menciptakan aksi kecepatan variabel dan menjadi populer dalam setiap jenis video game.

Dalam contoh kedua ini saya ingin menggunakan stik analog untuk mengarahkan tank, dan pasang tombol tekan sebagai gas dan rem/mundur. Konfigurasi jenis ini sangat populer dalam banyak game balap, seperti Mario Kart misalnya. Tekan tombol R2 untuk percepatan tank, L2 untuk mundur dan atur arah gerakan berdasarkan posisi x stick kiri.

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Jenis kit robotik yang saya gunakan tidak memiliki banyak inersia (jika tegangan pada motor diatur ke 0V itu tidak akan terus bergerak untuk sementara). Dengan cara ini, tidak perlu mendefinisikan perintah untuk memrem robot.

Sebagian besar kode sudah dijelaskan pada langkah sebelumnya. Perbedaannya adalah saya mendefinisikan dua variabel yang menyimpan kecepatan setiap motor (dari 0 hingga 1023).

int motor_right_speed = 0;<br>int motor_left_speed = 0; 

Dalam Main loop, Arduino akan membaca posisi x stick kiri. Ini akan menerima nilai antara 0 dan 255 dan memetakan antara -1023 dan 1023.

Nilai ini akan ditambahkan (atau dikurangi) ke kecepatan setiap motor, untuk menciptakan perbedaan antara kecepatan setiap jejak dan membuat robot belok kiri atau kanan.

int nJoyL = ps2x.Analog(PSS_LX); // read left stick nJoyL = map(nJoyL, 0, 255, 1023, -1023); motor_right_speed = 1023; motor_left_speed = 1023; if (nJoyL < 0) { motor_right_speed = motor_right_speed + nJoyL; } if (nJoyL > 0) { motor_left_speed = motor_left_speed - nJoyL; } 

Jika tombol R2 ditekan, tank akan bergerak maju. Dengan cara ini, Arduino mengatur nilai yang sesuai untuk pin motor. ENA dan ENB menciptakan output 'analog' untuk setiap motor, dengan nilai proporsional terhadap kecepatan yang diinginkan untuk setiap motor (berdasarkan posisi x stick kiri).

L2 akan melakukan sesuatu yang serupa, tetapi membalikkan arah motor.

if(ps2x.Button(PSB_R2)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(ps2x.Button(PSB_L2)) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(!ps2x.Button(PSB_L2) && !ps2x.Button(PSB_R2)) { analogWrite(ENA, 0); analogWrite(ENB, 0); } 

Jika tidak ada tombol yang ditekan, motor akan dinonaktifkan.

Langkah 8: Sketsa #3 - Stick Analog Kiri dan Kanan (Differential Drive)

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Ini adalah cara favorit saya untuk mengendalikan tank (meskipun tidak optimal dalam hal sumber daya)! Ini membuat saya merasa seperti mengendalikan mesin besar dengan kedua tangan!

Dalam kode ini saya menggunakan kedua stik untuk mengatur arah dan kecepatan setiap jejak. Stick kiri akan mengontrol jejak kiri, dan stick kanan akan mengontrol jejak kanan.

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Kode hampir sama seperti yang dijelaskan sebelumnya. Namun kali ini saya ingin membaca posisi y kedua stik:

int nJoyL = ps2x.Analog(PSS_LY); // read left stick int nJoyR = ps2x.Analog(PSS_RY); // read right stick nJoyL = map(nJoyL, 0, 255, 1023, -1023); nJoyR = map(nJoyR, 0, 255, -1023, 1023); 

Bergantung pada posisi stik, kode akan mengatur pin digital untuk menentukan arah setiap motor.

Saya menggunakan nilai tetap pada enable (1023), tetapi saya akan menggunakan nilai variabel berdasarkan nilai aktual dari stik analog. Saya mendefinisikan deadband (+-50) di mana mikrokontroler akan menonaktifkan motor.

// Perform movements based on both analog sticks if(nJoyR>50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); analogWrite(ENA, 1023); } if(nJoyR<-50) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); analogWrite(ENA, 1023); } if (abs(nJoyR)<50) { analogWrite(ENA, 0); } 

Langkah 9: Sketsa #4 - Hanya Stick Analog Kiri

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Dalam sketsa terakhir ini saya menggunakan satu joystick untuk mengendalikan robot. Ini optimal dalam hal penggunaan sumber daya (Anda akan memiliki banyak tombol tersisa untuk berbagai aksi yang dapat dikonfigurasi), tetapi cukup sulit dipahami.

Kecepatan setiap jejak didefinisikan tergantung pada posisi x dan y joystick. Dengan cara ini, mungkin untuk menerapkan kecepatan yang berbeda pada setiap jejak, dan menggerakkan robot dengan kecepatan/arah yang berbeda. Kode yang digunakan di sini berasal dari tutorial berikut. Cek ini!

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

https://www.impulseadventure.com/elec/robot-differential-steering.html

Langkah 10: Pertimbangan Akhir

Saya telah mengeluarkan banyak usaha dalam proyek ini, untuk membuatnya sejelas dan seedukasi mungkin. Jika Anda menyukainya, jangan lupa untuk 'suka' dan 'bagikan'. Dukungan Anda sangat penting bagi saya! :D

Jika Anda masih tidak mengikuti tutorial saya, lihat tutorial robotika lainnya ini! Saya harap Anda menyukainya!

https://www.hackster.io/igorF2/joy-robot-robo-da-alegria-bba54f

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

https://www.hackster.io/igorF2/nunchuk-controlled-robotic-arm-with-arduino-b1c0fa

https://www.hackster.io/igorF2/wi-fi-browser-controlled-robotic-arm-89b63d

Silakan pertimbangkan untuk mendukung proyek saya di masa depan dengan donasi Bitcoin kecil! :D

Alamat Deposit BTC: 1FiWFYSjRaL7sLdr5wr6h86QkMA6pQxkXJ

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Kode

Sketsa #1Arduino
// PS2 Tank by Igor Fonseca @2019 // Controls a robotic tank using a PS2 joystick, using D-pad buttons // based on an example using the PS2X library by Bill Porter 2011 // All text above must be included in any redistribution. // include libraries #include <PS2X_lib.h> // These are used to set the direction of the bridge driver. #define ENA 3 //ENA #define MOTORA_1 4 //IN3 #define MOTORA_2 5 //IN4 #define MOTORB_1 8 //IN1 #define MOTORB_2 7 //IN2 #define ENB 6 //ENB PS2X ps2x; // create PS2 Controller Class //right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller. int error = 0; byte type = 0; byte vibrate = 0; void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error == 0){ Serial.println("Found Controller, configured successful"); } else if(error == 1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error == 2) Serial.println("Controller found but not accepting commands"); else if(error == 3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type = ps2x.readType(); switch(type) { case 0: Serial.println("Unknown Controller type"); break; case 1: Serial.println("DualShock Controller Found"); break; case 2: Serial.println("GuitarHero Controller Found"); break; } } // Main loop void loop(){ if(error == 1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller // Perform movements based on D-pad buttons // MOVE FORWARD if(ps2x.Button(PSB_PAD_UP)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move forward"); } // TURN RIGHT if(ps2x.Button(PSB_PAD_RIGHT)){ digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Turn right"); } // TURN LEFT if(ps2x.Button(PSB_PAD_LEFT)){ digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Turn left"); } // MOVE BACK if(ps2x.Button(PSB_PAD_DOWN)){ digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move back"); } if (!ps2x.Button(PSB_PAD_DOWN) && !ps2x.Button(PSB_PAD_UP) && !ps2x.Button(PSB_PAD_RIGHT) && !ps2x.Button(PSB_PAD_LEFT)) { analogWrite(ENB, 0); analogWrite(ENA, 0); } delay(50); } } 
Sketsa #2Arduino
// PS2 Tank by Igor Fonseca @2019 // Controls a robotic tank using a PS2 joystick, using D-pad buttons // based on an example using the PS2X library by Bill Porter 2011 // All text above must be included in any redistribution. // include libraries #include <PS2X_lib.h> // These are used to set the direction of the bridge driver. #define ENA 3 //ENA #define MOTORA_1 4 //IN3 #define MOTORA_2 5 //IN4 #define MOTORB_1 8 //IN1 #define MOTORB_2 7 //IN2 #define ENB 6 //ENB int motor_right_speed = 0; int motor_left_speed = 0; PS2X ps2x; // create PS2 Controller Class //right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller. int error = 0; byte type = 0; byte vibrate = 0; void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error == 0){ Serial.println("Found Controller, configured successful"); } else if(error == 1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error == 2) Serial.println("Controller found but not accepting commands"); else if(error == 3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type = ps2x.readType(); switch(type) { case 0: Serial.println("Unknown Controller type"); break; case 1: Serial.println("DualShock Controller Found"); break; case 2: Serial.println("GuitarHero Controller Found"); break; } } // Main loop void loop(){ if(error == 1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyL = ps2x.Analog(PSS_LX); // read left stick nJoyL = map(nJoyL, 0, 255, 1023, -1023); int motor_right_speed = 1023; int motor_left_speed = 1023; if (nJoyL < 0) { motor_right_speed = motor_right_speed + nJoyL; } if (nJoyL > 0) { motor_left_speed = motor_left_speed - nJoyL; } if(ps2x.Button(PSB_R2)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(ps2x.Button(PSB_L2)) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(!ps2x.Button(PSB_L2) && !ps2x.Button(PSB_R2)) { analogWrite(ENA, 0); analogWrite(ENB, 0); } delay(50); } } 
Sketsa #3Arduino
// PS2 Tank by Igor Fonseca @2019 // Controls a robotic tank using a PS2 joystick, using D-pad buttons // based on an example using the PS2X library by Bill Porter 2011 // All text above must be included in any redistribution. // include libraries #include <PS2X_lib.h> // These are used to set the direction of the bridge driver. #define ENA 3 //ENA #define MOTORA_1 4 //IN3 #define MOTORA_2 5 //IN4 #define MOTORB_1 8 //IN1 #define MOTORB_2 7 //IN2 #define ENB 6 //ENB PS2X ps2x; // create PS2 Controller Class //right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller. int error = 0; byte type = 0; byte vibrate = 0; void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error == 0){ Serial.println("Found Controller, configured successful"); } else if(error == 1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error == 2) Serial.println("Controller found but not accepting commands"); else if(error == 3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type = ps2x.readType(); switch(type) { case 0: Serial.println("Unknown Controller type"); break; case 1: Serial.println("DualShock Controller Found"); break; case 2: Serial.println("GuitarHero Controller Found"); break; } } // Main loop void loop(){ if(error == 1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyL = ps2x.Analog(PSS_LY); // read left stick int nJoyR = ps2x.Analog(PSS_RY); // read right stick nJoyL = map(nJoyL, 0, 255, 1023, -1023); nJoyR = map(nJoyR, 0, 255, -1023, 1023); // Perform movements based on both analog sticks if(nJoyR>50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); analogWrite(ENA, 1023); } if(nJoyR<-50) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); analogWrite(ENA, 1023); } if (abs(nJoyR)<50) { analogWrite(ENA, 0); } if(nJoyL>50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); } if(nJoyL<-50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); } if (abs(nJoyL)<50) { analogWrite(ENB, 0); } delay(50); } } 
Sketsa #4Arduino
// PS2 Tank by Igor Fonseca @2019 // Controls a robotic tank using a PS2 joystick, using left analog stick // based on an example using the PS2X library by Bill Porter 2011 // All text above must be included in any redistribution. // include libraries #include <PS2X_lib.h> //for v1.6 // These are used to set the direction of the bridge driver. #define ENA 3 //ENA #define MOTORA_1 4 //IN3 #define MOTORA_2 5 //IN4 #define MOTORB_1 8 //IN1 #define MOTORB_2 7 //IN2 #define ENB 6 //ENB int motor_right_speed = 0; int motor_left_speed = 0; PS2X ps2x; // create PS2 Controller Class //right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller. int error = 0; byte type = 0; byte vibrate = 0; void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error == 0){ Serial.println("Found Controller, configured successful"); } else if(error == 1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error == 2) Serial.println("Controller found but not accepting commands"); else if(error == 3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type = ps2x.readType(); switch(type) { case 0: Serial.println("Unknown Controller type"); break; case 1: Serial.println("DualShock Controller Found"); break; case 2: Serial.println("GuitarHero Controller Found"); break; } } // Main loop void loop(){ if(error == 1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyX = ps2x.Analog(PSS_LX); // read x-joystick int nJoyY = ps2x.Analog(PSS_LY); // read y-joystick nJoyX = map(nJoyX, 0, 255, -1023, 1023); nJoyY = map(nJoyY, 0, 255, 1023, -1023); // OUTPUTS int nMotMixL; // Motor (left) mixed output int nMotMixR; // Motor (right) mixed output // CONFIG // - fPivYLimt : The threshold at which the pivot action starts // This threshold is measured in units on the Y-axis // away from the X-axis (Y=0). A greater value will assign // more of the joystick's range to pivot actions. // Allowable range: (0..+127) float fPivYLimit = 1023.0; // TEMP VARIABLES float nMotPremixL; // Motor (left) premixed output float nMotPremixR; // Motor (right) premixed output int nPivSpeed; // Pivot Speed float fPivScale; // Balance scale between drive and pivot // Calculate Drive Turn output due to Joystick X input if (nJoyY >= 0) { // Forward nMotPremixL = (nJoyX>=0)? 1023.0 : (1023.0 + nJoyX); nMotPremixR = (nJoyX>=0)? (1023.0 - nJoyX) : 1023.0; } else { // Reverse nMotPremixL = (nJoyX>=0)? (1023.0 - nJoyX) : 1023.0; nMotPremixR = (nJoyX>=0)? 1023.0 : (1023.0 + nJoyX); } // Scale Drive output due to Joystick Y input (throttle) nMotPremixL = nMotPremixL * nJoyY/1023.0; nMotPremixR = nMotPremixR * nJoyY/1023.0; // Now calculate pivot amount // - Strength of pivot (nPivSpeed) based on Joystick X input // - Blending of pivot vs drive (fPivScale) based on Joystick Y input nPivSpeed = nJoyX; fPivScale = (abs(nJoyY)>fPivYLimit)? 0.0 : (1.0 - abs(nJoyY)/fPivYLimit); // Calculate final mix of Drive and Pivot nMotMixL = (1.0-fPivScale)*nMotPremixL + fPivScale*( nPivSpeed); nMotMixR = (1.0-fPivScale)*nMotPremixR + fPivScale*(-nPivSpeed); motor_left_speed = nMotMixL; motor_right_speed = nMotMixR; if (motor_right_speed > 50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else if (motor_right_speed < -50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2, HIGH); } else { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, LOW); } if (motor_left_speed > 50) { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, HIGH); } else if (motor_left_speed < -50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); } else { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, LOW); } analogWrite(ENA, abs(motor_left_speed)); analogWrite(ENB, abs(motor_right_speed)); if (abs(motor_left_speed > 50) || abs(motor_left_speed > 50)) { Serial.println("Moving!"); } delay(50); } } 

Skematik

Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2

Proses manufaktur

  1. Membuat Robot Streaming Video yang Dikontrol Internet dengan Arduino & Raspberry Pi
  2. Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
  3. Robot Penghindar Halangan Direnkai Servo: Bangun dengan Arduino & HC-SR04
  4. Kendalikan Roomba Create 2 Anda dengan Arduino dan Android: Panduan Langkah-demi-Langkah
  5. Kit Lengan Robot 6-DoF Berbasis Arduino dengan Pengendali Nunchuk
  6. Kendalikan Dua Motor Stepper dengan Arduino Nano dan Joystick – Tutorial Sederhana
  7. Volant Joystick Arduino Kustom untuk Gaming
  8. Buat Robot Tempur Dikontrol Jarak Jauh dengan Pengendali PS2
  9. Kontrol Lengan Robot Arduino Anda melalui Aplikasi Android Khusus
  10. Bangun Robot Makan Berbasis Arduino Nano – Panduan Langkah demi Langkah