说明
grbl目前分两个版本
- Arduino Uno等版本https://github.com/gnea/grbl
- Arduino Mega2560的版本https://github.com/gnea/grbl-Mega
目前我只是研究了Arduino Uno这个版本。下面就介绍一下我怎么通过修改源码来分别实现写字和激光雕刻两种功能的。这次我们拿grbl(v1.1h (2019-08-25) Release) 这个版本来修改。下载地址:https://github.com/gnea/grbl/releases
grbl修改
- 方向设置
打开grbl源码中config.h 这个文件,找到如下代码。
1 | //#define COREXY // Default disabled. Uncomment to enable. |
如果你的机器的方向是下图这样的,就让取消注释。
1 | #define COREXY // Default disabled. Uncomment to enable. |
http://corexy.com/theory.html

这里强调一下: 这里去除注释会影响最后的编辑文件的大小。默认情况注释文件编译的大小为
- Arduino Uno这个板子的储存空间为32k(引导程序占用0.5KB),剩余31.5k。
- Arduino Nano这个板子的储存空间为32k(引导程序占用2KB),剩余30k。
所以去除注释编译的程序只能更新到Uno的板子上,而无法更新到Nano的板子上。
- 实现写字
打开grbl源码中spindle_control.c 这个文件,修改内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | //只要通过注释#define PEN_SERVO这一行,就可以实现激光雕刻机和写字机两个版本的切换了。不注释就是写字机,注释了就是激光雕刻机 #define PEN_SERVO //这个舵机控制抬笔和落笔的角度参数。根据自己的机器来设置 #define PEN_SERVO_DOWN 31 #define PEN_SERVO_UP 23 ... //下面两个函数我进行了修改。其实的代码没有动。大家可以对比一下进行修改。 void spindle_init() { #ifdef VARIABLE_SPINDLE // Configure variable spindle PWM and enable pin, if requried. On the Uno, PWM and enable are // combined unless configured otherwise. SPINDLE_PWM_DDR |= (1<<SPINDLE_PWM_BIT); // Configure as PWM output pin. #ifndef PEN_SERVO SPINDLE_TCCRA_REGISTER = SPINDLE_TCCRA_INIT_MASK; // Configure PWM output compare timer SPINDLE_TCCRB_REGISTER = SPINDLE_TCCRB_INIT_MASK; #ifdef USE_SPINDLE_DIR_AS_ENABLE_PIN SPINDLE_ENABLE_DDR |= (1<<SPINDLE_ENABLE_BIT); // Configure as output pin. #else #ifndef ENABLE_DUAL_AXIS SPINDLE_DIRECTION_DDR |= (1<<SPINDLE_DIRECTION_BIT); // Configure as output pin. #endif #endif pwm_gradient = SPINDLE_PWM_RANGE/(settings.rpm_max-settings.rpm_min); #else SPINDLE_TCCRA_REGISTER = (1<<COM2A1) | ((1<<WGM20) | (1<<WGM21)); TCCR2B = (1<<CS22) | (1 <<CS21) | (1<<CS20); #endif #else SPINDLE_ENABLE_DDR |= (1<<SPINDLE_ENABLE_BIT); // Configure as output pin. #ifndef ENABLE_DUAL_AXIS SPINDLE_DIRECTION_DDR |= (1<<SPINDLE_DIRECTION_BIT); // Configure as output pin. #endif #endif spindle_stop(); } ... void spindle_stop() { #ifndef PEN_SERVO #ifdef VARIABLE_SPINDLE SPINDLE_TCCRA_REGISTER &= ~(1<<SPINDLE_COMB_BIT); // Disable PWM. Output voltage is zero. #ifdef USE_SPINDLE_DIR_AS_ENABLE_PIN #ifdef INVERT_SPINDLE_ENABLE_PIN SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT); // Set pin to high #else SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT); // Set pin to low #endif #endif #else #ifdef INVERT_SPINDLE_ENABLE_PIN SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT); // Set pin to high #else SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT); // Set pin to low #endif #endif #else SPINDLE_OCR_REGISTER = PEN_SERVO_UP; #endif } ... |
下面是俺通过大神的资料做的





这里的扩展板我使用的是cnc shield v3 雕刻机扩展板,因为价格便宜呀。再加上两个A4988驱动板,10多块钱就搞定了。