标签 Arduino 下的文章

使用开源硬件和软件的 DIY 绘图仪可以自动地绘制、雕刻。

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

 title=

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

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

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

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

硬件安装

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

 title=

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

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

 title=

电机上的皮带路由

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

Arduino and Shield

Arduino 堆叠配置(高清大图

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

软件配置

基础部分

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

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

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

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

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

digitalWrite(enPin, LOW);

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

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

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

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

digitalWrite(dirPin, direction);

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

功能1 号电机2 号电机
启用25
方向47
步进36

在我们使用这些针脚之前,我们需要在代码的 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 给它提供一个很大的路径(很多的路径)去绘制。(在这个视频中展示了如何绘制 Hilbert 曲线)

设计一个好用的握笔器

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

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

 title=

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

笔是用一个小夹具固定住的(图上展示的是一个大小为 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 shield 的 4 号电机上,因此,我将用 1 号模拟针脚。

放下笔也很容易:

  penServo.write(PEN_DOWN);

进一步扩展

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

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

这篇文章最初发布在 Some Things to Remember 博客中并授权重分发。


via: https://opensource.com/article/18/3/diy-plotter-arduino

作者:Heiko W.Rupp 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

许多Arduino的项目都是基于两个简单的程序。

能电脑所不能的单片机,这就是Arduino。

我们每天使用的计算机是强大的,但它们根本不了解身边发生了什么事。比如说你的笔记本电脑也不能感到光或水。另外,Arduino对外专门设计成键控的。它有一个用于简化传感器通信的输入、输出板子。

Arduino是由Massimo Banzi和他的意大利搭档Ivrea开发的,并用Ivrea——他最喜欢的酒吧命名。Banzi希望他的设计课程的学生们有一个原型的硬件的廉价,容易的解决方案。自2005年Arduino的发布,它已经从一个教学工具发展成为世界各地制造商的DIY项目。现在有了多模型——更先进的Arduino Due,大功率,微纳米。

无论你购买哪个Arduino模型,当你用它来做“互联网”项目时,单片机的实用性便体现出来了——Arduino可以很容易让你连接到真实世界,云端,或两者。本书中,我们将重点介绍两个超基础项目以便展示Arduino可以多简单。

开始使用Arduino

在我们能够完全了解Arduino是什么之前,知道它不是什么是很重要的。Arduino不是电脑(跟卡片电脑Raspberry Pi不一样)。它不能被独立编程,需要被插入到计算机中去。它不是特别强大,Arduino Uno只有32 KB的内存 ,而苹果笔记本却平均有8G内存。

所以为了使用Arduino,你不能只买这个单片机。对于以下的项目,你需要的是:

硬件

  • Arduino Uno. “Uno”在意大利语中是一的意思,但这并不是有史以来第一个Arduino,只是最基本的Arduino单片机的最新版本。这些项目可以工作在任何一个型号上,但这里我用的是这个型号。
  • B型USB线。我已经很多年没见过这些旧式的USB端口了,但你可能会在旧的电子设备上用过他们。他们的成本约5-10美元 (译注:就是能连接题图的板子上的那个大大的USB口的线)。
  • LED灯。可以直接粘在Arduino上的一个引脚上的小灯;这些往往是相当便宜的

软件

  • Arduino IDE,即“集成开发环境”,是一个免费开源软件,用于开发“sketches”,也就是Arduino用户所说的程序。

当你第一次打开Arduino IDE,你需要建立软件所使用的端口,它用于控制Arduino如何工作,点击“工具”——>“串口”来建立。

  • OS X上,Uno串口的设备名叫做“/dev/tty.usbmodem”,但其他类型的Arduino板可能不同。我的是“/dev/tty.usbmodem1421”。
  • Windows,串口是COM3或更高端口,因为COM1和COM2通常保留给其他硬件。为确定端口号,你可以拔掉Arduino并重新打开IDE菜单。哪个口子不再出现哪个就是你的Arduino。

一般来说,你不用担心直接拔出你的Arduino电路板会有什么问题。我们知道功能齐全的电脑不应该这样做,包括Raspberry Pi,因为他们可以在后台运行一个重要的操作系统任务。但是Arduino只是一个单片机,除非你主动让它写内存,否则它肯定是不会的。

Arduino 硬件初步: 闪烁一个LED

在这第一个项目中,我们将概述Arduino产生物理输出的最基本方式,在这个实例中,闪烁一个LED灯。

我们要去写一个非常简单的程序使得LED频闪——或者是当我自豪地向他展现了我的作品时,我的朋友明智的告诉我,“一点小成果”。本程序是基于开源项目Blink sketch,它可以在Arduino的官网找到。

首先,设置硬件,将LED的两个脚分别插到到Arduino的公共地GND和引脚13上。

注意:如果你准备将一个LED插到一个打开电源的Arduino板子上较长时间(比如超过了这个项目的时间),安全的做法是也接一个220欧姆的电阻。这里有一个你也许需要的接线图,来自Arduino官网。

一个叉略短于另外一个叉——短的这个是负极头,因此,这个接“地”,即GND输入/输出。

注意短的接GND.

现在让我们开始写程序。首先,让我们给个程序的名字。Arduino会忽略行内双斜杠后边的内容,所以这是为自己写注释的好方法:

// 程序 1: 使一个LED闪烁开和关

当硬件工作时,我们需要告诉Arduino在它的14根不同的输入/输出引脚中哪儿会有信号。在这种情况下,我们固定13引脚的LED。这是我们的如何命名固定在引脚13的LED,其中“LED”只是我给的变量名:

int LED = 13;

每一个Arduino程序由两部分组成:void setup() 和 void loop()。这是能够运行的最小的Arduino程序。

void setup()中, 我们告诉Arduino初始化引脚为输出:

void setup() { 
  pinMode(LED, OUTPUT);
} 

void loop()中,我们告诉Arduino“写”一个值到引脚13中。因为我想让它闪烁,在每个循环中我们要使它写一个序列的四个不同命令。如“loop”一词的意思,直到把Arduino关掉前,我们希望它不断执行。

在下面的代码中,LED代表了我们之前分配的那个变量。”HIGH”告诉Arduino给LED提供五伏的电源,而“LOW”提供零伏。在闪烁时,使得它延迟“1000”毫秒每一整秒:

void loop() {
  digitalWrite(LED, HIGH);  
  delay(1000);              
  digitalWrite(LED, LOW);    
  delay(1000);  
} 

当把它们放在一起时,整个程序如下(再次声明,Arduino忽略行内双斜杠后边的内容,所以那只是你自己的注释):

// 程序 1: 使一个LED闪烁开和关
int led = 13; // name the LED in pin 13
void setup() {
  pinMode(LED, OUTPUT); // tell Arduino the pin in question is an output
}
void loop() {
  digitalWrite(LED, HIGH);     // deliver 5V to LED
  delay(1000);                     // wait a second
  digitalWrite(LED, LOW);      // deliver 0V to LED 
  delay(1000);                     // wait a second
}

点击checkmark来验证你的代码是没有错误的,然后按play键。如果你的Arduino已经连接,它应该开始运行你的闪烁程序了。

Arduino 软件程序: 打印到电脑上

现在让我们来做一个控制开关并试着演示Arduino是如何产生数字输出的最基本项目。

我们将要设置Arduino “打印”,或是在您的计算机屏幕上显示信息。这个程序基于Paul Bianchi的Arduino printing tutorial

在这个实例中没有硬件,这样我们就可以直接跳到程序部分。再说一次,程序分为两个部分: void setup()void loop()

void setup()中,我们要打开一个Arduino和计算机之间通信的线路,指定速率是9600b/s。如果你使用另一个速率,你可能会在计算机上得到乱码而不是文字。

void setup() { 
  Serial.begin(9600); 
}

void loop() 中,这部分很像我们的一个LED程序。我们要给它两条独立的指令,告诉它在他们之间每一整秒中断。Println是Arduino输出到你的电脑显示的命令。注意"Println"中的"l"的是小写的"L",而不是大写的"i"!

void loop() { 
  Serial.println(“hello”);
  delay(1000);
  Serial.println(“world.”);
  delay(1000);
}

将标题和注释等放到一起,如下:

// 程序 2: 使Arduino打印 “Hello World”到电脑上
void setup() {
  Serial.begin(9600); // open a 9600 baud communication line to computer
}
void loop() {
  Serial.println(“Hello”);        // write the word “Hello”
  delay(1000);                    // wait a second
  Serial.println(“World”);      // write the word “World”
  delay(1000);                   // wait a second
}

验证你的代码并运行。什么都不会显示,直到你点击Arduino IDE窗口右上角的“Serial Monitor”。你应该看到一个不停输出的“Hello World”,一遍又一遍,直到你拔掉Arduino。你会看到它并不完美:我总是得到一些乱码,但很快它自己就好了。

这两个Arduino项目都非常基本,但是通过执行他们你已经开始看到,可以与传感器通信并写结果到您的计算机的Arduino的潜力所在。如果你把这两个项目整合——例如,你可以连接一个温度计到你的Arduino,并告诉它将温度写到你的笔记本电脑,你会很快实现Arduino的可能性几乎是无止境的。


via: http://readwrite.com/2014/04/21/easy-arduino-projects-basics-tutorials-diy-hardware#feed=/hack

译者:tenght 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出