Arduino 4WD RC-Auto: Komplette Teileliste & Bauanleitung
Komponenten und Materialien
| Komponente | Anzahl |
|---|---|
| Arduino UNO | 2 |
| nRF24L01+ Transceiver (RP-SMA, mit Antenne) | 2 |
| Funduino Joystick Shield V1.A | 1 |
| L298N Dual H-Bridge Motortreiber | 2 |
| 4WD Smart Robot Car Chassis Kit | 1 |
| LED (Standard) | 3 |
| Widerstand 220 Ω | 2 |
| Steckbrett (Breadboard) | 2 |
| 18650 Li-Ion-Akkus | 2 |
| Powerbank | 1 |
| Jumper-Kabel (Sortiment) | 1 |
Benötigte Werkzeuge und Maschinen
- Lötkolben (Standard)
Apps und Online-Dienste
- Arduino IDE
Projektbeschreibung
Die Idee
Hallo zusammen! Dies ist mein nächstes Projekt: Ein Arduino 4WD RC-Auto mit Joystick-Controller. Es zeigt, wie einfach sich ein 4WD-Smart-Car mit einem analogen Joystick steuern lässt.
Als Funkstrecke dient das nRF24L01-Modul mit einer Reichweite von bis zu 1 km im Freifeld. Der Aufbau ist sehr einfach und gut nachvollziehbar.
1. Joystick-Controller (Sender)
Der Joystick-Shield wird auf den Arduino aufgesteckt und macht daraus einen einfachen Controller. Er bietet:
- 7 Taster (4 große, 2 kleine, 1 Joystick-Drucktaster)
- Zweiachsen-Daumen-Joystick (X/Y: 0–1023)
- Schnittstellen für nRF24L01, Nokia 5110 LCD, Bluetooth, I²C
- Kompatibel mit Arduino, Betriebsspannung 3,5 V oder 5 V


Verwendetes Funkmodul: BTE16-49 – nRF24L01+ mit RFX2401C, PA+LNA, Antennenschirmung, 2,4 GHz, 20 dBm, 1000 m Reichweite.
- 2,4 GHz ISM-Band (lizenzfrei)
- Bis 2 Mbit/s, GFSK-Modulation
- 125 Kanäle, Frequenzsprungverfahren
- Hardware-CRC, Punkt-zu-Multipunkt
- Betriebsspannung 3,0–3,6 V, 20 dBm Sendeleistung
- Externe 2,4 GHz Antenne
- 2,54 mm Rastermaß, kompatibel zu Standard-Modulen



2. Controller-Belegung & Test
Der Shield hat 4 große + 2 kleine Tasten + Joystick-Taste und einen 2-Achsen-Joystick (X: 0–1023, Y: 0–1023). In meinem Sketch:
- Taste Oben → Hupe (Buzzer)
- Taste Rechts → Frontlicht (LED + 220 Ω)
- Taste Links → Rücklicht (LEDs + 220 Ω)
- Andere Tasten: nicht belegt
Joystick-Testwerte (Ruheposition): X=499, Y=502, alle Tasten HIGH (Pull-Up).



3. Arduino 4WD RC-Auto (Empfänger)
Aufbau des Fahrgestells mit zwei L298N-Treibern für vier Motoren.










