Een oude RC-auto ombouwen tot joystick-gestuurd voertuig met Arduino
Onderdelen en benodigdheden
| Arduino UNO | 1 |
| Arduino USB Host Shield | 1 |
| XBOX360 Draadloze Controller | 1 |
| XBOX360 Ontvanger (USB) | 1 |
| L293D motordriver (of SN754410) | 2 |
| 7812 spanningsregelaar | 1 |
| 78S12 spanningsregelaar (hogere stroom) | 1 |
| Schakelaar | 1 |
| Koelplaten (heatsinks) | 1 set |
| Voedingconnector (Power Plug) | 1 |
| Batterijconnector voor 8x 1.5V AA-batterijen met 9V-batterijplug | 1 |
Over dit project
Stap 1: De auto nemen
Je hebt een oude RC-auto nodig. Ik vond een monster truck – ideaal! Verwijder alle elektronica behalve de kabels naar de twee motoren.
Stap 2: Arduino en de Shield
Neem een Arduino UNO en plug de USB Host Shield erop.
Stap 3: Arduino aan de auto bevestigen
Plug de shield op de Arduino UNO en schroef het geheel vast aan de auto. Ik gebruikte een van de gaten van de oude printplaat.
Stap 4: Het circuit maken
Ik bouwde het op een breadboard, maar een printplaat (perfboard) is ook prima. Het circuit bestaat uit twee motordrivers (L293D of SN754410) en twee spanningsstabilisators. De stabilisators beperken de spanning van de batterijen. Ik raad 10-12 AA 1.5V-batterijen aan (15-18V) voor langere speeltijd. Omdat de motoren veel stroom trekken (~2A om vanaf stilstand te starten), is een krachtige regelaar als de 78S12 nodig.
Meer info over de werking van de driver: TI L293D datasheet.
Stap 5: Het circuit aan de auto bevestigen
Zoek een lege plek op de RC-auto voor het circuit. Mijn monster truck had veel ruimte. Zodra gepositioneerd, verbind het circuit met de twee motoren. Plug de draadloze ontvanger in de USB Host Shield.
Stap 6: De Code
De code is gebaseerd op de voorbeelden van de USB Host Library 2.0 van Kristian Lauszus (GitHub).
Arduino-sketch (Xbox Wireless Receiver)
/* Voorbeeldsketch voor Xbox Wireless Receiver library - ontwikkeld door Kristian Lauszus
Ondersteunt tot vier controllers draadloos
Meer info: https://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/
E-mail: kristianl@tkjelectronics.com */
#include
#ifdef dobogusinclude
#include
#endif
USB Usb;
XBOXRECV Xbox(&Usb);
#define motorPinOne 5 // PWM-pin
#define motorPinTwo 6 // PWM-pin
#define motor2PinOne 4
#define motor2PinTwo 7
#define BRAKE 2
int pulse = 0;
int forward = 0;
int brake_on = 0;
void setup() {
TCCR1B = TCCR1B & 0b11111000 | 0x02; // PWM-frequentie aanpassen
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++) {
// L2 trigger = achteruit
if (Xbox.getButtonPress(L2, i)) {
Serial.print("L2: "); Serial.print(Xbox.getButtonPress(L2, i));
pulse = Xbox.getButtonPress(L2, i);
forward = 0;
clockwise();
}
// R2 trigger = vooruit
if (Xbox.getButtonPress(R2, i)) {
Serial.print("R2: "); Serial.println(Xbox.getButtonPress(R2, i));
pulse = Xbox.getButtonPress(R2, i);
forward = 1;
counterClockwise();
}
// Linker joystick = sturen
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();
}
// Knoppen (optioneel voor debugging)
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"));
// B-knop = rem
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"));
// Y-knop = stop motoren
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);
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);
analogWrite(motorPinTwo, pulse);
if (brake_on) { delay(600); digitalWrite(BRAKE, LOW); brake_on = 0; pulse = 0; }
}
void turn_left() {
digitalWrite(motor2PinOne, HIGH);
digitalWrite(motor2PinTwo, LOW);
}
void turn_right() {
digitalWrite(motor2PinOne, LOW);
digitalWrite(motor2PinTwo, HIGH);
}
void motors_stop() {
analogWrite(motorPinOne, 0);
analogWrite(motorPinTwo, 0);
pulse = 0;
}
void center() {
digitalWrite(motor2PinOne, LOW);
digitalWrite(motor2PinTwo, LOW);
}
Code
De volledige code staat ook op GitHub: USB_Host_Shield_2.0
Productieproces
- Bouw een Bluetooth-gecontroleerde Raspberry Pi Robot met Audio Feedback
- Gebarenbestuurde RGB-tafellamp – Interactief, Handvrij Verlichten
- LED's bedienen met Alexa via Raspberry Pi – Eenvoudige stapsgewijze handleiding
- Arduino-gebaseerde 6-DoF Robotarm Gestoeerd met Wii Nunchuk
- Twee Stappenmotors Sturen met Arduino Nano & Joystick – Simpele Tutorial
- Bouw een Stemgecontroleerde Robot met Arduino Nano
- Slimme Parkeer Teller: Real-time Voertuigvolging met Arduino, Processing en PHP
- PiBot: De Arduino-aangedreven pianorobot voor precisiemuziek
- Wi-Servo: Servomotoren Besturen via Wi-Fi met een Webbrowser
- Bouw een Aangepaste Arduino Joystick Stuurwiel voor Gaming
- Bouw je eigen RC Porsche-auto met Arduino: Stap-voor-stap handleiding