Превращаем старую радиоуправляемую машину в джойстик-контролируемый болид на Arduino
Компоненты и материалы
- Arduino UNO — 1 шт.
- USB Host Shield для Arduino — 1 шт.
- Беспроводной контроллер Xbox 360 — 1 шт.
- USB-приёмник Xbox 360 — 1 шт.
- Драйвер двигателей L293D (или SN754410) — 1 шт. (для двух двигателей нужно два драйвера)
- Стабилизатор 7812 (12В) — 1 шт.
- Стабилизатор 78S12 (12В, высокий ток) — 1 шт.
- Выключатель — 1 шт.
- Радиаторы для стабилизаторов — 1 комплект
- Розетка питания (для внешнего блока) — 1 шт.
- Комплект батарей: 8–12 элементов AA (1.5В) с разъёмом 9В — 1 шт.
Описание проекта
1. Берём машину
Нужна старая радиоуправляемая машина (автор нашёл монстр-трак). Удалите всю родную электронику, оставив только провода к двум моторам (привод и рулевое управление).

2. Arduino и Shield
Установите USB Host Shield на Arduino UNO.

3. Крепление Arduino на машину
Закрепите сборку на шасси (используйте существующие отверстия).

4. Сборка схемы
Схема на макетной плате (или монтажной): два драйвера L293D для двух моторов, два стабилизатора (7812 и 78S12) для питания логики и моторов от батарей 15–18В (10–12 элементов AA). Стабилизатор 78S12 выдаёт до 2А — нужен для пускового тока моторов. Подробнее о работе L293D в даташите.

5. Установка схемы на машину
Разместите плату на шасси, подключите к моторам. Вставьте USB-приёмник Xbox в USB Host Shield.

6. Программирование
Код основан на библиотеке USB Host Shield 2.0 (автор Kristian Lauszus). Управление:
- Левый триггер (L2) — назад, правый (R2) — вперёд (PWM пропорционально нажатию).
- Левый стик (LeftHatX) — поворот: влево/вправо при отклонении > 7500, резкий поворот > 26000.
- Кнопка B — аварийное торможение (короткий импульс назад).
- Кнопка Y — полная остановка.
- Кнопка Xbox — вращающаяся индикация LED на геймпаде.
Пины: мотор 1 (перед/зад) — PWM 5 и 6; мотор 2 (руль) — 4 и 7; тормоз — пин 2.
Код (основной скетч)
#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; // PWM frequency
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 (abs(Xbox.getAnalogHat(LeftHatX, i)) > 7500) {
if (Xbox.getAnalogHat(LeftHatX, i) > 26000) turn_right(); else center();
}
if (abs(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); }
Полезные ссылки
Производственный процесс
- Создание Bluetooth-робота на Raspberry Pi с аудио-обратной связью
- Настольная RGB-лампа с управлением жестами – Интерактивное беспроводное освещение
- Управление светодиодами через Alexa с помощью Raspberry Pi – простое пошаговое руководство
- Роботизированная рука 6 степеней свободы на Arduino Mega с управлением через Nunchuk
- Управление двумя шаговыми двигателями через джойстик на Arduino Nano — простой урок (Visuino)
- Голосовой робот на Arduino Nano: Управление речью через Bluetooth
- Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)
- PiBot: Робот-пианист на Arduino для точного исполнения музыки
- Wi-Servo: управление сервоприводами по Wi-Fi через веб-браузер
- Своё рулевое управление (джойстик) для игр на Arduino