文章程式碼顯示

2017年9月3日 星期日

《進階※應用篇》寫程式Arduino教學 - 01:DIY Easy CNC Plotter 做一台 CNC 寫字機 雕刻機


網路上有些許國外的範例,但都是全英文,摸索了好一番後決定來個全中文的教學。結合 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 ,還可以參考此影片或是此影片

文中所需要的程式碼可到此下載

↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引