DIY 2D 运动赛车模拟器
组件和用品
| × | 1 | ||||
| × | 2 |
必要的工具和机器
|
应用和在线服务
|
关于这个项目
SimTools 是一种通用的运动模拟器软件,能够控制多个硬件接口,包括 Arduino。该组合用于视频中介绍的项目。硬件部分仅包括 Arduino Nano 微控制器和两个便宜的 SG90 微型伺服电机。我们只需要上传下面给出的代码。
在 SimTools 软件的帮助下,所需的游戏数据通过串口传输到 Arduino。接下来 Arduino 激活伺服电机,相应地移动模拟平台。这是一个小规模的两轴模拟器。要制作真正的模拟器,需要添加电机驱动器和大型伺服电机。
“https://www.xsimulator.net/”页面上有很多此类DIY模拟器的示例以及施工图和技巧。视频中描述了 SimTools 设置过程,但您也可以下载 PDF 用户手册:https://simtools.us/wp-content/uploads/2019/06/SimToolsUserManual-v2.4.pdf
SimTools 将在“演示”模式下运行,直到注册了有效的许可证。当 SimTools 处于演示模式时,Live for Speed 插件完全可以进行测试。 (Live for Speed 的演示也适用于测试 SimTools。)您可以在 https://www.lfs.net/downloads
找到更多信息并下载 Live for SpeedSimTools 下载链接:
https://www.xsimulator.net/community/marketplace/motion-simulation-software-simtools.63/
代码
- 代码
代码C/C++
//************************************************* ****************************************************// RC伺服模型//原始代码由EAOROBBIE(罗伯特林赛)//完全由aarondc修改//用于Sim Tool Motion Software的免费使用//******************** ****************************************************** **********************#include//#define DEBUG 1 // 注释掉这一行以删除 debuggin Serial.print linesconst int kActuatorCount =2; // 我们正在处理多少个执行器 // 从 Sim Tools 发送的用于标识每个执行器的字母(“名称”)// 注意:这里的字母顺序决定了剩余常量 kPins 和 kActuatorScaleconst char kActuatorName[kActuatorCount] 的顺序={ 'R', 'L' };const int kPins[kActuatorCount] ={4, 5}; // 执行器连接的引脚const int kActuatorScale[kActuatorCount][2] ={ { 0, 179 } , // 右执行器缩放 { 179, 0 } // 左侧执行器缩放 }; const char kEOL ='~'; // 行尾 - 我们的执行器值的分隔符 const int kMaxCharCount =3; // 一些保险...伺服执行器Set[kActuatorCount]; // 我们的 Actuatorsint 数组 actuatorPosition[kActuatorCount] ={90, 90}; // 当前执行器位置,初始化为 90int currentActuator; // 跟踪从串口读入的当前执行器int valueCharCount =0; // 我们读取了多少个值字符(必须小于 kMaxCharCount!!// 为我们的状态机设置一些状态// psReadActuator =来自串行端口的下一个字符告诉我们执行器// psReadValue =来自串行端口的下一个 3 个字符告诉我们 valueenum TPortState { psReadActuator, psReadValue }; TPortState currentState =psReadActuator;void setup(){ // 将执行器连接到引脚 for (int i =0; i 0).void serialEvent() { char tmpChar; int tmpValue; while (Serial.available()) { // if我们正在等待执行器名称,在这里获取它 if (currentState ==psReadActuator) { tmpChar =Serial.read(); // 在我们设置的执行器名称数组中查找我们的执行器#ifdef DEBUG Serial.print("读入"); Serial.println(tmpChar); #endif for (int i =0; i 9)) tmpValue =0; actuatorPosition[currentActuator] =actuatorPosition[currentActuator] * 10 + tmpValue; valueCharCount++;否则休息; } // 如果我们读取了值分隔符,则更新执行器并开始寻找下一个执行器名称 if (tmpValue ==kEOL || valueCharCount ==kMaxCharCount) {#ifdef DEBUG Serial.print("read in "); Serial.println(actuatorPosition[currentActuator]); #endif // 缩放新位置,使值在 0 到 179 之间actuatorPosition[currentActuator] =map(actuatorPosition[currentActuator], 0, 255, kActuatorScale[currentActuator][0], kActuatorScale[currentActuator][1]);# ifdef DEBUG Serial.print("缩放到"); Serial.println(actuatorPosition[currentActuator]); #endif updateActuator(currentActuator); currentState =psReadActuator; } } }}//将当前Actuator位置写入传入的Actuator void updateActuator(int thisActuator) {actuatorSet[thisActuator].write(actuatorPosition[thisActuator]);}
示意图
制造工艺