Verkabelung gemäß Schaltplan. Wichtig: Vor dem Hochladen des Codes die Jumper-Kabel von den Arduino-Pins 0 und 1 (RX/TX) abziehen!
Nach dem Einschalten von Auto und Controller steuert der Joystick das Fahrzeug: Vorwärts/Rückwärts über Y-Achse, Links/Rechts über X-Achse.
Code
Car_nRF24.ino – Empfänger (Fahrzeug)
/* JoyStick Empfänger-Code - VERBINDUNGEN nRF24L01:
1 - GND
2 - VCC 3.3V !!! NICHT 5V
3 - CE → Arduino Pin 6
4 - CSN → Arduino Pin 8
5 - SCK → Arduino Pin 13
6 - MOSI → Arduino Pin 11
7 - MISO → Arduino Pin 12
8 - UNUSED
*/
#include
#include
#include
#define CE_PIN 6
#define CSN_PIN 8
const uint64_t pipe = 0xE8E8F0F0E1LL;
#define light_Front 18 // A4
#define light_Back 19 // A5
#define horn_Buzz 7
#define ENA_m1 3 // Motor vorne rechts PWM
#define ENB_m1 5 // Motor hinten rechts PWM
#define ENA_m2 9 // Motor vorne links PWM
#define ENB_m2 10 // Motor hinten links PWM
#define IN_11 0 // L298N #1 IN1
#define IN_12 1 // L298N #1 IN2
#define IN_13 2 // L298N #1 IN3
#define IN_14 4 // L298N #1 IN4
#define IN_21 14 // L298N #2 IN1 (A0)
#define IN_22 15 // L298N #2 IN2 (A1)
#define IN_23 16 // L298N #2 IN3 (A2)
#define IN_24 17 // L298N #2 IN4 (A3)
RF24 radio(CE_PIN, CSN_PIN);
int joystick[6];
int speedRight = 0, speedLeft = 0;
int xAxis, yAxis;
int buttonUp, buttonRight, buttonDown, buttonLeft;
void setup() {
pinMode(light_Front, OUTPUT);
pinMode(light_Back, OUTPUT);
pinMode(horn_Buzz, OUTPUT);
pinMode(ENA_m1, OUTPUT); pinMode(ENB_m1, OUTPUT);
pinMode(ENA_m2, OUTPUT); pinMode(ENB_m2, OUTPUT);
pinMode(IN_11, OUTPUT); pinMode(IN_12, OUTPUT);
pinMode(IN_13, OUTPUT); pinMode(IN_14, OUTPUT);
pinMode(IN_21, OUTPUT); pinMode(IN_22, OUTPUT);
pinMode(IN_23, OUTPUT); pinMode(IN_24, OUTPUT);
radio.begin();
radio.openReadingPipe(1, pipe);
radio.startListening();
}
void loop() {
if (radio.available()) {
radio.read(joystick, sizeof(joystick));
xAxis = joystick[0];
yAxis = joystick[1];
buttonUp = joystick[2];
buttonRight = joystick[3];
buttonDown = joystick[4];
buttonLeft = joystick[5];
// Tasten: Hupe, Frontlicht, Rücklicht (LOW-aktiv durch Pull-Up)
digitalWrite(horn_Buzz, buttonUp == HIGH ? LOW : HIGH);
digitalWrite(light_Front, buttonRight == HIGH ? LOW : HIGH);
digitalWrite(light_Back, buttonLeft == HIGH ? LOW : HIGH);
// Y-Achse: Vorwärts / Rückwärts
if (yAxis < 470) { // Rückwärts
digitalWrite(IN_11, LOW); digitalWrite(IN_12, HIGH);
digitalWrite(IN_13, HIGH); digitalWrite(IN_14, LOW);
digitalWrite(IN_21, HIGH); digitalWrite(IN_22, LOW);
digitalWrite(IN_23, LOW); digitalWrite(IN_24, HIGH);
speedRight = map(yAxis, 470, 0, 0, 255);
speedLeft = map(yAxis, 470, 0, 0, 255);
} else if (yAxis > 550) { // Vorwärts
digitalWrite(IN_11, HIGH); digitalWrite(IN_12, LOW);
digitalWrite(IN_13, LOW); digitalWrite(IN_14, HIGH);
digitalWrite(IN_21, LOW); digitalWrite(IN_22, HIGH);
digitalWrite(IN_23, HIGH); digitalWrite(IN_24, LOW);
speedRight = map(yAxis, 550, 1023, 0, 255);
speedLeft = map(yAxis, 550, 1023, 0, 255);
} else { // Totzone
speedRight = 0; speedLeft = 0;
}
// X-Achse: Lenkung (Differenzial)
if (xAxis < 470) { // Links
int xMapped = map(xAxis, 470, 0, 0, 255);
speedLeft -= xMapped; speedRight += xMapped;
speedLeft = max(speedLeft, 0); speedRight = min(speedRight, 255);
}
if (xAxis > 550) { // Rechts
int xMapped = map(xAxis, 550, 1023, 0, 255);
speedLeft += xMapped; speedRight -= xMapped;
speedLeft = min(speedLeft, 255); speedRight = max(speedRight, 0);
}
// Minimalgeschwindigkeit gegen Brummen (an Motoren anpassen)
if (speedLeft < 70) speedLeft = 0;
if (speedRight < 70) speedRight = 0;
analogWrite(ENA_m1, speedRight);
analogWrite(ENB_m1, speedRight);
analogWrite(ENA_m2, speedLeft);
analogWrite(ENB_m2, speedLeft);
}
}
Joystick_nRF24.ino – Sender (Controller)
/* JoyStick Sender-Code - VERBINDUNGEN nRF24L01:
1 - GND
2 - VCC 3.3V !!! NICHT 5V
3 - CE → Arduino Pin 9
4 - CSN → Arduino Pin 10
5 - SCK → Arduino Pin 13
6 - MOSI → Arduino Pin 11
7 - MISO → Arduino Pin 12
8 - UNUSED
Tasten: Up=2, Right=3, Down=4, Left=5 (INPUT_PULLUP)
Joystick: X → A0, Y → A1
*/
#include
#include
#include
#define CE_PIN 9
#define CSN_PIN 10
#define xAxis A0
#define yAxis A1
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int joystick[6];
int buttonUp = 2, buttonRight = 3, buttonDown = 4, buttonLeft = 5;
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
radio.stopListening();
pinMode(buttonUp, INPUT_PULLUP);
pinMode(buttonRight, INPUT_PULLUP);
pinMode(buttonDown, INPUT_PULLUP);
pinMode(buttonLeft, INPUT_PULLUP);
}
void loop() {
joystick[0] = analogRead(xAxis);
joystick[1] = analogRead(yAxis);
joystick[2] = digitalRead(buttonUp);
joystick[3] = digitalRead(buttonRight);
joystick[4] = digitalRead(buttonDown);
joystick[5] = digitalRead(buttonLeft);
radio.write(joystick, sizeof(joystick));
delay(20);
// Debug-Ausgabe
Serial.print("X = "); Serial.print(analogRead(xAxis));
Serial.print(" Y = "); Serial.print(analogRead(yAxis));
Serial.print(" Up = "); Serial.print(digitalRead(buttonUp));
Serial.print(" Right = "); Serial.print(digitalRead(buttonRight));
Serial.print(" Down = "); Serial.print(digitalRead(buttonDown));
Serial.print(" Left = "); Serial.println(digitalRead(buttonLeft));
}
Schaltpläne
rc_car_tp3A7JlpYw.fzz (Fritzing-Datei)
Herstellungsprozess
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- DIY Arduino USB Gaming Controller – Bauen Sie Ihren eigenen High-Performance Gamepad
- Altes RC-Auto per Xbox-Controller & Arduino zum Joystick-Fahrzeug umbauen
- Arduino Iron Man bauen: Komponenten, Sensoren & Schritt-für-Schritt-Anleitung
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- Funktionaler 3D-gedruckter Roboterarm mit Arduino – Schritt-für-Schritt-Anleitung
- DIY Arduino Luftbefeuchter-Steuerung mit Relais – Sichere Hochspannungs-Installation
- Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP
- NeoPixel-Matrix Pong auf Arduino Nano: Neon-Pong selbst bauen
- DIY Arduino Lenkrad / Joystick für Rennspiele – USB-HID-Umbau