DIY二自由度竞速模拟器:Arduino Nano驱动SG90微型舵机
核心硬件
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino Nano R3 | 1 | 紧凑型主控,串口接收SimTools数据 |
| SG90微型舵机 | 2 | 分别驱动俯仰(Pitch)与滚转(Roll)轴 |
辅助工具与软件
- 电烙铁:焊接排针/连接线
- Arduino IDE:固件烧录
- SimTools:通用运动模拟器软件(下载),支持多种硬件接口含Arduino
- Live for Speed:赛车模拟游戏(免费试玩版),SimTools演示模式下插件全功能可用
项目原理
SimTools从游戏读取遥测数据(加速度、G力、车辆姿态等),通过串口协议发送给Arduino。Arduino解析协议,将数值映射为舵机角度(0-179°),驱动两个SG90舵机移动微型模拟平台。这是微缩版双轴动感平台;实战级需替换为大扭矩舵机/电机+驱动器+增力机械结构。
详细构建教程、机械图纸、调参技巧见社区:xsimulator.net
SimTools用户手册:PDF下载
固件代码(C++)
//********************************************************************************************
// RC模型舵机驱动 - 适配SimTools运动模拟软件
// Original by EAOROBBIE, Modified by aarondc
//********************************************************************************************
#include
// #define DEBUG 1 // 取消注释启用串口调试输出
const int ACTUATOR_COUNT = 2; // 双轴
const char ACTUATOR_NAME[ACTUATOR_COUNT] = { 'R', 'L' }; // SimTools发送的通道标识符
const int PINS[ACTUATOR_COUNT] = { 4, 5 }; // 舵机信号线引脚
// 映射范围:SimTools发送0-255 -> 舵机0-179°,左右轴方向相反
const int SCALE[ACTUATOR_COUNT][2] = { { 0, 179 }, { 179, 0 } };
const char EOL = '~'; // 数据包结束符
const int MAX_CHARS = 3; // 最大位数(255)
Servo actuators[ACTUATOR_COUNT];
int actuatorPos[ACTUATOR_COUNT] = { 90, 90 };
int currentActuator = 0, valueCharCount = 0;
enum PortState { PS_READ_ACTUATOR, PS_READ_VALUE };
PortState state = PS_READ_ACTUATOR;
void setup() {
for (int i=0; i 9) val = 0;
actuatorPos[currentActuator] = actuatorPos[currentActuator] * 10 + val;
valueCharCount++;
} else break;
}
if (val == EOL || valueCharCount == MAX_CHARS) {
#ifdef DEBUG Serial.print("Raw value: "); Serial.println(actuatorPos[currentActuator]); #endif
// 映射 0-255 -> 对应轴的舵机范围
actuatorPos[currentActuator] = map(actuatorPos[currentActuator], 0, 255,
SCALE[currentActuator][0], SCALE[currentActuator][1]);
#ifdef DEBUG Serial.print("Mapped angle: "); Serial.println(actuatorPos[currentActuator]); #endif
updateActuator(currentActuator);
state = PS_READ_ACTUATOR;
}
}
}
}
void updateActuator(int idx) { actuators[idx].write(actuatorPos[idx]); }
接线原理图
进阶建议
- 舵机抖动/噪音大:检查供电是否充足,加大电解电容滤波,调整代码中
delay或使用数字舵机(300Hz vs 50Hz) - 扩展自由度:增加舵机数量,修改
ACTUATOR_COUNT与ACTUATOR_NAME数组 - 实战级升级:替换为大扭矩无刷电机+驱动器+滚珠丝杠/连杆机构,参考xsimulator社区成熟方案
制造工艺
- 树莓派 DIY 红外运动传感器:从原理到代码的完整指南
- 自制LUMAZOID:基于Arduino的音乐可视化灯光控制器
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- DIY VR 滑板:用 Arduino、Google Cardboard 与蓝牙打造虚拟滑雪体验
- 基于 Arduino Nano 的智能运动感应水枪
- DIY Arduino 电子波疗设备 - 基于拉德尼克疗法的 EMR 治疗仪
- 使用 Arduino 制作便携式 RFID 门锁——分步指南
- DIY三轴CNC立式加工中心:打造精密铣床
- Arduino Nano + GY-906 非接触红外测温枪制作指南
- DIY 飞行模拟器方向舵脚踏板:分步制作指南
- DIY Arduino 身高测量仪:超声波非接触测高,精准易制
- Arduino Nano 自制 1MHz 方波发生器:简易 PWM 电路