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

Robot Arduino Dengan Kontroler PS2 (Joystick PlayStation 2)

Komponen dan persediaan

Arduino UNO
× 1
SparkFun Dual H-Bridge driver motor L298
× 1
Kit tangki robotik DIY
× 1
Pengontrol nirkabel Sony PS2
× 1

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

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

Saya sebelumnya telah merancang tangki robotik yang dikendalikan Blynk. Terhubung ke jaringan Wi-Fi dan menerima perintah dari server Blynk. Ponsel cerdas yang menjalankan aplikasi Blynk digunakan sebagai remote control, dan metode input yang berbeda digunakan:tombol tekan, bilah geser, dan bahkan akselerometer ponsel cerdas. 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 membuat beberapa eksperimen dengan perintah suara. Mungkin berguna jika Anda ingin mengontrol robot dari jarak jauh tanpa menggunakan tangan Anda, atau jika Anda ingin membuatnya dapat diakses oleh seseorang dengan gerakan terbatas. Orang mungkin berpikir tentang kursi roda yang dikendalikan suara robot, misalnya. Kit robot DIY digunakan, bersama dengan beberapa alat favorit saya:Adafruit.io, IFTTT, dan Arduino IDE. Petunjuk lengkapnya di sini:

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

Anda dapat menggunakan kit yang berbeda atau bahkan mendesain robot Anda sendiri menggunakan bahan sederhana, tanpa perlu menggunakan alat yang rumit seperti printer 3D dan mesin pemotong laser. Anda dapat menemukan contoh di salah satu tutorial saya sebelumnya:

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

Langkah 1:Alat dan Bahan

Alat berikut digunakan dalam proyek ini:

  • Setrika dan kawat solder (tautan / tautan). Motor DC sudah dilengkapi dengan kabel yang disolder ke terminalnya... Tetapi pada akhirnya akan putus dan Anda mungkin harus menyoldernya kembali. Jadi pertimbangkan untuk memiliki besi solder dan kawat yang bagus.
  • Lembar busa EVA (atau bahan non-konduktif lainnya). Sasis robot yang saya gunakan dalam proyek ini terbuat dari aluminium, dan papan sirkuit dipasang pada bagian logam ini. Saya menggunakan lapisan lembaran busa antara papan dan pelat logam untuk menghindari kemungkinan korsleting.
  • Pita dua sisi . Itu digunakan untuk merekatkan lembaran busa ke papan sirkuit, dan untuk pemasangan mode H-Bridge.
  • Gunting , untuk memotong beberapa persegi panjang lembaran busa.

Saya menggunakan bagian perangkat keras berikut untuk proyek saya:

  • Dewan pengembang berbasis Arduino Uno (tautan / tautan / tautan / tautan). Ini digunakan sebagai pengontrol utama robot. Sangat mudah digunakan dan diprogram dengan Arduino IDE, cocok untuk pemula dalam bidang elektronik dan pemrograman.
  • Modul H-bridge saluran ganda L298N (tautan / tautan / tautan / tautan). Modul ini memungkinkan sinyal 3.3V dari Wemos (atau Arduino) diperkuat ke 12V yang dibutuhkan untuk motor.
  • Tank Chassis Robot DIY (tautan). Kit yang luar biasa ini memiliki semua yang Anda butuhkan untuk membuat tangki:dua motor DC, roda gigi, track, baut, mur, dll. Kit ini sudah dilengkapi dengan alat yang dibutuhkan untuk merakit sasis, yang sangat bagus untuk pemula!
  • Kontrol Jarak Jauh Nirkabel PS2 (tautan). Pengontrol videogame ini dapat mengirim perintah secara nirkabel ke penerima, yang dapat dihubungkan dengan mikrokontroler menggunakan komunikasi serial.
  • Baterai 18650 3.7V (x3) (tautan / tautan). Saya dulu memberi daya pada seluruh sirkuit. Tangki ini menggunakan motor 12V. Saya menggunakan tiga baterai 3.7V secara seri untuk menyalakannya.
  • Tempat baterai 3S 18650 (tautan / tautan / tautan). Ini dapat menampung tiga baterai 18650 secara seri, dan dapat dengan mudah dipasang ke bagian belakang tangki.
  • Pengisi daya baterai 18650 (tautan / tautan). Baterai Anda pada akhirnya akan kehabisan daya. Ketika itu terjadi, pengisi daya baterai akan datang untuk menyelamatkan Anda.
  • Jumper (tautan / tautan). Saya menggunakan 6 jumper pria-wanita untuk sinyal antara h-bridge dan Wemos, dan 2 jumper pria-pria untuk 5V dan Gnd. Anda mungkin membutuhkan lebih banyak jika Anda berencana untuk menambahkan beberapa sensor.
  • Kabel USB Tipe-B . Anda akan memerlukan ini untuk mengunggah kode Anda. Sebagian besar papan sudah dilengkapi dengan kabelnya sendiri.

