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

opensource.com
作为一个老派的 5V 爱好者,我真的很喜欢最初的 Arduino Uno。以下是我使用的其他组件列表(声明一下,我与这些公司没有任何关联)
- FabScan 扩展板:物理上承载步进电机驱动器。
- SilentStepSticks:电机驱动器,因为 Arduino 本身无法处理步进电机所需的电压和电流。我现在使用的是带有 Trinamic TMC2130 芯片的驱动器,但目前处于独立模式。这些是 Pololu 4988 的替代品,但运行起来安静得多。
- SilentStepStick 保护器:二极管,可防止转动的电机烧毁您的电机驱动器(相信我,您需要它们)。
- 步进电机:我选择了 12V 的 NEMA 17 电机(例如,来自 Watterott 和 SparkFun 的型号)。
- 线性导轨
- 木制底板
- 木螺钉
- GT2 皮带
- GT2 同步带轮
这是一个正在进行中的个人项目。如果您正在寻找现成的套件,请查看德国 Make 杂志的 MaXYposi。
硬件设置
正如您在这里看到的,我一开始做得太大了。这个绘图仪不能舒服地放在我的桌子上,但这没关系,因为我这样做是为了学习目的(而且,因为我必须重做一些事情,下次我会使用更小的梁)。

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

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

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 轴上的。这不精确,也无法让软件升降笔(这解释了大的黑点)。
从那时起,我创建了一个更好、更精确的笔架,它使用伺服电机来升降笔。在这个图片和上面链接的希尔伯特曲线视频中可以看到这个新的、改进的笔架。

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 博客上,经许可转载。
1 条评论