Robot Tank Arduino Dikendalikan Joystick Nirkabel PS2
Komponen dan Perlengkapan
Arduino UNO
×
1
SparkFun Dual H-Bridge motor drivers L298
×
1
Kit robotic tank DIY
×
1
Kontroler nirkabel Sony PS2
×
1
Aplikasi dan Layanan Online
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:
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:
Berikut adalah alat yang digunakan dalam proyek ini:
Pakuian solder dan kabel (link / link). Motor DC sudah datang dengan kabel yang dilapisi solder pada terminalnya... Namun akhirnya akan rusak dan Anda mungkin harus melapisi ulang solder. Jadi pertimbangkan untuk memiliki pakuian solder dan kabel yang baik di dekat Anda.
Lem EVA foam (atau bahan non konduktif lain). Chassis robot yang saya gunakan dalam proyek ini terbuat dari aluminium, dan papan sirkuit dipasang pada bagian logam ini. Saya menggunakan lapisan foam antara papan dan plat logam untuk menghindari pendek listrik yang mungkin terjadi.
Kawat double sided tape. Digunakan untuk menempelkan lem EVA foam pada papan sirkuit, dan untuk pemasangan modul H-Bridge.
Gunting, untuk memotong beberapa persegi panjang lem EVA foam.
Saya menggunakan bagian hardware berikut untuk proyek saya:
Papan pengembangan berbasis Arduino Uno (link / link / link / link). Digunakan sebagai kontroler utama robot. Sangat mudah digunakan dan diprogram dengan Arduino IDE, cocok untuk pemula di elektronika dan pemrograman.
Modul L298N dual channel H-bridge (link / link / link / link). Modul ini memungkinkan sinyal 3.3V dari Wemos (atau Arduino) difokuskan menjadi 12V yang dibutuhkan untuk motor.
Chassis Tank Robot DIY (link). Kit hebat ini memiliki semua yang Anda butuhkan untuk membuat tank: dua motor DC, gigi, rantai, baut, mata kuncinya, dll. Kit ini sudah dilengkapi dengan alat yang diperlukan untuk merakit chassis, yang hebat untuk pemula!
Kontroler Jarak Jauh Nirkabel PS2 (link). Kontroler videogame ini dapat mengirim perintah secara nirkabel ke penerima, yang dapat dihubungkan dengan mikrokontroler menggunakan komunikasi serial.
Baterai 18650 3.7V (x3) (link / link). Saya menggunakan untuk menyiram seluruh sirkuit. Tank ini menggunakan motor 12V. Saya menggunakan tiga baterai 3.7V secara seri untuk menyiramnya.
Tempat Baterai 3S 18650 (link / link / link). Dapat menahan tiga baterai 18650 secara seri, dan dapat dengan mudah dipasang di bagian belakang tank.
Charger Baterai 18650 (link / link). Baterai Anda akhirnya akan kehabisan daya. Ketika itu terjadi, charger baterai akan datang untuk menyelamatkan Anda.
Jumpers (link / link). Saya menggunakan 6 jumper machin-betina untuk sinyal antara h-bridge dan Wemos, dan 2 jumper machin-machin untuk 5V dan Gnd. Anda mungkin membutuhkan lebih banyak jika berencana menambahkan beberapa sensor.
Kabel USB Type-B. Anda akan membutuhkan ini untuk mengunggah kode Anda. Sebagian besar papan sudah dilengkapi dengan kabelnya sendiri.
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:
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:
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.
Langkah 3: Merangkaian Sirkuit
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.
Berikut daftar pin yang perlu Anda hubungkan:
Input/Output Arduino Uno:
Pin digital 3 => pin ENA H-Bridge
Pin digital 5 => pin IN1 H-Bridge
Pin digital 4 => pin IN2 H-Bridge
Pin digital 8 => pin IN3 H-Bridge
Pin digital 7 => pin IN4 H-Bridge
Pin digital 6 => pin ENB H-Bridge
Pin 5V => pin 5V H-Bridge
Pin Gnd => pin Gnd H-bridge
Pin digital 10 => pin 6 penerima PS2
Pin digital 11 => pin 2 penerima PS2
Pin digital 12 => pin 1 penerima PS2
Pin digital 13 => pin 7 penerima PS2
Pin 3.3V => pin 5 penerima PS2
Pin Gnd => pin 4 penerima PS2
Input/Output H-Bridge:
Pin ENA => pin digital Arduino 3
Pin IN1 => pin digital Arduino 5
Pin IN2 => pin digital Arduino 4
Pin IN3 => pin digital Arduino 8
Pin IN4 => pin digital Arduino 7
Pin ENB => pin digital Arduino 6
Pin 5V => pin 5V Arduino
Pin Gnd => pin Gnd Arduino
Pin Gnd => kabel negatif baterai
Pin 12V => kabel positif baterai
OUT1 => kabel negatif motor kanan
OUT2 => kabel positif motor kanan
OUT3 => kabel positif motor kiri
OUT4 => kabel negatif motor kiri
Penerima PS2:
Pin 1 (data) => pin digital Arduino 12
Pin 2 (command) => pin digital Arduino 11
Pin 4 (ground) => pin Gnd Arduino
Pin 5 (power) => pin 3.3V Arduino
Pin 6 (attention) => pin digital Arduino 10
Pin 7 (clock) => pin digital Arduino 13
Langkah 4: Pengaturan Arduino IDE
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!
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:
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:
PSB_PAD_UP = tombol D-pad atas;
PSB_PAD_DOWN = tombol D-pad bawah;
PSB_PAD_LEFT = tombol D-pad kiri
PSB_PAD_RIGHT = tombol D-pad kanan
Tombol aksi:
PSB_GREEN atau PSB_TRIANGLE = tombol segitiga hijau
PSB_RED atau PSB_CIRCLE = tombol lingkaran merah
PSB_BLUE atau PSB_CROSS = tombol x biru
PSB_PINK atau PSB_SQUARE = tombol persegi panjang pink
Trigger:
PSB_L1 = tombol trigger sisi kiri 1
PSB_R1 = tombol trigger sisi kanan 1
PSB_L2 = tombol trigger sisi kiri 2
PSB_R2 = tombol trigger sisi kanan 2
Stick:
PSB_L3 = tombol tekan stick kiri (ya, Anda dapat menekan stick sebagai tombol tekan)
PSB_R3 = tombol tekan stick kanan
Menu:
PSB_SELECT = tombol select
PSB_START = tombol start
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:
PSS_LY = posisi y stick kiri
PSS_LX = posisi x stick kiri
PSS_RY = posisi y stick kanan
PSS_RX = posisi x stick kanan
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
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:
PSB_PAD_UP = maju
PSB_PAD_DOWN = mundur
PSB_PAD_LEFT = belok kiri
PSB_PAD_RIGHT = belok kanan
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.
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:
Reset papan Arduino Uno. Cobalah beberapa kali (bagi saya, biasanya berhasil setelah reset ketiga);
Periksa apakah joystick menyala (dan dengan baterai terisi). Penerima beberapa LED yang akan menunjukkan apakah joystick telah dipasangkan. Juga periksa apakah pin RX dan TX Arduino berkedip saat menerima perintah baru (dan memperbarui status pada port Serial);
Periksa koneksi... mungkin ada yang salah pada jumper antara komponen.
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.
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.
*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)
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.
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.
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.
Jika tidak ada tombol yang ditekan, motor akan dinonaktifkan.
Langkah 8: Sketsa #3 - Stick Analog Kiri dan Kanan (Differential Drive)
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.
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
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!
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!
// 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); } }