Tautan di atas hanyalah saran di mana Anda dapat menemukan item yang digunakan dalam tutorial ini (dan mungkin mendukung tutorial saya di masa mendatang). Jangan ragu untuk mencarinya di tempat lain dan membeli di toko lokal atau online favorit Anda.

Langkah 2:Merakit Robot

Bagian pertama dari proyek ini adalah perakitan struktur robot.

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

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

Kemudian saya memutuskan untuk memberikan kesempatan untuk kit robot yang diperoleh dari toko online. Anda dapat menemukan tautan ke sasis robot di tautan berikut:http://bit.ly/2ycI8fP. Jika Anda sedang mencari kit, saya pikir itu pilihan yang baik! Saya menggunakannya dalam dua tutorial lainnya, seperti yang Anda lihat pada tautan 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

Pada awalnya tampaknya perakitan akan rumit atau saya akan mengalami masalah seperti kurangnya suku cadang (mengingat jumlah suku cadang yang menyusun kit). Tapi kit ini benar-benar mengejutkan saya! Semua bagian menurut saya berkualitas baik, dan beberapa suku cadang menyertai kit. Jadi, sekrup yang hilang di bawah meja kerja tidak akan membuat proyek Anda tidak dapat dijalankan, yang menurut saya sangat bagus (terutama setelah kehilangan beberapa sekrup).

Poin positif lainnya adalah bahwa semua alat yang diperlukan untuk memasang robot sudah termasuk dalam kit (beberapa kunci pas Allen dan obeng). Saya yakin ini membuat kit ini sangat baik untuk pemula yang tidak memiliki banyak alat!

Sebagai aspek negatif saya akan menyoroti kurangnya dokumentasi. Tukang perakitan robot

ual (file spreadsheet dalam bahasa Cina) sangat tidak ramah pengguna, dan tidak banyak tutorial online untuk tangki itu. Jadi saya memutuskan untuk mendokumentasikan proses perakitan robot saya di video di atas! Hal lain yang menjadi perhatian menyangkut bahan struktur robot. Dasar seluruhnya terbuat dari aluminium, yang dapat menyebabkan korsleting jika pin papan sirkuit tercetak menyentuh rangka.

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

Langkah 3:Menghubungkan Sirkuit

Paket daya yang terbuat dari tiga baterai 18650 dipasang di bagian belakang robot. Ini memberikan 11.1V (3 x 3.7V) ke robot. Itu cukup untuk memberi daya pada motor DC 12V.

Jembatan H saluran ganda L298N digunakan untuk mengontrol motor. Ini menerima beberapa sinyal 5V dari papan Arduino, dan memberikan tegangan yang lebih tinggi untuk motor. Ini juga memungkinkan motor berjalan di kedua arah, bergantung pada kombinasi sinyal input tersebut.

Setiap perangkat terhubung sesuai dengan skema.

Berikut daftar pin yang harus Anda sambungkan:

