如何使用 Arduino 构建绘图仪

使用开源硬件和软件,自动化绘制、雕刻等操作,DIY 绘图仪。
440 位读者喜欢这篇文章。
The making of Arduino

Opensource.com

在学校时,科学系的储藏室里藏着一台 HP 绘图仪。我玩了一段时间,一直想拥有一台自己的绘图仪。快进多年后,步进电机很容易获得,我又开始用电子产品和微控制器做东西,最近我看到有人用雕刻的丙烯酸制作显示器。这促使我最终构建了自己的绘图仪。

The plotter in action

opensource.com

作为一个老派的 5V 爱好者,我真的很喜欢最初的 Arduino Uno。以下是我使用的其他组件列表(声明一下,我与这些公司没有任何关联)

  • FabScan 扩展板:物理上承载步进电机驱动器。
  • SilentStepSticks:电机驱动器,因为 Arduino 本身无法处理步进电机所需的电压和电流。我现在使用的是带有 Trinamic TMC2130 芯片的驱动器,但目前处于独立模式。这些是 Pololu 4988 的替代品,但运行起来安静得多。
  • SilentStepStick 保护器:二极管,可防止转动的电机烧毁您的电机驱动器(相信我,您需要它们)。
  • 步进电机:我选择了 12V 的 NEMA 17 电机(例如,来自 WatterottSparkFun 的型号)。
  • 线性导轨
  • 木制底板
  • 木螺钉
  • GT2 皮带  
  • GT2 同步带轮

这是一个正在进行中的个人项目。如果您正在寻找现成的套件,请查看德国 Make 杂志的 MaXYposi

硬件设置

正如您在这里看到的,我一开始做得太大了。这个绘图仪不能舒服地放在我的桌子上,但这没关系,因为我这样做是为了学习目的(而且,因为我必须重做一些事情,下次我会使用更小的梁)。

Plotter base plate with X-axis and Y-axis rails

opensource.com

皮带安装在导轨的两侧,然后用一些辅助轮绕在电机上

The belt routing on the motor

opensource.com

我在 Arduino 上堆叠了几个组件。Arduino 在底部,上面是 FabScan 扩展板,接下来是电机插槽 1+2 上的 StepStick 保护器,最上面是 SilentStepStick。请注意,SCK 和 SDI 引脚未连接。

Arduino and Shield

opensource.com

小心正确地将电线连接到电机。如有疑问,请查看数据表或使用欧姆表来确定哪些电线属于一起。

软件设置

虽然像 grbl 这样的软件可以解释用于工具移动和其他操作的所谓 G 代码,而且我可以将其刷入 Arduino,但我很好奇,想更好地理解这些东西。(我的 X-Y 绘图仪软件可在 GitHub 上获得,不提供任何 гарантии)。

基础知识

要使用 StepStick(或兼容)驱动器驱动步进电机,您基本上需要向相应的引脚发送高电平和低电平信号。或者用 Arduino 的术语来说

digitalWrite(stepPin, HIGH);
delayMicroseconds(30);
digitalWrite(stepPin, LOW);

其中 stepPin 是步进电机的引脚号:电机 1 为 3,电机 2 为 6。

在步进电机开始工作之前,必须启用它。

digitalWrite(enPin, LOW);

实际上,StepStick 知道引脚的三种状态

  • 低电平:电机已启用
  • 高电平:电机已禁用
  • 引脚未连接:电机已启用,但一段时间后进入节能模式

当电机启用时,其线圈通电,并保持其位置。几乎不可能手动转动其轴。这对于精度目的很有好处,但也意味着电机和驱动芯片都被“充满”电力,并且会升温。

最后,但同样重要的是,我们需要一种确定绘图仪方向的方法

digitalWrite(dirPin, direction);

下表列出了功能和引脚

功能 电机 1 电机 2
启用 2 5
方向 4 7
步进 3 6

在我们使用引脚之前,我们需要在代码的 setup() 部分将它们设置为 OUTPUT 模式

pinMode(enPin1, OUTPUT);
pinMode(stepPin1, OUTPUT);
pinMode(dirPin1, OUTPUT);
digitalWrite(enPin1, LOW);

有了这些知识,我们可以轻松地让步进电机移动起来

    totalRounds = ...
    for (int rounds =0 ; rounds < 2*totalRounds; rounds++) {
       if (dir==0){ // set direction
         digitalWrite(dirPin2, LOW);
       } else {
         digitalWrite(dirPin2, HIGH);
       }
       delay(1); // give motors some breathing time
       dir = 1-dir; // reverse direction
       for (int i=0; i < 6400; i++) {
         int t = abs(3200-i) / 200;
         digitalWrite(stepPin2, HIGH);
         delayMicroseconds(70 + t);
         digitalWrite(stepPin2, LOW);
         delayMicroseconds(70 + t);
       }
    }

这将使滑块左右移动。这段代码处理一个步进电机,但对于 X-Y 绘图仪,我们需要考虑两个轴。

命令解释器

我开始实现一个简单的命令解释器来使用路径规范,例如

"X30|Y30|X-30 Y-30|X-20|Y-20|X20|Y20|X-40|Y-25|X40 Y25

描述以毫米为单位的相对移动(1 毫米等于 80 步)。

绘图仪软件实现了连续模式,允许 PC 将大型路径(分块)馈送到绘图仪。(这就是我在此 视频 中绘制希尔伯特曲线的方式。)

构建更好的笔架

在上面的第一张图片中,笔是用一些金属线绑在 Y 轴上的。这不精确,也无法让软件升降笔(这解释了大的黑点)。

从那时起,我创建了一个更好、更精确的笔架,它使用伺服电机来升降笔。在这个图片和上面链接的希尔伯特曲线视频中可以看到这个新的、改进的笔架。

Servo to raise/lower the pen

opensource.com

笔用一个小夹子固定(图中所示的是 8 号夹子,通常用于将电缆固定到墙壁上)。伺服臂可以抬起笔;当手臂放下时,重力会将笔放下。

驱动伺服电机

驱动伺服电机相对简单:只需提供位置,伺服电机即可完成所有工作。

#include <Servo.h>

// Servo pin
#define servoData PIN_A1

// Positions
#define PEN_UP 10
#define PEN_DOWN 50

Servo penServo;

void setup() {
  // Attach to servo and raise pen
  penServo.attach(servoData);
  penServo.write(PEN_UP);
}

我正在使用 FabScan 扩展板电机 4 位置上的伺服头,所以我使用了模拟引脚 1。

放下笔就像这样简单

  penServo.write(PEN_DOWN);

下一步

我的下一步之一是添加一些限位检测器,但我可能会跳过它们,而使用 TMC2130 的 StallGuard 模式。这些检测器也可以用于实现 home 命令。

也许在未来,我会添加一个真正的 Z 轴,它可以容纳雕刻机来做木材铣削、PCB 钻孔、丙烯酸雕刻,或者...(激光也是一个想法)。

这最初发表在 Some Things to Remember 博客上,经许可转载。

标签
User profile image.
Heiko 是一位长期的开源提交者。他目前在 Red Hat 从事服务器和软件系统的监控和管理主题。Heiko 拥有卡尔斯鲁厄大学计算机科学硕士学位,并撰写了两本关于 JBoss AS 和 Enterprise Java Beans 的书籍。

1 条评论

是的,对于那些想绘制插图的人来说,这是一个很棒的项目想法

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© 2025 open-source.net.cn. All rights reserved.