English
🤖 LateAI
首页做自己的机器人 › SimulIDE 模拟控制电路(详细分册)
🔌

SimulIDE 模拟 SmallRobotArm 控制电路(详细分册)

SimulIDE Arduino Mega Control Circuit — Step-by-Step Guide with Runnable Firmware
📶 入门 ~ 进阶 ⏱ 约 1~2 晚 💰 软件免费 🦾 DIY · 站内原创

📌 本分册目标

这是「做自己的机器人」第 1 个项目中 ③ SimulIDE 电路仿真 的详细版教程:在 SimulIDE 0.4.15+ 里搭出一台「虚拟 Arduino Mega 2560 控制箱」,用 6 只 LED 直观看到 6 路步进脉冲、用 6 个电位器当示教器拧角度、用串口监视器读运动学输出——全程零硬件、零成本。

先说明一个关键事实:SimulIDE 目前没有步进电机模型,所以本分册的策略是「LED 代表每个轴的脉冲序列」做逻辑验证:哪个轴在动,哪只 LED 就哒哒哒地闪。跑通这里,你就把真机接线前最容易错的「引脚、方向、使能、串口」环节全部预演了一遍。

💡 本站提供的固件是原创教学示例(演示 Mega 2560 控制 6 路脉冲的逻辑),不是原仓库 SmallRobotArm.ino 的复刻——真机烧录请用下载资料里的原版固件,并以其 PDF 引脚表为准。

🧰 环境准备

界面先认识四个区域

🔌 真实接线图: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 里要观察的就是这几个脚。

Arduino Mega 2560 主控 · 固件 hex 烧这里 D26 D36 D33 D54 D60 D46 6 路 STEP 脉冲 RAMPS 1.4 控制板 6 个步进驱动插槽(A4988 / TMC2130 / TB6600) E0轴1 底座 STEP 26 · DIR 28 · EN 24 E1轴2 肩 STEP 36 · DIR 34 · EN 30 E2轴3 肘 STEP 33 · DIR 49 · EN 31 X轴4 腕1 STEP 54 · DIR 55 · EN 38 Y轴5 腕2 STEP 60 · DIR 61 · EN 56 Z轴6 末端 STEP 46 · DIR 48 · EN 62 D-sub 25 机臂内线束 6 电机 × 4 线 = 24 针 M1 M2 M3 M4 M5 M6 6 × NEMA 步进 电源与去耦 12V(TMCM1110 用 24V)→ 各驱动 VMOT · 100µF/50V 电解并联在电机电源上 · 驱动 GND 与 Mega GND 必须共地
图 A-0 · SmallRobotArm 真实接线图(本站依据官方 Electronics PDF 与固件 pinout.h 重绘):Mega 2560 的 6 个数字脚送出 STEP 脉冲进 RAMPS 的 E0/E1/E2/X/Y/Z 六个驱动插槽,每个插槽上的驱动模块再驱动一只 NEMA 步进;6 只电机的 8 根(4 相 × 2)线束在机臂内汇总到 DB25 连接器。颜色约定:蓝=STEP 信号,绿=GND 公共地,红=电机电源正极。
轴(真机位置)RAMPS 插槽STEPDIREN官方建议电流上限
轴1 · 底座回转E0D26D28D24≤ 2.8 A
轴2 · 肩(大臂)E1D36D34D30≤ 2.8 A
轴3 · 肘(小臂)E2D33D49D31≤ 0.85 A
轴4 · 腕摆动 1XD54D55D38≤ 0.67 A
轴5 · 腕摆动 2YD60D61D56≤ 0.67 A
轴6 · 末端回转ZD46D48D62≤ 0.6 A
💡 电流为什么逐轴递减:底座与肩要托起整条臂(负载最大,给到 2.8 A);越往末端负载越轻,电流也越小(末端 0.6 A 足够)。电流靠驱动模块上的 Vref 电位器设定,A4988 的经验公式 Vref ≈ I_max × 8 × Rs(Rs 通常 0.1Ω),调之前先查你手上模块的手册。
⚠️ 三个真机必踩的坑:① 驱动 GND 必须与 Mega GND 共地,否则 STEP 信号没有回路、电机纹丝不动;② 电机电源端并联 100µF 电解电容(官方 PDF 明确要求),抑制断电反冲;③ 先不插电机调好 Vref 再上电,电流调大了会烧电机或驱动。

🔌 细化(一):驱动模块每个脚怎么接(以 A4988 为例)

图 A-0 是"板级"连接,这一节拆到驱动模块每一个引脚。SmallRobotArm 官方给了四种兼容驱动(TMC2130 / TMCM1110 / A4988 / TB6600),引脚命名不同但功能一致;下面以最常见、最便宜的 A4988(Pololu 兼容模块,16 脚)为基准讲解,换 TMC/TB6600 时按同名信号对号入座即可。

