基于Arduino与GRBL的迷你CNC绘图仪:从零搭建自动绘图机器人
1. 项目概述与核心价值
想自己动手做一台能自动画画的机器吗?这台基于Arduino和GRBL的迷你CNC绘图仪,就是一个绝佳的入门项目。它本质上是一台三轴(X, Y, Z)的微型数控机床,只不过把切割头换成了一支笔。你可能会好奇,市面上有现成的绘图仪,为什么还要自己折腾?原因很简单:掌控感、学习曲线和极致的成本控制。通过亲手组装这台机器,你能透彻理解从数字设计到物理运动的每一个环节——步进电机如何精准地走完每一步,G代码如何被翻译成电脉冲,软件又如何与硬件对话。这对于想涉足自动化、机器人甚至更复杂CNC领域的朋友来说,是一次完美的“学前班”体验。
整个项目的核心架构非常清晰:Arduino Nano作为大脑,运行着专为数控机床优化的GRBL固件;三个28BYJ-48步进电机配合ULN2003驱动板,负责驱动三个轴向的运动;机身结构则完全由3D打印件构成。软件链也采用了经典的开源组合:用Inkscape处理矢量图形,用在线工具JSCut生成G代码,最后用Universal Gcode Sender(UGS)发送指令控制机器。整个流程下来,你花费的成本可能还不到一顿像样的大餐,但收获的却是一整套可迁移的硬件知识和软件技能。接下来,我会带你从零开始,拆解每一个步骤,并分享我在制作过程中踩过的坑和总结出的技巧,确保你也能一次成功。
2. 硬件选型与物料清单解析
自己动手做项目,最怕的就是东西买错或者买漏。一份清晰的物料清单(BOM)是成功的一半。下面我根据原项目并结合自己的经验,整理了一份更详细、更可靠的清单,并解释为什么选这些部件。
2.1 核心控制器与驱动模块
主控板:Arduino Nano为什么是Nano而不是更常见的Uno?核心原因在于尺寸和引脚兼容性。Nano在功能上与Uno几乎一致,但体积小巧得多,非常适合嵌入到我们这种紧凑的机身结构中。它拥有足够的数字I/O口来控制三个电机驱动板,并且原生支持USB通信,方便连接电脑上传固件和发送指令。购买时注意选择CH340芯片版本,其驱动在Windows系统上更易安装,性价比也更高。
步进电机:28BYJ-48 + ULN2003驱动板这是本项目最具性价比的选择。28BYJ-48是一种5V驱动的减速步进电机,内部有一套齿轮组,虽然速度不快,但扭矩被放大,低速运行平稳,且价格极其低廉。ULN2003是一片达林顿晶体管阵列芯片,专门用来驱动这类小功率步进电机或继电器。它相当于一个电流放大器,接收Arduino微弱的控制信号,输出足以驱动电机线圈的大电流。
注意:28BYJ-48的步距角(每步转动的角度)经过齿轮减速后非常小,这意味着它分辨率高,能画出更平滑的线条,但绝对速度慢,不适合需要快速移动的场景。对于绘图仪来说,精度和稳定性的优先级远高于速度。
2.2 机械结构件与连接件
3D打印结构件机身的所有框架、滑块、电机座都依赖3D打印。文件格式为STL,你需要一台FDM(熔融沉积)3D打印机来制作。材料首选PLA,因为它打印容易、翘曲小、强度足够。关于打印参数:
- 层高:建议0.2mm,在打印速度和表面质量间取得平衡。
- 填充率:15%-20%即可,过高的填充不会显著增加强度,反而浪费材料和时间。
- 支撑:仔细检查模型,对于悬空角度大于60度的结构才需要生成支撑。原设计通常已优化,大部分零件可以无需支撑打印。
- 数量:确保打印了所有必需的零件,包括X轴、Y轴滑块、笔架(Z轴)、各种连接板和底座。
标准连接件你需要准备以下五金件:
- 螺丝:主要是M3规格的各种长度螺丝(如6mm, 10mm, 16mm)和螺母。用于固定电机、连接结构件。
- 光轴与直线轴承:这是实现直线运动的关键。通常需要几根直径8mm的光轴(作为导轨)和配套的直线轴承(安装在滑块内)。确保光轴切割长度与设计图纸一致,并用砂纸打磨端部毛刺,以免划伤轴承。
- 同步带与皮带轮:大多数桌面CNC使用同步带传动。你需要根据设计图纸确定同步带的型号(如GT2-6mm宽)和长度,以及配套的20齿或16齿皮带轮。同步带的松紧度可调,是后期调试的重点。
2.3 电路辅料与工具
电路焊接部分:
- 万用板或定制PCB:初学者可以用万用板(洞洞板)焊接,但线路杂乱容易出错。我强烈推荐像原作者一样,使用立创EDA等免费工具根据电路图绘制一块简单的PCB,然后去打样。现在打样5块板子往往只需要二三十元还包邮,能极大提升项目的成功率和美观度。
- 杜邦线:用于连接Arduino Nano与驱动板、驱动板与电机。准备公对公、公对母、母对母若干。
- 电源:需要一个输出为5V/2A以上的直流电源适配器(带桶形插头或接线端子)。确保电流充足,三个电机同时运动时瞬时电流可能超过1A。
- 其他:220欧姆电阻(用于限流,保护连接到Arduino的LED指示灯)、LED、电源开关、接线端子等。
必备工具:
- 电烙铁及焊锡、吸锡器
- 螺丝刀套装(十字、一字)
- 剥线钳、剪线钳
- 尖嘴钳、镊子
- 一台已安装切片软件的3D打印机
3. 机械结构组装与调校实战
硬件齐备后,真正的挑战开始了——把一堆零件变成一台结实的机器。组装顺序和调校方法直接决定了绘图仪最终的精度。
3.1 框架与线性运动系统组装
组装应遵循“从下至上,从静到动”的原则。
- 安装底座与Y轴:先将Y轴的光轴(两根平行的长轴)安装到底座对应的固定座上,并确保它们绝对平行。这是整个机器精度的基础。可以使用游标卡尺测量两端和中间的距离来校验平行度。然后,将装有直线轴承的Y轴滑块套在光轴上,手动推动应感觉顺滑、无卡涩。
- 安装X轴横梁:将X轴的光轴和电机座安装到Y轴滑块上。这里的关键是确保X轴光轴与Y轴运动方向垂直。一个取巧的方法是,推动Y轴滑块到一端,标记出X轴光轴的位置;再推到另一端,检查X轴光轴是否与之前的标记线平行。如果不平行,需要调整连接处的螺丝。
- 安装笔架(Z轴):最后将笔架组件安装到X轴的滑块上。笔架通常由一个微型舵机(伺服电机)构成,通过舵机的摆动来实现提笔和落笔。确保笔架安装牢固,并且笔尖能垂直对准工作台面。
调校心得:
- 光轴平行度:这是最重要的。不平行会导致滑块移动阻力越来越大,甚至卡死,同时电机负载不均,容易丢步(即电机没有走到指令要求的位置)。
- 同步带张紧:皮带太松会打滑,导致定位不准;太紧则会增加电机负载和噪音。调到一个用手按压皮带中部,能有轻微形变(约3-5mm)的程度为宜。
- 各轴运动顺畅度:在安装电机和同步带之前,用手推动各轴滑块,应该在全行程内都顺畅无阻。如果有顿挫感,检查光轴是否清洁、直线轴承是否安装到位。
3.2 电机与传动系统安装
将28BYJ-48步进电机安装到各自的电机座上。电机的输出轴需要安装上同步带轮,并用顶丝固定紧。然后绕上同步带,并用皮带夹将同步带的两端分别固定在滑块和机架上,形成一个闭环。
重要提示:28BYJ-48电机的轴很细,且不是标准的D型轴。安装同步带轮时,一定要使用配套的联轴器或者选择内孔与电机轴匹配的皮带轮,并用顶丝死死锁紧,否则极易打滑,导致所有运动都失控。
连接电机与ULN2003驱动板。28BYJ-48电机有5根线(实际上是四相线圈加一根公共电源线),颜色顺序一般为:红(公共正极)、橙、黄、粉、蓝。你需要查阅电机说明书,将四根信号线(橙、黄、粉、蓝)按顺序连接到驱动板的IN1至IN4。公共红线连接到驱动板的电机电源正极。
4. 电路设计与控制系统搭建
电路是项目的神经系统,连接错误轻则不动,重则烧板。我们采用分块搭建、逐块测试的方法,确保万无一失。
4.1 控制电路原理与接线
整个电路的核心是Arduino Nano与三个ULN2003驱动板的连接。其控制逻辑是:GRBL固件通过Nano的特定引脚输出步进脉冲(STEP)和方向信号(DIR)给每个驱动板,驱动板再将这些信号放大,驱动电机线圈按顺序通电,从而让电机旋转。
Arduino Nano与ULN2003的接线表(基于GRBL默认引脚定义):
| Arduino Nano 引脚 | 连接至 ULN2003 驱动板 | 功能说明 |
|---|---|---|
| D2 | X轴驱动板IN1 | 控制X轴电机第一相 |
| D3 | X轴驱动板IN2 | 控制X轴电机第二相 |
| D4 | X轴驱动板IN3 | 控制X轴电机第三相 |
| D5 | X轴驱动板IN4 | 控制X轴电机第四相 |
| D6 | Y轴驱动板IN1 | 控制Y轴电机第一相 |
| D7 | Y轴驱动板IN2 | 控制Y轴电机第二相 |
| D8 | Y轴驱动板IN3 | 控制Y轴电机第三相 |
| D9 | Y轴驱动板IN4 | 控制Y轴电机第四相 |
| D10 | Z轴驱动板IN1 | 控制Z轴(笔舵机)信号线* |
| A0 (D14) | Z轴舵机信号线* | 控制提笔/落笔(需在GRBL中配置) |
| 5V | 所有驱动板+端 | 为驱动板逻辑部分供电 |
| GND | 所有驱动板-端 | 共地,至关重要! |
*注:原项目使用舵机作为Z轴,但GRBL默认配置可能不同。更常见的做法是将一个舵机信号线连接到D11(GRBL默认的Spindle Enable引脚,可重定义为舵机控制),并在GRBL设置中启用#define VARIABLE_SPINDLE和#define SPINDLE_DIR_PIN等选项来兼容舵机。对于首次尝试,可以先用一个电机作为Z轴(上下移动笔),逻辑与X/Y轴相同,接线到D10-D13。舵机方案需要修改GRBL源码,难度稍高。
电源连接:
- 将外部5V/2A电源的正极(+)连接到所有ULN2003驱动板的电机电源正极接口(通常是板子另一侧的
+端子)。 - 将外部电源的负极(-)连接到所有驱动板的电机电源负极,并且务必与Arduino Nano的
GND引脚连接在一起。共地是电路正常工作的绝对前提。
4.2 焊接与测试要点
如果你使用万用板,建议先布局再焊接。将Arduino Nano插座、ULN2003驱动板插座的位置规划好,电源走线要粗一些。焊接完成后,先不要接电机,进行以下测试:
- 通电测试:只连接电源,用万用表测量各驱动板的电源输入端是否为稳定的5V,测量Arduino Nano的
VIN或5V引脚是否有电。 - 信号测试:上传一个简单的步进电机测试代码(例如让一个电机持续单方向转动),用示波器或者甚至一个LED配合电阻接在驱动板的信号输入脚上,观察是否有脉冲信号。没有示波器的话,可以小心地接上一个电机,看它是否振动或尝试转动(此时可能因为缺相而抖动)。
避坑指南:
- 反接保护:在电源输入端,可以反向并联一个二极管(如1N4007),防止电源反接烧毁电路。
- 滤波电容:在Arduino Nano的
5V和GND之间,以及每个ULN2003驱动板的电源入口处,就近焊接一个100uF的电解电容和一个0.1uF(104)的瓷片电容。前者缓冲电机启停引起的电压波动,后者滤除高频噪声。这是保证系统稳定运行、防止Arduino意外复位的关键小技巧。 - 发热问题:ULN2003在工作时会发热,尤其是驱动电机低速堵转时(比如笔卡住了)。确保驱动板周围有适当空气流通,不要被其他部件紧密包裹。
5. GRBL固件刷写与核心参数配置
硬件组装完毕,是时候注入“灵魂”了。GRBL是一款极其高效、专为Arduino优化的数控固件,它能将接收到的G代码指令,实时转化为精确的步进电机控制信号。
5.1 固件刷写详细步骤
- 安装旧版Arduino IDE:GRBL对新版IDE的兼容性有时会有问题。访问Arduino官网下载1.8.x版本的IDE并安装,这是最稳定的选择。
- 获取GRBL库:不要从Arduino的库管理器安装,最好从GitHub获取最新版本。访问
github.com/gnea/grbl,点击Code->Download ZIP,下载源码。 - 导入库到IDE:打开Arduino IDE,依次点击
项目->加载库->添加.ZIP库...,选择你刚下载的ZIP文件。 - 打开并上传示例:上传完成后,在
文件->示例->GRBL->GRBLUpload中找到示例。在工具菜单中,选择正确的板卡类型(Arduino Nano)和处理器(ATmega328P (Old Bootloader)这个选项很重要,很多国产Nano芯片需要选这个才能上传成功),选择正确的串口端口。 - 点击上传:等待编译和上传完成。上传成功后,打开串口监视器(波特率选择
115200),如果看到一串以Grbl X.Xx ['$' for help]开头的启动信息,恭喜你,固件刷写成功!
5.2 关键参数配置与校准
GRBL通过$开头的命令进行配置。打开串口监视器,输入$$并回车,会列出所有当前参数。我们需要修改其中几个关键参数,让固件认识我们的机器。
核心参数解析与设置:
- $0 步进脉冲时间 (Step pulse):保持默认
10微秒即可,ULN2003可以响应。 - $1 步进空闲时间 (Step idle delay):保持默认
25毫秒,电机停止一段时间后自动进入省电模式。 - $100, $101, $102 各轴每毫米步数 (Steps/mm):这是最重要的参数!它告诉GRBL,电机需要走多少步,笔尖才能移动1毫米。
- 计算公式:
Steps/mm = (电机每转步数 * 驱动器微步数) / (丝杠导程或皮带轮周长) - 对于28BYJ-48电机:其步进角为5.625°,每转需要64步(64 steps/rev)。但它是4相8拍驱动,所以实际运行时,ULN2003驱动器会以8拍(一个周期8个脉冲)方式驱动,因此电机每转需要64 * 8 = 512个脉冲。我们通常不使用微步,所以驱动器微步数设为1。
- 对于同步带传动:假设使用GT2皮带,20齿的皮带轮。GT2齿距为2mm,所以皮带轮周长 = 20齿 * 2mm/齿 = 40mm。
- 计算:
Steps/mm = 512 steps/rev / 40 mm/rev = 12.8 steps/mm - 在GRBL中,输入
$100=12.8(X轴),$101=12.8(Y轴)。Z轴(如果是舵机)则不需要这个参数,如果是步进电机,计算方式相同。
- 计算公式:
- $110, $111, $112 各轴最大速率 (Max rate mm/min):电机能跑的最快速度。28BYJ-48速度较慢,建议设为
500-800 mm/min。输入$110=500,$111=500。 - $120, $121, $122 各轴加速度 (Acceleration mm/sec^2):启动和停止的快慢。太大会丢步,太小效率低。建议从
50-100开始尝试。输入$120=80,$121=80。 - $130, $131, $132 各轴行程 (Travel max mm):设置机器的软限位,防止撞车。用尺子量出你的绘图仪X轴和Y轴的有效绘图范围,比如100mm x 100mm。输入
$130=100,$131=100。
设置完成后,输入$G保存到EEPROM。你可以输入G91 G1 X10 F100这样的命令来测试电机是否按预期移动10毫米。
6. 从矢量图到G代码:完整软件工作流
硬件和固件就绪后,我们需要告诉机器“画什么”。这个过程就是将一张图片,转换成机器能理解的G代码指令集。
6.1 使用Inkscape准备矢量图形
CNC机器只认识由点、线、面构成的矢量路径,无法直接处理JPG、PNG这类位图。Inkscape是一款免费强大的矢量图形软件。
- 设置画布:打开Inkscape,进入
文件->文档属性。将单位设为mm,并将页面宽度和高度设置为你绘图仪的实际工作区域大小,例如100x100mm。这能确保你设计的图形不会超出边界。 - 导入或创建图形:你可以用Inkscape的工具自己画图,或者导入一张位图(
文件->导入)。导入位图后,选中它,点击顶部菜单的路径->轮廓化位图。在弹出的对话框中,调整阈值和边界检测参数,直到预览中的线条清晰勾勒出你想要的轮廓。点击应用,原位置图下方就会生成一个矢量路径。删除原来的位图,只保留矢量部分。 - 优化路径:复杂的路径可能包含太多无用的节点。选中路径,点击
路径->简化(快捷键Ctrl+L),可以适当减少节点,使生成的G代码更简洁,运行更流畅。 - 保存文件:将处理好的矢量图保存为
SVG格式。这是与后续G代码生成工具兼容性最好的格式。
6.2 使用JSCut生成G代码
JSCut是一个基于网页的、专门为2D CNC/激光切割/绘图生成G代码的工具,非常适合本项目。
- 加载机器配置:打开JSCut网站。首先需要定义你的机器。在
Machine选项卡下,设置Work Area(工作区域)为你的机器尺寸(100x100)。在Material下设置厚度(绘图可以设为0)。 - 导入SVG文件:点击
File->Import SVG,导入你保存的SVG文件。图形会出现在虚拟工作台上。 - 创建加工操作:在
Operations面板,点击Add Operation。对于绘图,我们通常选择Profile(轮廓)操作。在操作设置中:Tool(刀具):因为我们用的是笔,可以虚拟一个“刀具”,将Tool Diameter(刀具直径)设置为你的笔尖粗细,例如0.5mm。这会影响路径的补偿。Cut Depth(切割深度):设为0,因为我们不切割。Pass Depth:设为0。Feed Rate(进给速率):设置与GRBL中Max Rate相匹配的速度,例如500 mm/min。Plunge Rate(下刀速率):可以设小一点,比如100 mm/min。
- 生成并导出G代码:点击
Calculate,软件会生成刀具路径(可视化的线条)。确认无误后,点击Save G-code,保存为.nc或.gcode文件。
高级技巧:如果你画的是有多条路径的图形(比如文字),在Inkscape中,务必使用路径->拆分命令将每条独立路径分开。在JSCut中,你可以为每条路径单独创建操作,甚至可以设置不同的“下笔/提笔”高度(通过模拟Z轴位置),实现画不同部分时自动抬笔移动,避免拖痕。
7. 上位机控制与首次绘图调试
最后一步,用电脑软件连接绘图仪,发送G代码,见证机器动起来的时刻。这里我们使用Universal Gcode Sender (UGS),它功能全面且对GRBL支持良好。
7.1 UGS平台连接与机器设置
- 连接与通信:用USB线连接Arduino Nano到电脑。打开UGS,在右上角选择正确的串口端口和波特率(115200),点击
连接。如果成功,下方日志窗口会显示GRBL的启动信息。 - 运行设置向导:点击顶部菜单
Commands->Setup Wizard。这是一个极其有用的工具。- Firmware:选择
GRBL。 - Port:选择你的串口。
- Wizard Steps:跟随向导一步步操作:
- Homming:我们的机器没有限位开关,跳过。
- Motor Wiring:这里可以测试电机方向。点击
X+,观察笔架移动方向。如果方向反了,不要慌。你可以通过交换ULN2003驱动板上连接电机线圈的两组线(例如IN1与IN3对调,IN2与IN4对调)来改变方向,或者在GRBL中通过$3=1(反向X轴方向)这样的命令来软件反转。我强烈建议先硬件调换,软件反转作为备用方案。 - Calibration:这是校准机器实际移动距离的关键!向导会让你移动一段距离(比如10mm),然后问你实际移动了多少。你需要用尺子精确测量。UGS会根据你的反馈,自动计算出正确的
Steps/mm值,并更新GRBL的$100/$101参数。这比手动计算更准确,因为它补偿了皮带打滑、轮子尺寸误差等实际因素。 - Reset to Zero:将笔尖移动到纸张的左下角(你希望的绘图原点),点击
Reset Zero,将此点设为工作坐标系(G54)的(0,0,0)点。 - Finish:完成向导,设置会被保存。
- Firmware:选择
7.2 执行绘图与问题排查
- 加载与预览:在UGS中点击
打开G代码文件,加载你生成的.nc文件。右侧的可视化标签页可以预览刀具路径,检查是否有异常的超范围移动。 - 对刀与开始:手动控制(使用UGS的手动控制面板或
Jog功能)将笔尖移动到纸张的起始位置。点击Reset Zero重置坐标。再次确认笔尖是否接触纸面(Z轴高度)。对于舵机控制的笔,你需要事先调试好舵机的两个角度:一个抬笔高度(笔尖离开纸面约2-3mm),一个落笔高度(笔尖轻轻压在纸面上)。这通常在GRBL中通过配置$30(最大主轴转速)和$31(最小主轴转速)映射到舵机角度来实现,或者使用专门的G代码(如M3 S1000落笔,M5抬笔)来控制。 - 点击
Send:开始绘图!保持观察,特别是第一次运行。
首次绘图常见问题排查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机不转,但有声音 | 1. 电机线序接错。 2. 电源功率不足。 3. GRBL电机使能引脚未激活。 | 1. 检查电机四根线是否按顺序连接驱动板。 2. 换用电流更大的5V电源(2A以上)。 3. 在UGS中检查状态,或发送 $X命令解锁警报。 |
| 电机转动,但笔架不动 | 同步带未张紧或皮带轮打滑。 | 重新张紧同步带,紧固皮带轮顶丝。 |
| 绘图尺寸不对 | Steps/mm参数设置错误。 | 使用UGS的设置向导重新进行距离校准。 |
| 图形扭曲或错位 | 1. X轴与Y轴不垂直。 2. 某个轴电机丢步。 | 1. 重新调整机械结构,确保两轴垂直。 2. 降低 Max Rate和Acceleration参数,检查该轴运动阻力是否过大。 |
| 笔画断断续续 | 1. 笔尖压力不够或出水不畅。 2. Z轴(抬笔/落笔)动作不准确。 | 1. 换用出水流利的笔,或调整笔架给笔施加一点压力。 2. 精细调试舵机的落笔角度,确保每次都能接触纸面。 |
| 绘图到一半停止 | 1. USB线接触不良。 2. 电脑进入休眠。 3. G代码中有错误指令。 | 1. 固定好USB线。 2. 关闭电脑休眠设置。 3. 检查G代码文件,看是否包含机器不支持的M代码或G代码。 |
第一次成功画出图形时,那种成就感是无与伦比的。即使图形有些歪斜或者线条不连贯,也请不要气馁。DIY的精髓就在于迭代和优化。你可以根据测试结果,回头去微调机械结构、校准电机参数、优化G代码生成设置。这台小小的绘图仪,就像一把钥匙,为你打开了通往更广阔的数字制造世界的大门。从它出发,你可以尝试更换激光头模块做成激光雕刻机,或者深入研究GRBL的高级功能,探索更复杂的项目。
