Transforme um Carro RC Antigo em Veículo Controlado por Joystick com Arduino
Componentes e Materiais
| Arduino UNO | × | 1 |
| Shield USB Host para Arduino | × | 1 |
| Controle Sem Fio Xbox 360 | × | 1 |
| Receptor Sem Fio Xbox 360 | × | 1 |
| Driver de Motor L293D (ou SN754410) | × | 1 |
| Regulador 7812 | × | 1 |
| Regulador 78S12 (5A) | × | 1 |
| Chave Liga/Desliga | × | 1 |
| Dissipadores de calor | × | 1 |
| Plug de alimentação (jack barril) | × | 1 |
| Conector de bateria para 8 pilhas AA 1,5V com plug 9V | × | 1 |
Sobre o Projeto
1. Consiga o Carro!
Encontre um carro RC antigo. Usei um monster truck. Remova toda a eletrônica original, mantendo apenas os fios dos dois motores.

2. Arduino e Shield
Encaixe o Shield USB Host sobre o Arduino UNO.

3. Fixando o Arduino no Carro
Parafuse o conjunto (Arduino + shield) na carroceria, reaproveitando furos da placa original.

4. Montando o Circuito
Montei em protoboard, mas pode ser em placa perfurada. O circuito usa dois drivers L293D (ou SN754410) e dois reguladores de tensão. Os reguladores limitam a tensão das pilhas. Sugiro 10–12 pilhas AA 1,5V (15–18V) para maior autonomia. Como os motores exigem alta corrente na partida (~2A), use o regulador 78S12 (5A) para a etapa de potência.
Para entender o funcionamento do driver L293D, veja datasheet.

5. Instalando o Circuito no Carro
Encontre espaço para a protoboard, conecte os motores e plugue o receptor Xbox no shield USB Host.

6. O Código
Baseado nos exemplos da USB Host Library 2.0 de Kristian Lauszus (GitHub).
Sketch Principal
/* Exemplo para biblioteca Xbox Wireless Receiver - Kristian Lauszus
Suporta até 4 controles sem fio
Mais info: https://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/ */
#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; // Ajusta frequência PWM pinos 5/6
Serial.begin(115200);
if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start"));
while(1); // travar
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++) {
// Gatilhos L2/R2 controlam velocidade e direção (frente/trás)
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();
}
// Analógico esquerdo controla direção (esquerda/direita)
if (abs(Xbox.getAnalogHat(LeftHatX, i)) > 7500 || abs(Xbox.getAnalogHat(LeftHatY, i)) > 7500 ||
abs(Xbox.getAnalogHat(RightHatX, i)) > 7500 || abs(Xbox.getAnalogHat(RightHatY, i)) > 7500) {
if (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();
}
}
// Botão B = freio de emergência (ré curta)
if (Xbox.getButtonClick(B, i)) {
digitalWrite(BRAKE, HIGH);
brake_on = 1;
pulse = 100;
if (forward) clockwise(); else counterClockwise();
}
// Botão Y = parar motores
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); }
Código
O código completo está no repositório da biblioteca: github.com/felis/USB_Host_Shield_2.0
Processo de manufatura
- Construa um Robô Raspberry Pi Controlado por Bluetooth com Feedback de Áudio
- Lâmpada de Mesa RGB Controlada por Gestos – Iluminação Interativa e Sem Toque
- Controlar LEDs com Alexa via Raspberry Pi – Guia Passo a Passo Fácil
- Braço Robótico 6 GDL Controlado por Nunchuk com Arduino Mega
- Controle Dois Motores de Passo com Arduino Nano e Joystick – Tutorial Simples
- Construa um Robô Controlado por Voz com Arduino Nano
- Contador Inteligente de Vagas: Rastreamento de Veículos em Tempo Real com Arduino, Processing e PHP
- PiBot: Robô Pianista Arduino para Performance Musical de Precisão
- Wi-Servo: Controle Servomotores via Wi-Fi pelo Navegador
- Volante Joystick Arduino Personalizado para Jogos