A4988 驱动模块 Vref 电位器调电流 GND VDD(5V) 2B 2A 1A 1B EN(低有效) MS1 MS2 MS3 RST SLP STEP DIR 12V 电机电源 +12V / GND(2A 以上) VMOT VMOT 5V 逻辑电(RAMPS 供) 公共 GND(与 Mega 共地) 100µF 跨接 VMOT–GND M1 NEMA17 两相 A 相:1A / 1B B 相:2A / 2B STEP←D26 · DIR←D28 · EN←D24(轴1)
图 A-0b · A4988 驱动模块全引脚接线:左半边是「强电」——VMOT 接 12V、GND 共地、1A/1B/2A/2B 接电机两相四线,并在 VMOT–GND 之间并联 100µF 电解电容;右半边是「弱电」——STEP/DIR/EN 来自 Mega,MS1~MS3 决定细分,RST 与 SLP 通常短接后接高电平(不短接模块不工作)。
引脚接到哪里作用 / 注意事项
VMOT12V 电源正(TB6600 支持 9–42V,TMCM1110 用 24V)电机驱动电源,必须并联 100µF/50V 电解电容抑制反冲
GND(2 脚)电源地 + Mega 的 GND必须与 Mega 共地,否则信号无回路、电机不转
VDD5V(RAMPS 板提供,或外部 5V)模块逻辑电源;RAMPS 插上时自动供
1A / 1B电机 A 相两根线同一绕组(万用表测得导通)
2A / 2B电机 B 相两根线另一绕组;方向反了把这一组两根对调即可
STEPMega 的 STEP 脚(轴1 = D26)每个上升沿走一步;脉冲频率 = 转速
DIRMega 的 DIR 脚(轴1 = D28)高/低电平决定正反转,换向要先停脉冲再改
ENMega 的 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Ω),先算后量再上电
⚠️ 绝不能热插拔:电机或驱动模块在通电状态下插拔,A4988 极易瞬间击穿。调线/换相务必先断 12V。

🔌 细化(二):电机四根线怎么找、DB25 25 针全表

SmallRobotArm 用的是两相四线双极步进(NEMA17 类)。每只电机引出 4 根线:两个绕组各 2 根。官方做法是把 6 只电机共 24 根线汇总到一只 D-sub 25 连接器(25 针 = 24 根线 + 1 根屏蔽/备用),机臂内部只走这一根粗线束。

① 用万用表找出同一相(不查颜色也能接)

② DB25 引脚分配(6 电机 × 4 线)

针脚轴1(底座)针脚轴2(肩)针脚轴3(肘)
1 / 2 / 3 / 4A1+ / A1− / B1+ / B1−5 / 6 / 7 / 8A2+ / A2− / B2+ / B2−9 / 10 / 11 / 12A3+ / A3− / B3+ / B3−
针脚轴4(腕1)针脚轴5(腕2)针脚轴6(末端)
13 / 14 / 15 / 16A4+ / A4− / B4+ / B4−17 / 18 / 19 / 20A5+ / A5− / B5+ / B5−21 / 22 / 23 / 24A6+ / A6− / B6+ / B6−
25屏蔽层 / 保护地(PE),建议接金属外壳或悬空,不要与信号地混接
💡 上表是按「每轴占 4 针、从 1 脚顺序排列」的常规做法整理;官方 PDF 第 2 页的引脚图即为这一结构。接线前请用万用表逐针核对你手上线束的实际定义(不同批次可能不同),确认无误再上电。

③ 在 SimulIDE 里对应到哪

🔧 第 1 步:放置 Arduino Mega 2560

1

从元件库拖入板子

左侧展开 Boards → Arduino → Mega 2560,拖到画布中间。若分类里找不到 Mega 2560,先升级到 0.4.15+(这是老版本最常见的坑)。

SimulIDE 里只有 Mega 2560 与 Mega ADK 是 2560 核心;UNO/Nano 只有 14 个数字脚,装不下本教程的 6 路脉冲 + 6 路方向。

2

