如何使用 Arduino 制作一个绘图仪

简介:

在上学时,科学系的壁橱里藏着一台惠普绘图仪。虽然我在上学的期间可以经常使用它,但我还是想拥有一台属于自己的绘图仪。许多年之后,步进电机已经很容易获得了,我又在从事电子产品和微控制器方面的工作,最近,我看到有人用丙烯酸塑料(acrylic)制作了一个显示器。这件事启发了我,并最终制作了我自己的绘图仪。

我 DIY 的绘图仪;在这里看它工作的视频。

我 DIY 的绘图仪;在这里看它工作的视频

由于我是一个很怀旧的人,我真的很喜欢最初的 Arduino Uno。下面是我用到的其它东西的一个清单(仅供参考,其中一些我也不是很满意):

  • FabScan shield:承载步进电机驱动器。
  • SilentStepSticks:步进电机驱动器,因为 Arduino 自身不能处理步进电机所需的电压和电流。因此我使用了一个 Trinamic TMC2130 芯片,但它是工作在单独模式。这些替换为 Pololu 4988,但是它们运转更安静。
  • SilentStepStick 保护装置:一个防止你的电机驱动器转动过快的二极管(相信我,你肯定会需要它的)。
  • 步进电机:我选择的是使用 12 V 电压的 NEMA 17 电机(如,来自 WatterottSparkFun 的型号)。
  • 直线导杆
  • 木制的基板
  • 木螺丝
  • GT2 皮带
  • GT2 同步滑轮

这是我作为个人项目而设计的。如果你想找到一个现成的工具套件,你可以从 German Make 杂志上找到 MaXYposi

硬件安装

正如你所看到的,我刚开始做的太大了。这个绘图仪并不合适放在我的桌子上。但是,没有关系,我只是为了学习它(并且,我也将一些东西进行重新制作,下次我将使用一个更小的横梁)。

带 X 轴和 Y 轴轨道的绘图仪基板

带 X 轴和 Y 轴轨道的绘图仪基板

皮带安装在轨道的侧面,并且用它将一些辅助轮和电机挂在一起:

电机上的皮带路由

电机上的皮带路由

我在 Arduino 上堆叠了几个组件。Arduino 在最下面,它之上是 FabScan shield,接着是一个安装在 1 和 2 号电机槽上的 StepStick 保护装置,SilentStepStick 在最上面。注意,SCK 和 SDI 针脚没有连接。

Arduino 堆叠配置(高清大图)

