机械必威体育网址
标题:
运动控制入门篇GCode_Interpreter
[打印本页]
作者:
xmdesign
时间:
2014-5-10 09:39
标题:
运动控制入门篇GCode_Interpreter
本帖最后由 xmdesign 于 2014-5-10 09:42 编辑
C3 X- ~* G/ u g r
$ d: }* W4 `. y2 A) L
首先声明
2 [9 p' }4 J. z
我不是专家,业余捣鼓
2 S: l7 F/ K- z1 o8 Z, B
源代码首先来自网络
2 S. ?9 J3 F% a& m0 l. n) j
开发平台Arduino及Maple
' r5 s0 y/ |8 g3 ?- X' C& L( J; {
http://www.arduino.cc/
7 e! i9 x( c" H
http://leaflabs.com/devices/
) J: h& [) @: g# R/ N4 ~
国内活跃必威体育网址
2 ^4 e9 ^6 ^! O; A* H7 `
http://www.geek-workshop.com/forum.php
+ ~1 N/ D" i; ^' V- j4 }
% `- _/ @! {9 D! `/ N7 R
竟然缺少积累,首先寻找最大的开放式开源平台,这样可以积累全球范围的创客和DIY者的脑力活动经验
2 a9 E8 R' l$ x
来入门了解熟悉思路架构等
# f, z- Q2 b6 k0 W
* z6 ]. W5 r4 t0 ^4 ?
我只捣鼓了下8位机Arduino 移植到32位机Maple 方面一点点事情,
3 F D# F% n n+ H3 t' s
许多功能还木完成,不过作为低档次得应用可能还有可能
/ R% @/ P& H8 \9 j: D) a
3 }) @% P' U0 T# S9 @7 p
我自己也是个半桶水,再乐意玩的起码自学能力还是要有点吧
, b$ k# T6 I. Z% ~1 J
3 h" Q& q9 h/ Y/ l5 i
拒绝 所有的求
; U4 \" s2 ~4 {! Z5 v* N
求人不如求自己 不然木玩
$ k [3 T' V, m$ l; c$ p. {4 H ^
( Q+ F. n/ V) c
高手绕道 谢谢!
, y: }; A9 z+ N5 j* g: e
7 D& s2 A0 e1 |" o# ]1 h+ [
作者:
xmdesign
时间:
2014-5-10 09:48
本帖最后由 xmdesign 于 2014-5-10 09:52 编辑
8 A. o, k: H8 Q& X
" _. o$ n( Q3 m
GCode_Interpreter是比较容易懂的,木那些寄存器等虾米开始不容易懂的东东
: O$ Z% U w. u/ I0 _! U0 n
贴代码先
; L* S# P( g3 f% d
直接Maple的,某宝许多超便宜哈
. d6 F8 r, |! K" b' \+ x, U
晕,我怎么上不了RAR?
8 s8 j6 @7 r- O: a8 h! l
想玩的留下 e妹吧
* W/ n9 Z* s" I* S. u: l+ J+ L
第一个妹麻烦传第二个妹哈
$ E; @5 l0 t, u
我平常杂事多
/ u) Z. d, G4 _1 r' R1 B
谁放网盘上再,麻烦开放下
作者:
xmdesign
时间:
2014-5-10 09:52
// Arduino G-code Interpreter for Rep Rap
9 _9 y; d1 M. G c( Q8 ^# x
// v1.0 by Mike Ellery - initial software (
mellery@gmail.com
)
9 v) Y) d2 a8 L
// v1.1 by Zach Hoeken - cleaned up and did lots of tweaks (
hoeken@gmail.com
)
* i: E* [/ ?+ b3 U& J4 M, p. V
// v1.2 by Chris Meighan - cleanup / G2&G3 support (
cmeighan@gmail.com
)
3 W6 I3 L! E* T4 I+ y' e
// v1.3 by Zach Hoeken - added thermocouple support and multi-sample temp readings. (
hoeken@gmail.com
)
& `3 }6 t0 W) \1 b d' [; g" o
7 G! b# \( a: c6 b P% W
// Arduino G-code Interpreter for Macro / Micro photography
2 [, J4 g* J ^7 x8 e( k
// v1.4 by Gene Cooper - modified and setup controls for macro / micro photography (
gene@fourchambers.org
)
6 K) e* X# n& _9 }1 l. H8 Z
//modified by YaoHan China 2010.2.15
5 P$ n6 Y" Y. Y9 p/ q$ U
//modified by JiWei China 2010.2.22 (
jwdesign@163.com
,QQ:75990175)
9 M$ o& U& i( s" Y( n; X! [1 K
#include <stdlib.h>
; v, W5 V8 N5 H3 ?
#include <LiquidCrystal.h>
% o% W/ b7 G3 r. m7 M" n9 L
$ @2 |, C5 @1 o7 r! r" m6 f" j1 J
//启动(高电平有效)/暂停(低电平有效) 默认高电平
9 O6 {+ I" z; P5 i( n0 _* f
#define BUTTON_CTL 35
4 x2 ~; A, S3 _8 u/ x
% k% ]' D, k$ G( w. _
//点动模式键(高电平有效) 默认低电平
4 J1 N( B+ f) t+ b0 J! P
#define BUTTON_SS 36
; E8 ?3 D. D$ T" d6 b6 K2 G' O
3 s. \7 }( p& r& h/ U8 o
//点动键
; W: b2 M7 L+ @1 U2 K4 x, K
#define BUTTON_MAN 15
+ L" S- `8 r% x& J, g
x+ H# F+ j# C8 }
//电位器速度控制
& U) `1 e! N3 h7 M
#define SPEEN_CTL 16
+ c* C) c2 |6 R
7 Q k: U8 I5 s" ]* D9 `& [ @
//手动调速使能
& X5 s5 Q- b: s
#define BUTTON_SP_EN 17
/ `: } U# I# F9 a5 x3 s
+ D4 _9 t4 H7 |. }5 \* }
//LCD 类型 1604或1602
B" k& Q% J6 w _; X1 z
#define LCD_TYPE 1604
- u0 Y1 H7 D7 K7 y) Q
//LCD 引脚定义
% P2 r; |! j- e) \: y
#define LCD_RS 23
. D$ A* d% b2 w" d0 X
#define LCD_EN 24
4 @! o& g0 M3 H- H- A3 [5 }9 u
#define LCD_D4 25
3 c& K$ Z. ^+ e) u& A( K! O
#define LCD_D5 26
4 K0 r' R! v3 C; B# f2 v* t
#define LCD_D6 27
8 H+ o6 O6 E" ~8 R) o2 k
#define LCD_D7 28
8 Q* d$ m' t6 p
0 y1 W/ t6 }% r7 v* a
//命令字符串
, J9 X2 M$ Z( Z$ [ U
#define COMMAND_SIZE 128
: n, g/ I3 N) ?. X) i
char word_old[COMMAND_SIZE];
5 p0 C. H: f# U: Z
byte serial_count=0;
8 G7 f( A0 G5 h6 a3 E/ z( i+ A
int no_data = 0;
/ O# u! T/ p" X4 g
//LCD 引脚链接 配置
`0 m! O3 Z" k6 G2 O
LiquidCrystal lcd(LCD_RS,LCD_EN,LCD_D4,LCD_D5,LCD_D6,LCD_D7);
. v0 n" G3 k+ b- a/ k* U4 \
//停止控制,高电平有效
: o& o6 |) f7 v7 l! L+ I& L
#define BUTTON_STOP 30
4 }( y, X) [" B# ]+ t4 @/ C
int stop_flag=0;
5 @% r# J9 @9 k% H4 A
: y; T& q. H# H
//暂停
) w0 M; \; q0 z0 w }* |
void pause(){
/ H- B& g+ B- d8 U* a9 L
while(!digitalRead(BUTTON_CTL));
" j0 ^, Z6 G3 }
}
) K' l: r: c% x! \ [/ T/ X
: B3 f; p( h$ V( W& y4 Z8 f( i
void stopper(){
/ d0 `& f3 o' ^: g# X. `8 b
delayMicroseconds(10);
8 a0 R o5 u/ l) w: E" ~/ [7 g
stop_flag = digitalRead(BUTTON_STOP);
& n7 U( s4 Y' _: c! T8 f
}
: J: _0 S- }* _- A5 O6 ]! K/ H
x f- t% b H. U& Q2 ?
void setup()
) k& {4 J9 E- K- m8 m9 ]" `# o
{
8 P/ |5 t9 h4 A! z& X) o
//show start
0 M0 Y, v; C- W0 j, f/ h
SerialUSB.println("start");
$ f5 X/ |* z9 u4 {# ^+ b1 k
% b# z; R9 ?# D: X+ i8 z+ f3 G T
//启动lcd
( x% ~% @$ q+ b: A
lcd.begin(16,4);
/ V4 J; q$ K1 `: b2 X. X8 t
lcd.setCursor(0, 0);
/ r7 ^9 L1 w6 E
lcd.print("hello, world!");
) `! }* Q3 }9 v5 f: G( W
( O, D; r+ Q# n
//初始化控制引脚及引脚功能
3 J6 g; z9 \$ i; h$ J8 V" \
pinMode(BUTTON_CTL,INPUT_PULLUP);
9 ?" O5 O3 [- r
pinMode(BUTTON_SS,INPUT_PULLDOWN);
4 O, ~9 V& q7 D) b1 @5 y
pinMode(BUTTON_STOP,INPUT_PULLDOWN);
* {) Q% C0 N" u9 u
pinMode(BUTTON_MAN,INPUT_ANALOG);
* L+ v* C8 `* f# ?" E
( K0 z0 F7 c0 ?$ u
//控制引脚的中断
- d' {( g( D. A
attachInterrupt(BUTTON_CTL,pause,FALLING);//暂停的中断
: u Z" E/ D' W
attachInterrupt(BUTTON_STOP,stopper,CHANGE);
6 P8 X; c' R5 x* { h, @1 ?
) N X8 z( U/ E2 \9 R/ K
//other init
, s; J9 G% a% F! [- B3 u
init_process_string();
* C: u3 _8 }& c4 ^! c9 N
init_steppers();
7 M! N8 H6 X, m, \$ j" n
init_camera();
4 l6 k N' `4 F) K
6 R1 U8 l U, Y* @
}
' {+ t% c, G4 q6 e% r
" i `) n8 ^3 _; z
void loop()
& z4 a; [+ n: l' F7 ?
{
" [- r) ~: e. J+ ~8 v8 E
char c;
9 J' f6 Z4 P: e; O
6 K5 c+ X& t( \5 ?. V* o7 S- J( Q
//读取输入的字符
?' n/ X8 q+ y
if ((SerialUSB.available() > 0) && (!stop_flag))
7 R9 r% Z& E3 B _, c' ^
{
9 K3 n/ p2 W6 T
c = SerialUSB.read();
# W# E; [* i# x2 H+ ^
no_data = 0;
4 l! G0 l4 m( N C: D9 `% `
- E( }- k: Q5 ~
//换行符代表一个命令的结束
/ m! ?, k# u( |6 A6 V0 X: a) Y
if (c != '\n')
0 K5 `9 y" B& j9 t: r
{
( V$ T3 v" z2 {/ U
word_old[serial_count] = c;
, G; [: U# |- i" E0 H" ^
serial_count++;
j1 V8 C5 U I e( x7 t4 v
# N, O) {8 U9 q2 R) Y
}
/ a7 u' R; j& `
}
) x* X" W- ]: z% J% J& D L+ S
//标记没有数据输入
! b! t' R- T9 L0 z" \2 F5 Z
else
9 ]1 c- F& w( Y$ v$ t
{
# Q n9 p7 C X' z( \1 a
no_data++;
3 y( b- P9 M, y" R9 Q& G. H( s
delayMicroseconds(100);
, |* o# k2 Z6 z6 F, ?
}
1 S6 g+ A" ?" j9 z& x; M6 k
. Y9 s2 Q, i" a; T! k$ @4 f: x
//if theres a pause or we got a real command, do it
; Q9 Z# V1 x% T+ B
if ((serial_count && (c == '\n' || no_data > 100)) && (!stop_flag))
( Q' y" p6 u% S) }; f, p
{
/ m0 u: [ b: _" `1 k# p
7 k$ m& D4 e ~( f* n6 y( _: b
//处理命令
7 Y7 E4 A* E! [$ R
process_string(word_old, serial_count);
5 r! w8 j8 A: ]: v# i, y2 `
( `, P1 J/ _) Q2 b' A0 J) r$ W& f- U
//清除命令
' j4 }5 l2 W" \5 k
init_process_string();
) a p, K* e- D7 P+ O5 n. V
}
" d5 T2 S( @ w# o% E$ w* ]4 B
2 b" j9 Y0 a, z" V( i5 w0 c7 l
//如果没有数据关闭电机
# v O* R' ?9 S: [1 ~( I
if (no_data > 1000)
k) P$ \; T* l7 u) a; u# k: f' b
disable_steppers();
9 y! q! f) I: }
5 o$ f k3 G' Z) K1 c2 N' }3 N
//如果ss键按下进入点动模式
# V+ L, Y; R( `* l& q' u8 [
//if(digitalRead(BUTTON_SS)) ss();
3 i$ p2 w% d1 Q0 Y
run_a();
) R/ M4 R- {$ Z4 b T( z0 g3 F8 K
}
7 G3 g2 O% ^* O/ g
+ d$ x) r! n: h9 s' p
//点动模式
; B7 k2 I# t1 ^6 k
void ss(){
4 q" [+ v; r7 K) p/ j1 r( l: ~* G
. p2 x# n- ~0 i! L& C7 V" h+ \
delay(1);
$ B6 _8 t% q3 Q# D/ @1 Y& T
if(!digitalRead(BUTTON_SS))return;
) x; D" s7 k2 d6 k! }6 P
if(!digitalRead(BUTTON_SS))return;
8 T6 k" T8 e% }5 o
//init_process_string();
Y# u$ D* B0 n( s& w5 [- x
//init_steppers();
) n& o' ]8 ~# q
//init_camera();
6 J, W6 f+ L: |8 c! r
3 ? }! [; H8 G' h% A( i
// SerialUSB.println("Step By Step Mode");
( h1 P0 H! }% ^) o8 F w
//#if (LCD_TYPE == 1604 )
" D( h7 c* p$ a |5 {5 j- I
//当LCD为1604时显示要处理的命令
0 q9 b+ I& o- z6 G; m# f9 p% [9 z [
lcd.setCursor(0, 0);
5 c# D$ J6 o) p0 h) W; ?" U
lcd.print("Step By Step Mode");
6 o1 C4 u( p) M$ Y. L8 \( {. C: m, V
//#endif
0 a |9 ]1 O7 D7 r! ^0 v
process_string("G1 F5000",8);
) O7 Z* C& \( e- c3 c$ n7 W3 R
process_string("G91",8);
* R) J: S0 J6 {! l8 {
//init_process_string();
6 x3 d' `, G) ]4 t$ N
; _# p7 h1 |, `; e! g/ u
while(digitalRead(BUTTON_SS)){
# ~. m8 P, q( }; z8 i$ s* u
int i=0;
" [7 T9 r% f6 a2 I8 R
i=analogRead(BUTTON_MAN)>>9;
& X1 e9 |: k* b- X* X1 w6 o
//if (i==0){break;}
4 b) V2 {, J0 `7 G4 D2 E
//SerialUSB.println(i);
* T/ C- ]4 Z- o
//delay(1000);
) ]: J/ d! W5 K c' ]
: Y {$ N9 m8 ]" t8 V2 @
if(i==2){
- S8 ~4 }0 O9 q4 u2 ~
set_target(1000.0, 0.0, 0.0, 0.0);
, {9 X2 }9 x9 D+ Y* o
dda_move(getMaxSpeed());
7 t }1 b: I B
if(stop_flag) return;
1 z) a' G) g& h8 w6 L+ Q; c
//process_string("X0.01",5);
- l* s) @3 u' u
//init_process_string();
/ y/ v8 H9 Y, B; f
}
! K/ b1 ~) P( q
else
+ |$ e+ P) R! s- {
if(i==5){
' o a: U4 {2 ?
set_target(-1000.0, 0.0, 0.0, 0.0);
( x. j3 C" N; m/ ~; a& I* F( t0 v3 k
dda_move(getMaxSpeed());
# {2 V$ {, Z' r2 z
if(stop_flag) return;
* S9 w, i0 E: D q, R' R0 u
//process_string("X-0.01",6);
9 W! u( n( B0 B# M {# w
//init_process_string();
! v) o4 {3 v M
}
2 \" R. m) H: ?; Y
4 ]2 w5 D- ~: T1 c+ }1 B3 [
4 a( o/ k. }- M/ Q. |
}
2 g I4 ?& K3 j( Y7 k; H0 t/ b
$ x- x, z0 G* A' p
//init_steppers();
& Z7 L& A& x0 d* i9 ~
//init_camera();
- _$ w2 I" z8 r/ @( d8 J/ m
// SerialUSB.println("Return To Normal Mode");
|6 w2 z9 J/ S
process_string("G1",8);
! g3 i" S' ~% C* ]
// process_string("G91",8);
! s+ `1 X/ O" U; X7 L6 S4 L
init_process_string();
5 r8 w2 r* }( F2 S$ s
//#if (LCD_TYPE == 1604 )
( H: [7 i5 v9 r9 u. a7 w8 s0 B
//当LCD为1604时显示要处理的命令
& @2 T! g1 A3 H5 G) E
// lcd.setCursor(0, 4);
+ u+ x. y6 Z3 u j2 ?" x
// lcd.print("Return To Normal Mode");
/ a1 n8 x u. x. L+ g, y* _) H& g
//#endif
0 y4 Q1 k. E( Q: R
}
; t8 J2 G' J) j5 P" W
% u) Q: q$ l/ @
void run_a()
$ ?' t( X# L& A8 }9 L
{
8 Y2 P/ J7 B7 I
//delay(1);
1 S( t. D; V, @! B. `" E7 K' m
//if(digitalRead(14)== HIGH)return;
0 W, ?) ?* X) s
//if(digitalRead(14)== HIGH)return;
" Q& k4 t# ?. F4 m5 n
//process_string("G1 F2000",8);
3 g- ] ~) T- G# z( q
//process_string("G92",8);
$ h9 {/ ^; S* F7 r9 R/ _+ i
process_string("G90",8);
/ N7 t4 l6 F6 _3 B1 ?) G0 `9 V
process_string("X120 F10",5);
+ L7 z% f+ p8 Q0 u
process_string("G4P2000",8);
3 f# a* s8 y; I/ _7 ]2 j! Z
process_string("X10 F10",5);
: j9 ], L) ]+ B
// process_string("M101",8);
! [7 b a% L8 r
// process_string("X-50",5);
4 [$ F, `1 \% p) V8 S8 i
dda_move(getMaxSpeed());
8 K6 k/ `; p6 \" o+ k+ E
init_process_string();
# O1 V3 l9 o" V
3 i! R' D9 }2 s8 o' m$ v* Z
}
! R8 K8 W( _% i( T
作者:
xmdesign
时间:
2014-5-10 09:53
4 ^. {4 W; V% l( N3 m/ e5 [
- W9 `; N; T [9 T3 C
// 定义机器参数
5 w# \; z& X( X7 I7 O) W
#define X_STEPS_PER_INCH 400
( u3 v' P* R$ u- @
#define X_STEPS_PER_MM 16.0
* z7 d& R% y8 K% s* ^& _. n
#define X_MOTOR_STEPS 200
7 \7 s& U; X* G! Z
6 v7 R. `! N1 H' ]" f# ~ r
#define Y_STEPS_PER_INCH 400.0
4 V; @$ t z& v# o5 D1 y; p
#define Y_STEPS_PER_MM 16.0
9 {- `- l: D* J4 G
#define Y_MOTOR_STEPS 200
+ a+ a. U! F4 @- ?) j8 g1 K
& t' r6 H, s" K2 t$ \
#define Z_STEPS_PER_INCH 400.0
# a) c+ h0 a! `+ Q
#define Z_STEPS_PER_MM 16.0
' G5 }8 _1 @. S: T) f' t# b) ^
#define Z_MOTOR_STEPS 200
9 b% n0 I2 `/ W4 Y* i4 G1 D
' D1 R8 M9 d- c* E* [
#define U_STEPS_PER_INCH 400.0
; m0 }1 v# v5 c+ b1 F$ f5 T5 s! J5 Z$ m: t
#define U_STEPS_PER_MM 16.0
1 |# a$ ]5 v/ N
#define U_MOTOR_STEPS 200
v1 }; V: K( W- Z8 P6 k1 Y0 S
$ x2 [ f: t4 z L+ }- G8 {
//最大进给率
9 w8 M3 Z' y8 o. r3 j
#define FAST_XY_FEEDRATE 1500.0
8 m3 P% g5 q6 i' C! I
#define FAST_Z_FEEDRATE 1500.0
. `2 q' W- P0 L$ |: M9 Y; v" m/ d' [
#define FAST_U_FEEDRATE 1500.0
* ~2 T2 G* g/ v& r3 c" q
// Units in curve section
/ b, }9 Z( w9 J1 g: B, k
#define CURVE_SECTION_INCHES 0.019685
1 p1 D8 ~6 O A, L Z
#define CURVE_SECTION_MM 0.5
# T- V J" f# R5 E, m' P3 H
' I& ^! Z" G; J: n4 r; x8 D
# ^/ m% ]* T: n* j2 p4 l3 d b& }2 n
// Set to one if sensor outputs inverting (ie: 1 means open, 0 means closed)
+ P* J# J; u+ }
// RepRap opto endstops are *not* inverting.
) K R& Q5 ~: h Z' p
#define SENSORS_INVERTING 1
' k. f, q5 H) ]4 P7 ?5 n9 C
, D5 @2 G' L( R! T9 R; L
/****************************************************************************************
) ]4 q0 h" _! `# w7 `4 {6 q* p
* digital i/o pin assignment
. C/ h6 @( H: s j9 Z9 M/ k; z1 J
*
: Q. @/ C) b* O2 | A) P1 n
* this uses the undocumented feature of Arduino - pins 14-19 correspond to analog 0-5
) i1 w" S: p8 D3 w! [& K- |! Q
****************************************************************************************/
* t+ _( u; F- B1 G9 y8 ^! p3 k
! |. {* N3 k' \! g+ _( v" q" T. p
//camera shutter and control pins
( L9 _+ W; e/ J# ~
#define CAM_SHUTTER_PIN1 29
3 w$ j" o/ Y2 G1 X# {0 M0 R
#define CAM_SHUTTER_PIN2 30
! M/ @! d. F k, \) S
//#define CAM_AUX_PIN1 31 // analog 0
& q- w0 u8 ]1 _* u
//#define CAM_AUX_PIN2 32 // analog 1
; @9 [! l; ?, C, z3 @
//#define CAM_AUX_PIN3 33 // analog 2
0 ?# S! \& H; L$ {
//#define CAM_AUX_PIN4 34 // analog 3
- ]8 }' o L5 N, q$ `
9 O/ `6 x, V) p, h8 l6 h' q
// stepper driver pins
- x* R7 g3 k4 j9 {1 ~- ?9 x0 L
#define X_STEP_PIN 7
, y. Y: }5 U/ p- |
#define X_DIR_PIN 8
- g3 c( F0 t" B- K% r
#define X_ENABLE_PIN 19
# ?" N2 v! t$ `# z$ H2 j8 F2 y/ ]7 x
6 H; s, d. u% p8 u( q
#define Y_STEP_PIN 9
& F" n: b U9 c3 z# s# h
#define Y_DIR_PIN 10
( S; u4 m( W# }6 k; O; Z+ Q# f" I
#define Y_ENABLE_PIN 19
/ k K* K. i+ L
3 D( D) u' ^( W( a+ A( e5 f
#define Z_STEP_PIN 11
9 q2 F& }+ d" Q( p. f2 b5 p
#define Z_DIR_PIN 12
% W3 u; j6 A7 r0 `
#define Z_ENABLE_PIN 19
6 m5 M# y; a, C
& g2 y" L: _! w6 a' a" L
#define U_STEP_PIN 13
" H6 S$ P3 h2 J- n/ \% F0 k
#define U_DIR_PIN 14
4 J ]' u& m d$ g
#define U_ENABLE_PIN 19
! x2 |4 @8 N, x
7 s# ]" X' @3 `
// limits not used right now
% ^! o) S+ L0 o! z% N( }3 Z- z% ?0 I
#define X_MIN_PIN 14
5 ~7 r) O5 c6 [7 d0 q
#define X_MAX_PIN 14
8 R# Z9 f! U% Y* o" V# u5 X/ g* y: U
#define Y_MIN_PIN 14
; o7 r: `9 ^( _5 c! e
#define Y_MAX_PIN 14
6 W( r( }- @% l& `. Z: X
#define Z_MIN_PIN 14
8 M! ?, _/ S ?
#define Z_MAX_PIN 14
4 E0 _' n* ^4 V6 I6 `3 K
#define U_MIN_PIN 14
; Y1 s" `9 U8 {- r8 `1 C- j
#define U_MAX_PIN 14
6 v5 {5 E' P- q% ^! h" s
作者:
xmdesign
时间:
2014-5-10 09:54
void init_camera()
! v- N2 }) i3 Q' _ m0 ]' c4 z
{
+ g0 U: B. B* ]& ?4 U7 N+ x
pinMode(CAM_SHUTTER_PIN1, OUTPUT);
6 [6 k/ ^3 A1 c* c' D- E
pinMode(CAM_SHUTTER_PIN2, OUTPUT);
5 a4 W8 L0 \3 G+ s- _
//pinMode(CAM_AUX_PIN1, OUTPUT); // analog 0
, Y, \3 ^0 H0 v4 ~+ k5 [
// pinMode(CAM_AUX_PIN2, OUTPUT); // analog 1
" G# F' ^( F/ o6 A* ~) J6 U
// pinMode(CAM_AUX_PIN3, OUTPUT); // analog 2
/ }# r h0 x$ C
// pinMode(CAM_AUX_PIN4, OUTPUT); // analog 3
" H, l. s# Y# s. K6 c, {
}
# [# P2 \- d4 d) m# o9 ~$ o
# o0 j( h" X0 `5 R" g9 A/ ^
void camera_shutter1()
* ?9 l6 g6 n, L; L4 j
{
! [4 E) N% `3 v
// fire the camera shutter via relay...1/4 sec hold time
6 G" e- `% s2 F/ ~
digitalWrite(CAM_SHUTTER_PIN1, HIGH);
$ v Z7 X2 f' y; ?, W
delay(250);
+ u: [& O9 o& z7 a
digitalWrite(CAM_SHUTTER_PIN1, LOW);
9 _0 s; W7 g' ~, P8 C
' C4 n6 v. K* F+ k8 O
}
! e7 I0 K. |0 i/ d1 `
. f, }( x' |; y' {
void camera_shutter2()
0 P7 D$ f7 P/ C* j% N0 z- v0 y3 X
{
7 i1 E7 d4 H' t' ^# ]
// fire the camera shutter via relay...1/4 sec hold time
* ^6 a% G) J8 I
digitalWrite(CAM_SHUTTER_PIN2, HIGH);
! c8 l4 e/ n+ t! {5 `8 z3 Q0 N* x- }
delay(250);
( ^2 w) O( L( j
digitalWrite(CAM_SHUTTER_PIN2, LOW);
, z- t0 c9 ?) o0 l" R+ |9 \
3 y( r6 C3 b# V* o
}
) d- k& B @7 c# ^) w& |5 ]
/*
$ r3 H* `, S _6 @7 u) h! r
void camera_aux1_on()
/ g5 u( z! V: O: g, @& J
{
; z3 X* h& m% [% j; X1 h5 u. L6 @
// turn aux relay 1 on
0 s7 z* K4 w/ @* R! ^
digitalWrite(CAM_AUX_PIN1, HIGH);
' v# d% u: H4 O& l" ~
}
/ L; `- e) a9 P6 ~% i$ p* x
5 \+ t+ Q) V: H9 f3 s# E! E
void camera_aux1_off()
% Y1 B4 o' s) ]2 z! |3 S
{
; Q- b/ }% I; h8 V, o; t0 X
// turn aux relay 1 off
' _/ {; k6 h! w- s
digitalWrite(CAM_AUX_PIN1, LOW);
) W* u" ]" H5 i3 T0 l- n$ r; k! R8 Z0 G
}
$ T+ J* v) }: f6 w- I* W2 U
3 S+ ~ m& U' I, Z( A
void camera_aux2_on()
8 U1 E0 k# t. F4 J( d0 E
{
+ U) S: U9 J J0 \4 N
// turn aux relay 2 on
& n2 Z- l7 o* x. U
digitalWrite(CAM_AUX_PIN2, HIGH);
/ q1 ~, ^& W, q5 r% K" L, t
}
0 U" Z ]; h8 a1 Q
! B7 L* y7 N. h* }8 d( L
void camera_aux2_off()
0 I1 s# {* m- K3 _: e0 I0 q2 i
{
- Q/ J |- y6 d
// turn aux relay 2 off
/ @$ v9 Y! G" D6 _
digitalWrite(CAM_AUX_PIN2, LOW);
- R+ Z2 u+ r9 S
}
7 a& K4 m, j( N! N$ M4 `
. }* A4 S0 ]$ S/ B
void camera_aux3_on()
2 y6 J! B2 \. A V$ | e: P' U
{
/ O% L( D2 D: P1 F8 i& O
// turn aux relay 3 on
9 T' k; X1 \1 u; n! ~5 j8 K
digitalWrite(CAM_AUX_PIN3, HIGH);
+ e5 @7 `0 n: T+ a: v& v
}
# R0 `8 g) U- o: P$ S
1 Y! J3 l) \" I+ m4 B9 @( j H
void camera_aux3_off()
. E+ M R0 q* f9 y
{
, z( _2 f" R$ i$ G8 x
// turn aux relay 3 off
, s" I* V& V" I5 \2 n! d
digitalWrite(CAM_AUX_PIN3, LOW);
! O7 m+ X- A) \7 y& j
}
7 C2 V6 v `' x. R) J
5 D% v3 @) z! s8 R0 O! z
void camera_aux4_on()
' [# h5 Z: n9 R& I- m
{
8 l/ h" e" V+ f* s
// turn aux relay 4 on
- t5 I7 A4 X1 \4 Q
digitalWrite(CAM_AUX_PIN4, HIGH);
2 H# l( h+ _& Z1 A, I v5 @0 E/ n% `- d( {
}
+ ~" U& M; a2 E) L1 B' j! N
" i/ x% X: ]! r6 w; U7 A z
void camera_aux4_off()
- A; ?$ `; a7 H! r# P
{
) }7 ]( ~( N. Y) _
// turn aux relay 4 off
- o0 f* g8 Q7 A: a. d' ?% W, B
digitalWrite(CAM_AUX_PIN4, LOW);
. W9 q4 z0 T# h7 K
}
作者:
luxiang821
时间:
2014-5-10 09:54
楼主推荐的网址不错
7 s! I- X# x8 w W% j% t, e( E
请问楼主是玩什么的,用乐高玩具吗?
作者:
xmdesign
时间:
2014-5-10 09:55
// our point structure to make things nice.
, x+ n) k3 C( U" s+ \ d+ A6 P
struct LongPoint {
) K: b* y+ l- t8 ]* g r( c# Q
long x;
! W' s5 E5 T9 z. t0 c( f
long y;
# t r4 ~/ |5 f
long z;
$ Q/ `: f3 W* w/ h6 g- S) p
long u;
O& o! m' g9 r7 h2 b
};
& n) D4 p" B. g* i
" E# }5 P2 N* S9 w! o# m; d: Q4 B
struct FloatPoint {
8 F! @/ { t5 E2 ~
float x;
2 p# l( F* v j
float y;
" t/ u' H+ k$ ^: h9 N, f2 q
float z;
6 H2 a) y) o& C5 C
float u;
4 S3 x9 d9 s+ l0 I+ h& \
};
. g! |: z6 B- j& H! |9 O* b
4 V0 W; ^) a: S' G. @8 Y3 L2 p
FloatPoint current_units;
6 w7 G3 R4 z$ T [) w2 H
FloatPoint target_units;
! Z/ V8 n I# E4 z9 j, Y
FloatPoint delta_units;
2 B$ I" }/ ~" Y- k+ I/ U; v6 K& G
/ X; [4 }: h/ \- C9 R
FloatPoint current_steps;
: ?/ w: O" x7 j( r5 n3 w
FloatPoint target_steps;
, A2 T+ o. d5 U+ Q( n3 j7 j
FloatPoint delta_steps;
" T2 N' H7 N4 e4 T& [ G8 G
( p' N0 |1 M9 A" F/ v* U1 ^9 g* P
boolean abs_mode = false; //0 = 增量位置模式; 1 = 绝对位置模式
9 S5 `! G! m& h" ~: G; t
- M8 [. Z( T2 _
//default to inches for units
7 Y1 K. G* N' k7 l+ C
float x_units = X_STEPS_PER_INCH;
) M% ^* Z, G6 ]1 W3 k1 y
float y_units = Y_STEPS_PER_INCH;
0 C5 w0 }( G+ @$ C7 x+ C
float z_units = Z_STEPS_PER_INCH;
- h. H2 ]1 L/ T( O3 t- l4 ?0 b
float u_units = U_STEPS_PER_INCH;
) r) j- f5 E, {2 r2 [( E
float curve_section = CURVE_SECTION_INCHES;
+ L. b+ z# l5 b# X- B* Q! y
7 D6 h) e% v' d* i. `5 D6 K0 O( L
//our direction vars
6 m. U1 E, n# I3 r3 X! o, I
byte x_direction = 1;
7 H0 [; C7 a H8 Q l4 J5 {' `% L
byte y_direction = 1;
: U B! m, Z/ Z
byte z_direction = 1;
7 @9 @- y% w/ Y$ e9 J; n5 p
byte u_direction = 1;
; L( |6 Q. y# V2 k! q+ Z
& W E4 H. h/ b1 r6 O
//初始化字符串处理
* U$ h1 {$ @: ^7 B8 L' L$ l
void init_process_string()
6 r7 d% Q V( N
{
! \ b- E$ }: X. d& M, `* u# n" [) S
//init our command
* S2 p8 Y7 i/ U
for (byte i=0; i<COMMAND_SIZE; i++)
0 H* o0 K6 j# D) F% W
word_old[i] = 0;
) ~+ D) m: \4 i" c1 z2 u) u% r
serial_count = 0;
) c% A+ l% ]9 o7 ?3 @( X% M
}
8 q+ V# b3 X, h. G2 s$ t6 ^2 ~3 f
4 x4 l. \, u+ z! p) _0 y
//our feedrate variables.
3 b$ O* i: F' Y3 g& [# [" |
float feedrate = 0.0;
5 l" S( W- N; o9 z
long feedrate_micros = 0;
: U' C/ ]* W6 Q
. [1 ]1 z+ s/ N0 L! H4 d
//读取并执行命令
7 f5 Q$ Z l" Y) w/ G( Q, a( V
void process_string(char instruction[], int size)
/ w6 J( v( j' T' m5 V
{
$ H: z& S' O8 v
//the character / means delete block... used for comments and stuff.
0 u, |7 T; y8 b0 {
if (instruction[0] == '/')
: P$ n4 f8 [% i
{
8 V+ B+ V9 F' }9 H. t
// SerialUSB.print("ok");
. }6 `% D/ i# s9 `/ M2 P
// SerialUSB.print(byte(78));
% v. C* w3 I: `3 j3 ]" Y% c5 \
return;
4 }- B% m8 k& x0 W, o
}
3 b1 @, s$ a* W0 I5 a* N
//init baby!
' q+ n2 U& G7 g1 z' G6 b% F
FloatPoint fp;
' ` l5 L; V% L L
fp.x = 0.0;
, [" z: U, M$ S, N1 S( Y
fp.y = 0.0;
: t/ |2 r* ^$ d* p0 W
fp.z = 0.0;
! l( E" o4 ~- X8 g* n# r! O
fp.u = 0.0;
2 t( S1 y' k% s2 Y' p7 T: y) s4 P/ |% h
, S! G9 ]" `' y& }$ j; B" P4 O
byte code = 0;
" I' I- l2 K* c6 a0 `% W& v* B4 a" m8 _
& m. {8 d* p$ X3 v% ]1 V) ]8 Q
//显示在处理的命令
; ~/ t+ f+ o$ p- E
#if (LCD_TYPE == 1604 )
) D0 h* B( G: m2 H. w+ ?- O- J
// lcd.setCursor(0, 4);
' ^+ Q) P# J+ a3 A3 \3 [& k' f. c1 d
// lcd.print(word_old);
! W k r5 r" x1 |( Y: U, L
#endif
2 J3 @8 a: g6 _: H# o' P I7 X
SerialUSB.println();
2 ?& H0 d& ]' m6 f; e1 V
SerialUSB.print(instruction);
1 x$ x4 P& `" V; ~& ]& f
SerialUSB.print("\t");
5 r: n% J6 w/ L- T& ^
; V) Z1 I7 M4 |0 L0 o& f
//what line are we at?
; T+ X/ w+ X9 J: t! q
// long line = -1;
3 O/ W9 Y; T$ `
// if (has_command('N', instruction, size))
% R0 u" K1 N- w( p, U, Y
// line = (long)search_string('N', instruction, size);
2 Y" E t3 u @ l4 `2 M8 |
) Y1 R4 q. b5 G& }0 C5 L
/*
: S. }. y, m& L9 L, Y4 Q6 H
Serial.print("line: ");
; C% n, y2 }8 W& s0 Z
Serial.println(line);
' h) _" p3 [ K: Z4 Y+ d
Serial.println(instruction);
( W9 t/ ~# f( M) ?6 I. F$ R
*/
0 s) k: ^8 ]# y! C, G: n S
//判断是否读取了个 G代码?
! a5 ~) i& `1 u: [3 k- i. T
if (
, V) I; H7 T( V
has_command('G', instruction, size) ||
- W0 u2 |" O7 y$ A; g
has_command('X', instruction, size) ||
" f6 X3 s4 a, j0 U
has_command('Y', instruction, size) ||
- r9 a* ~% o$ J
has_command('Z', instruction, size) ||
- y$ k: u( N6 b7 t3 g2 h
has_command('U', instruction, size)
0 p. ^. E, I6 R5 k
)
% y) {2 z0 J7 g; K% L. h+ z" E
{
: a7 a$ u3 q+ M) m; W7 _( E. F
//which one?
6 [' d; r. m5 }3 @. l$ L& ` X
code = (int)search_string('G', instruction, size);
" a; l; c, t& G* V- l2 a* z
// Get co-ordinates if required by the code type given
/ o9 {0 L& E! @' U! H
switch (code)
9 g% I7 i' C, a. a7 o6 T2 N
{
! `" q: G- O/ R. q/ a/ z$ ~2 L
case 0:
& w, B' F i0 Z K! A
case 1:
" s/ a L5 y7 m* q- S
case 2:
9 r# x4 W) i) n
case 3:
! J2 L$ S% s$ f3 v
if(abs_mode)
# v4 _3 S9 c6 v- A1 \
{
4 ~( s& n& o9 \% @' ?! q: u
//we do it like this to save time. makes curves better.
+ [4 g! w) i( X" k/ F8 H [
//eg. if only x and y are specified, we dont have to waste time looking up z.
0 A; Q+ |+ U$ W4 P8 S
if (has_command('X', instruction, size))
5 a" T3 d& K/ T3 j
fp.x = search_string('X', instruction, size);
6 c! [5 I. f& x: Q) N0 I, F& \
else
7 P. Y" D! D, L. }" j* o3 I' m
fp.x = current_units.x;
# v" O* m; D# Q" \
. I( p/ o. n, i5 a5 T# S2 }
if (has_command('Y', instruction, size))
1 U! y5 l a$ W6 w
fp.y = search_string('Y', instruction, size);
( c" }0 m1 e/ }9 ?4 Q" G
else
7 E! B( t2 a4 R. G0 S: A1 m8 W- T0 {2 i
fp.y = current_units.y;
7 ^; m2 {7 G% p8 t, `7 B, f' c ]& o
; I6 A5 W2 p' D: Y
if (has_command('Z', instruction, size))
) @( x) O X/ t/ Q
fp.z = search_string('Z', instruction, size);
/ s- v9 W' ]1 @; C% x8 i
else
$ h, S: c+ l: Y+ d, B
fp.z = current_units.z;
, H" j' E8 G! A/ G
# c8 p) u8 f5 a) m" w1 L
if (has_command('U', instruction, size))
H) Z' Z6 k. c$ W0 U' S
fp.u = search_string('U', instruction, size);
! [) J# ~0 n5 V; T4 j9 ]! o @
else
9 v% H# r) W4 n4 v
fp.u = current_units.u;
; L4 ^3 w& z; s2 {7 @
}
8 k" A3 m+ r$ {. G. n1 ?, L% z! n) b. M
else
$ g, v) `' a- Q- S
{
! w) u; t% B8 m6 d% f9 J( z
fp.x = search_string('X', instruction, size) + current_units.x;
8 I+ z+ B. G- Y- a, N: A
fp.y = search_string('Y', instruction, size) + current_units.y;
# _* M% x" y% _) E/ F, c @
fp.z = search_string('Z', instruction, size) + current_units.z;
: O: Q/ D8 A# i+ D
fp.u = search_string('U', instruction, size) + current_units.u;
8 A; h$ I* o* O8 V
}
0 W+ S# L6 c( `. d3 V( i+ C' |
break;
7 T, ^4 V" [- K: H- e: y8 e
}
/ L# W; a# t) l7 \3 J
//do something!
" X* u7 Q G6 |5 {4 f6 w. r6 a
switch (code)
% S: v" H) ~8 C& s' w. D
{
+ g- A8 l5 D a v# I
//Rapid Positioning
2 ^/ j# p* D' D" o8 D$ z
//Linear Interpolation
% W' v, k; e0 x; N2 @
//these are basically the same thing.
* n5 o6 Y+ u l& j5 k1 s; D! k
case 0:
+ d- G- q6 R$ z
case 1:
% a& J; ^3 Z/ ?& I, V
//set our target.
4 E0 C. E9 d+ N. s f! T" k7 D
set_target(fp.x, fp.y, fp.z, fp.u);
% c# k, l' c8 V: R i1 l/ u( S
//set_targeta( fp.a);
& Q4 F1 Z4 |& {& f/ _* n8 T) h
//do we have a set speed?
B1 S2 U# L B" C2 ~
if (has_command('G', instruction, size))
, ?, p4 [3 W6 Z
{
: o, M: }9 a$ U$ h# _0 W2 A
//adjust if we have a specific feedrate.
. f' y- Z7 `* H+ C
if (code == 1)
& `8 ~7 j8 r; [
{
2 V, J4 P, k; W
//how fast do we move?
# d* h7 @1 _$ V, P
feedrate = search_string('F', instruction, size);
" j- C P/ |* c w( D7 i0 V
if (feedrate > 0)
0 T1 X7 @: b4 ]- o5 O' Z
feedrate_micros = calculate_feedrate_delay(feedrate);
$ U% W7 t& k0 y2 N% i4 S) b) Q4 R& S
//nope, no feedrate
6 ]9 Y6 m) s4 S+ e K6 G
else
# F3 d8 m2 f1 {5 r1 g
feedrate_micros = getMaxSpeed();
; r5 }4 p1 O7 q' S. c e; }; N
}
, |% v) h2 J4 Z5 `
//use our max for normal moves.
^0 r. D) z; b& b g/ Q
else
3 L/ x0 Q. r4 c9 @; W8 }$ n$ z1 D
feedrate_micros = getMaxSpeed();
; _5 x. k" \4 B/ A H$ d
}
2 n7 j' S$ e: w' W) B/ T6 i% v; s
//nope, just coordinates!
r" Z9 `/ m0 z3 j
else
8 a2 T! H# S6 K5 S4 C1 ?! X
{
- I8 M% f- a$ h2 z" y
//do we have a feedrate yet?
. ^$ Q5 r, _$ s+ u7 L5 W4 F
if (feedrate > 0)
- e& E3 H: P/ Y% O: {; N7 R6 v, R3 C
feedrate_micros = calculate_feedrate_delay(feedrate);
/ |, U9 I: H6 d; e6 U8 u
//nope, no feedrate
0 P8 w. |' c# G
else
( |3 ]$ Y. B8 c% Z5 U
feedrate_micros = getMaxSpeed();
8 V% d7 Y% C# J4 F9 n
}
& J+ M: B) v3 Z
' V6 o: \1 s0 X5 C. B0 M
//finally move.
+ e3 k8 H2 B: x* ~! `. J
dda_move(feedrate_micros);
N3 Y9 B; D, R& H+ N: l
if(stop_flag) return;
c, r Z& @& _* S+ D# Z0 e
break;
- r7 L+ w {/ a
9 c, Y: D u' M; S4 o/ r: v$ Q
//Clockwise arc
) J+ z) b' @# e% B
case 2:
+ X X3 H) s4 M7 t9 t
//Counterclockwise arc
: X4 a6 y2 V7 R2 u0 i ]
case 3:
+ k+ c7 @% }- b- ]( P7 q
FloatPoint cent;
0 r$ r4 N2 F) L" R
// Centre coordinates are always relative
5 g3 O9 T8 c3 V
cent.x = search_string('I', instruction, size) + current_units.x;
0 m8 B4 r; g# }' O3 w7 C0 d( V
cent.y = search_string('J', instruction, size) + current_units.y;
- a& {) @0 t5 m" n% Z; d
float angleA, angleB, angle, radius, length, aX, aY, bX, bY;
* U6 H0 O% W( M: h
4 m2 K7 d/ S1 ~! R# p" Z. r
aX = (current_units.x - cent.x);
( {- T% O# J: x" A( m6 z% A8 h, f4 z' e/ r
aY = (current_units.y - cent.y);
1 @+ N: ]5 Y5 S/ j
bX = (fp.x - cent.x);
5 j6 u$ M R- M$ W
bY = (fp.y - cent.y);
# y' Q8 V. L7 p. H( R6 J
# T) ~' I% A' b
if (code == 2) { // Clockwise
! f1 W% A5 R( R; K: b7 n4 h0 z
angleA = atan2(bY, bX);
# h! k7 l- |, v. `- X& p
angleB = atan2(aY, aX);
; B: i2 F2 f: {+ h! z5 [$ \
}
- m; S$ j. }" F2 D9 E L# J! g
else { // Counterclockwise
" o2 g: {; c4 h+ d: \
angleA = atan2(aY, aX);
* l4 ^$ ~8 P& B1 _4 p( u
angleB = atan2(bY, bX);
& q- \" H* z7 h8 j" |
}
0 u+ o5 X" c1 _
// Make sure angleB is always greater than angleA
8 N8 @ f. y0 x
// and if not add 2PI so that it is (this also takes
+ L3 x0 w6 Q7 x1 A% G; @+ V
// care of the special case of angleA == angleB,
' s; O$ v; l( v$ t) r
// ie we want a complete circle)
7 A) N$ @3 `: I5 G/ Z* w' C8 V& K
if (angleB <= angleA) angleB += 2 * M_PI;
$ D# a0 M* u5 @4 ]# \' T' l$ Y
angle = angleB - angleA;
3 {6 s/ R( ]$ Z) N. b( v
& G6 B5 } B" ^2 o5 ?6 F! Y
radius = sqrt(aX * aX + aY * aY);
! s F6 @6 c, `* P
length = radius * angle;
4 l; e5 P) h1 u
int steps, s, step;
6 {5 M0 I: \/ L3 R/ ? P; Y+ P
steps = (int) ceil(length / curve_section);
; |+ f5 O% }* t$ q
5 b) N. d# R: b; @" ~
FloatPoint newPoint;
6 T5 w; [) A( m* s
for (s = 1; s <= steps; s++) {
9 e: t+ q' @5 y+ I
step = (code == 3) ? s : steps - s; // Work backwards for CW
2 @# }# N( a" }( L
newPoint.x = cent.x + radius * cos(angleA + angle * ((float) step / steps));
3 k1 ^/ q% B; t( [
newPoint.y = cent.y + radius * sin(angleA + angle * ((float) step / steps));
5 m5 l3 N) ?$ U# k2 l! R+ N: j
set_target(newPoint.x, newPoint.y, fp.z, fp.u);
2 E) J$ N# ~ E6 J: m. ~& U
) r5 L. d7 o9 H; {0 |# M
// Need to calculate rate for each section of curve
3 Q& {4 o2 f2 ~# R$ b
if (feedrate > 0)
% ]3 `: B m" k( R
feedrate_micros = calculate_feedrate_delay(feedrate);
1 A* O( ^& z) w4 v( h( b
else
0 F' B* G/ M. j" [% @
feedrate_micros = getMaxSpeed();
5 }6 [9 p- m8 N% Q/ M8 a% T
, ~. p$ \. j( z% Q& U
// Make step
7 g8 H3 s( i2 f7 u! f* ^
dda_move(feedrate_micros);
+ B E) y( x' ~$ u- J
if(stop_flag) return;
+ O6 b) }$ E8 r7 v( U! M
}
" S) \( @2 I+ `5 {# t; L8 h$ {, I
* n' q* e1 P& d3 [* |$ E
break;
& x3 s- u: n* G
: o: H, Y6 V8 ?
//Dwell
+ U2 n( b7 [9 N
case 4:
" z1 J' b7 Q* }7 p& w6 A
delay((int)search_string('P', instruction, size));
7 Y- g: B u" i, v6 @
break;
3 j8 U0 U* u4 k! s- b' I
8 i! w; F$ W9 `; ]
//Inches for Units
6 j6 I# W' z: {% s' [
case 20:
+ s: N9 b) \# D; Q! c# ~8 _) l1 _9 m
x_units = X_STEPS_PER_INCH;
6 Z4 G& ?* C% p3 m
y_units = Y_STEPS_PER_INCH;
! G' j1 }) S k9 d3 D E
z_units = Z_STEPS_PER_INCH;
. P" l+ Q% K* X! s2 x" s( C* [
u_units = U_STEPS_PER_INCH;
* T3 y! N8 w v: y+ [( E k# l
curve_section = CURVE_SECTION_INCHES;
( }( X* B& b8 U8 i
calculate_deltas();
" b2 K- U7 _: I- p4 J/ T
break;
4 |; b6 z( M9 ^! r% d
; s4 A1 `" y8 A* l t
//mm for Units
4 P) b5 Z, W2 N& c- q$ Z7 f9 m) A
case 21:
: r+ @5 z/ [1 c8 Z3 \# N
x_units = X_STEPS_PER_MM;
0 d5 A) F+ k- o2 o
y_units = Y_STEPS_PER_MM;
4 ~! }8 ]. G* t: A8 u) K8 B
z_units = Z_STEPS_PER_MM;
* G7 O4 u# Y( `/ k1 D) j) R
u_units = U_STEPS_PER_MM;
3 d$ m0 M7 |# k4 d
curve_section = CURVE_SECTION_MM;
' ^: J) d* w7 r5 y% l
calculate_deltas();
" x2 Q& L/ C* c
break;
' \0 B% E Z8 Y
+ L8 O4 n( {. o8 C" o& u) t
//go home.
/ _) |$ P9 D' e* p2 J
case 28:
5 `. j: R) K1 Y' ` W
set_target(0.0, 0.0, 0.0, 0.0);
3 E- O) R; h' B3 v9 M/ y" A+ q0 }3 T
dda_move(getMaxSpeed());
$ r6 B. q5 A/ R v' ]) {: R
if(stop_flag) return;
0 m0 R" U% X: ~8 Z: O
break;
& k; t3 }# z+ X; x' W
9 `0 M8 N8 T$ c/ ~! {1 j' R% B
//go home via an intermediate point.
5 P( G4 S6 @% K% L( {. |" v
case 30:
! d# ?- D& E2 w. V1 \* o$ x
fp.x = search_string('X', instruction, size);
% f& w1 i8 ~. o6 E, u, f
fp.y = search_string('Y', instruction, size);
, G6 X) _( ]9 K- y, V; q1 u
fp.z = search_string('Z', instruction, size);
4 D; F) B7 ]$ Y7 Y7 y
fp.u = search_string('U', instruction, size);
% }, A* H7 T5 E4 @' |
//set our target.
1 s7 V' {' |7 u$ O
if(abs_mode)
! p5 R1 {3 o u$ P7 w, R
{
% }: |! r( @0 _$ q7 o
if (!has_command('X', instruction, size))
* c' ]. n3 g. b; `8 k
fp.x = current_units.x;
& f/ c6 X; R. H& ^
if (!has_command('Y', instruction, size))
3 Y% Y: P5 e8 W- b$ c5 l9 L3 n
fp.y = current_units.y;
+ u$ H/ h( ?4 u+ E! h3 o
if (!has_command('Z', instruction, size))
( h# Y* A2 R# i9 m! S$ c; X! q# ]
fp.z = current_units.z;
* J4 w) E5 y7 R* W# u& C) T
if (!has_command('U', instruction, size))
6 Q; d" L/ [9 { X3 J3 ?" h: p
fp.u = current_units.u;
1 c' D3 c0 b1 h1 P- X
set_target(fp.x, fp.y, fp.z, fp.u);
( ^( r- W5 c, V7 _/ u1 F t; v
( e, h8 [8 c7 Y# y
}
* T( O7 U( P1 F1 m9 J1 [
else
4 M$ k I2 a* \) b. ^- R8 ?& P
set_target(current_units.x + fp.x, current_units.y + fp.y, current_units.z + fp.z, current_units.u + fp.u );
' D5 I/ ]1 I/ q f8 a) V
) | R. V; }4 w1 c3 p/ l
//go there.
4 z2 ?4 |+ c- U; o1 Q g
dda_move(getMaxSpeed());
$ X# v9 t3 F3 `* q9 A+ G
if(stop_flag) return;
, _0 u6 |/ r% U7 ?1 v7 S- r
, h+ t1 C. \; ~+ D1 k
//go home.
8 `9 G0 l2 W9 w
set_target(0.0, 0.0, 0.0, 0.0 );
1 \% |2 f5 m6 C1 p" S8 K
/ X3 A! f, u$ q2 w3 t
dda_move(getMaxSpeed());
8 a1 H& k2 ^2 y; O! L" ~; y" ?9 L+ D1 R( p
if(stop_flag) return;
. h" i8 }4 [& L: c' M- P2 B
break;
! }" A9 u/ P8 H9 v( @% u
, s9 v0 E2 m# D
//Absolute Positioning
8 k4 u. S8 e4 H. m/ _/ u7 d8 q
case 90:
6 t1 B' K6 Y3 H0 ~/ R ?% w% O& X) P2 m
abs_mode = true;
: h0 \6 I' ^2 ]+ e" t
break;
# s9 O4 ?3 O; _. z' ^9 ~# y7 o
0 M$ A* Q7 c2 g! y( l4 S! F
//Incremental Positioning
9 ]8 S4 W. f' x y1 W3 r7 u( ^7 [# e6 g! {
case 91:
i) g" ~) S/ `6 e
abs_mode = false;
+ o" d+ ?* e, U5 \8 N' Z
break;
9 q- D1 N1 ^, S: r9 I% ^: c! @
2 D' w# Q7 C9 m: n3 u" _! p* L: s
//Set as home
5 K- P: d" ^' M Q
case 92:
' {3 A7 G& h* i+ \% h( z8 j
" [3 A8 \! @2 {4 `3 @4 B
set_position(0.0, 0.0, 0.0, 0.0 );
' n# {! h( D4 S/ l" N2 C/ d, h
( j, Q8 f) ^7 B q. k( g2 W
break;
+ ~' {; R5 Z. B# l$ U1 w7 o
0 x+ j2 O5 P4 e
/*
& O/ }7 _' t+ Z% Y' ` e/ v
//Inverse Time Feed Mode
3 c, m( g" q+ G
case 93:
7 [* q+ h0 A; p$ J+ `! R8 a
# f8 y Y) f$ P) r7 g6 `0 ~1 `
break; //TODO: add this
- x5 J& W: m0 S/ P, `4 [) ?
6 I8 ]1 K) F" u) x! q
//Feed per Minute Mode
7 U) y7 B( K! Q; V0 m
case 94:
n4 ~. S; v$ |0 s/ g! q
/ k. i. D6 g! d$ L* e
break; //TODO: add this
3 a) M% E5 E" T' B% N) F* x! N# |
*/
d; j1 F" o8 G: x
9 ]) W L2 h4 x& k
default:
/ L9 a+ I1 W5 g. s5 ?0 K
SerialUSB.print("huh? G");
( v8 T' |. ^4 I" q3 L# A+ i1 Z* G' z' V2 ~
SerialUSB.println(code,DEC);
" i$ S% M! r6 M& d
}
# p" ^& p5 \4 Q7 }2 p* A
}
. |2 s7 y" A9 T ^, \. H! A
0 S* C4 X9 A; p, A
//find us an m code.
% Q9 u. I+ u; ^2 R5 `
if (has_command('M', instruction, size))
g% ~. E/ s A8 h
{
6 o1 W3 @4 ?. D: _
code = search_string('M', instruction, size);
- C9 y, j& w! ]
switch (code)
0 j9 I8 d" i$ Q1 p; B, A
{
, E8 H/ R0 W6 I
//TODO: this is a bug because search_string returns 0. gotta fix that.
9 {/ v0 O8 Q, F
case 0:
# R% R# t4 q4 [% J1 q' x+ k4 d
true;
9 x0 |1 ^- O4 Q! k+ Y/ S6 i
break;
: ^; O# B6 X0 v5 Y" ]$ P2 L
, r8 z, Y4 l2 B; I
case 100:
3 S. \' Z1 {/ N
break;
: V( ^$ H, Z$ p4 X1 [
7 a* b# ]9 f+ a `& x
// fire camera relay
* R7 e8 o$ h1 _' O8 `, F/ P
case 101:
4 V2 K0 W/ ~% }/ _
camera_shutter1();
7 t0 e# R4 i/ J5 F7 H% v
break;
5 S2 ?' Q5 l! h: q
* M3 Z. d- s+ ]1 Y: R) _; j) p$ _9 O
// fire camera relay2
3 O3 ^' D; ^8 o a' x6 R! T( j
case 102:
4 h5 z& F7 T5 j# _
camera_shutter2();
' [7 X; P) p* s% u
break;
; [: r& k% j# q
/*
) m. U( D# Z4 H# j) ]' e& I3 N* c A
// turn aux 1 relay on
2 ~9 i- r+ p2 v5 H! i
case 103:
' s5 G1 Y, P6 w4 l8 B' \' M
camera_aux1_on();
1 O+ V# \6 V r' u
break;
1 A! Q' @2 b: ~; N
" O9 C- o: W+ a' R
// turn aux 1 relay off
& X# u( t% i2 F* b% ^- k. n. P( \- ~" B
case 104:
+ _& d7 B# ~; q6 g2 ^
camera_aux1_off();
- ?( i. l: k! { ~, K6 c6 }
break;
8 n. U) G& p- m( ~. |! R8 {
' y! n) e, D4 e8 i' O
// turn aux 2 relay on
! r8 a$ {1 O; P+ k
case 105:
9 d# n" o- b1 s: I% O0 _
camera_aux2_on();
2 X+ N- C1 B4 T
break;
5 y8 c6 y9 t: T8 A6 _. n* Q! t
' T+ Y: N, [; y0 h
// turn aux 2 relay off
1 p5 X) p0 G' w7 j$ |( ?
case 106:
" V2 W! F7 j/ [5 J% A6 }
camera_aux2_off();
5 \# E1 a; }8 M
break;
" C$ } t o* s% Z
1 y& A- x; O# A/ T
// turn aux 3 relay on
: y/ z( k5 I# [; G
case 107:
6 S1 _4 h1 O! `6 `) u: _0 n: E
camera_aux3_on();
& W! d; Q8 H( Z: ]$ |- G; c3 |5 Q" ^
break;
3 A# X+ W% Y/ t
- N& |+ T5 y/ z6 e/ o' N; S# h) r
// turn aux 3 relay off
( Y* _ e0 W8 H8 { e
case 108:
; X8 P; Z: v5 k. Y
camera_aux3_off();
4 h& M& c! j f- J* s
break;
. n# p2 i. d$ a$ N
F% \& ]- B. H7 |8 A' u7 n: @
// turn aux 4 relay on
" \. d, |6 c! X; n
case 109:
+ a2 X' X. v( L% E
camera_aux4_on();
5 F" [+ ~# Z" R$ B& `5 Z5 M+ j( q
break;
3 i1 F+ _. G. z9 L7 _; m5 G
2 i' t6 {" A \; N
// turn aux 4 relay off
4 c0 }2 o4 z. Z# Q2 k0 t
case 110:
8 x5 m3 b2 s8 Z+ H$ L |4 ]7 w+ G
camera_aux4_off();
0 Q1 |0 a" P* ^% s
break;
6 o$ i9 J7 K7 h8 {
*/
) u! A: U' Q/ I& z3 w
default:
# U" d6 M) ?: P! p, Q+ O
# X) F, n* O# j4 J2 G
SerialUSB.print("Huh? M");
1 M6 p, }. N& z7 Y* E4 W$ Q
SerialUSB.println(code);
* H7 F! o$ U+ C9 _8 q
}
7 K% G7 M& \) W n5 \) k/ K" N
}
' o: x. h( k6 y$ s2 U: F5 `2 ?
# z# g+ ]3 p9 o" L) D
//tell our host we're done.
: G. ]( Y- q6 L7 }0 L0 W* d. K `, p
SerialUSB.print(byte(78));
. z; ^7 x n$ l" r$ K$ z& L7 k( d
J( [8 a/ f4 Q$ s) J# \
}
) O: |; b& H0 g/ c0 k5 E6 u
8 I4 L1 l/ Y9 g
//look for the number that appears after the char key and return it
. N# J- Y: J- A
double search_string(char key, char instruction[], int string_size)
) m+ m8 [; K4 O( _& {4 h# D
{
+ H7 k; N, C S+ J5 Q! k, C( m
char temp[10] = " ";
- [7 `3 y s) Q. t8 k/ p
for (byte i=0; i<string_size; i++)
* t7 i g: H; I
{
" A1 J, C( K% N' r5 B
if (instruction[i] == key)
6 f8 w4 P# Q7 T- m1 _/ |: O+ \9 N
{
( g! ~/ ?( O- {
i++;
4 F: w1 v) f! x& p# P" |. b
int k = 0;
/ M9 ^3 h+ U2 k1 Q" Z7 v6 ^7 b( f
while (i < string_size && k < 10)
) C1 l) V' i5 o, R" q
{
7 t8 H9 G# s/ s, g- ?; Q
if (instruction[i] == 0 || instruction[i] == ' ')
- B- k7 F+ I1 M! f5 L5 b- f
break;
, T: h' W+ s5 b
0 d3 k6 R, l& M- t9 `$ b3 U! v
temp[k] = instruction[i];
- k" \; M" i; C9 T& w$ ~; [7 s
i++;
3 |* w' P+ f7 N% r
k++;
1 l3 c5 j# M N9 @4 u; p5 M
}
4 O F: B& w6 b B8 Z7 T
return strtod(temp, NULL);
* q0 ~# @" {/ p
}
5 e7 N1 u6 G K# V/ T
}
/ P0 }/ v7 b2 Q, j# `1 w3 l1 U. h
5 |, \) ~4 c, H5 v0 ~
return 0;
( @9 W) _: d' S+ i7 a. _+ _
}
5 e- e! y/ m2 o- u' u, z
0 u# n" V. T2 S4 s
//look for the command if it exists.
" r+ E2 G3 x6 N% _ F" R
bool has_command(char key, char instruction[], int string_size)
( w3 ^4 [, M; ], r6 S- b7 I
{
' e+ q" f4 _: ~& V
for (byte i=0; i<string_size; i++)
, C3 ~. t& ]$ S6 [
{
! y' I0 U) e: R, V" M
if (instruction[i] == key){
# U, B& ~# ~$ O* a
0 S! N; O, P$ j% r' g8 _4 P: H
return true;
2 |# v6 A6 s7 D1 \
}
' M( L2 _# }6 s/ \8 {
}
5 U7 `& k( I% H# b7 a; g& Q% a7 q+ G
* s6 [1 _9 n3 ^9 e2 M$ E5 [4 \
return false;
4 t: I6 L6 l A" V; S
}
5 u8 n% v; V. Q" V! F2 M% J
) c& W0 ^: b; O ~% J" a' m
$ ?+ b. S$ z$ L d, q+ _
! T) V0 i; ^4 R9 j6 W
作者:
xmdesign
时间:
2014-5-10 09:55
& s/ l; o: v7 G: }9 l2 O/ O
//init our variables
7 a+ A$ q- `. ~4 W& b3 D
long max_delta;
5 C, T& b/ G) V0 {0 G* b8 [
long x_counter;
3 O" z' q" x! | T/ d
long y_counter;
; g3 C9 Q# G* h6 ]7 t
long z_counter;
4 P0 n+ ^5 R: T4 r8 D1 ?5 R" h% l
long u_counter;
1 |) h, R% w# u' o- |6 r3 G% e
long x_pos = 0; // x position in terms of absoloute motor stepps
0 @5 o( J# n! O) y+ ~" {
long y_pos = 0; // y position in terms of absoloute motor stepps
+ H& Q& }: ]; M: m" M) K
long z_pos = 0; // z position in terms of absoloute motor stepps
: L) K+ v, @+ S; K( e
long u_pos = 0; // U position in terms of absoloute motor stepps
9 f8 M. f/ \' s! d: Q3 O6 I5 H q
+ s) U% w) k! A3 w$ O9 [7 @
bool x_can_step;
7 ]4 C. g: d0 k& k
bool y_can_step;
* }, \) x4 U# ` v! O
bool z_can_step;
" g/ T. I% H3 j5 Z- y! r$ A
bool u_can_step;
& l( r, \" T% q% Z) m& Y" \* w
int milli_delay;
) t/ K1 W- ]7 A
9 {+ g! A+ l$ \. G
void init_steppers()
' Y7 _& \' b& T) \9 H, B: Z
{
" Z/ y2 x& r( k( Z( U' n
//turn them off to start.
3 d" }, a/ Z6 N
disable_steppers();
5 L8 s/ F( d0 @$ [$ a+ [
0 m# h8 v2 `- u& F% n
//init our points.
, P0 d$ e5 r$ z M; I2 c) } P2 R
current_units.x = 0.0;
5 E/ C0 i! O7 R. F0 q
current_units.y = 0.0;
4 q/ Y% I4 J2 K5 `3 e
current_units.z = 0.0;
8 o6 ^ H5 ]0 X! f2 r: V3 k
current_units.u = 0.0;
3 ]) m* j( n: t3 `
target_units.x = 0.0;
% i' e, l1 B: C1 t. i/ S' T
target_units.y = 0.0;
6 ?/ R# c& M; E U
target_units.z = 0.0;
6 h+ {3 K5 c6 e" |# ^8 n
target_units.u = 0.0;
7 @6 `9 x W3 F1 D1 n" M( m/ k, h
0 C* v* [2 N! C. E( o3 [4 @
4 d: W2 |# U G) v
pinMode(X_STEP_PIN, OUTPUT);
0 Y2 W L+ F c' J0 f5 `2 C
pinMode(X_DIR_PIN, OUTPUT);
) G( T8 C$ L9 {7 G2 I
pinMode(X_ENABLE_PIN, OUTPUT);
~- p$ e+ t( H7 h5 \* `+ _- ]
pinMode(X_MIN_PIN, INPUT);
3 O! i7 A- X k, ]
pinMode(X_MAX_PIN, INPUT);
8 v; o% J" b2 Y6 `6 H* F% [
4 n- W8 ^) @0 j2 o( m0 A- [$ z$ W
pinMode(Y_STEP_PIN, OUTPUT);
, }- A' ?; z" J9 z% z2 x
pinMode(Y_DIR_PIN, OUTPUT);
! Q! L. c/ \% Z
pinMode(Y_ENABLE_PIN, OUTPUT);
* Q$ a& X2 ~9 q9 {: @# f
pinMode(Y_MIN_PIN, INPUT);
' v3 ]7 D+ ~) p+ b. f, R
pinMode(Y_MAX_PIN, INPUT);
$ [# J% J) o6 e8 d) t
6 `6 y! U& C; r) m, ]
pinMode(Z_STEP_PIN, OUTPUT);
/ W7 G$ e* Z; B
pinMode(Z_DIR_PIN, OUTPUT);
/ @5 H- @$ Q# c
pinMode(Z_ENABLE_PIN, OUTPUT);
) p* B+ l% I1 e5 z& V1 t( u
pinMode(Z_MIN_PIN, INPUT);
1 a0 A: Y* u6 [& f# C
pinMode(Z_MAX_PIN, INPUT);
! g& L( @: r! z% Y$ B
. _5 ~0 g. o# ?( Z5 ?0 o- b: P0 P
pinMode(U_STEP_PIN, OUTPUT);
8 z, L: Q# Y& \" V( H% A
pinMode(U_DIR_PIN, OUTPUT);
- @& ? w# L; d1 \/ n5 f
pinMode(U_ENABLE_PIN, OUTPUT);
! d3 x3 j5 m+ U+ O
pinMode(U_MIN_PIN, INPUT);
, u' g: f" i) n% `+ C+ K2 p
pinMode(U_MAX_PIN, INPUT);
# w' m: y( K: p6 s- }
//figure our stuff.
7 i _3 S( P* l3 o0 ~
calculate_deltas();
0 r$ D+ O7 l$ ^- i0 ?
}
. @/ |+ x) e+ p9 @% B2 H$ ^ p5 ]
6 w: D$ G6 {4 _' u" |
void dda_move(long micro_delay)
( d7 x1 b0 v9 ]8 R! v, k' N) s
{
& w1 f) I9 ?7 u6 r; q
//enable our steppers
: Q; f! s* P+ t
digitalWrite(X_ENABLE_PIN, HIGH);
7 f- `$ x, I8 V# [0 v
digitalWrite(Y_ENABLE_PIN, HIGH);
* B3 U: F' {! Q1 a( f
digitalWrite(Z_ENABLE_PIN, HIGH);
U$ l; h% l) O% N
digitalWrite(U_ENABLE_PIN, HIGH);
3 k6 _; \8 K+ p1 q4 a
//figure out our deltas
0 c- d+ g5 \$ k1 r/ J$ f
max_delta = max(delta_steps.x, delta_steps.y);
5 u8 I% v2 F* W/ q6 Z: ]; S
max_delta = max(delta_steps.z, max_delta);
5 r( ?0 M# {% ^ g2 s! a1 A
max_delta = max(delta_steps.u, max_delta);
! a0 p3 d, x0 j: U& }0 i
//init stuff.
* e/ K. B7 E& X- S$ O" Q# Y% ~
long x_counter = -max_delta/2;
& L o. h) Q4 u1 o, o% G4 T
long y_counter = -max_delta/2;
3 X- h' Q l% P. w6 Y2 R% }/ H( k
long z_counter = -max_delta/2;
5 d1 w$ x4 S- N5 V
long u_counter = -max_delta/2;
) q, H" F- @* `2 @$ I: A. e9 Y
8 \- s/ _" \6 d6 z
//our step flags
; {( _3 R: I' D% w* e3 D$ g% |; O9 p: F
bool x_can_step = 0;
. w8 c6 w5 G& p1 q( y5 ~! _: O5 E q
bool y_can_step = 0;
; W: m3 h3 R3 n% g5 p
bool z_can_step = 0;
% X6 P) o. E; s( |
bool u_can_step = 0;
; R" p9 g! N2 x% S. G6 K
7 m7 O, U/ J' S# [
if (micro_delay >= 16383)
3 u& B4 |! ?2 b/ E7 P
milli_delay = micro_delay / 1000;
; ]3 m* r. I8 g' v; q, b
else
! w9 H( ^8 p# n( c
milli_delay = 0;
7 C3 k V6 M9 r o9 j
3 S' i3 f* k5 r* E
/ J2 P, }$ F9 x1 I# E J6 }
//do our DDA line!
9 Q3 m8 L4 P0 R/ y
. G- @6 l1 A e; m: r& r Y& N* N* L
do
- B+ g. {6 n8 ?# E" S
{
% }' ^* m5 Z* X/ G6 y( o. o9 S
if(( digitalRead(BUTTON_SS)?analogRead(BUTTON_MAN)>>9==0:0) || stop_flag) break;
% _: n& K- b0 a; f+ F4 L0 A
x_can_step = can_step(X_MIN_PIN, X_MAX_PIN, current_steps.x, target_steps.x, x_direction);
5 V, f% a5 I$ ~
y_can_step = can_step(Y_MIN_PIN, Y_MAX_PIN, current_steps.y, target_steps.y, y_direction);
2 C' g( v! [; P+ a
z_can_step = can_step(Z_MIN_PIN, Z_MAX_PIN, current_steps.z, target_steps.z, z_direction);
5 ~. j1 Y. G8 c% o. P
u_can_step = can_step(U_MIN_PIN, U_MAX_PIN, current_steps.u, target_steps.u, u_direction);
6 r' I( h" O" k
if (x_can_step)
, ]: P1 y" ^& W8 U N8 D' x
{
A- @" l- m1 U: \' n
x_counter += delta_steps.x;
2 B/ \# w" R7 K5 D1 H0 M, h
; S: ]& S; Q7 L8 P3 {, z/ }
if (x_counter > 0)
. g/ t/ ]+ E( J9 P$ Q8 {
{
( w- _/ i3 c3 w u6 R. e
do_step(X_STEP_PIN);
% u; n L! R) s7 w O# q t# A
x_counter -= max_delta;
( n) ?- y/ h3 { `1 e0 h& w
if (x_direction)
& b% w: C. z x! P1 s3 U
{ current_steps.x++; x_pos++; }
$ ^* h! E |- d. `6 a( Q N
" k9 Y5 w) V- w2 ^# l* X6 I. j, w
else
9 m3 u$ G8 U3 A9 n. ]* j$ b
{ current_steps.x--; x_pos--; }
% T( F$ W/ Y4 L5 N V4 s$ F6 m
3 v% Q1 ]3 X/ }1 ]0 j/ n: ~
}
' j, E) ?" U- w
}
' e2 G) s5 }, F K
if (y_can_step)
3 e+ g! s6 b' R0 ^0 t
{
) O5 V- B# T ?. u5 U% L
y_counter += delta_steps.y;
6 j: g' x8 I, g6 k
0 j% D) @8 ~! v6 O- A( l/ E$ u
if (y_counter > 0)
' n4 p& P6 V" w1 A# W
{
( \! w6 k' Y/ P$ H7 T
do_step(Y_STEP_PIN);
2 h' E0 a+ F: H" z
y_counter -= max_delta;
1 S% e: l( |# x0 E- Q& a
' D# S) d/ e. a* E5 B9 F# i* a0 L( n
if (y_direction)
: w- Z9 x6 [$ H: d
{ current_steps.y++; y_pos++; }
. w3 h# u) g5 ^ G( Y. h
# |8 a/ ?% z) [6 j& H9 J
else
) b- f; o6 r b
{ current_steps.y--; y_pos--; }
* E! F% ]# h" a
6 m, {5 O7 P$ a
}
9 g9 n6 I& V! Y' q
}
! g3 C$ P% A/ Z" R/ Z4 I& p$ A Y
0 {, g0 l3 b8 @9 ?
if (z_can_step)
9 ~1 { g0 a2 G' z k( U
{
6 F& K# ?, `9 k4 I' [3 a3 X" M- m- d
z_counter += delta_steps.z;
& i6 V( K4 T& j7 r
" {" s# H( u, |
if (z_counter > 0)
$ |9 G. | w) P$ V+ ^) P4 @
{
# t$ _) C8 C2 i/ `
do_step(Z_STEP_PIN);
F3 E- l- D, { e) J7 d7 F; A
z_counter -= max_delta;
1 [4 q# l M& g) L
$ @; k- `% \* a3 n0 ?: s
if (z_direction)
6 b$ Y0 Q5 P( E$ x4 |
{ current_steps.z++; z_pos++; }
) ?( `2 l+ q1 Q% U5 s; q6 _- u' f
, R$ ?( l) m% z5 b1 b
else
5 f2 n3 i A# O
{ current_steps.z--; z_pos--; }
/ T& }, s9 c; H% Z; f
* b3 }- r0 m6 {$ V
}
1 b; z- U; Y0 `) y. R* L, R6 b
}
4 b$ U. ?7 O8 d$ f; g! V) r
9 @! Y5 I0 O1 m8 ~( f
if (u_can_step)
0 \4 }( c$ ? @/ h
{
2 M9 r6 P" B3 ~( m
u_counter += delta_steps.u;
Y3 C& W! v' U; ?& ~- T) H" h/ B
; L4 Y Q# V2 d& x* S: W/ }
if (u_counter > 0)
% ?6 W' P2 v6 I' v2 ^: S
{
, Q7 @' U* K8 j: u# b
do_step(U_STEP_PIN);
& m' ^: ?2 C2 ^
u_counter -= max_delta;
2 E# F! B: ] w6 ?. s9 }! v- T( ^
5 S% U' R* e1 ]- I! S
if (u_direction)
2 n% \) a: A- W6 L" Q' W6 a
{ current_steps.u++; u_pos++; }
2 [5 x2 e2 p! H# G
. L3 x1 X1 k0 {( J2 J/ C. }
else
& A( p8 Y! b) B9 V- b. a$ C% m
{ current_steps.u--; u_pos--; }
+ U- W) N" k. c
1 c' V( a% Z K. S( ?& [# C
}
+ J K0 h7 I( |
}
/ m: n6 z, _% U9 }3 D
//wait for next step.
2 t$ N$ M- X# B& I& v
if (milli_delay > 0){
) n. I D3 o# q0 {4 v9 W
//if (digitalRead(BUTTON_SP_EN)) SPEEN();
7 _7 v& B' o$ S! I2 s
delay(milli_delay);
4 Z" b- i, S9 e9 k" m% ^
}
6 m; j/ f5 ^4 i& p ?2 o8 b
else{
; R3 r9 I& i7 T3 c6 r
//if (digitalRead(BUTTON_SP_EN)) SPEEN();
8 g) s( A- g/ U/ c6 V( h& d# e
if(micro_delay>0)delayMicroseconds(micro_delay);
0 N7 ~3 t+ `( y8 o2 b) y
}
* ^: a) ^3 `6 x- g0 f9 _
//if(x_can_step%40 || y_can_step%40 || z_can_step%40);
+ v# u. N5 T' |+ l: k1 k7 q
}
) j$ o0 D5 q" q. N+ O( W
while (x_can_step || y_can_step || z_can_step || u_can_step);
& o0 p2 @4 Q# {8 F3 ?. e' P
% Z6 K: A2 p/ E' K* i# p: @! w7 |
, Y! W* V4 B9 Q8 o% j! X; \5 I
//set our points to be the same
* d& ?3 K K V' K1 f; i) F
current_units.x = (float) x_pos / X_STEPS_PER_INCH;
# `( B) F! [$ ^. L
current_units.y = (float) y_pos / Y_STEPS_PER_INCH;
% L& W4 r) F/ Q1 N& `* P$ i
current_units.z = (float) z_pos / Z_STEPS_PER_INCH;
( t* S1 F) a" F4 i+ g/ z" q4 y% j
current_units.u = (float) u_pos / U_STEPS_PER_INCH;
$ h0 V/ o7 S+ [- P
+ u" b! |& ]1 G- m
set_position(current_units.x, current_units.y, current_units.z, current_units.u );
& A/ a) ?8 P* R% Z, C- V
# t& h! g! X, f) x- k
long x_pos = 0; // x position in terms of absoloute motor stepps
; [0 F" j2 `( R# ~7 Q
long y_pos = 0; // y position in terms of absoloute motor stepps
+ P6 g& t6 O6 }! w6 Q
long z_pos = 0; // z position in terms of absoloute motor stepps
) u' K. I: \" F# \! s
long u_pos = 0; // u position in terms of absoloute motor stepps
; C x+ Q, ?- f/ o" \ u; t
calculate_deltas();
' \" c. n4 r9 H, b: ^% \9 s
$ K; ^4 h3 O3 c. [* P0 N" _, q3 q8 g
}
# z$ l* [& ^, O5 `& k9 V! _- q. Z4 u7 z
) U! Q( s$ Y5 e; N( C( @: q
bool can_step(byte min_pin, byte max_pin, long current, long target, byte direction)
+ O6 E2 E* b8 s6 z ] n
{
& r0 U8 T6 w+ ^7 S- J% l; K
//stop us if we're on target
- C" t; f: p9 y9 V) G
if (target == current)
, X/ a* N, ^8 z* ] D% f9 X
return false;
5 c2 Z$ @2 ~) K3 q3 z; O) r c
//stop us if we're at home and still going
# }, Y* Z. F! {0 ^* E$ X
else if (read_switch(min_pin) && !direction)
4 V% V% T+ X; y
return false;
/ O8 T( @) L" X$ k1 j7 b
//stop us if we're at max and still going
- ^) M$ C( U4 ?* h# y& }
else if (read_switch(max_pin) && direction)
+ y8 c" A% u$ ]* y: x
return false;
1 v( p R, ?# H8 F& m% ]# z
% y7 k) X# s, w! @- K
//default to being able to step
3 M2 C9 G( x# C% j* G
return true;
t# ~0 ~. C1 T: _- z
}
* J6 j% J8 D$ z1 f
( c/ \1 f5 k& g( y& O# ~$ b5 d
void do_step(byte step_pin)
. j$ f* k: L' ?. R8 g2 I' N: i D5 \
{
# t3 E/ V6 `" A- a. G( J; h( J
digitalWrite(step_pin, HIGH);
: e) e3 O+ S b/ s: W
//delayMicroseconds(1);
% O9 i. w( p o( m V# T: h( ]
digitalWrite(step_pin, LOW);
% M/ i; `6 O. D2 t r
}
. r2 }2 @; t! j2 s
4 R8 t0 X7 L4 a7 h/ y. M+ e- W
bool read_switch(byte pin)
0 _; ~- \- _ @
{
, a! w: @2 _8 w7 O7 B x" ~1 s
//dual read as crude debounce
6 c: f% D! E7 d: K7 h1 ?
% |1 f. q/ s( N- B; |: z2 e
if ( SENSORS_INVERTING )
6 H. C- x* X7 K/ y3 H, X
return !digitalRead(pin) && !digitalRead(pin);
2 r0 a5 L! V. C( w; W
else
7 p8 w6 C% |" \ O; m
return digitalRead(pin) && digitalRead(pin);
7 U6 P% j ]* @
}
7 t: J8 u4 I x
/ v1 W' x, `5 D( S" @2 Y8 d$ _( P! x" N
long to_steps(float steps_per_unit, float units)
) B. A) w' B* r0 U6 @6 g( \" l
{
/ ~4 g: _" C7 G0 @; G
return steps_per_unit * units;
! a: a/ i8 S* t
}
! H3 u1 f1 v& Y
/ ~9 Y) f' Y; H; T, b
void set_target(float x, float y, float z, float u)
$ I% _2 m9 C3 r
{
/ D' r0 T- w6 T7 C7 v
target_units.x = x;
& n7 F& e, n/ l& |. j/ M
target_units.y = y;
" W' U, T" U$ u% i% ^7 Y
target_units.z = z;
+ `' Z$ W& C7 M" C; [# D! {
target_units.u = u;
0 C7 d: G5 Z- S- K
calculate_deltas();
a. t8 ]' f3 B" q' u/ q9 o+ [3 K
}
" ]( [: P0 l% I. t
: Q3 M0 y! E. C% J1 l4 z: f) n* x! s
void set_position(float x, float y, float z, float u)
j9 _$ z! e" q! L& Q. Q$ P3 u
{
+ C+ ?8 B& v5 F% D; t
current_units.x = x;
6 i$ l. }! j7 _
current_units.y = y;
1 |, t, n$ e9 [6 j# I2 k) M' {& k" o
current_units.z = z;
; c- {9 M' s8 Y+ w
current_units.u = u;
' U. |& p& n& H
calculate_deltas();
) m& j8 I1 B+ G7 d
}
" P: x' d* h0 r: ]6 }( |
1 c5 F& |6 _2 y. ]1 V, l$ X
void calculate_deltas()
" X; u; r7 [! O- z; H/ P
{
" V- L% s) D5 | }
//figure our deltas.
: R; o1 W. s: M, Z+ z: W, {
delta_units.x = (target_units.x >= current_units.x) ? (target_units.x - current_units.x) : (current_units.x - target_units.x);
4 ?: U$ i+ j! Z
delta_units.y = (target_units.y >= current_units.y) ? (target_units.y - current_units.y) : (current_units.y - target_units.y);
* Y H [9 Y& ^- y' S* |
delta_units.z = (target_units.z >= current_units.z) ? (target_units.z - current_units.z) : (current_units.z - target_units.z);
; [1 L& N" ?/ d% ~! G _; q
delta_units.u = (target_units.u >= current_units.u) ? (target_units.u - current_units.u) : (current_units.u - target_units.u);
" z% m% t# a( w$ p! D8 |( W
7 G* Q& V5 A, `) ]2 R1 @5 [
//set our steps current, target, and delta
- j' G" [6 X! u- R
current_steps.x = to_steps(x_units, current_units.x);
3 r& ^! ^1 K( h ]! H6 T) M
current_steps.y = to_steps(y_units, current_units.y);
8 [1 Q! J' b# I3 ^2 T* Q
current_steps.z = to_steps(z_units, current_units.z);
) `( n7 f ?( d+ Q
current_steps.u = to_steps(u_units, current_units.u);
1 U7 Q6 G$ X7 W$ y& c: C! g
, Z4 J! c& g( {4 C
target_steps.x = to_steps(x_units, target_units.x);
, r3 l2 ~8 |8 S V* q
target_steps.y = to_steps(y_units, target_units.y);
5 [6 l) X1 D1 B) O2 n2 t
target_steps.z = to_steps(z_units, target_units.z);
( o& K3 x+ L/ Y* X; Q/ |: i
target_steps.u = to_steps(u_units, target_units.u);
0 W- d0 a: _5 h, D8 T2 k
4 K/ U3 l+ q5 j
delta_steps.x = (target_steps.x >= current_steps.x) ? (target_steps.x - current_steps.x) : (current_steps.x - target_steps.x);
& E" t. j+ }( s$ a9 R# w* d
delta_steps.y = (target_steps.y >= current_steps.y) ? (target_steps.y - current_steps.y) : (current_steps.y - target_steps.y);
6 T* ~6 ?, w2 \' ?1 Y% I/ h( E
delta_steps.z = (target_steps.z >= current_steps.z) ? (target_steps.z - current_steps.z) : (current_steps.z - target_steps.z);
$ `( M7 K# g8 s# _0 D
delta_steps.u = (target_steps.u >= current_steps.u) ? (target_steps.u - current_steps.u) : (current_steps.u - target_steps.u);
. I/ i5 o* P7 X, d; r
( ?, c+ \' i; Q1 b; ?+ `
% C+ ^4 W& X4 g) E/ e* l" n! K* F
: {% `7 l& ?( x3 b. F3 ]0 Y; \
//what is our direction
6 K9 q" Z Z# U
x_direction = (target_units.x >= current_units.x);
( l. c: ~4 Y7 t& F0 ^4 b
y_direction = (target_units.y >= current_units.y);
9 {7 d% I+ h! d6 m6 Z- H' F
z_direction = (target_units.z >= current_units.z);
E; ~' b/ v) z' E
u_direction = (target_units.u >= current_units.u);
" p7 n% J# ~( l$ h" X
# L/ n; W% B3 s' o
//set our direction pins as well
) _" @ P. Z2 F- v2 u
digitalWrite(X_DIR_PIN,x_direction);
. ?3 Q! y! c. C0 }& i) s
digitalWrite(Y_DIR_PIN,y_direction);
' \/ c! ^" f- u& `" N; y
digitalWrite(Z_DIR_PIN,z_direction);
4 d& W- I) P: I7 {# j' p
digitalWrite(U_DIR_PIN,u_direction);
1 {7 M3 q/ p3 X
/ x5 M6 h. a8 b9 }1 C- J2 B
//绘制LCD
1 r$ \; d8 q8 P- j& q, U
LCD_DRAW();
) ~* p( H" H$ E3 i' b* L/ b; p# S
/ t2 g* Q+ G* |" c8 G# ^
}
+ I3 \/ u2 K0 b9 t
2 E, U; q5 c% [; [
3 N( `1 F+ b7 r. D
long calculate_feedrate_delay(float feedrate)
9 ]! G8 u' Z, w2 m: b
{
+ [9 k+ b: B( r% q
//how long is our line length?
5 N# t# Y3 m0 }/ H; T x7 Y+ d9 J
float distance = sqrt(delta_units.x*delta_units.x + delta_units.y*delta_units.y + delta_units.z*delta_units.z + delta_units.u*delta_units.u);
( t! F9 \, L. G$ K! J7 S6 D
long master_steps = 0;
! x9 b1 }1 V; e+ e3 \% [. e ?3 n. J5 S' S
1 ?) X! _; R: x* l
master_steps=(delta_steps.x > delta_steps.y)?delta_steps.x:delta_steps.y;
7 o5 R; \% t/ X) A
master_steps=(delta_steps.z>master_steps)?delta_steps.z:master_steps;
+ w5 F7 X$ S6 O, F- D% F
master_steps=(delta_steps.u>master_steps)?delta_steps.u:master_steps;
- x! }. I( M: @5 b% s0 q0 Y
0 M- i) V2 e+ x% R
3 c, |$ h& r" z8 @4 r, T, P
% g' d% L% R' X5 f2 j- S
# r# t% I6 S* j' k9 ]# |: |
//calculate delay between steps in microseconds. this is sort of tricky, but not too bad.
# Z( ?, v2 b; y
//the formula has been condensed to save space. here it is in english:
) n5 d/ w/ z, Q: ]
// distance / feedrate * 60000000.0 = move duration in microseconds
0 m, J; q4 L9 L& k
// move duration / master_steps = time between steps for master axis.
0 Z+ y2 k; Y$ P7 b- C
return ((distance * 6000000.0) / feedrate) / master_steps;
C/ T4 w& \/ g( |3 ?
, G Z; a& g* B( U- @+ }2 X9 T
}
# |% y$ \ j; j: D! d7 F6 w' ~" a$ H
# f; M" [) b6 n7 Z+ G- `4 u
long getMaxSpeed()
' e9 w% e& }1 a; S( W$ h. P3 a
{
9 z, j2 ^' L6 O
if (delta_steps.z > 0 || delta_steps.u > 0 )
/ a8 } o) T4 Q" D' `& j' Y& h3 [
return calculate_feedrate_delay(FAST_Z_FEEDRATE);
" s, ~3 z% `, A! `2 w- M( Q, b, L
else
0 D. C# @. o. }
return calculate_feedrate_delay(FAST_XY_FEEDRATE);
) E; E3 g( H9 C& R& P' w
}
: x7 v) a( ~7 q# n4 m
, V) Q; m( ], C1 x/ G
void disable_steppers()
! r e6 h N# h' q2 \
{
$ X+ r1 N y% N
//enable our steppers
4 T6 U* A0 w4 m3 k! B. k4 e
digitalWrite(X_ENABLE_PIN, LOW);
* }1 t' d. J2 R X9 M
digitalWrite(Y_ENABLE_PIN, LOW);
3 B: j1 b: t/ @
digitalWrite(Z_ENABLE_PIN, LOW);
) H6 B( a6 e, I P1 Y
digitalWrite(U_ENABLE_PIN, LOW);
! X4 g9 Q+ O2 n& N M) f
}
! V6 b" b7 ^" z6 t f% l) [4 E$ @
4 d# n2 x* R, Z: K8 f
& Q% ~ Q/ l' ^ `% \2 X* L$ ]
//绘制LCD
$ {4 V: Y0 ^- M8 i2 X
//unsigned int DRAWCount=0;
3 h: N& h z" y
void LCD_DRAW()
6 G% x' f6 F) `! A% ~' j
{
3 P* \/ V' u3 F7 H# Z! D, K
lcd.clear();
a+ K) {% X6 w
lcd.setCursor(0, 0);
: _5 e) X( A4 O
lcd.print(" X=");
, O& y7 F& P) O
lcd.print(current_units.x);
$ G! x7 z- h% W5 K" O8 v2 H' R
lcd.setCursor(0, 1);
* t: f8 e" x% a5 D |: e
lcd.print(" Y=");
, C, b! H' ]* A+ g k6 v2 J
lcd.print(current_units.y);
- a4 j, H ~% I
lcd.setCursor(0, 2);
* }2 D- ?6 R, X# `
lcd.print("Z=");
) \9 ?6 d8 n, d7 J0 r4 e; ?
lcd.print(current_units.z);
% V% t* y; L. |0 H# U
lcd.setCursor(0, 3);
9 m$ i s$ E8 `1 ?$ {8 Q" m& n
lcd.print("U=");
" |1 D* w+ j q1 k# a d' V
lcd.print(current_units.u);
/ h3 k' [5 B8 g W. D6 W
}
1 S" D% ~; a1 \& \
// else if (DRAWCount>=30)DRAWCount=0;
6 c" g- y2 T% u" x# @
// else DRAWCount++;
( a* p! k+ l" E- B: u0 @
void SPEEN()
/ W7 x( S3 d/ X# U' R. n
{
: b. g) l3 F- s( e _4 Q
delayMicroseconds(analogRead(SPEEN_CTL)+1);
! \, }0 i. Q8 Q- R5 W a
}
" P' D2 u, |. \
# A3 R8 R+ b$ ^
& ?" a3 G* ~) A* i" u
//delayMicroseconds(analogRead(SPEEN_CTL)+1);
( ~9 p7 u `* I0 K; T& h
//if (digitalRead(BUTTON_SP_EN)) SPEEN();
' [1 r" I* s' p4 s1 i
$ M. |( d5 L7 W7 m+ S0 A
. J. j$ s9 |7 q8 v H- [' o' w
作者:
xmdesign
时间:
2014-5-10 09:58
基本原代码的大概是这样,我是断断续续捣鼓的,玩到最后版的,后面我会找出来先测试下过,再贴上:)
作者:
duanyz
时间:
2014-5-10 10:48
请楼主发一份给我,感谢!
178354773@qq.com
作者:
机械梦想者2
时间:
2014-5-10 12:10
楼主请您发一分给我啊,
804167650@qq.com
作者:
xmdesign
时间:
2014-5-11 14:30
已经发出e妹:)
作者:
usbfans
时间:
2016-8-23 15:43
老师,给我份资料学习下?
398087764@qq.com
,感激不尽!
- k3 V7 f& E9 y6 j- \5 ?& c
作者:
nasony
时间:
2020-2-12 18:59
nasony@163.com
) U. s9 v! J8 L P8 m
作者:
nasony
时间:
2020-2-12 19:00
请楼主发一份给我,感谢!
nasony@163.com
欢迎光临 机械必威体育网址 (//www.szfco.com/)
Powered by Discuz! X3.4