项目原理
绘图机器人的核心思想是控制一个或多个电机,通过特定的运动轨迹,带动画笔在纸上作画,最常见的设计有两种:

-
XY 轴绘图机 (Cartesian Plotter):
- 结构:类似于打印机,画笔在一个可以水平移动的滑块上(X轴),而整个滑块又可以垂直移动(Y轴),画笔本身只在Z轴(上下)移动。
- 优点:结构直观,控制算法相对简单,精度较高。
- 缺点:占用空间较大,运动范围受限于框架大小。
-
极坐标绘图机 (Polar Plotter):
- 结构:一个旋转的底座(角度 θ),一个从中心向外伸缩的臂(半径 r),画笔固定在臂的末端。
- 优点:结构更紧凑,可以在一个圆形区域内绘图。
- 缺点:边缘区域的精度会下降,控制算法更复杂。
我们这里将以最常见的 XY 轴绘图机 为例进行讲解。
所需材料与工具
电子部分
| 名称 | 数量 | 备注 |
|---|---|---|
| Arduino 开发板 | 1 | 推荐 Arduino UNO R3 或 Nano |
| 步进电机 | 2 | 推荐 42HS48 或 28BYJ-48(带驱动板),42HS48 力矩大,精度高。 |
| 步进电机驱动器 | 1 | 如果电机是 28BYJ-48(5线),则自带驱动,如果是 42HS48(4线),则需要 A4988 或 DRV8825 驱动板。 |
| 笔架/笔夹 | 1 | 3D 打印或手工制作,用于固定画笔和实现抬笔/落笔功能。 |
| 舵机 | 1 | 用于控制笔的抬起和落下,如 SG90。 |
| 电源 | 1 | 根据电机功率选择,42HS48 通常需要 12V-24V 电源,A4988 需要外部供电。 |
| 杜邦线 | 若干 | 用于连接各个模块。 |
结构部分
| 名称 | 数量 | 备注 |
|---|---|---|
| 亚克力板/木板 | 1 | 作为机器人的底板和框架,尺寸根据你的设计而定。 |
| 同步带/齿条 | 2 | X轴和Y轴的传动部件,提供精确的线性运动。 |
| 滑块/导轨 | 2 | 配合同步带或齿条,实现平滑的直线运动。 |
| 电机支架/联轴器 | 2 | 用于固定电机并连接同步带轮。 |
| 螺丝、螺母、垫片 | 若干 | 用于固定所有机械部件。 |
| 轴承 | 4 | 用于支撑同步带轮,减少摩擦。 |
工具
- 电烙铁、焊锡
- 螺丝刀
- 热熔胶枪
- 尺子、铅笔
硬件连接
假设我们使用 Arduino UNO + 2个 42HS48 步进电机 + A4988 驱动器 + 1个 SG90 舵机。

A4988 驱动器与步进电机连接
每个 A4988 驱动板控制一个电机,连接方式如下:
- 电机接口:将电机的 A+, A-, B+, B- 线缆连接到驱动板的对应引脚。
- 电源:
VMOT:连接外部电源的正极(如 12V)。注意:不要连接到 Arduino 的 5V!GND:连接外部电源的负极。2B,2A:连接电机 B 相。1A,1B:连接电机 A 相。
- 控制信号:
STEP:接收来自 Arduino 的步进脉冲,每来一个脉冲,电机走一步。DIR:接收来自 Arduino 的方向信号,决定电机正转还是反转。GND:连接 Arduino 的 GND,确保共地。VDD:连接 Arduino 的 5V,为逻辑部分供电。
Arduino 与 A4988 驱动器连接
以 X 轴和 Y 轴为例,定义引脚:
| A4988 引脚 | X轴 Arduino 引脚 | Y轴 Arduino 引脚 | 功能 |
|---|---|---|---|
STEP |
D2 | D3 | 脉冲信号 |
DIR |
D4 | D5 | 方向信号 |
GND |
GND | GND | 地线 |
VDD |
5V | 5V | 逻辑电源 |
SG90 舵机与 Arduino 连接
- 信号线 (通常是橙色):连接到 Arduino 的一个 PWM 引脚,如 D9。
- VCC (通常是红色):连接到 Arduino 的 5V。
- GND (通常是棕色):连接到 Arduino 的 GND。
电源连接
- 外部电源:将 12V 电源的正极连接到两个 A4988 驱动板的
VMOT引脚,负极连接到它们的GND引脚。 - Arduino 供电:你可以通过 USB 供电,或者从外部电源的
VMOT和GND上分出一路,通过一个 5V 稳压模块(如 LM7805)给 Arduino 供电,以获得更稳定的性能。
软件编程
所需库
你需要安装以下两个库:
- AccelStepper:用于精确控制步进电机,支持加速和减速,让运动更平滑。
- 安装:在 Arduino IDE 中,
工具->管理库...,搜索 "AccelStepper" 并安装。
- 安装:在 Arduino IDE 中,
- Servo:Arduino 自带库,用于控制舵机。
示例代码:画一个正方形
这段代码将控制机器人画一个 10cm x 10cm 的正方形,并在每个角抬笔和落笔。

#include <AccelStepper.h>
#include <Servo.h>
// --- 定义引脚 ---
// 步进电机控制引脚
#define X_STEP_PIN 2
#define X_DIR_PIN 4
#define Y_STEP_PIN 3
#define Y_DIR_PIN 5
// 舵机控制引脚
#define SERVO_PIN 9
// 定义步进电机接口类型
// AccelStepper::DRIVER 表示使用 STEP/DIR 驱动器
AccelStepper stepperX(AccelStepper::DRIVER, X_STEP_PIN, X_DIR_PIN);
AccelStepper stepperY(AccelStepper::DRIVER, Y_STEP_PIN, Y_DIR_PIN);
// 定义舵机
Servo penServo;
// --- 运动参数 ---
// 定义每毫米的步数 (需要根据你的机械结构校准!)
// 同步带节距 2mm, 驱动轮 20齿, 每圈步数 200步
// 每毫米步数 = 200步/圈 / (2mm/圈 * 20齿) = 5步/mm
// 这是一个示例值,你必须根据你的硬件进行计算和调整!
#define STEPS_PER_MM 5.0
// 定义抬笔和落笔的角度 (需要根据你的舵机位置调整)
#define PEN_UP_ANGLE 100 // 抬笔角度
#define PEN_DOWN_ANGLE 70 // 落笔角度
// 定义绘图速度 (mm/s)
#define DRAWING_SPEED 50
void setup() {
Serial.begin(9600);
Serial.println("Drawing Robot Initializing...");
// 初始化步进电机
stepperX.setMaxSpeed(1000); // 设置最大速度 (步/秒)
stepperY.setMaxSpeed(1000);
stepperX.setAcceleration(500); // 设置加速度 (步/秒^2)
stepperY.setAcceleration(500);
// 初始化舵机
penServo.attach(SERVO_PIN);
penUp(); // 初始状态为抬笔
Serial.println("Initialization complete.");
}
void loop() {
// 开始绘图
drawSquare(100); // 画一个边长为100mm的正方形
delay(2000); // 等待2秒
drawLetter('A', 50); // 画一个字母A,高度50mm
delay(2000);
// 机器人完成,可以停止或进入待机模式
while(1);
}
// --- 辅助函数 ---
// 抬笔
void penUp() {
penServo.write(PEN_UP_ANGLE);
delay(200); // 等待舵机动作完成
}
// 落笔
void penDown() {
penServo.write(PEN_DOWN_ANGLE);
delay(200); // 等待舵机动作完成
}
// 画正方形
void drawSquare(int size) {
Serial.print("Drawing a square with size: ");
Serial.println(size);
penDown();
moveRelatively(size, 0); // 向右画一条边
moveRelatively(0, size); // 向下画一条边
moveRelatively(-size, 0); // 向左画一条边
moveRelatively(0, -size); // 向上画一条边
penUp();
}
// 画字母A (简化版)
void drawLetter(char letter, int size) {
Serial.print("Drawing letter: ");
Serial.println(letter);
penDown();
// 这里只是一个示例,画出字母'A'的轮廓
// 实际应用中需要更复杂的路径规划
moveRelatively(0, size); // 竖线
moveRelatively(size, -size); // 斜线
moveRelatively(-size, 0); // 横线
moveRelatively(size, size); // 斜线
penUp();
}
// 相对移动函数 (单位: mm)
// X: X轴移动距离 (正数向右,负数向左)
// Y: Y轴移动距离 (正数向下,负数向上)
void moveRelatively(float x, float y) {
long stepsX = x * STEPS_PER_MM;
long stepsY = y * STEPS_PER_MM;
// 启动电机
stepperX.move(stepsX);
stepperY.move(stepsY);
// 等待电机移动完成
while (stepperX.distanceToGo() != 0 || stepperY.distanceToGo() != 0) {
stepperX.run();
stepperY.run();
}
}
校准与调试
这是项目中最关键的一步。
-
校准
STEPS_PER_MM:- 手动控制电机,让它在X轴或Y轴上移动一个已知的精确距离(例如100mm)。
- 修改代码,将
STEPS_PER_MM的值进行微调,直到实际移动距离与设定距离相符。 - 公式:
STEPS_PER_MM = (电机每圈步数 * 驱动轮齿数) / (同步带节距 * 驱动轮节圆直径),直接测量和调整是最准确的方法。
-
校准
PEN_UP_ANGLE和PEN_DOWN_ANGLE:- 上传代码,观察舵机的动作。
- 调整
PEN_UP_ANGLE和PEN_DOWN_ANGLE的值,确保画笔能完全抬起(不接触纸面)和完全落下(接触纸面且有压力)。
-
检查运动方向:
- 如果画笔移动方向与代码中的 方向相反(
moveRelatively(100, 0)向左走),只需交换对应电机的DIR引脚连接即可。
- 如果画笔移动方向与代码中的 方向相反(
进阶方向
当你完成了基础绘图后,可以尝试以下进阶功能:
-
G-Code 解析器:
- G-Code 是 CNC 机器人和 3D 打印机使用的标准指令语言,你可以编写一个 G-Code 解析器,让 Arduino 直接读取
.gcode文件(通过 SD 卡模块或串口),从而绘制复杂的图形。
- G-Code 是 CNC 机器人和 3D 打印机使用的标准指令语言,你可以编写一个 G-Code 解析器,让 Arduino 直接读取
-
PC 端控制软件:
在电脑上用 Python (PyQt/PySide) 或 Processing 开发一个图形界面,用户可以在上面画图,软件将图形路径转换为步进电机指令,通过串口发送给 Arduino。
-
图像转矢量:
编写一个脚本(如 Python + OpenCV),将 JPG 或 PNG 图片转换为 SVG 矢量图,再将 SVG 路径转换为 G-Code 或自定义指令,让机器人进行绘画。
-
激光雕刻/切割:
- 将画笔替换为激光二极管模块(注意安全!),即可实现简单的激光雕刻功能。
希望这个详细的指南能帮助你成功制作出自己的 Arduino 绘图机器人!祝你玩得开心!
标签: Arduino绘图机器人精度控制 Arduino绘图机器人步进电机校准 Arduino绘图机器人路径规划算法