Input/output Arduino Uno:

  • Pin digital 3 => Pin ENA H-Bridge
  • Pin digital 5 => Pin H-Bridge IN1
  • Pin digital 4 => Pin H-Bridge IN2
  • Pin digital 8 => Pin H-Bridge IN3
  • Pin digital 7 => Pin H-Bridge IN4
  • Pin digital 6 => Pin ENB H-Bridge
  • Pin 5V => Pin H-Bridge 5V
  • Pin Gnd => Pin Gnd jembatan H
  • Pin digital 10 => Pin penerima PS2 6
  • Pin digital 11 => Pin penerima PS2 2
  • Pin digital 12 => Pin penerima PS2 1
  • Pin digital 13 => Pin penerima PS2 7
  • Pin 3.3V => Pin penerima PS2 5
  • Pin Gnd => Pin penerima PS2 4

Masukan/keluaran 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 Arduino 5V
  • Pin Gnd => Pin Gnd Arduino
  • Gnd pin => 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 (perintah) => Pin digital Arduino 11
  • Pin 4 (ground) => Pin Arduino Gnd
  • Pin 5 (daya) => Pin Arduino 3.3V
  • Pin 6 (perhatian) => Pin digital Arduino 10
  • Pin 7 (jam) => Pin digital Arduino 13

Langkah 4:Siapkan 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 luncurkan.

2. Menambahkan perpustakaan

Dalam proyek ini, saya menggunakan library Arduino PS2X.

Unduh perpustakaan di https://github.com/madsci1016/Arduino-PS2X. Buka zip file, dan salin folder ke folder library/tools Arduino IDE.

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

Sekarang lingkungan dev Anda sudah siap, mari kita lanjutkan ke langkah berikutnya!

Langkah 5:Penjelasan Pustaka Pengontrol Nirkabel PS2

Pengontrol nirkabel PS2 adalah alat yang hebat untuk proyek robotika Anda. Ini memiliki jumlah tombol yang luar biasa:20 tombol tekan digital dan 2 stik analog. Dengan cara ini, ada kemungkinan tak terbatas untuk mengontrol robot Anda.

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

Ini mendefinisikan Kelas PS2X untuk pengontrol, yang berisi beberapa metode untuk membaca input analog dan digital dari joystick. Objek untuk kelas ini dibuat menggunakan kode berikut (sebelum atau selama penyiapan):

PS2X ps2x;  

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

error =ps2x.config_gamepad(jam,perintah,perhatian,data, tekanan?, gemuruh?);  

Fungsi ini mungkin mengembalikan beberapa kesalahan jika ada yang salah dengan koneksi atau dengan pengontrol itu sendiri.

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

ps2x.Button(button);  

Di mana tombol 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 kiri D-pad
  • PSB_PAD_RIGHT =Tombol kanan D-pad

Tombol tindakan:

  • 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 merah muda

Pemicu:

  • PSB_L1 =tombol pemicu sisi kiri 1
  • PSB_R1 =tombol pemicu sisi kanan 1
  • PSB_L2 =tombol pemicu sisi kiri 2
  • PSB_R2 =tombol pemicu sisi kanan 2

Tongkat:

  • PSB_L3 =tombol tekan stik kiri (ya, Anda dapat menekan stik sebagai tombol tekan)
  • PSB_R3 =tombol tekan stik kanan

Menu:

  • PSB_SELECT =tombol pilih
  • PSB_START =tombol mulai

Untuk membaca nilai analog (dengan konverter dalam bilangan bulat antara 0 dan 255) dari tongkat gunakan metode berikut:

ps2x.Analog(stick_axis);  

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

  • PSS_LY =posisi y dari stick kiri
  • PSS_LX =x-posisi stick kiri
  • PSS_RY =posisi y dari stick kanan
  • PSS_RX =posisi x tongkat kanan

Dengan fungsi dasar tersebut, Anda akan siap menggunakan pengontrol PS2 di proyek Anda! Pada langkah-langkah berikut saya tunjukkan beberapa contoh sketsa Arduino yang menggabungkan tombol-tombol itu!

Langkah 6:Sketsa #1 - Tombol Dpad

Video game lama, seperti SEGA Master System dan Mega Drive dan Nintendo SNES, tidak memiliki tombol yang peka terhadap tekanan. Tombol arah hanya tombol on/off. Untuk contoh pertama ini, saya ingin meniru jenis kontrol yang ada di video game lama dari konsol tersebut.

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

Tombol-tombol itu memiliki keluaran biner. Dengan cara ini, mikrokontroler hanya akan mengerti bahwa tombol ditekan, tetapi tidak akan mengerti seberapa keras tombol itu ditekan. Dengan cara ini, setelah tombol tertentu diklik, motor akan berjalan dengan kecepatan penuh.

Jika Anda menghubungkan semuanya sesuai dengan skema 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 berbelok ke kiri atau ke kanan, motor akan berjalan berlawanan arah, sehingga robot akan berputar pada porosnya.

Kode Arduino:

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

Untuk mengupload kode, pilih board 'Arduino/Genuino Uno', pilih port COM yang tepat, pasang board pada port USB komputer Anda dan upload kode.
Setelah upload selesai, cabut kabel USB, dan pasang baterai. Kode akan mulai berjalan dan papan Arduino secara otomatis akan menghubungkan joystick PS2. Buka monitor serial pada penggunaan pertama dan periksa status koneksi. Jika gagal terhubung dengan joystick, ada sesuatu yang harus Anda lakukan:

  • Setel ulang papan Arduino Uno. Cobalah beberapa kali (bagi saya, biasanya berhasil setelah reset ketiga);
  • Periksa apakah joystick menyala (dan dengan baterai yang terisi daya). Penerima memiliki beberapa LED yang akan menunjukkan jika joystick dipasangkan. Periksa juga 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 antarkomponen.

Kode Dijelaskan:

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

#include   

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

// Ini digunakan untuk mengatur arah pengemudi jembatan. #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 penyiapan (p2sx , kesalahan , ketik dan getar ). Yang pertama adalah turunan dari kelas PS2X. Status kesalahan selama koneksi akan disimpan di kesalahan bilangan bulat. Ketik dan getar akan menunjukkan jenis pengontrol (pengontrol DualShock atau GuitarHero) dan apakah itu seharusnya bergetar pada perintah yang diberikan.

Hal pertama yang saya lakukan selama pengaturan adalah mengonfigurasi status pin I/O (sebagai output) dan menyetel pin aktifkan ke LOW. Dengan cara ini Anda akan menonaktifkan kedua motor saat start-up, dan robot tidak akan bergerak secara acak saat menunggu sisa kode.

// Konfigurasi pin keluaran pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Nonaktifkan kedua motor digitalWrite(ENA,0); digitalWrite(ENB,0);  

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

// Mulai komunikasi serial Serial.begin(57600);  

Terakhir, konfigurasikan objek ps2x dengan pin Arduino yang terhubung ke penerima joystick (masing-masing jam, perintah, perhatian, dan data). Ini mungkin mengembalikan kesalahan (untuk ditampilkan di monitor Serial). Jenis pengontrol juga akan ditampilkan (walaupun Anda mungkin sudah mengetahui jenis pengontrol yang ada di tangan Anda saat ini :D).

error =ps2x.config_gamepad(13,11,10,12, benar, benar); //setup pin dan pengaturan:GamePad(jam, perintah, perhatian, data, Tekanan?, Rumble?) periksa kesalahan // Periksa kesalahan jika(kesalahan ==0){ Serial.println("Ditemukan Controller, dikonfigurasi berhasil" ); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Pengontrol ditemukan tetapi tidak menerima perintah"); else if(error ==3) Serial.println("Pengontrol menolak masuk ke mode Tekanan, mungkin tidak mendukungnya."); // Periksa jenis pengontrol type =ps2x.readType(); switch(type) { case 0:Serial.println("Tipe pengontrol tidak diketahui"); merusak; kasus 1:Serial.println("Pengendali DualShock Ditemukan"); merusak; case 2:Serial.println("Pengontrol GuitarHero Ditemukan"); merusak; }  

Selama putaran utama Arduino akan membaca setiap tombol D-pad (Atas, BAWAH, KIRI dan KANAN) dan mengatur nilai yang berbeda untuk pin output, untuk menggerakkan roda. Setelah penundaan yang cepat, putaran baru dimulai.

Bagian berikut menunjukkan cara menggerakkan robot ke depan jika tombol UP ditekan. Pin MOTORA_1 dan MOTORA_2 menentukan arah putaran untuk Motor A. ENA akan menentukan apakah gerakan diaktifkan atau tidak (motor ON/OFF). Perhatikan bahwa ini adalah keluaran "analog" (sebenarnya keluaran PWM). Nilainya harus antara 0 dan 1023. Ini akan memodulasi PWM, dan mengubah tegangan rata-rata pada output h-brigde (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,TINGGI); digitalWrite(MOTORB_1,TINGGI); digitalWrite(MOTORB_2,RENDAH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Maju"); }  

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

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

Pada waktu tertentu, semua konsol mengadopsi joystick dengan dua stik analog. Masukan baru tersebut memungkinkan masukan sensitif paksa yang menciptakan tindakan kecepatan variabel dan menjadi populer di setiap jenis video game.

Dalam contoh kedua ini saya ingin menggunakan sakelar analog untuk menyetir tangki, dan sepasang tombol tekan sebagai throttle dan rem/mundur. Konfigurasi semacam ini sangat populer di banyak game balap, seperti Mario Kart misalnya. Tekan tombol R2 untuk percepatan tangki, L2 untuk mundur dan atur arah gerakan berdasarkan posisi x tongkat kiri.

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

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

int motor_right_speed =0;
int motor_left_speed =0;

Di loop Utama, Arduino akan membaca posisi x dari tongkat kiri. Ini akan menerima nilai antara 0 dan 255 dan memetakannya antara -1023 dan 1023.

Nilai ini akan ditambahkan (atau dikurangi) pada kecepatan masing-masing motor, untuk menciptakan perbedaan antara kecepatan setiap lintasan dan membuat robot berbelok ke kiri atau ke kanan.

int nJoyL =ps2x.Analog(PSS_LX); // baca tongkat kiri nJoyL =peta(nJoyL, 0, 255, 1023, -1023); kecepatan_kanan_motor =1023; kecepatan_kiri_motor =1023; if (nJoyL <0) { motor_kecepatan_kanan =motor_kecepatan_kanan + nJoyL; } if (nJoyL> 0) { motor_left_speed =motor_left_speed - nJoyL; }  

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

L2 akan melakukan hal serupa, tetapi membalikkan arah motor.

if(ps2x.Button(PSB_R2)) { digitalWrite(MOTORA_1,RENDAH); digitalWrite(MOTORA_2,TINGGI); digitalWrite(MOTORB_1,TINGGI); digitalWrite(MOTORB_2,RENDAH); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(ps2x.Button(PSB_L2)) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,RENDAH); digitalWrite(MOTORB_1,RENDAH); digitalWrite(MOTORB_2,TINGGI); 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 - Stik Analog Kiri dan Kanan (Drive Diferensial)

Ini adalah cara favorit saya untuk mengontrol tangki (walaupun tidak optimal dalam hal sumber daya)! Itu membuatku merasa seperti sedang mengendalikan mesin yang sangat besar dengan kedua tangan!

Dalam kode ini saya menggunakan kedua tongkat untuk mengatur arah dan kecepatan setiap trek. Stik kiri akan memerintahkan trek kiri, dan tongkat kanan akan mengontrol trek kanan.

Kodenya hampir sama seperti yang dijelaskan sebelumnya. Tapi kali ini saya ingin membaca posisi y dari kedua tongkat:

int nJoyL =ps2x.Analog(PSS_LY); // baca tongkat kiri int nJoyR =ps2x.Analog(PSS_RY); // baca tongkat kanan nJoyL =peta(nJoyL, 0, 255, 1023, -1023); nJoyR =peta(nJoyR, 0, 255, -1023, 1023);  

Tergantung pada posisi tongkat, kode akan mengatur pin digital untuk mengatur arah masing-masing motor.

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

// Lakukan gerakan berdasarkan kedua stik analog if(nJoyR>50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,RENDAH); analogWrite(ENA, 1023); } if(nJoyR<-50) { digitalWrite(MOTORA_1,RENDAH); digitalWrite(MOTORA_2,TINGGI); analogWrite(ENA, 1023); } if (abs(nJoyR)<50) { analogWrite(ENA, 0); }  

Langkah 9:Sketsa #4 - Hanya Stik Analog Kiri

Dalam aplikasi Sketch terakhir ini saya menggunakan joystick tunggal untuk mengontrol robot. Ini optimal dalam hal penggunaan sumber daya (Anda akan memiliki banyak tombol tersisa untuk tindakan yang berbeda untuk dikonfigurasi), tetapi cukup sulit untuk dipahami.

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

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

Langkah 10:Pertimbangan Terakhir

Saya berusaha keras dalam proyek ini, untuk membuatnya sejelas dan edukatif 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! 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

Harap pertimbangkan untuk mendukung proyek masa depan saya dengan sumbangan Bitcoin kecil! :D

Alamat Setoran BTC:1FiWFYSjRaL7sLdr5wr6h86QkMA6pQxkXJ

Kode

  • Sketsa #1
  • Sketsa #2
  • Sketsa #3
  • Sketsa #4
Sketsa #1Arduino
// Tank PS2 oleh Igor Fonseca @2019// Mengontrol tank robot menggunakan joystick PS2, menggunakan tombol D-pad// berdasarkan contoh menggunakan library PS2X oleh Bill Porter 2011// Semua teks di atas harus disertakan dalam redistribusi apapun.// include libraries#include // Ini digunakan untuk mengatur arah driver bridge.#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 //ENBPS2X ps2x; // buat Kelas Pengontrol PS2//sekarang, perpustakaan TIDAK mendukung pengontrol hot pluggable, artinya //Anda harus selalu me-restart Arduino Anda setelah Anda menghubungkan pengontrol, //atau memanggil config_gamepad(pin) lagi setelah menghubungkan pengontrol. int kesalahan =0; tipe byte =0;byte getar =0;void setup(){ // Konfigurasi pin keluaran pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Nonaktifkan kedua motor digitalWrite(ENA,0); digitalWrite(ENB,0); // Mulai komunikasi serial Serial.begin(57600); kesalahan =ps2x.config_gamepad(13,11,10,12, benar, benar); //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"); merusak; case 1:Serial.println("DualShock Controller Found"); merusak; case 2:Serial.println("GuitarHero Controller Found"); merusak; }}// Main loopvoid 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); } }
Sketch #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 // 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 //ENBint 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"); merusak; case 1:Serial.println("DualShock Controller Found"); merusak; case 2:Serial.println("GuitarHero Controller Found"); merusak; }}// Main loopvoid 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); } }
Sketch #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 // 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 //ENBPS2X 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"); merusak; case 1:Serial.println("DualShock Controller Found"); merusak; case 2:Serial.println("GuitarHero Controller Found"); merusak; }}// Main loopvoid 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); } }
Sketch #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  //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 //ENBint 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"); merusak; case 1:Serial.println("DualShock Controller Found"); merusak; case 2:Serial.println("GuitarHero Controller Found"); merusak; }}// Main loopvoid 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); } }

Skema


Proses manufaktur

  1. Buat Robot Streaming Video Terkendali Internet Anda dengan Arduino dan Raspberry Pi
  2. Unopad - Pengontrol MIDI Arduino dengan Ableton
  3. Hambatan Menghindari Robot Dengan Motor Servo
  4. Mengontrol Robot Roomba Dengan Arduino Dan Perangkat Android
  5. Lengan Robot Terkendali Nunchuk (dengan Arduino)
  6. Arduino Nano:Kontrol 2 Motor Stepper Dengan Joystick
  7. Arduino Joystick
  8. Buat Bot Pertempuran yang Dikendalikan dengan Kontroler PS2
  9. Kontrol Lengan Robot Arduino dengan Aplikasi Android
  10. Membuat Robot Makan Dengan Arduino Nano | Sekrup Emas