網路上有些許國外的範例,但都是全英文,摸索了好一番後決定來個全中文的教學。結合 Inkscape 、 CAMotics 及 Processing ,簡單的用一些文具行材料構成與 CNC 相同機構的寫字機(或我們強化機構並且將Z軸替換為铣刀就能夠進行雕刻),為了簡化,Z軸採用小伺服馬達配合簽字筆來做成繪圖機。
以試誤法省略了部分較複雜的參數設定,讓只是想玩玩這有趣應用的玩家可以更簡單的實現。以下影片為機構以及整個實現流程,各部份的文字敘述,僅重點提示並且附上會用到的程式碼。整個過程我認為最困難的地方是機構的精準度與穩定性,其他的部份照著影片就可以很簡單的 DIY 一個基於 CNC 架構的寫字機Plotter by Arduino
首先機構的部分會花上大家許多時間,且此部分因人而異,可以發揮自己的創意。但XY軸所需要的東西是相同的,皆為馬達+皮帶+光軸+軸承(加固定座),在這個部份可以參考 Youtube 上期他們的架構,而我使用的架構是最常見也最多人使用的 "龍門式 " 。 Z 軸的部分則需要一個 SG90 來讓筆進行抬起以及放下的動作,並且我們要調整 SG90 讓筆放下時可以輕觸到寫字的平台上,不能太緊(馬達會拖不動造成失步)也不能太鬆(寫出來的字會歪七扭八的),這個部分需要很有耐心的進行調整,並且會與 Y軸上的平台平整度有很大的關聯性,倘若一開始平台就沒有保持水平,那麼就會影響到後續的進行。
當完成機構後就可以進一步的進行配線,詳細的電路圖就不給了,主要就是將步進馬達經由 Arduino 搭配 ULN2003 驅動器進行控制,腳位的部分可以參考文末 Arduino 程式碼中的註解。
當配線完成後,我們首要單獨測試一下各軸移動是否順暢。下面附上程式碼來讓大家方便測試。
/*
在串列埠輸入 1 可以讓筆頭向左(之於平台), 2為向右, 3為筆頭抬起, 4為筆頭放下,抬起與放下的
數值需自行修改腳位配置
Servo signal --> pin6
StepperY --> 5,3,4,2
StepperX --> 11,9,10,8
*/
#include "stepper .h="""
#include "servo .h="""
const int penZUp = 92; //筆頭抬起的數值
const int penZDown = 77; //筆頭放下的數值
const int penServoPin = 6;
Servo penServo;
String comdata = "";
int mode = 0;
const int stepsPerRevolution = 60;
Stepper myStepperY(stepsPerRevolution, 5,3,4,2);
Stepper myStepperX(stepsPerRevolution, 11,9,10,8);
void setup() {
myStepperX.setSpeed(200);
myStepperY.setSpeed(200);
penServo.attach(penServoPin);
Serial.begin(9600);
//penServo.write(penZUp);
penServo.write(penZDown);
}
void loop() {
SerialRecv();
if(comdata=="1")
mode=1;
else if (comdata=="2")
mode=2;
else if (comdata=="3")
mode=3;
else if (comdata=="4")
mode=4;
else if (comdata=="5")
mode=5;
if (mode==1)
myStepperX.step(-stepsPerRevolution); //筆向左(之於平台)
else if (mode==2)
myStepperX.step(stepsPerRevolution); //筆向右(之於平台)
else if (mode==3)
myStepperY.step(-stepsPerRevolution); //筆下
else if (mode==4)
myStepperY.step(stepsPerRevolution); //筆上
else if (mode==5)
{
myStepperX.step(0);
myStepperY.step(0);
}
delay(5);
}
void SerialRecv()
{
if( Serial.available() > 0 )
{
char serial_buffer = Serial.read();
if( serial_buffer != '\n' )
{
comdata = comdata + serial_buffer;
delay(10);
}
else
{
Serial.println(comdata);
comdata = "";
}
}
}
接著我們將 arduino_cnc.ino(於文末連結可供下載,記得修改 Servo 抬筆與放下的數值) 燒錄進板子,因每個人的機構大小或是步進馬達都不同,沒有一個參數可以無痛使用,故這參數的部分在這篇文章中我們就不細說如何調了,有問題可以留言討論。
接著我們需要安裝使用 Processing 3.3.5 並且用來開啟 gcode_executer.pde ,幫助 Arduino 配合剛剛燒錄的程式解 gcode 檔,所謂的 gcode 檔是什麼就請大家去 google 一下就能得到答案了!簡單的說 gcode 會生成 X, Y, or Z 座標,藉由上述的搭配就能讓筆頭隨著 gcode 內的 X, Y, or Z 坐標進行移動,實現寫字的功能。
接下來我們談談要如何從一張圖片得到 gcode 檔,首先我在 ppt 打字並且將其截圖,接著使用了 Inkscape 將這張圖片生成為 gcode 檔,詳細的操作步驟如影片中呈現。
使用 Inkscape 轉成 Gcode ,還可以參考此影片或是此影片
文中所需要的程式碼可到此下載