Transformez une vieille voiture RC en véhicule piloté au joystick avec Arduino
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Shield USB Host pour Arduino | 1 |
| Manette sans fil Xbox 360 | 1 |
| Récepteur sans fil Xbox 360 | 1 |
| Driver moteur L293D (ou SN754410) | 1 |
| Régulateur 7812 (12 V) | 1 |
| Régulateur 78S12 (12 V, courant élevé) | 1 |
| Interrupteur | 1 |
| Radiateurs pour régulateurs | 1 lot |
| Connecteur d'alimentation (jack) | 1 |
| Connecteur pile 8×AA 1,5 V avec fiche 9 V | 1 |
À propos du projet
1. Récupérez la voiture RC
Trouvez une vieille voiture RC (ici un monster truck). Retirez toute l'électronique d'origine, ne conservez que les fils des deux moteurs (propulsion et direction).

2. Arduino et shield USB Host
Empilez le shield USB Host sur l'Arduino UNO.

3. Fixez l'Arduino sur la voiture
Vissez l'ensemble sur le châssis, en réutilisant les trous de l'ancien circuit.

4. Réalisez le circuit de puissance
Sur plaque d'essai (ou circuit imprimé) : deux drivers L293D (un par moteur) et deux régulateurs de tension. Les régulateurs limitent la tension des piles. Utilisez 10 à 12 piles AA 1,5 V (15–18 V) pour une bonne autonomie. Le moteur demande ~2 A au démarrage, d'où le 78S12 (courant élevé) pour l'alimentation moteur. Voir le schéma ci-dessous.

5. Installez le circuit et le récepteur
Placez le circuit sur le châssis, reliez les sorties aux deux moteurs. Branchez le récepteur Xbox 360 sur le shield USB Host.

6. Le code
Basé sur la bibliothèque USB Host Shield Library 2.0 de Kristian Lauszus (GitHub). Le sketch gère jusqu'à 4 manettes sans fil.
Contrôles :
- Gâchette L2 : marche arrière (vitesse proportionnelle)
- Gâchette R2 : marche avant (vitesse proportionnelle)
- Joystick gauche (X) : direction (gauche/droite)
- Bouton B : frein d'urgence (impulsion inverse)
- Bouton Y : arrêt complet
- Bouton Xbox : animation LED de la manette
/* Sketch pour récepteur Xbox Wireless - Kristian Lauszus */
#include <XBOXRECV.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
USB Usb;
XBOXRECV Xbox(&Usb);
#define motorPinOne 5 // PWM
#define motorPinTwo 6 // PWM
#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; // Fréquence PWM ~3,9 kHz
Serial.begin(115200);
if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start"));
while(1); // halt
}
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++) {
// Gâchettes analogiques
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();
}
// Joystick gauche -> direction
if (abs(Xbox.getAnalogHat(LeftHatX, i)) > 7500) {
if (Xbox.getAnalogHat(LeftHatX, i) > 26000) turn_right();
else if (Xbox.getAnalogHat(LeftHatX, i) < -26000) turn_left();
else center();
}
// Boutons
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();
// ... autres boutons (START, BACK, A, X, etc.) pour debug
}
}
delay(1);
}
void clockwise() { // marche avant
analogWrite(motorPinOne, pulse);
analogWrite(motorPinTwo, 0);
if (brake_on) { delay(600); digitalWrite(BRAKE, LOW); brake_on = 0; pulse = 0; }
}
void counterClockwise() { // marche arrière
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); }
Ressources
- Bibliothèque USB Host Shield 2.0 : GitHub
Processus de fabrication
- Construire un robot Raspberry Pi piloté par Bluetooth avec retour audio
- Lampe de table RGB à commande gestuelle – Éclairage interactif, mains libres
- Contrôler des LED avec Alexa via Raspberry Pi – Guide Pas à Pas
- Bras robotique 6 DoF piloté par Nunchuk Wii – Kit Arduino Mega
- Contrôler 2 moteurs pas-à-pas avec Arduino Nano et joystick – Tutoriel Visuino
- Robot commandé par la voix avec Arduino Nano et Bluetooth
- Compteur de stationnement intelligent : Suivi véhicule en temps réel avec Arduino, Processing et PHP
- PiBot : Robot pianiste Arduino pour performance musicale de précision
- Wi-Servo : Contrôlez des servomoteurs via Wi-Fi depuis un navigateur Web