废旧遥控车改装:Arduino + USB Host Shield 实现 Xbox 手柄无线控制
所需组件与材料
| Arduino UNO | ×1 |
| Arduino USB Host Shield | ×1 |
| Xbox 360 无线手柄 + 接收器 | ×1 |
| L293D 电机驱动芯片(或 SN754410) | ×2 |
| 7812 / 78S12 稳压器 + 散热片 | 各×1 |
| 拨码开关、电源插头、电池盒(8×1.5V AA) | 各×1 |
项目简介
将一辆老旧遥控怪物卡车的原电子设备拆除,仅保留两个驱动电机。用 Arduino UNO + USB Host Shield 接入 Xbox 360 无线接收器,通过 L293D H 桥驱动电机,实现手柄摇杆控制前进/后退、左右转向,扳机键控制速度,按键实现刹车。项目基于 Kristian Lauszus 的 USB_Host_Shield_2.0 库。
改装步骤
1. 拆车保留电机
拆除原接收板、电池盒、所有线路,仅保留两个直流电机引线。
2. 搭建控制核心
- USB Host Shield 叠装在 Arduino UNO 上。
- 用螺丝将控制板固定在车身原电路板安装孔上。
3. 搭建驱动电路(面包板或万能板)
- 双 L293D 分别驱动左/右电机(或前进/后退 + 转向电机)。
- 78S12(大电流)给电机供电,7812 给逻辑供电,输入端并联 10-12 节 AA 电池(15-18V),确保启动电流充足。
- 所有地线共地。
4. 安装电路到车身
将驱动板固定在车身空处,接好电机引线,插上 Xbox 接收器到 USB Host Shield。
5. 核心代码逻辑
完整代码见下方。关键映射:
- L2 扳机:后退,PWM 幅度对应按压深度
- R2 扳机:前进
- 左摇杆 X 轴:转向(阈值 ±7500,±26000 全打角)
- B 键:急刹车(反向短促 PWM)
- Y 键:停止所有电机
完整 Arduino 代码
#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; // 调整 PWM 频率
Serial.begin(115200);
if (Usb.Init() == -1) {
Serial.println(F("\r\nOSC did not start"));
while(1);
}
Serial.println(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);
motors_stop();
center();
}
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 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);
}
// 电机控制函数:clockwise / counterClockwise / turn_left / turn_right / motors_stop / center
// 详见原文完整代码
库安装
在 Arduino IDE 中安装 USB_Host_Shield_2.0 库(GitHub: felis/USB_Host_Shield_2.0),包含 Xbox 接收器支持。
测试与调试
- 上传代码,打开串口监视器(115200)。
- 开启手柄,观察“Xbox Wireless Receiver Library Started”。
- 操作扳机与摇杆,确认电机响应方向、速度正确。
- 若电机抖动或不转,检查供电是否足够、PWM 引脚是否正确、L293D 接线是否可靠。
扩展建议
- 加装超声波/红外避障模块,实现半自主避障。
- 改用 ESP32 + 蓝牙手柄,省去 USB Host Shield。
- 设计 PCB 替代面包板,提升可靠性。
制造工艺
- 蓝牙控制树莓派机器人:语音反馈功能构建指南
- 手势控制 RGB 台灯 —— 交互式免手操作照明
- 通过树莓派用 Alexa 控制 LED - 简单分步指南
- Arduino Mega 驱动 Wii Nunchuk 控制 6 自由度机械臂
- Arduino Nano + 摇杆控制双步进电机:Visuino 图形化教程
- Arduino Nano 语音控制机器人:蓝牙 + 手机 APP 实现
- 智能停车计数系统:Arduino + Processing + PHP 实时车位追踪上云
- PiBot:Arduino驱动的88键钢琴机器人,精准演奏MIDI乐曲
- Wi-Servo:基于 ESP8266 的 Wi-Fi 网页端舵机远程控制系统
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- 自制 Arduino 遥控保时捷赛车:从改装底盘到手机 App 控制全攻略
- Arduino 电容式触控开关:一枚硬币点亮 LED 的极简 DIY