DIY赛车模拟器踏板记录(一):控制板和传感器测试

1 灵感来源

  1. 俄罗斯大神Alex(ZERgyt)在GrabCAD上分享的模拟踏板组设计方案:https://grabcad.com/library/pedals-v2-1
  2. Youtube博主GP Race Simulation分享的Make your own Load Cell Pedals for Sim Racing系列视频:https://youtu.be/DarnIy6LnNo
Alex大神设计的三踏板模组(图片来自其GrabCAD页面)

2 传感器选型

踏板传感器备注
油门、离合KY-024线性霍尔模块安装49E线性霍尔传感器
刹车70Kg称重传感器 + HX711 AD模块HX711需要支持80Hz模式切换

Alex大神的原始设计是三个踏板都使用称重传感器(英文翻译为Loadcell),但是参考了用户Orhan Kökbudak设计的霍尔传感器改装套件后,我决定在油门和离合器踏板上采用线性霍尔传感器,只在刹车踏板上采用称重传感器。

Orhan Kökbudak设计的霍尔传感器支架 (图片来自其GrabCAD页面)

2.1 霍尔模块选型

霍尔模块采用KY-024模块,这个在淘宝上就可以轻松买到。在这里分享我遇到的第一个坑:KY-024有安装了不同传感器的两种版本,一种是49E线性霍尔传感器,这个型号可以根据磁感应强度输出较为线性的模拟电压,可以作为踏板传感器。另外一种是3144传感器,仅能根据磁感应强度的阈值输出开关量!!!不能作为踏板传感器使用!!!在采购的时候一定要问清楚探头的型号,千万不要买错成3144的版本(受害者在此)。

KY-024霍尔模块

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多块了,肉疼。

Arduino Pro Micro

3 编程调试

3.1 接线图

按照下面的接线图完成接线,就可以把开发板接入电脑编程调试了。

传感器接线图

把所有元件用杜邦线和面包板连接起来,用磁铁靠近霍尔探头,用手掰一掰称重传感器,然后观察DIVIEW上的读数是否变化。挨个测试没问题以后就算调试成功了。

3.2 Arduino调试程序

程序部分调用了HX711Joystick两个库, 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);
}

该文章属于专题: DIY模拟赛车踏板

1人评论了“DIY赛车模拟器踏板记录(一):控制板和传感器测试”

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注