如何使用 Arduino 製作一個繪圖儀
在上學時,科學系的壁櫥里藏著一台惠普繪圖儀。雖然我在上學的期間可以經常使用它,但我還是想擁有一台屬於自己的繪圖儀。許多年之後,步進電機已經很容易獲得了,我又在從事電子產品和微控制器方面的工作,最近,我看到有人用丙烯酸塑料(acrylic)製作了一個顯示器。這件事啟發了我,並最終製作了我自己的繪圖儀。
![The plotter in action ](/data/attachment/album/201806/04/201133gnzj86j6m8a35jh5.png "The plotter in action ")
我 DIY 的繪圖儀;在這裡看它工作的視頻。
由於我是一個很懷舊的人,我真的很喜歡最初的 Arduino Uno。下面是我用到的其它東西的一個清單(僅供參考,其中一些我也不是很滿意):
- FabScan shield:承載步進電機驅動器。
- SilentStepSticks:步進電機驅動器,因為 Arduino 自身不能處理步進電機所需的電壓和電流。因此我使用了一個 Trinamic TMC2130 晶元,但它是工作在單獨模式。這些替換為 Pololu 4988,但是它們運轉更安靜。
- SilentStepStick 保護裝置:一個防止你的電機驅動器轉動過快的二極體(相信我,你肯定會需要它的)。
- 步進電機:我選擇的是使用 12 V 電壓的 NEMA 17 電機(如,來自 Watterott 和 SparkFun 的型號)。
- 直線導桿
- 木製的基板
- 木螺絲
- GT2 皮帶
- GT2 同步滑輪
這是我作為個人項目而設計的。如果你想找到一個現成的工具套件,你可以從 German Make 雜誌上找到 MaXYposi。
硬體安裝
正如你所看到的,我剛開始做的太大了。這個繪圖儀並不合適放在我的桌子上。但是,沒有關係,我只是為了學習它(並且,我也將一些東西進行重新製作,下次我將使用一個更小的橫樑)。
![Plotter base plate with X-axis and Y-axis rails](/data/attachment/album/201806/04/201134tufjyjyjsv3k92db.jpg "Plotter base plate with X-axis and Y-axis rails")
帶 X 軸和 Y 軸軌道的繪圖儀基板
皮帶安裝在軌道的側面,並且用它將一些輔助輪和電機掛在一起:
![The belt routing on the motor](/data/attachment/album/201806/04/201134ni04ih6c9mhh94d6.jpg "The belt routing on the motor")
電機上的皮帶路由
我在 Arduino 上堆疊了幾個組件。Arduino 在最下面,它之上是 FabScan shield,接著是一個安裝在 1 和 2 號電機槽上的 StepStick 保護裝置,SilentStepStick 在最上面。注意,SCK 和 SDI 針腳沒有連接。
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 號電機 |
---|---|---|
啟用 | 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 給它提供一個很大的路徑(很多的路徑)去繪製。(在這個視頻中展示了如何繪製 Hilbert 曲線)
設計一個好用的握筆器
在上面的第一張圖中,繪圖筆是細繩子綁到 Y 軸上的。這樣繪圖也不精確,並且也無法在軟體中實現提筆和下筆(如示例中的大黑點)。
因此,我設計了一個更好用的、更精確的握筆器,它使用一個伺服器去提筆和下筆。可以在下面的這張圖中看到這個新的、改進後的握筆器,上面視頻鏈接中的 Hilbert 曲線就是使用它繪製的。
![Servo to raise/lower the pen ](/data/attachment/album/201806/04/201135q6wwy5ww6994w6u9.jpg "Servo to raise/lower the pen ")
圖中的特寫鏡頭就是伺服器臂提起筆的圖像
筆是用一個小夾具固定住的(圖上展示的是一個大小為 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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive