Ubah Mobil RC Lama menjadi Kendaraan Terkontrol Joystick dengan Arduino
Komponen dan Perlengkapan
- Arduino UNO – 1 unit
- Arduino USB Host Shield – 1 unit
- XBOX360 Wireless Controller – 1 unit
- XBOX360 Receiver – 1 unit
- 1 L293D motor driver – 1 unit
- 7812 – 1 unit
- 78S12 – 1 unit
- Saklar – 1 unit
- Heatsinks – 1 unit
- Power Plug – 1 unit
- Konektor baterai untuk 8 baterai AA 1,5V dengan steker baterai 9V – 1 unit
Tentang Proyek Ini
1. Ambil Mobilnya!
Pertama-tama Anda perlu mobil RC lama. Untungnya saya menemukan monster truck. Ini bisa sangat menarik!
Hapus semua elektronik kecuali kabel untuk mengontrol dua motor.
2. Arduino dan Shield
Ambil papan Arduino (saya memilih Arduino UNO) dan colokkan USB host shield di atasnya.
3. Pasang Arduino ke Mobil
Colokkan shield di atas Arduino UNO dan USB Host shield dan obrak-abrik mereka ke mobil. Saya menggunakan salah satu lubang untuk sirkuit elektronik lama.
4. Buat Sirkuit
Saya membuat saya pada breadboard, tetapi Anda juga dapat membangunnya pada perfboard. Pada dasarnya sirkuit terdiri dari dua driver (L293D atau SN754410) dan dua stabilisator tegangan. Stabilisator tegangan digunakan untuk membatasi tegangan dari baterai. Faktanya saya menyarankan Anda untuk menggunakan 10-12 baterai AA 1,5V agar memiliki tegangan maksimum 15-18V yang akan memberi Anda lebih banyak waktu untuk bermain dengan mobil RC. Karena motor membutuhkan jumlah arus yang tinggi, untuk menggerakkan mobil dari posisi istirahat (sekitar 2A) kita membutuhkan stabilisator tegangan yang kuat seperti 78S12.
Jika Anda ingin informasi lebih lanjut tentang cara kerja driver, lihat di sini !
5. Pasang Sirkuit ke Mobil
Temukan tempat kosong di mobil RC tempat Anda dapat menempatkan sirkuit. Pada monster truck yang saya miliki, ada banyak ruang. Setelah diposisikan, hubungkan sirkuit ke dua motor. Akhirnya colokkan penerima nirkabel ke USB host shield.
6. Kode
Kode didasarkan pada contoh pustaka USB Host Library 2.0 yang dihosting di GitHub oleh Kristian Lauszus dari circuits@home
/* Contoh sketsa untuk pustaka penerima nirkabel Xbox - dikembangkan oleh Kristian Lauszus Mendukung hingga empat pengontrol secara nirkabel Untuk informasi lebih lanjut lihat posting blog: https://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/ atau kirim email saya: kristianl@tkjelectronics.com */ #include <XBOXRECV.h> // Satisfy IDE, which only needs to see the include statment in the ino. #ifdef dobogusinclude #include <spi4teensy3.h> #endif USB Usb; XBOXRECV Xbox(&Usb); #define motorPinOne 5 //The chosen pin must have PWM #define motorPinTwo 6 //The chosen pin must have PWM #define motor2PinOne 4 #define motor2PinTwo 7 #define BRAKE 2 /* Define the rotational speed of the motor. MUST be between 0 and 255. */ int pulse = 0; int forward = 0; int brake_on = 0; void setup() { TCCR1B = TCCR1B & 0b11111000 | 0x02; Serial.begin(115200); if (Usb.Init() == -1) { Serial.print(F("\r\nOSC did not start")); while(1); //halt motors_stop(); center(); } Serial.print(F("\r\nXbox Wireless Receiver Library Started")); pinMode (motorPinOne, OUTPUT); pinMode (motorPinTwo, OUTPUT); pinMode (motor2PinOne, OUTPUT); pinMode (motor2PinTwo, OUTPUT); pinMode (BRAKE, OUTPUT); digitalWrite (BRAKE, LOW); } void loop() { Usb.Task(); if(Xbox.XboxReceiverConnected) { for(uint8_t i=0;i<4;i++) { if(Xbox.getButtonPress(L2, i)) { Serial.print("L2: "); Serial.print(Xbox.getButtonPress(L2, i)); pulse = Xbox.getButtonPress(L2, i); forward = 0; clockwise(); } if(Xbox.getButtonPress(R2, i)) { Serial.print("R2: "); Serial.println(Xbox.getButtonPress(R2, i)); pulse = Xbox.getButtonPress(R2, i); forward = 1; counterClockwise(); } if(Xbox.getAnalogHat(LeftHatX, i) > 7500 || Xbox.getAnalogHat(LeftHatX, i) < -7500 || Xbox.getAnalogHat(LeftHatY, i) > 7500 || Xbox.getAnalogHat(LeftHatY, i) < -7500 || Xbox.getAnalogHat(RightHatX, i) > 7500 || Xbox.getAnalogHat(RightHatX, i) < -7500 || Xbox.getAnalogHat(RightHatY, i) > 7500 || Xbox.getAnalogHat(RightHatY, i) < -7500) { if(Xbox.getAnalogHat(LeftHatX, i) > 7500) { Serial.print(F("LeftHatX: ")); Serial.print(Xbox.getAnalogHat(LeftHatX, i)); Serial.print("\t"); if (Xbox.getAnalogHat(LeftHatX, i) > 26000) turn_right(); else center(); } if (Xbox.getAnalogHat(LeftHatX, i) < -7500) { Serial.print(F("LeftHatX: ")); Serial.print(Xbox.getAnalogHat(LeftHatX, i)); Serial.print("\t"); if (Xbox.getAnalogHat(LeftHatX, i) < -26000) turn_left(); else center(); } if(Xbox.getAnalogHat(LeftHatY, i) > 7500 || Xbox.getAnalogHat(LeftHatY, i) < -7500) { Serial.print(F("LeftHatY: ")); Serial.print(Xbox.getAnalogHat(LeftHatY, i)); Serial.print("\t"); } if(Xbox.getAnalogHat(RightHatX, i) > 7500) { Serial.print(F("RightHatX: ")); Serial.print(Xbox.getAnalogHat(RightHatX, i)); Serial.print("\t"); } if (Xbox.getAnalogHat(RightHatX, i) < -7500) { Serial.print(F("RightHatX: ")); Serial.print(Xbox.getAnalogHat(RightHatX, i)); Serial.print("\t"); } if(Xbox.getAnalogHat(RightHatY, i) > 7500 || Xbox.getAnalogHat(RightHatY, i) < -7500) { Serial.print(F("RightHatY: ")); Serial.print(Xbox.getAnalogHat(RightHatY, i)); } Serial.println(); } if(Xbox.getButtonClick(UP, i)) { Serial.println(F("Up")); } if(Xbox.getButtonClick(DOWN, i)) { Serial.println(F("Down")); } if(Xbox.getButtonClick(LEFT, i)) { Serial.println(F("Left")); } if(Xbox.getButtonClick(RIGHT, i)) { Serial.println(F("Right")); } if(Xbox.getButtonClick(START, i)) { Serial.println(F("Start")); } if(Xbox.getButtonClick(BACK, i)) { Serial.println(F("Back")); } if(Xbox.getButtonClick(L3, i)) Serial.println(F("L3")); if(Xbox.getButtonClick(R3, i)) Serial.println(F("R3")); if(Xbox.getButtonClick(L1, i)) Serial.println(F("L1")); if(Xbox.getButtonClick(R1, i)) Serial.println(F("R1")); if(Xbox.getButtonClick(XBOX, i)) { Xbox.setLedMode(ROTATING, i); Serial.println(F("Xbox")); } if(Xbox.getButtonClick(A, i)) { Serial.println(F("A")); } if(Xbox.getButtonClick(B, i)) { Serial.println(F("B")); digitalWrite(BRAKE, HIGH); brake_on = 1; pulse = 100; if (forward) clockwise(); else counterClockwise(); } if(Xbox.getButtonClick(X, i)) Serial.println(F("X")); if(Xbox.getButtonClick(Y, i)) { Serial.println(F("Y")); motors_stop(); } } } delay(1); } void clockwise() { Serial.print("Rotation is clockwise and speed is "); Serial.println(pulse); analogWrite(motorPinOne,pulse); // set leg 1 of the H-bridge low analogWrite(motorPinTwo,0); if (brake_on) { delay(600); digitalWrite(BRAKE, LOW); brake_on = 0; pulse = 0; } } void counterClockwise() { Serial.print("Rotation is counter-clockwise and speed is "); Serial.println(pulse); analogWrite(motorPinOne,0); // set leg 1 of the H-bridge low analogWrite(motorPinTwo,pulse); if (brake_on) { delay(600); digitalWrite(BRAKE, LOW); brake_on = 0; pulse = 0; } } void turn_left() { digitalWrite(motor2PinOne,HIGH); // set leg 1 of the H-bridge low digitalWrite(motor2PinTwo,LOW); } void turn_right() { digitalWrite(motor2PinOne,LOW); // set leg 1 of the H-bridge low digitalWrite(motor2PinTwo,HIGH); } void motors_stop() { analogWrite(motorPinOne,0); analogWrite(motorPinTwo,0); pulse = 0; } void center() { digitalWrite(motor2PinOne, LOW); digitalWrite(motor2PinTwo, LOW); }
Kode
Cuplikan kode #1 tersedia di bagian bawah halaman asli.
Github: https://github.com/felis/USB_Host_Shield_2.0