认识板子的仿真引脚

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Ω 电阻 → GND6 路 STEP 脉冲可视化:轴在动 = 灯在闪
D28 → D48本教程先不接(留给真机方向通道);想观察方向可各接一只异色 LED6 路 DIR 方向
A0 → A5第 5 步再接电位器,先留空6 路示教角度输入
GND所有 LED 阴极汇聚的公共地(GND 符号)公共地
⚠️ 接线提示:在画布上先用 Basic → GND 放 6 个地符号(或一根地母线),用 Circuit → Connect 依次把 D26 引脚 → LED 阳极、LED 阴极 → 电阻 → GND 连起来。LED 长脚是阳极(正),接反了灯永远不会亮。
💡 把 6 只 LED 在画布上排成一条竖线,标上「轴1…轴6」,后面看闪烁规律一目了然——这就是真机上一排驱动板 LED 的翻版。
Arduino Mega 2560 SimulIDE · Boards → Mega 2560 D13 板载 LED 做心跳 D26 220Ω LED1 · 轴1 D36 220Ω LED2 · 轴2 D33 220Ω LED3 · 轴3 D54 220Ω LED4 · 轴4 D60 220Ω LED5 · 轴5 D46 220Ω LED6 · 轴6 GND
图 A-1 · 6 路 STEP 脉冲观察电路:D26/36/33/54/60/46(蓝线)各接一只 LED 的阳极(长脚),LED 阴极(短脚)220Ω 电阻接到 GND 公共地(绿线)。D28/34/49/55/61/48 方向通道本教程先不接。接线顺序:先放 6 个 GND 符号或画一条地母线,再从 D 脚 → LED 阳极、LED 阴极 → 电阻 → GND 依次连线。

🔧 第 3 步:写入完整仿真固件(可直接编译运行)

双击画布上的 Mega 2560,弹出固件编辑窗口。把下面这份本站原创教学固件整体粘贴进去,然后点 Compile(编译)。编译通过后点 Upload 烧进仿真板,关闭编辑窗口。

arm_pulse_demo.ino · SimulIDE 教学仿真固件(Arduino Mega 2560 · 本站原创)
/* ============================================================
 * 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 路脉冲

1

点 ▶ Run 开始仿真

上传成功后点顶部工具栏 ▶ Run。板载 D13 的 LED 应开始每 500ms 闪一下(心跳)——这证明固件在跑。

2

看到什么算成功

电位器还没接时 analogRead 读到浮空值,各轴会自己追到某个角度然后停住:表现为某几只 LED 快速闪一会儿后停下。把 A0 脚接一个电位器后慢慢拧,对应轴1 的 LED 就会持续哒哒哒——转速随你拧的速度变化。

成功标志:LED 闪动节奏与「电位器转速」同步、停下后不再乱闪。这说明脉冲通道与示教逻辑全部打通。

🔧 第 5 步:加 6 个电位器,当「虚拟示教器」

Inputs → Potentiometer 拖 6 个电位器到画布,排成一列标上 轴1~轴6。每个电位器 3 个脚:两端分别接 5VGND,中间抽头(wiper,通常是中间的脚)接对应模拟输入 A0~A5

💡 SimulIDE 的电位器默认阻值 10kΩ 即可。接线顺序建议:先放一个 5V 端点与一个 GND 端点,用连线把 6 个电位器的一端都接到 5V、另一端都接到 GND(并联),再单独把每个抽头拉到自己的 A0/A1/…/A5。
5V GND Mega 2560 模拟输入引脚 电位器1 · 轴1 → A0 电位器2 · 轴2 → A1 电位器3 · 轴3 → A2 A0 A1 A2
图 A-2 · 电位器示教接法:每个电位器 两端子分别接 5V(红线)与 GND(绿线)——6 个电位器并联到同一对电源母线;中间抽头(紫线)接对应模拟输入 A0~A5。拧电位器 → A 脚电压 0~5V 变化 → analogRead 得到 0~1023 → 固件映射为 0°~180° 目标角。
1

运行并拧电位器

点 ▶ Run,用鼠标拖动某个电位器旋钮(或选中后按方向键微调)。对应轴的 LED 应开始脉冲闪动,直到角度追上电位器位置。

从 0° 拧到 180° 时,LED 应闪约 100 次(180 ÷ 1.8° ≈ 100 步)后停下——这就是「示教」的电子版:真机上装机械臂时,你也会用类似逻辑让每个轴转到指定角度。

2

六轴联动演示

把 6 个电位器拧成不同角度(例如 0/30/60/90/120/150°),观察 6 只 LED 各自以不同时长闪烁后稳定——像不像 6 个步进电机分别转到各自角度?这就是 Drake 那边「关节角 → 运动」在电路侧的对应。

🔧 第 6 步:用串口监视器读运动学输出

1

打开串口监视器

菜单 Tools → Serial Monitor(或元件库 Instruments → Serial Monitor 拖到画布),把波特率设为 115200(与固件 Serial.begin(115200) 一致),点开监视后选择对应串口。

仿真运行时,窗口里应每 500ms 滚出一行 target:0,0,45,90,0,0 之类的数据——这就是 6 轴的目标角度。

2

与 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(另一篇分册)——两者各管一段,合起来就是完整的仿真组合拳。

💡 要点提示

🔗 相关资源

🦾 返回做自己的机器人 上一篇:Drake 分册 ← ← LateAI 首页