Altes RC-Auto per Xbox-Controller & Arduino zum Joystick-Fahrzeug umbauen
Benötigte Komponenten
- Arduino UNO (1×)
- Arduino USB Host Shield (1×)
- Xbox 360 Wireless Controller (1×)
- Xbox 360 Wireless Receiver (1×)
- L293D Motortreiber (1×)
- Spannungsregler 7812 (1×)
- Spannungsregler 78S12 (1×)
- Schalter (1×)
- Kühlkörper (1×)
- Netzstecker (1×)
- Batteriehalter für 8× 1,5V AA mit 9V-Batterieclip (1×)
Projektbeschreibung
Ein altes RC-Auto (hier ein Monstertruck) wird zur ferngesteuerten Plattform mit Xbox-360-Controller. Die originale Elektronik wird entfernt, nur die Motorkabel bleiben. Ein Arduino UNO mit USB Host Shield empfängt die Signale des Xbox-Receivers. Zwei L293D-Treiber (oder SN754410) steuern die beiden Motoren (Fahrt & Lenkung). Spannungsregler (7812/78S12) erzeugen stabile 12V aus 10–12 AA-Batterien (15–18V Eingang).
Schritt 1: Auto vorbereiten
Alte Elektronik ausbauen, Motorkabel belassen.
Schritt 2: Arduino & Shield montieren
USB Host Shield auf Arduino UNO stecken, beides im Auto befestigen (z. B. vorhandene Bohrungen nutzen).
Schritt 3: Schaltung aufbauen
Auf Steckbrett oder Lochrasterplatine: Zwei H-Brücken (L293D) für die zwei Motoren, zwei Spannungsregler (7812 für Logik, 78S12 für Motoren – hoher Strombedarf beim Anfahren ~2A). Kühlkörper nicht vergessen. Schaltplan siehe Bild.
Schritt 4: Schaltung im Auto verbauen
Platz finden, Motoren anschließen, Xbox-Receiver in USB Host Shield stecken.
Schritt 5: Programmierung
Der Code basiert auf der USB Host Shield Library 2.0 (Beispiel für Xbox Wireless Receiver).
- L2/L3 (Linke/Rechte Schultertaste) → Vorwärts/Rückwärts (PWM-gesteuert)
- Linker Analog-Stick (X-Achse) → Lenkung (links/rechts)
- Taste B → Bremse (kurzer Rückwärtsimpuls)
- Taste Y → Stopp
- Weitere Tasten geben Debug-Infos auf Serial Monitor.
Wichtige Pin-Belegung:
Motor 1 (Fahrt): PWM Pins 5 & 6 Motor 2 (Lenkung): Pins 4 & 7 Brems-LED: Pin 2
Der Sketch initialisiert USB, prüft Controller-Verbindung, liest Tasten/Sticks aus und steuert die H-Brücken per analogWrite (Fahrt) bzw. digitalWrite (Lenkung).
Code
Vollständiger Sketch im Repository (Link oben) und unten als Kopie.
/* Example sketch for the Xbox Wireless Receiver library ... */
#include <XBOXRECV.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
USB Usb;
XBOXRECV Xbox(&Usb);
#define motorPinOne 5
#define motorPinTwo 6
#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;
Serial.begin(115200);
if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start"));
while(1);
}
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)) { pulse = Xbox.getButtonPress(L2, i); forward = 0; clockwise(); }
if(Xbox.getButtonPress(R2, i)) { pulse = Xbox.getButtonPress(R2, i); forward = 1; counterClockwise(); }
if(Xbox.getAnalogHat(LeftHatX, i) > 7500 || Xbox.getAnalogHat(LeftHatX, i) < -7500) {
if(Xbox.getAnalogHat(LeftHatX, i) > 26000) turn_right(); else center();
}
if(Xbox.getAnalogHat(LeftHatX, i) < -7500) {
if(Xbox.getAnalogHat(LeftHatX, i) < -26000) turn_left(); else center();
}
if(Xbox.getButtonClick(B, i)) { digitalWrite(BRAKE, HIGH); brake_on = 1; pulse = 100; if (forward) clockwise(); else counterClockwise(); }
if(Xbox.getButtonClick(Y, i)) { motors_stop(); }
}
}
delay(1);
}
void clockwise() { analogWrite(motorPinOne,pulse); analogWrite(motorPinTwo,0); if(brake_on){delay(600);digitalWrite(BRAKE,LOW);brake_on=0;pulse=0;} }
void counterClockwise() { 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); }
Herstellungsprozess
- Bluetooth-gesteuerter Raspberry Pi Roboter mit Audio-Feedback bauen
- Gesteuerter RGB-Tischlampe – Interaktive, berührungslose Beleuchtung
- LEDs mit Alexa über Raspberry Pi steuern – Einfache Schritt-für-Schritt-Anleitung
- Arduino-basierter 6-DoF Roboterarm mit Nunchuk-Steuerung
- Zwei Schrittmotoren mit Arduino Nano & Joystick steuern – Einfaches Tutorial
- Sprachgesteuerter Roboter mit Arduino Nano bauen
- Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP
- PiBot: Arduino-gesteuerter Klavierroboter für präzise Musikwiedergabe
- Wi-Servo: Servomotoren per WLAN über Webbrowser steuern
- DIY Arduino Lenkrad / Joystick für Rennspiele – USB-HID-Umbau