文章目录
1 灵感来源
- 俄罗斯大神Alex(ZERgyt)在GrabCAD上分享的模拟踏板组设计方案:https://grabcad.com/library/pedals-v2-1
- Youtube博主GP Race Simulation分享的Make your own Load Cell Pedals for Sim Racing系列视频:https://youtu.be/DarnIy6LnNo
2 传感器选型
踏板 | 传感器 | 备注 |
油门、离合 | KY-024线性霍尔模块 | 安装49E线性霍尔传感器 |
刹车 | 70Kg称重传感器 + HX711 AD模块 | HX711需要支持80Hz模式切换 |
Alex大神的原始设计是三个踏板都使用称重传感器(英文翻译为Loadcell),但是参考了用户Orhan Kökbudak设计的霍尔传感器改装套件后,我决定在油门和离合器踏板上采用线性霍尔传感器,只在刹车踏板上采用称重传感器。
2.1 霍尔模块选型
霍尔模块采用KY-024模块,这个在淘宝上就可以轻松买到。在这里分享我遇到的第一个坑:KY-024有安装了不同传感器的两种版本,一种是49E线性霍尔传感器,这个型号可以根据磁感应强度输出较为线性的模拟电压,可以作为踏板传感器。另外一种是3144传感器,仅能根据磁感应强度的阈值输出开关量!!!不能作为踏板传感器使用!!!在采购的时候一定要问清楚探头的型号,千万不要买错成3144的版本(受害者在此)。
2.2 称重传感器和AD模块选型
根据Alex大神的设计,需要采购106*15孔距,孔径M6的称重传感器,在参考了Reddit论坛上关于传感器量程的小调查(Load cell pedals - how heavy have you set yours?)之后发现,大部分用户都使用了60~80kg之间的传感器,所以我买了70kg的。
大部分称重传感器都采用HX711作为AD模块,这里分享我遇到的第二个坑:HX711芯片有10Hz和80Hz两种回报率,可以通过短接/断开J1跳线来切换10Hz/80Hz两种速率,但是我第一次买到的HX711模块没有预留J1跳线(PCB板是绿色的那种),直接是接通的!也就是说锁死了10Hz,远远达不到一个游戏外设的响应要求。所以第二次仔细观察了以后买了一个带J1跳线的版本(PCB一般是红色或者紫色)。
需要注意的是,RATE跳线的两坨锡盘看似是断开的,实际上中间有一根细小的铜丝连接,需要用小刀或者其他的锋利物刮断,然后就能够以80Hz采样率运行了。因为我手上只有一把钝了的镊子,所以刮得乱七八糟的(不要在意)。
2.3 主控制板选择
主控选择了被广泛采用的国产版Arduino Pro Micro,搭载Atmega32U4芯片,我买了type-c接口的5V版本,短短几个月已经从20多块涨到40多块了,肉疼。
3 编程调试
3.1 接线图
按照下面的接线图完成接线,就可以把开发板接入电脑编程调试了。
把所有元件用杜邦线和面包板连接起来,用磁铁靠近霍尔探头,用手掰一掰称重传感器,然后观察DIVIEW上的读数是否变化。挨个测试没问题以后就算调试成功了。
3.2 Arduino调试程序
程序部分调用了HX711和Joystick两个库, HX711 库的功能是驱动HX711模块,Joystick的功能则是将开发板以游戏手柄的方式接入Windows设备。
//调用库来自:https://github.com/bogde/HX711 #include <HX711.h> //调用库来自:https://github.com/MHeironimus/ArduinoJoystickLibrary #include <Joystick.h> /* 定义称重传感器(刹车)相关参数 calibration_factor 称重传感器标定系数 DOUT 数据引脚 CLK 时钟引脚 SCALE_MIN HX711最小输入量 SCALE_MAX HX711最大输入量 B_MIN 刹车踏板下限值 B_MAX 刹车踏板上限值 */ #define calibration_factor 100 #define DOUT 1 #define CLK 0 #define SCALE_MIN 0 #define SCALE_MAX 7000 #define B_MIN 0 #define B_MAX 4096 /* 定义油门(Throttle)参数 T_PIN 模拟电压量输入引脚 T_INPUT_MIN 油门传感器最小模拟量 T_INPUT_MAX 油门传感器最大模拟量 T_MIN 油门踏板下限值 T_MAX 油门踏板上限值 */ #define T_PIN A3 #define T_INPUT_MIN 249 #define T_INPUT_MAX 498 #define T_MIN 0 #define T_MAX 255 /* 定义离合(XAxis)参数 C_PIN 模拟电压量输入引脚 C_INPUT_MIN 离合传感器最小模拟量 C_INPUT_MAX 离合传感器最大模拟量 C_MIN 离合踏板下限值 C_MAX 离合踏板上限值 */ #define C_PIN A2 #define C_INPUT_MIN 265 #define C_INPUT_MAX 539 #define C_MIN 0 #define C_MAX 255 //创建Loadcell类,以阻塞模式启动 HX711 Loadcell; //创建Joystick类,定义外设类型和各轴启用状态 Joystick_ Joystick(0x04, JOYSTICK_TYPE_JOYSTICK, //HID设备ID设置为0x04 | 外设类型设置为Joystick(摇杆) 0, 0, // 0个按钮 | 0个切换开关 true, false, false, // X轴扳机启用 | Y轴扳机禁用 | Z轴扳机禁用 false, false, false, // X轴旋转禁用 | Y轴旋转禁用 | Z轴旋转禁用 false, true, // 脚舵禁用 | 油门启用 false, true, false); // 加速器禁用 | 刹车启用 | 方向盘禁用 //声明各踏板所需的变量 int Brake_ = 0; int Throttle_ = 0; int Clutch_ = 0; void setup() { //初始化Joystick库 Joystick.begin(false); //设置各轴区间 Joystick.setThrottleRange(T_MIN, T_MAX); Joystick.setBrakeRange(B_MIN, B_MAX); Joystick.setXAxisRange(C_MIN, C_MAX); //设置HX711使用的引脚 Loadcell.begin(DOUT, CLK); //载入称重传感器标定数据 Loadcell.set_scale(calibration_factor); Loadcell.tare(); } void loop() { //读取称重传感器数据作为刹车值,若原始变量为负值,则需要使用负号: -Loadcell.get Brake_ = Loadcell.get_units(); Brake_ = map(Brake_, SCALE_MIN, SCALE_MAX, B_MIN, B_MAX); //值映射 Joystick.setBrake(Brake_); //将离合值传入离合摇杆(XAxis) Clutch_ = analogRead(C_PIN); Clutch_ = map(Clutch_, C_INPUT_MIN, C_INPUT_MAX, C_MIN, C_MAX); //值映射 Clutch_ = C_MAX - Clutch_; //霍尔电压值反转,视磁铁布置方式而定 Joystick.setXAxis(Clutch_); //将油门值传入油门摇杆(Throttle) Throttle_ = analogRead(T_PIN); Throttle_ = map(Throttle_, T_INPUT_MIN, T_INPUT_MAX, T_MIN, T_MAX); //值映射 Throttle_ = T_MAX - Throttle_; //霍尔电压值反转,视磁铁布置方式而定 Joystick.setThrottle(Throttle_); //更新状态,设置循环延迟10ms Joystick.sendState(); delay(10); }
以下为同专题其他文章:
其实买踏板买的就是铁,软件和传感器那块好解决,很多开源的,加上chatgpt就好了