GRBL CNC with 28BYJ-48 and SG90 低價步進馬達伺服機控制

GRBL簡介

GRBL 是一套免費、開源的 Arduino Uno 韌體固件,用來控制簡單的XY雙軸CNC移動,並可在Z軸上,上下移動電鑽、控制電鑽的轉速。由於 GRBL 可以透過 Arduino Uno 的 Rx Tx 序列埠串口,以G-Code進行即時通訊,因此燒錄了 GRBL 韌體固件的 Arduino Uno 板,便可以用來製造小型簡單的 CNC 自動化機器,並利用現成的免費CNC軟體,實現比較複雜的機器控制。
網路上可以搜尋到很多基於 GRBL 的創客專案,像電鑽雕刻機、雷射激光雕刻機,或者更簡單的繪圖機玩具,其實很多拍賣網上販售的木頭雕刻機、軟金屬雕刻機,也都是基於GRBL的機器。這些機器,透過一些開源的 CNC 平台軟體,可以搞出很不錯、可用的控制機具。

然而對於一些入門者來說,製作這些機器,所需要花費的金錢雖然不算太貴,但對於想要做幾部CNC機器來玩、來實驗的創客,或要做個專題研究的學生來說,所有零組件買下來,也得要幾千塊錢。而對於像我一樣,只是想要粗淺涉獵這部份知識的玩票性玩家來說,也不想花太多資源浪費在這上面。

用 GRBL控制兩顆28BYJ-48 加一顆 SG90?

基於上述理由,本來我只是想用兩個 28BYJ-48 步進馬達,與一個 SG90 伺服馬達。花個幾百塊錢零件費,來設計一個完全 3D 列印出來的低速繪圖機,藉以了解 CNC軟體與 Arduino 之間的互動關係,以及 CNC 軟體這邊的設計規劃,這兩種馬達可以輕易在拍賣網站買到,而且很便宜。但沒想到買來以後,剛開始試驗 Arduino UNO 與這些馬達連接控制的過程,就遇到困難。原版 GRBL 的設計,根本沒有考慮用這類低價的 28BYJ-48步進馬達(搭配ULN2003馬達驅動板)、SG90馬達。我想是因為 28BYJ-48+ULN2003,一顆馬達就佔用4根腳位,跟其他只用到 CW/CCW或STEP/DIR兩根腳位的步進馬達,較不受到青睞吧。
一開始在網路上找到 TGit-Tech 改編的 GRBL 1.1f版,可以支援兩顆 28BYJ-48+ULN2003,與一顆伺服馬達。但試用後發現,韌體固件設計在Pin11的伺服馬達PWM信號,跟SG90不相容。SG90的控制,需要以50Hz 的脈衝波,並調整脈衝寬度在1ms到2ms之間,來控制伺服機轉動角度。這麼小比例的 Duty Cycle,原本可能是為了省電才這麼設計。但這麼窄的寬度,以 GRBL 剩餘唯一可用的 8-bit Timer 2 來控制 (其他的Timer被GRBL用來產生定時中斷信號,用作程式流程的精密循序控制),雖然 Timer 2 還是可產生出上述的 50Hz PWM / 1ms-2ms寬度的特殊脈衝波,在 Pin3 接出來使用,但是解析度實在很差。
以SG90伺服機180度全幅轉角來計算,用Arduino Uno的 Timer2 控制,只能有8個步階,相當於每個步階,就有22.5度這麼大的轉幅,實在很粗糙。不過用於繪圖機的筆尖抬起放下動作,8個步階,還是能製造出夠OK的筆觸效果,覺得勉強可用。

原版程式修改 GRBL Firmware Redesign

為了試驗上述馬達控制,一開始找到 TGit-Tech 的 GRBL 修改版,他的程式可以控制兩顆 28BYJ-48 步進馬達。接著試著小改他的程式,以支援SG90伺服機,但後來發現,他的程式已經佔用幾乎全部 Arduino ROM空間,增加一點程式碼,便無法成功上傳到Arduino Uno。而且他的程式,選用的 Timer Mode無法輸出SG90需求的脈衝波。無奈之下,只好用 gnea 原版的 GRBL 1.1f 版本,重新大改一番,將一些被 28BYJ-48 佔用的腳位、無法使用的一些限位開關功能程式碼,以 #ifdef 語法,在編譯時捨棄,來節省ROM空間,並且在 config.h 中,用兩行程式碼,統一決定要不要使用 SG90 (#define SPINDLE_SG90)與要不要使用28BYJ-48 (#define STEPPER_28BYJ48)。去掉config.h中,這兩行程式碼再重新編譯的話,便可回復原版 GRBL 韌體固件,不會影響到原有功能。這樣的設計,對未來可能會用到的其他馬達零件或功能,應該會比較理想。
下面的下載連結中,那個被我改好的GRBL Remix版本韌體固件,經過測試,確定能正常控制兩顆 28BYJ48與一顆 SG90,而且程式容量小到可塞進 Arduino Uno 的ROM中,而不發生問題。程式中,SG90的轉動幅度控制,是以 GRBL 儲存參數中,最小鑽頭轉速($31)與最大鑽頭轉速($30)的範圍,平均8等分,來控制轉動角度。以GRBL v1.1f 預設的這兩個參數來說,0 - 1000RPM,鑽頭轉速每增加125 RPM,就會讓SG90伺服馬達,右轉一格,也就是 22.5度,反之則反方向轉動。
GRBL預設參數:
$30=1000. Max spindle speed, RPM
$31=0. Min spindle speed, RPM

馬達配線 Wiring between motor (driver) and Arduino Uno

這個Remix版本的GRBL,我盡量讓影響的功能降到最小,在配線上盡量節省,不要干擾到作者原先的設計,但還是得犧牲到一些限位開關,造成一些 CNC 的定位功能失效。按照以下的配線方法,便能夠在CNC軟體中,正常操控兩顆便宜的步進馬達加一顆便宜的伺服機。

X axis 28BYJ-48 Stepper by ULN2003 driver X軸步進馬達配線

IN1->D2, IN2->D4, IN3->D5, IN4->D7
Reverse Moving IN1->D7, IN2->D5, IN3->D4, IN4->D2 若是要相反方向運動的話,這樣配線
IN1 to IN4 are the pins on ULN2003 Darlington motor driver, and D2, D4, D5, D7 are digital pins on Arduino Uno

Y axis 28BYJ-48 Stepper by ULN2003 driver Y軸步進馬達配線

IN1->A0, IN2->A1, IN3->A2, IN4->A3
Reverse Moving IN1->A3, IN2->A2, IN3->A1, IN4->A0 若是要相反方向運動的話,這樣配線

Z axis SG90 controlled by CNC spindle speed Z軸伺服機配線

PWM wire (orange) -> D3 橘色PWM線接Arduino 數位 D3 腳位
The other two power and ground pins to 5V and GND on Arduino or external power supply

重製版韌體固件下載 Download

Download: GRBL 1.1f Remix for two 28BYJ-48 Stepper + one SG90 Servo
Files modified from the official version of GRBL:
config.h
cpu_map.h
stepper.c

沒有留言:

張貼留言