Arduino 堆叠配置(高清大图

注意将电机的连接线接到正确的针脚上。如果有疑问,就去查看它的数据表,或者使用欧姆表去找出哪一对线是正确的。

软件配置

基础部分

虽然像 grbl 这样的软件可以解释诸如像装置移动和其它一些动作的 G-codes,并且,我也可以将它刷进 Arduino 中,但是我很好奇,想更好地理解它是如何工作的。(我的 X-Y 绘图仪软件可以在 GitHub 上找到,不过我不提供任何保修。)

使用 StepStick(或者其它兼容的)驱动器去驱动步进电机,基本上只需要发送一个高电平信号或者低电平信号到各自的针脚即可。或者使用 Arduino 的术语:


 
 
  1. digitalWrite(stepPin, HIGH);
  2. delayMicroseconds(30);
  3. digitalWrite(stepPin, LOW);

stepPin 的位置上是步进电机的针脚编号:3 是 1 号电机,而 6 是 2 号电机。

在步进电机能够工作之前,它必须先被启用。


 
 
  1. digitalWrite(enPin, LOW);

实际上,StepStick 能够理解针脚的三个状态:

  • Low:电机已启用
  • High:电机已禁用
  • Pin 未连接:电机已启用,但在一段时间后进入节能模式

电机启用后,它的线圈已经有了力量并用来保持位置。这时候几乎不可能用手来转动它的轴。这样可以保证很好的精度,但是也意味着电机和驱动器芯片都“充满着”力量,并且也因此会发热。

最后,也是很重要的,我们需要一个决定绘图仪方向的方法:


 
 
  1. digitalWrite(dirPin, direction);

下面的表列出了功能和针脚:

< 如显示不全,请左右滑动 >
功能 1 号电机 2 号电机
启用 2 5
方向 4 7
步进 3 6

在我们使用这些针脚之前,我们需要在代码的 setup() 节中设置它的 OUTPUT 模式。


 
 
  1. pinMode(enPin1, OUTPUT);
  2. pinMode(stepPin1, OUTPUT);
  3. pinMode(dirPin1, OUTPUT);
  4. digitalWrite(enPin1, LOW);

了解这些知识后,我们可以很容易地让步进电机四处移动:


 
 
  1. totalRounds = ...
  2. for (int rounds =0 ; rounds < 2*totalRounds; rounds++) {
  3. if (dir==0){ // set direction
  4. digitalWrite(dirPin2, LOW);
  5. } else {
  6. digitalWrite(dirPin2, HIGH);
  7. }
  8. delay(1); // give motors some breathing time
  9. dir = 1-dir; // reverse direction
  10. for (int i=0; i < 6400; i++) {
  11. int t = abs(3200-i) / 200;
  12. digitalWrite(stepPin2, HIGH);
  13. delayMicroseconds(70 + t);
  14. digitalWrite(stepPin2, LOW);
  15. delayMicroseconds(70 + t);
  16. }
  17. }

这将使滑块向左和向右移动。这些代码只操纵一个步进电机,但是,对于一个 X-Y 绘图仪,我们要考虑两个轴。

命令解释器

我开始做一个简单的命令解释器去使用规范的路径,比如:


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

用毫米来描述相对移动(1 毫米等于 80 步)。

绘图仪软件实现了一个 持续模式 ,这可以允许一台 PC 给它提供一个很大的路径(很多的路径)去绘制。(在这个视频中展示了如何绘制 Hilbert 曲线)

设计一个好用的握笔器

在上面的第一张图中,绘图笔是细绳子绑到 Y 轴上的。这样绘图也不精确,并且也无法在软件中实现提笔和下笔(如示例中的大黑点)。

因此,我设计了一个更好用的、更精确的握笔器,它使用一个伺服器去提笔和下笔。可以在下面的这张图中看到这个新的、改进后的握笔器,上面视频链接中的 Hilbert 曲线就是使用它绘制的。

图中的特写镜头就是伺服器臂提起笔的图像

图中的特写镜头就是伺服器臂提起笔的图像

笔是用一个小夹具固定住的(图上展示的是一个大小为 8 的夹具,它一般用于将线缆固定在墙上)。伺服器臂能够提起笔;当伺服器臂放下来的时候,笔就会被放下来。

驱动伺服器

驱动伺服器是非常简单的:只需要提供位置,伺服器就可以完成所有的工作。


 
 
  1. #include <Servo.h>
  2. // Servo pin
  3. #define servoData PIN_A1
  4. // Positions
  5. #define PEN_UP 10
  6. #define PEN_DOWN 50
  7. Servo penServo;
  8. void setup() {
  9. // Attach to servo and raise pen
  10. penServo.attach(servoData);
  11. penServo.write(PEN_UP);
  12. }

我把伺服器接头连接在 FabScan shield 的 4 号电机上,因此,我将用 1 号模拟针脚。

放下笔也很容易:


 
 
  1. penServo.write(PEN_DOWN);

进一步扩展

我的进一步扩展的其中一项就是添加一些终止检测器,但是,我也可以不用它们,进而使用 TMC2130 的 StallGuard 模式来代替。这些检测器也可以用于去实现一个 home 命令。

以后,我或许还将添加一个真实的 Z 轴,这样它就可以对一个木头进行铣削雕刻,或者钻一个 PCB 板,或者雕刻一块丙烯酸塑料,或者 … (我还想到了用激光)。


原文发布时间为:2018-06-5

本文来自云栖社区合作伙伴“Linux中国开源社区”,了解相关信息可以关注“Linux中国开源社区”。

相关文章
|
Kubernetes API 调度
Kubernetes必备知识: CNI
CNI的全称是 Container Network Interface,即容器网络的 API 接口。 它是 K8s 中标准的一个调用网络实现的接口。Kubelet 通过这个标准的 API 来调用不同的网络插件以实现不同的网络配置方式。实现了这个接口的就是 CNI 插件,它实现了一系列的 CNI API 接口。常见的 CNI 插件包括 Calico、flannel、Terway、Weave Net 以及 Contiv。
2295 0
Kubernetes必备知识: CNI
|
7月前
|
存储 人工智能 安全
一文总览阿里云存储产品年度升级!
阿里云在“回顾·向新:AI浪潮下的数据存储进化”活动上,总结了过去一年在AI领域的存储研究成果,提出“AI领域”与“高可用底层架构”双轨策略。会上推出的CPFS智算版,针对模型训练场景全链路性能升级,提供20TB级吞吐和3亿IOPS性能,助力大模型高效训练。同时,OSS端到端链路升级支持构建超2万数据湖,性能显著提升。此外,阿里云强化存储安全与高可用性,推出多种灾备方案,满足企业多样化需求。通过赋能月之暗面、小鹏汽车、小红书等案例,阿里云持续领跑AI时代,助力企业智能化转型。
393 29
|
传感器 安全 物联网
STM32方向研究报告
STM32方向研究报告
408 0
|
12月前
|
前端开发 JavaScript API
2024年前端框架的演进与创新
【10月更文挑战第2天】在快速发展的Web开发领域,前端框架是构建交互式界面的基石。从jQuery到React、Vue和Angular,每个框架都有独特优势。2024年,Vue 3持续发展,引入Vapor模式提升性能;React生态系统不断扩展,成为热门选择;SolidJS崛起,提供细粒度响应性;低代码/无代码平台推动开发民主化;跨平台开发如React Native和Flutter进步显著;渐进式Web应用(PWA)使用增加,提升用户体验。这些趋势正塑造前端开发的未来,助力开发者在竞争中保持领先。
|
12月前
|
Web App开发 数据可视化 JavaScript
input标签的type属性汇总
input标签的type属性汇总
392 0
|
存储 Kubernetes 监控
深入浅出分布式事务:理论与实践
在数字化时代的浪潮中,分布式系统如同星辰大海般浩瀚而深邃。本文将带你航行于这片星辰大海,探索分布式事务的奥秘。我们将从事务的基本概念出发,逐步深入到分布式事务的核心机制,最后通过一个实战案例,让你亲自体验分布式事务的魅力。让我们一起揭开分布式事务的神秘面纱,领略其背后的科学与艺术。
181 1
|
存储 前端开发 JavaScript
处理 React 应用程序中的异步数据加载
【8月更文挑战第31天】
222 0
|
设计模式 供应链 数据可视化
DDD - 事件风暴从理论到落地
DDD - 事件风暴从理论到落地
616 1
|
Prometheus Kubernetes 监控
Kubernetes(k8s)上安装Prometheus和Grafana监控(下)
Kubernetes(k8s)上安装Prometheus和Grafana监控(下)
522 0
|
存储 消息中间件 SQL
Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座
阿里云开源大数据表存储团队负责人,阿里巴巴高级技术专家李劲松(之信),在 Streaming Lakehouse Meetup 的分享。
1159 0
Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座