SimulIDE 模拟 SmallRobotArm 控制电路(详细分册)
📌 本分册目标
这是「做自己的机器人」第 1 个项目中 ③ SimulIDE 电路仿真 的详细版教程:在 SimulIDE 0.4.15+ 里搭出一台「虚拟 Arduino Mega 2560 控制箱」,用 6 只 LED 直观看到 6 路步进脉冲、用 6 个电位器当示教器拧角度、用串口监视器读运动学输出——全程零硬件、零成本。
先说明一个关键事实:SimulIDE 目前没有步进电机模型,所以本分册的策略是「LED 代表每个轴的脉冲序列」做逻辑验证:哪个轴在动,哪只 LED 就哒哒哒地闪。跑通这里,你就把真机接线前最容易错的「引脚、方向、使能、串口」环节全部预演了一遍。
🧰 环境准备
- SimulIDE 0.4.15 及以上(simulide.com 官方下载,Windows / macOS / Linux 绿色免安装,解压即用)——只有 0.4.15+ 才支持 Arduino Mega 2560,老版本只有 UNO/Nano
- 不需要任何实体硬件:板子、LED、电位器都在软件元件库里
- 本仓库 ZIP(可选):想对照真机引脚与固件时下载,纯跑本教程不下载也行
界面先认识四个区域
- 左侧 Components 元件库:按分类找元件——
Boards → Arduino → Mega 2560、Basic → GND / Resistor、Inputs → Potentiometer(电位器)、Outputs → LED、Instruments → Serial Monitor(若你的版本在Tools菜单里也能开) - 中间大画布:拖元件、连线的地方
- 顶部工具栏:▶ Run(开始/继续仿真)、⏸ 暂停、■ 停止;连线用菜单
Circuit → Connect或快捷键 - 右侧属性面板:选中元件后改参数(LED 颜色、电阻阻值等)
🔌 真实接线图:Mega 2560 + RAMPS 1.4 + 6 路驱动
搭仿真之前先看清真机到底怎么接。SmallRobotArm 官方电子文档(SmallRobotArmElectronics.pdf)给出的方案是:Arduino Mega 2560 + 3D 打印机 RAMPS 1.4 控制板 + 6 个步进驱动模块(静音方案用 TMC2130 / TMCM1110,省钱方案用 A4988 / TB6600);机械臂内部的 6 路电机线束通过一只 D-sub 25(DB25)连接器集中引出。
本站对照官方 PDF 与社区固件的 pinout.h(RAMPS 1.4 引脚定义)整理出下面这张按真实引脚号标注的接线图——SimulIDE 里要观察的就是这几个脚。
| 轴(真机位置) | RAMPS 插槽 | STEP | DIR | EN | 官方建议电流上限 |
|---|---|---|---|---|---|
| 轴1 · 底座回转 | E0 | D26 | D28 | D24 | ≤ 2.8 A |
| 轴2 · 肩(大臂) | E1 | D36 | D34 | D30 | ≤ 2.8 A |
| 轴3 · 肘(小臂) | E2 | D33 | D49 | D31 | ≤ 0.85 A |
| 轴4 · 腕摆动 1 | X | D54 | D55 | D38 | ≤ 0.67 A |
| 轴5 · 腕摆动 2 | Y | D60 | D61 | D56 | ≤ 0.67 A |
| 轴6 · 末端回转 | Z | D46 | D48 | D62 | ≤ 0.6 A |
Vref ≈ I_max × 8 × Rs(Rs 通常 0.1Ω),调之前先查你手上模块的手册。🔌 细化(一):驱动模块每个脚怎么接(以 A4988 为例)
图 A-0 是"板级"连接,这一节拆到驱动模块每一个引脚。SmallRobotArm 官方给了四种兼容驱动(TMC2130 / TMCM1110 / A4988 / TB6600),引脚命名不同但功能一致;下面以最常见、最便宜的 A4988(Pololu 兼容模块,16 脚)为基准讲解,换 TMC/TB6600 时按同名信号对号入座即可。
| 引脚 | 接到哪里 | 作用 / 注意事项 |
|---|---|---|
| VMOT | 12V 电源正(TB6600 支持 9–42V,TMCM1110 用 24V) | 电机驱动电源,必须并联 100µF/50V 电解电容抑制反冲 |
| GND(2 脚) | 电源地 + Mega 的 GND | 必须与 Mega 共地,否则信号无回路、电机不转 |
| VDD | 5V(RAMPS 板提供,或外部 5V) | 模块逻辑电源;RAMPS 插上时自动供 |
| 1A / 1B | 电机 A 相两根线 | 同一绕组(万用表测得导通) |
| 2A / 2B | 电机 B 相两根线 | 另一绕组;方向反了把这一组两根对调即可 |
| STEP | Mega 的 STEP 脚(轴1 = D26) | 每个上升沿走一步;脉冲频率 = 转速 |
| DIR | Mega 的 DIR 脚(轴1 = D28) | 高/低电平决定正反转,换向要先停脉冲再改 |
| EN | Mega 的 EN 脚(轴1 = D24) | 低电平使能;不接或悬空会锁死,务必由固件拉低 |
| MS1 / MS2 / MS3 | 接高(1)或接地(0)设定细分 | 000 整步 / 100 半步 / 010 四分 / 110 八分 / 111 十六分(推荐,最静音) |
| RST / SLP | 两脚互相短接(再接 VDD 或由 RAMPS 跳线处理) | 不短接模块处于休眠/复位态,电机完全不动(最常见“接了没反应”的原因) |
| Vref | 用螺丝刀调模块上的电位器 | Vref ≈ I_max × 8 × Rs(Rs 常为 0.1Ω),先算后量再上电 |
🔌 细化(二):电机四根线怎么找、DB25 25 针全表
SmallRobotArm 用的是两相四线双极步进(NEMA17 类)。每只电机引出 4 根线:两个绕组各 2 根。官方做法是把 6 只电机共 24 根线汇总到一只 D-sub 25 连接器(25 针 = 24 根线 + 1 根屏蔽/备用),机臂内部只走这一根粗线束。
① 用万用表找出同一相(不查颜色也能接)
- 把万用表打到 电阻档(200Ω),任取两根线测量:导通且阻值几欧~几十欧 = 同一绕组(同一相);无穷大 = 不同相。
- 找出两组同相线后各挑一根定为 A+、B+,剩下两根即 A−、B−(正负只是参考方向,反了只影响转向)。
- 接到驱动:A+/A− → 1A/1B,B+/B− → 2A/2B。若转向与预期相反,把 其中一相的两根对调(不要两组都换)。
- ⚠️ 常见 NEMA17 配色是「黑 A+、绿 A−、红 B+、蓝 B−」,但各厂不统一,必须以实测为准——按颜色直接接是新手烧驱动/电机抖动的头号原因。
② DB25 引脚分配(6 电机 × 4 线)
| 针脚 | 轴1(底座) | 针脚 | 轴2(肩) | 针脚 | 轴3(肘) |
|---|---|---|---|---|---|
| 1 / 2 / 3 / 4 | A1+ / A1− / B1+ / B1− | 5 / 6 / 7 / 8 | A2+ / A2− / B2+ / B2− | 9 / 10 / 11 / 12 | A3+ / A3− / B3+ / B3− |
| 针脚 | 轴4(腕1) | 针脚 | 轴5(腕2) | 针脚 | 轴6(末端) |
| 13 / 14 / 15 / 16 | A4+ / A4− / B4+ / B4− | 17 / 18 / 19 / 20 | A5+ / A5− / B5+ / B5− | 21 / 22 / 23 / 24 | A6+ / A6− / B6+ / B6− |
| 25 | 屏蔽层 / 保护地(PE),建议接金属外壳或悬空,不要与信号地混接 | ||||
③ 在 SimulIDE 里对应到哪
- SimulIDE 没有 A4988 / 步进电机模型,所以仿真侧不画驱动模块,而是把 Mega 的 STEP/DIR/EN 三路引脚用 LED + 220Ω 电阻接到 GND,用灯的闪烁频率和亮灭代表真实发给驱动的信号。
- 想看更细的时序(脉冲宽度、DIR 建立时间),在 STEP 脚上挂 SimulIDE 的逻辑分析仪 / 示波器,观察方波——这正是真机上示波器点 A4988 的 STEP 脚看到的东西。
- 真机侧把这三根线接到驱动模块的 STEP/DIR/EN,就完成了「仿真 ↔ 真机」一一对应:仿真里灯怎么闪,真机电机就怎么走。
🔧 第 1 步:放置 Arduino Mega 2560
从元件库拖入板子
左侧展开 Boards → Arduino → Mega 2560,拖到画布中间。若分类里找不到 Mega 2560,先升级到 0.4.15+(这是老版本最常见的坑)。
SimulIDE 里只有 Mega 2560 与 Mega ADK 是 2560 核心;UNO/Nano 只有 14 个数字脚,装不下本教程的 6 路脉冲 + 6 路方向。
认识板子的仿真引脚
Mega 2560 仿真板上能看到 PA/PB/PC… 或标了数字的引脚;本教程用 D26/36/33/54/60/46(脉冲 STEP)与 D28/34/49/55/61/48(方向 DIR),外加 A0~A5(示教电位器输入)与 GND/5V。
先只搭「控制核心」:把每个 D26/36/33/54/60/46 接一只 LED 到 GND,代表 6 路脉冲——后面所有验证都围绕这 6 只灯。
🔧 第 2 步:搭出 6 路脉冲观察电路
| Mega 2560 引脚 | 接法 | 含义 |
|---|---|---|
| D26 / D36 / D33 / D54 / D60 / D46 | 各接一只 LED 阳极(长脚),LED 阴极经 220Ω 电阻 → GND | 6 路 STEP 脉冲可视化:轴在动 = 灯在闪 |
| D28 → D48 | 本教程先不接(留给真机方向通道);想观察方向可各接一只异色 LED | 6 路 DIR 方向 |
| A0 → A5 | 第 5 步再接电位器,先留空 | 6 路示教角度输入 |
| GND | 所有 LED 阴极汇聚的公共地(GND 符号) | 公共地 |
Basic → GND 放 6 个地符号(或一根地母线),用 Circuit → Connect 依次把 D26 引脚 → LED 阳极、LED 阴极 → 电阻 → GND 连起来。LED 长脚是阳极(正),接反了灯永远不会亮。🔧 第 3 步:写入完整仿真固件(可直接编译运行)
双击画布上的 Mega 2560,弹出固件编辑窗口。把下面这份本站原创教学固件整体粘贴进去,然后点 Compile(编译)。编译通过后点 Upload 烧进仿真板,关闭编辑窗口。
/* ============================================================
* SmallRobotArm · SimulIDE 教学仿真固件(本站原创,非原仓库代码)
* 板卡:Arduino Mega 2560(SimulIDE 0.4.15+)
* 演示三件事:
* 1) 6 路 STEP 脉冲输出(D26/36/33/54/60/46)+ 6 路 DIR 方向(D28/34/49/55/61/48)
* 2) 6 个电位器(A0~A5)当“示教旋钮”:拧到几度轴就追到几度
* 3) 板上 D13 LED 心跳 + 串口 115200 打印各轴目标角度
* 画布里把 D26/36/33/54/60/46 各接一只 LED(阳极) → 220Ω → GND:
* 哪个轴在动,哪只 LED 就哒哒哒闪 = 步进脉冲的可视化。
* ============================================================ */
const int STEP_PIN[] = {26, 36, 33, 54, 60, 46}; // 6 路脉冲输出
const int DIR_PIN[] = {28, 34, 49, 55, 61, 48}; // 6 路方向输出
const int POT_PIN[] = {A0, A1, A2, A3, A4, A5}; // 6 路示教输入
float targetDeg[6] = {0}; // 示教目标角度
float currentDeg[6] = {0}; // 固件内部“当前角度”(仿真实轴位置)
unsigned long lastPrint = 0;
void setup() {
for (int i = 0; i < 6; i++) {
pinMode(STEP_PIN[i], OUTPUT);
pinMode(DIR_PIN[i], OUTPUT);
}
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
}
/* 向目标补一步:步距按 1.8°(常见 42 步进电机整步) */
void stepAxis(int axis) {
float diff = targetDeg[axis] - currentDeg[axis];
if (diff > -0.9f && diff < 0.9f) return; // 已在半步容差内,不再发脉冲
digitalWrite(DIR_PIN[axis], diff > 0 ? HIGH : LOW); // 方向由差值符号决定
digitalWrite(STEP_PIN[axis], HIGH); // 一个脉冲 = 一步
delayMicroseconds(50);
digitalWrite(STEP_PIN[axis], LOW);
delayMicroseconds(950);
currentDeg[axis] += (diff > 0 ? 1.8f : -1.8f);
}
void loop() {
// 读 6 个电位器 → 0..1023 → 映射 0°..180° → 每个轴慢慢追目标
for (int i = 0; i < 6; i++) {
int v = analogRead(POT_PIN[i]);
targetDeg[i] = map(v, 0, 1023, 0, 180);
stepAxis(i);
}
// D13 心跳(每 500ms 翻转)
digitalWrite(LED_BUILTIN, (millis() / 500) % 2);
// 每 500ms 串口打印一次目标角度(配合 Serial Monitor 观察)
if (millis() - lastPrint > 500) {
lastPrint = millis();
Serial.print(F("target:"));
for (int i = 0; i < 6; i++) {
Serial.print(targetDeg[i]);
if (i < 5) Serial.print(','); else Serial.println();
}
}
}
stepAxis():每次 loop 检查「目标角 − 当前角」的差,差够大就发出 1 个脉冲并前进 1.8°,直到追上目标。真机驱动板吃的就是这种「一个高电平 = 一步」的脉冲——LED 看到的就是它。🔧 第 4 步:运行并观察 6 路脉冲
点 ▶ Run 开始仿真
上传成功后点顶部工具栏 ▶ Run。板载 D13 的 LED 应开始每 500ms 闪一下(心跳)——这证明固件在跑。
看到什么算成功
电位器还没接时 analogRead 读到浮空值,各轴会自己追到某个角度然后停住:表现为某几只 LED 快速闪一会儿后停下。把 A0 脚接一个电位器后慢慢拧,对应轴1 的 LED 就会持续哒哒哒——转速随你拧的速度变化。
成功标志:LED 闪动节奏与「电位器转速」同步、停下后不再乱闪。这说明脉冲通道与示教逻辑全部打通。
🔧 第 5 步:加 6 个电位器,当「虚拟示教器」
从 Inputs → Potentiometer 拖 6 个电位器到画布,排成一列标上 轴1~轴6。每个电位器 3 个脚:两端分别接 5V 与 GND,中间抽头(wiper,通常是中间的脚)接对应模拟输入 A0~A5。
analogRead 得到 0~1023 → 固件映射为 0°~180° 目标角。运行并拧电位器
点 ▶ Run,用鼠标拖动某个电位器旋钮(或选中后按方向键微调)。对应轴的 LED 应开始脉冲闪动,直到角度追上电位器位置。
从 0° 拧到 180° 时,LED 应闪约 100 次(180 ÷ 1.8° ≈ 100 步)后停下——这就是「示教」的电子版:真机上装机械臂时,你也会用类似逻辑让每个轴转到指定角度。
六轴联动演示
把 6 个电位器拧成不同角度(例如 0/30/60/90/120/150°),观察 6 只 LED 各自以不同时长闪烁后稳定——像不像 6 个步进电机分别转到各自角度?这就是 Drake 那边「关节角 → 运动」在电路侧的对应。
🔧 第 6 步:用串口监视器读运动学输出
打开串口监视器
菜单 Tools → Serial Monitor(或元件库 Instruments → Serial Monitor 拖到画布),把波特率设为 115200(与固件 Serial.begin(115200) 一致),点开监视后选择对应串口。
仿真运行时,窗口里应每 500ms 滚出一行 target:0,0,45,90,0,0 之类的数据——这就是 6 轴的目标角度。
与 Drake 对照(关键一步)
把同样一组角度(如 0/30/60/90/120/150°)同时喂给 Drake 控制器与这份 SimulIDE 固件:Drake 侧看到「关节转到这些角度」,SimulIDE 侧看到「对应脉冲数与方向」。
至此两条仿真链路就互相对上了:Drake 验运动学与轨迹,SimulIDE 验电路与固件逻辑——真机阶段直接照这套参数调,事半功倍。
🧪 真机 ↔ 仿真对照表
| 本仿真(教学演示) | SmallRobotArm 真机概念 | 说明 |
|---|---|---|
| D26/36/33/54/60/46 输出脉冲 | 6 个驱动器 STEP 输入 | LED 只做可视化;真机脉冲进驱动板 |
| D28/34/49/55/61/48 输出方向 | 6 个驱动器 DIR 输入 | 高/低电平决定正反转 |
| A0~A5 电位器示教 | 上位机/串口下发目标角度 | 真机目标来自逆解计算,不是电位器 |
| 串口 115200 打印 | 固件串口调试输出 | 同上,仅用于调试观察 |
| 1.8°/步 整步逻辑 | 驱动细分可调(1/8、1/16…) | 真机分辨率更高,逻辑同理 |
SmallRobotArmElectronics.pdf 与原版固件为准——用真机前务必对照 PDF,别拿这张表直接焊板。❓ 常见问题 FAQ
元件库里找不到 Arduino Mega 2560?
版本低于 0.4.15。请到 simulide.com 下载 0.4.15+(老版本只带 UNO/Nano,2560 是后来才支持的)。
点 Compile/Upload 报错?
先确认选中的板子是 Mega 2560;再检查工程路径没有中文/空格。SimulIDE 的编译器是随包带的(Windows 版含 gcc),无需额外安装;若提示找不到编译器,重装完整包(不要下精简版)。
上传成功但 LED 全不亮?
三种最常见原因:① 没点 ▶ Run(SimulIDE 烧完不会自动开始,需手动运行);② LED 接反(阳极=长脚接 D 脚,阴极经电阻接地);③ 用了 UNO/Nano 板子而代码里写了 D26/36/33/54/60/46(该板没有这些脚)。
串口监视器没有输出?
检查波特率是否 115200;确认仿真正在运行(▶);确认监视器连接的是 Mega 的串口。SimulIDE 的 Serial Monitor 需在仿真运行中才实时刷新。
想用 UNO 试试但引脚不够?
把脉冲输出改成 {2,3,4,5,6,7}、方向改成 {8,9,10,11,12,13}、电位器用 A0~A5 即可——但 UNO 的 D13 同时是板载 LED 脚,会与心跳共用,建议心跳换 D9 或干脆删掉心跳段。
SimulIDE 能直接仿真步进电机转动吗?
目前没有步进电机模型,所以本分册用 LED + 串口数字验证逻辑;想看「真转起来」请用 Drake(另一篇分册)——两者各管一段,合起来就是完整的仿真组合拳。
💡 要点提示
- 先搭「1 路」验证全流程:1 只 LED + 1 个电位器跑通,再复制成 6 路,出错时排查范围最小。
- LED 只代表「有没有脉冲」;想看脉冲波形(占空比/频率),用
Instruments → Logic Analyzer或示波器接在 D26 上更直观。 - 电位器在 SimulIDE 里旋转要用鼠标拖旋钮;接反两端的 5V/GND 会导致读数反向,属正常,交换两端即可。
- 想学原版固件?下载 ZIP 后用 Arduino IDE 打开
SmallRobotArm.ino,对比它与本教学固件的「目标角 → 脉冲」差异,能加深对步进控制的理解。
🔗 相关资源
- 回到「做自己的机器人」栏目首页下载全部资料、阅读主线教程
- MIT Drake 真实动力学模拟(另一篇分册)URDF 建模 + 1kHz PD 控制 + 重力补偿 + 扭矩饱和分析,附完整程序
- SimulIDE 官网(下载与文档)0.4.15+ 免费下载
- SmallRobotArm 原仓库(GitHub)原版固件与 Electronics.pdf(GPL-3.0)