国产精品乱码一区-性开放网站-少妇又紧又爽视频-西西大胆午夜人体视频-国产极品一区-欧美成人tv-四虎av在线-国产无遮挡无码视频免费软件-中文字幕亚洲乱码熟女一区二区-日产精品一区二区三区在线观看-亚洲国产亚综合在线区-五月婷婷综合色-亚洲日本视频在线观看-97精品人人妻人人-久久久久久一区二区三区四区别墅-www.免费av-波多野结衣绝顶大高潮-日本在线a一区视频高清视频-强美女免费网站在线视频-亚洲永久免费

 找回密碼
 注冊會員

QQ登錄

只需一步,快速開始

搜索
查看: 24668|回復: 14

運動控制入門篇GCode_Interpreter

  [復制鏈接]
1#
發表于 2014-5-10 09:39:53 | 只看該作者 |倒序瀏覽 |閱讀模式
本帖最后由 xmdesign 于 2014-5-10 09:42 編輯 ' q, n1 Q6 _' a: d  `) ~4 a

6 g$ [5 h# X: E3 c$ c+ S" z首先聲明
/ B! W. [1 R- ^0 z& V+ ]& T( u我不是專家,業余搗鼓4 e  G$ N8 M  _% a* R2 @
源代碼首先來自網絡
! F8 a6 q; k( o* |' N4 e2 l  s5 v開發平臺Arduino及Maple
- z  y% |. ]* j* x! H* _http://www.arduino.cc/, R4 G# U1 @$ S% t4 y* Z9 V
http://leaflabs.com/devices/
* S* O# u+ q- c. o國內活躍社區
# ?% b8 z4 j, H2 J  {' bhttp://www.geek-workshop.com/forum.php + S5 S8 z) j* U
# U+ I& z* Z7 E9 s
竟然缺少積累,首先尋找最大的開放式開源平臺,這樣可以積累全球范圍的創客和DIY者的腦力活動經驗
* `% t" K& s# `: _# T; n來入門了解熟悉思路架構等/ d& X8 H, {% f
$ L3 c% D1 _6 Y3 c: d6 C
我只搗鼓了下8位機Arduino 移植到32位機Maple 方面一點點事情,% l5 U$ \7 h$ |, g
許多功能還木完成,不過作為低檔次得應用可能還有可能
4 m* m! c4 ]  |. G. V& X  f6 m: b. f* }% E
我自己也是個半桶水,再樂意玩的起碼自學能力還是要有點吧- D2 n" n8 q- B5 c, A- r4 R

6 q9 ]2 d1 V/ s2 _! q. e3 N1 d9 c9 W. B拒絕 所有的求6 J  ^8 U( l$ N8 p
求人不如求自己 不然木玩6 ?$ I8 V, X% L' O

' i5 F1 ?) U4 C高手繞道 謝謝!& x2 ]. |+ X+ i6 t) a+ y4 Q4 y

1 E, U+ Z9 T8 Q% ^0 G: R
回復

使用道具 舉報

2#
 樓主| 發表于 2014-5-10 09:48:37 | 只看該作者
本帖最后由 xmdesign 于 2014-5-10 09:52 編輯 ( k! T3 i" w  P2 J" X- ?9 l
3 A! f, i" w! W6 i; l: m! e7 C
GCode_Interpreter是比較容易懂的,木那些寄存器等蝦米開始不容易懂的東東6 F- F; i) d+ G# F" ^) Y
貼代碼先& L- G& t9 m+ O( N' G0 b( r
直接Maple的,某寶許多超便宜哈5 Z& k* R9 p/ e( `- I$ y# J
暈,我怎么上不了RAR?
/ i1 j4 _$ V2 ]  p想玩的留下 e妹吧7 v* C/ H" e" o( l, b/ t  C$ \
第一個妹麻煩傳第二個妹哈
; V* S; r# D) E- }6 M0 s) k我平常雜事多  g# n2 f2 c" R: e2 O% T& e
誰放網盤上再,麻煩開放下
3#
 樓主| 發表于 2014-5-10 09:52:53 | 只看該作者
// Arduino G-code Interpreter for Rep Rap
' X$ A1 W0 O8 }$ P. L2 _% P) m9 C// v1.0 by Mike Ellery - initial software (mellery@gmail.com)
# B  {+ A+ I) @. a/ E! ]* i6 [4 C// v1.1 by Zach Hoeken - cleaned up and did lots of tweaks (hoeken@gmail.com)
& }7 @8 O7 H: f% b, ^// v1.2 by Chris Meighan - cleanup / G2&G3 support (cmeighan@gmail.com)
. c( a' K+ S" N& G/ l// v1.3 by Zach Hoeken - added thermocouple support and multi-sample temp readings. (hoeken@gmail.com)1 U* Y- G( T! J7 C9 P1 [

% V1 }- Z5 h' Q// Arduino G-code Interpreter for Macro / Micro photography$ q2 N* a! ?' G% |0 }
// v1.4 by Gene Cooper - modified and setup controls for macro / micro photography (gene@fourchambers.org)
, R  ~% h3 K% B. V* C//modified by YaoHan China 2010.2.15
$ y4 E+ T; h1 R8 ?6 }7 a$ F: o//modified by JiWei China 2010.2.22 (jwdesign@163.com,QQ:75990175)0 s5 a( A' ~5 R) E1 x- I6 A9 S
#include <stdlib.h>' w' @! ^: r8 J& I8 X) Y+ f
#include <LiquidCrystal.h>& G0 K+ n5 z0 ]+ K8 D( `/ |9 |+ P
/ B7 w; Y0 u# C; `7 `
//啟動(高電平有效)/暫停(低電平有效)  默認高電平
, Z* R  W/ J+ j  X' {8 A! @#define BUTTON_CTL 35
6 Z/ e& `3 s. d0 i* F; ?" s8 u* ~1 N* a) a+ O: M
//點動模式鍵(高電平有效)  默認低電平
  P/ p( |; P/ e& W' V, W3 F#define BUTTON_SS 36
3 \  d$ y" i' E; |' i5 C& u  q% b1 W- f* j% e  ^+ B+ D
//點動鍵
2 H9 E( e, j) h. b! |' C$ S#define BUTTON_MAN 15
! u' c- s7 X# M  q' h1 x- Q: g; M. A' b' A, ^6 y
//電位器速度控制
- g0 r  K! G" Q5 j5 k, P) G6 F#define SPEEN_CTL 16
& t- W4 L# `! k; z. `
9 G! k; O+ m' G//手動調速使能* z; O5 H, I/ I2 U
#define BUTTON_SP_EN 17
5 P; Y4 B. |9 p  H$ X
) q/ _2 P1 j; g8 J' Z& P) b2 m2 y//LCD 類型 1604或1602
- u- S; x. e3 V#define LCD_TYPE 1604& I  @2 T! \3 f. j0 q
//LCD 引腳定義& A8 Z' B. D/ s' ?5 Q  w
#define LCD_RS 23
2 U) q& E$ R6 p- ^7 U#define LCD_EN 24
! }3 f- ~. d% b#define LCD_D4 25+ C$ w7 z( |5 `
#define LCD_D5 26
+ `% U6 E0 r% p: Y#define LCD_D6 277 }7 n0 Y7 [6 i) Q" y/ w
#define LCD_D7 28
6 e6 g) N: d! X- ?* U  h/ E* |0 c# g( J4 o& z: B( d2 j
//命令字符串' J; B7 v1 X! n. q/ c# r+ i
#define COMMAND_SIZE 128, F2 J: C, Q+ r( h4 m/ {# [  D
char word_old[COMMAND_SIZE];9 x4 p9 w; H5 @6 E! \4 H6 [; i3 W
byte serial_count=0;& x! \$ Z& N% j& d
int no_data = 0;
) ]9 b; X# u4 G: q6 J//LCD 引腳鏈接 配置8 r2 F0 u9 P6 `! [
LiquidCrystal lcd(LCD_RS,LCD_EN,LCD_D4,LCD_D5,LCD_D6,LCD_D7);
5 p& G0 S+ V) E//停止控制,高電平有效
: R+ `3 ?% T3 O5 j8 V, H! _1 [* H#define BUTTON_STOP 30
- m: o7 g) _; E  Z8 Wint stop_flag=0;
6 ?5 d2 ?8 C7 _4 z/ x5 K2 G6 |/ Z  p$ c( R4 S
//暫停
$ X$ _, L$ g; G  e% V5 fvoid pause(){; O% Y9 B; X" I% ~8 d
  while(!digitalRead(BUTTON_CTL));
5 v$ ]- j: h4 z  r7 l) |' |}
5 s  q6 f- R- S
/ A3 Y+ h- E' t& {void stopper(){
/ `: e; M5 s- o  E9 d  delayMicroseconds(10);7 N/ t( U& }( Z0 X9 h
  stop_flag = digitalRead(BUTTON_STOP);
5 U7 o' y6 t7 j' `}
0 H" @* Q- }+ F5 L, W' S) }8 ^" S1 A2 h) {8 g. X
void setup()
' x) \' x$ D8 O{
2 D3 E4 i% ?1 p! S  //show start5 f/ q4 U$ B, M# J
  SerialUSB.println("start");& C' b: _. j+ A  K

, y) n0 k& I0 ?5 N/ f2 Z  //啟動lcd. t* ?/ N/ r  k+ j2 Q
    lcd.begin(16,4);3 M+ g, h. r* u$ z- ~
    lcd.setCursor(0, 0);
6 {7 l% J/ g- i- M0 x) }# b) ~  |8 X    lcd.print("hello, world!");. w, \* O3 E* _% w6 U- H* S/ R

, g' g8 N; Q) a  R: v5 y  //初始化控制引腳及引腳功能
0 }* |4 J0 }* f( T1 r$ U  pinMode(BUTTON_CTL,INPUT_PULLUP);
* v7 k  {: O7 v* `8 T0 ~/ S& T  pinMode(BUTTON_SS,INPUT_PULLDOWN);& G$ |7 J7 V; a5 a
  pinMode(BUTTON_STOP,INPUT_PULLDOWN);' {. l4 d3 X3 W$ F+ a; n7 Y
  pinMode(BUTTON_MAN,INPUT_ANALOG);1 [" ^; O! P% i% Q4 u* ]  d
" V: O0 a' X% N- u* a4 T+ w  c
  //控制引腳的中斷
, E& {0 g" K: a8 q6 F3 p  attachInterrupt(BUTTON_CTL,pause,FALLING);//暫停的中斷
7 U( {" S# \2 ]  ^4 \5 Q  attachInterrupt(BUTTON_STOP,stopper,CHANGE);
: D1 e5 D2 \% ~: E9 i" D0 k9 c
8 p; F- v8 w8 Q: d3 Y) s  //other init
+ X& y  @5 U& t7 L  o  init_process_string();
9 Y2 m" L$ K9 D8 x1 i  c  init_steppers();
8 a% L% s9 C+ I* c1 Y% n  init_camera();
# i6 d# e' D9 @. L6 d/ m* f
* s2 c6 j3 T& H- J# n}' L# M  B2 I! U5 c

0 U3 o' k; j% b: Hvoid loop()( u# U, I. e& f+ N5 K' M
{+ r* t+ B. z! d5 Z% H# j0 p9 N# }
  char c;0 j' }% E" p3 m# n! ]- n3 W
; E! j& B4 Y4 p
  //讀取輸入的字符$ F% f; m9 o9 I
  if ((SerialUSB.available() > 0) && (!stop_flag))
6 P9 H. `  ]7 _; `1 [- N0 [  {
* k2 {+ O6 `  Q7 b    c = SerialUSB.read();2 A/ c, n, L4 c
    no_data = 0;% c# e# K! R$ N  H; s0 _. M
4 F- ~" y! t. \0 y& u% i% O0 f
    //換行符代表一個命令的結束9 w+ d4 H& p! b" n. c$ }& C9 n
    if (c != '\n')
2 U7 B: j. H& f4 w& |0 r# V    {
" x' o0 j. [2 |1 p7 d      word_old[serial_count] = c;
+ h# B- g! D+ ~+ d+ w! e, b: t      serial_count++;
* Y$ B' x( X8 E1 f$ i
0 V8 q/ U$ A% E+ |, }8 Z    }9 D. M) T" `4 M6 l
  }; d, D4 m8 j' D- x, t$ F
  //標記沒有數據輸入
+ e" h! V- `* a7 {' {  else1 b/ C* y7 [  L  C" x3 Y1 T
  {3 _  |2 s! B% x  f# u
    no_data++;
3 w& F4 ?) j9 I    delayMicroseconds(100);
+ q* s5 ?% g8 k- g9 ]  }
. N& _  g: H0 h# L+ o7 \
% z$ I6 l# ~: m$ J7 j  //if theres a pause or we got a real command, do it/ w: t3 [2 g  L, T9 U4 V1 p
  if ((serial_count && (c == '\n' || no_data > 100)) && (!stop_flag))
7 C" }' l1 ^# G  {1 K. i: f; [; ~( H
2 z$ o8 \" \+ X) P2 i2 h3 H
    //處理命令) L/ |1 ]  Z% v- B8 d
    process_string(word_old, serial_count);7 Z0 K7 G) R8 y$ N9 u& |2 }: l4 c
" i% Q* O2 V; L( N3 _: ?# Q
    //清除命令. \/ n, Z1 v! W' E
    init_process_string();
' f, X6 ?+ a9 i  f- p  }
- f+ J5 B6 V  x* ?4 ^* N
. @3 W( r3 j! W% J; F) j  //如果沒有數據關閉電機
/ }$ E& ]+ T! W8 e( r% N  if (no_data > 1000)# y6 E* c5 Y7 f# G
    disable_steppers();, }! ^) d% [- Q- m$ L) O- K
" [/ Y2 f" {2 g* o! w2 }* f4 V- z
  //如果ss鍵按下進入點動模式. Z# G+ f. V* {
  //if(digitalRead(BUTTON_SS)) ss();0 T7 |6 X: ]) H3 ]  U
  run_a();# A1 A1 L; h6 D
}5 b- H5 L% {4 K, d! f
. ~. t# D# m: F- a
//點動模式
7 s* N; T" b  s! J6 b0 f) x$ evoid ss(){* I: N( t3 [  P7 K' h& t" Q2 f& o

% s5 S5 g- G" t" Y- S  delay(1);! a: K' V! y! v! l7 [+ i
  if(!digitalRead(BUTTON_SS))return;
/ v6 d7 v/ I; f, Y) G+ F2 U! h3 B  if(!digitalRead(BUTTON_SS))return;% x& W5 D3 t0 ?, e4 B
  //init_process_string();) q+ u; o$ U" @  n" g! O8 R# S( @
  //init_steppers();
& b+ P/ T. G2 `; ~  //init_camera();2 r/ P9 x' o0 }1 `0 l4 P! u

# H6 z) C1 W8 J" e! ? // SerialUSB.println("Step By Step Mode");
% H, C2 [' [; |" H- a//#if (LCD_TYPE == 1604 ), d& n3 d0 }0 g" D
  //當LCD為1604時顯示要處理的命令3 G3 Q7 e% W. z  t8 k/ S
   lcd.setCursor(0, 0);6 a" D4 R, N3 |( A* D
   lcd.print("Step By Step Mode");
( G: l/ a) T$ x$ M0 W$ Y" C//#endif9 r% F% _: H" f2 O7 z
  process_string("G1 F5000",8);
! s/ a  s( B  B% _  L) @) I  process_string("G91",8);, E- m# E: Q2 Z# Q" x0 _
  //init_process_string();
8 _, [$ t# J  x$ Z: g
6 X" j# d1 O7 P6 y+ Z/ _0 U  while(digitalRead(BUTTON_SS)){
3 S, U! U; V- d6 N    int i=0;  |5 f6 Y1 R8 J4 i
    i=analogRead(BUTTON_MAN)>>9;
9 ^  Y; z* @6 v6 h& K    //if (i==0){break;}9 j" ]; @6 M& _( h. j
   //SerialUSB.println(i);( P' m* j2 G! i% A0 n* h
   //delay(1000);   & Z& j7 u2 p( X' e9 r
5 I' x% q, |2 G$ Q' m
   if(i==2){7 q/ @: E. d& O( }8 G0 l
      set_target(1000.0, 0.0, 0.0, 0.0);2 `8 w8 p5 u  g8 [, x4 ]
      dda_move(getMaxSpeed());
/ X3 O' S" d2 F! f      if(stop_flag) return;
. O2 D6 D. u* m! L      //process_string("X0.01",5);
  l, |2 z/ F7 Z8 W- d0 w      //init_process_string();+ A4 m4 M6 d5 C4 r; X/ T$ L
    } ! M/ x- m$ Q1 I2 Q7 ]+ M
    else * b" g1 A" T* L2 }2 I
    if(i==5){- I5 ^& G7 R1 l; k* \. q
      set_target(-1000.0, 0.0, 0.0, 0.0);. w) J1 i4 a+ F( q
      dda_move(getMaxSpeed());$ s! b' Q1 [& Q: A1 b7 _* Y
      if(stop_flag) return;. w0 X! l! j: s) {! m" }
      //process_string("X-0.01",6);3 z; a7 U) i% t! p; J8 \
      //init_process_string();
. _, p8 h$ h1 a4 m! m( s& C    }
7 m, y9 X& F+ @& H: e0 N) ^     
. ?- T" v: t/ i  F4 r7 K# r4 y4 n  d" g6 z
  }
, ^- ?4 ^# }! g) c  i! |7 A, ^+ m+ T" V# S& N( Z
  //init_steppers();: n- O3 b0 c- H' g
  //init_camera();& o* I5 C+ W) Z0 z5 y9 g
   // SerialUSB.println("Return To Normal Mode");5 g9 _1 f) C& N, f2 `; u
     process_string("G1",8);  ~# r6 L1 [3 _" S% S
  // process_string("G91",8);# o6 E* Z1 ?# y. P& z& e
    init_process_string();" j2 H- Z* y: v1 |$ D( p( {3 b0 s
//#if (LCD_TYPE == 1604 )1 {5 x* L& O  s: I& {9 b, B+ `
  //當LCD為1604時顯示要處理的命令9 B" S6 L9 x3 E3 v
  // lcd.setCursor(0, 4);
0 G/ L/ y! m' X/ M; z: `( N4 H* ?  // lcd.print("Return To Normal Mode");
- Y! V9 N( J' a& ?) n1 {  u//#endif
' u/ \! S( c3 h* m}1 U; n1 u: x( ]2 |1 c. n/ R5 ~

! S" I' Y8 b9 Svoid run_a()5 P  ?3 a0 M$ ?2 [/ x5 J
{5 {( Q( [& ]# n) ?# M$ N" D
  //delay(1);" c- i# e5 K/ Z
  //if(digitalRead(14)== HIGH)return;- p7 S8 i; _# C, j/ d% N- ^' o8 Q
  //if(digitalRead(14)== HIGH)return;
' M  q8 A4 @" {  //process_string("G1 F2000",8);
9 {% \% _" W( {) f //process_string("G92",8);. G. G1 V3 q( d2 H" H
process_string("G90",8);
3 @& B; Z' G5 C! h7 r+ F: h process_string("X120 F10",5);
# w, g; U. O+ ~7 A3 f process_string("G4P2000",8);
! g/ q' k6 n  y! Z9 O0 Y' t process_string("X10 F10",5);, V& r" _" t. e& J$ l  ^' i; e2 n
// process_string("M101",8);
0 k& V, f' s3 H& O! S# u+ D% F# M// process_string("X-50",5);
  P8 g9 [1 w& d; h5 u- x5 d7 r9 W9 A/ X dda_move(getMaxSpeed());4 D8 \6 D* D: C
init_process_string();" i" @8 z# L' ?- F, m" W+ y1 F
7 k. m- J+ u: `
}
; \4 o5 e5 k0 g
4#
 樓主| 發表于 2014-5-10 09:53:25 | 只看該作者
1 B; r, o3 X: j6 S* g7 f: Q, z
  l# R' {: a: B3 X4 F' U
// 定義機器參數5 z! q, G& n& n0 O3 ^( A# a
#define X_STEPS_PER_INCH 400
& q0 R5 d/ B+ _+ i5 V0 [5 Q#define X_STEPS_PER_MM   16.0
+ o7 ~0 y0 a3 ?' ^% L#define X_MOTOR_STEPS    2009 N: n6 ~1 J7 p2 V
, Y  D/ X0 O- X: e2 M4 A
#define Y_STEPS_PER_INCH 400.0
+ _5 h: {3 k. [#define Y_STEPS_PER_MM   16.04 h! a8 J) Y# a' W! ^" v2 Z
#define Y_MOTOR_STEPS    2009 X, s" s/ ?9 S6 f0 P/ J+ G

# V! r' e( B3 A& l% [5 A#define Z_STEPS_PER_INCH 400.0' m5 Z/ _7 i1 ]3 i, V; j$ M
#define Z_STEPS_PER_MM   16.0
* x% U* {: Q& _$ f#define Z_MOTOR_STEPS    200  s& F1 o! N! ?  B# G" O2 t8 h' M
5 Z* O" a  b& G( X: F$ f7 M+ S- ^
#define U_STEPS_PER_INCH 400.0  b( [# H1 p2 G- t" r
#define U_STEPS_PER_MM   16.0
9 S, K* H* X: |#define U_MOTOR_STEPS    200* Y6 v" D# v% j3 X8 L0 O7 X# @

3 ^) w, Z: h* E, p/ M) p: I//最大進給率4 Y: s( {5 [! A# O1 r* y$ I0 g
#define FAST_XY_FEEDRATE 1500.01 m( Q1 S0 b* t! }* N" N
#define FAST_Z_FEEDRATE  1500.0: o6 Y/ A" p  `1 D6 k! E
#define FAST_U_FEEDRATE  1500.0
1 @9 j, |3 _1 o  Y- F// Units in curve section* J6 l: K: J9 u" Y% K
#define CURVE_SECTION_INCHES 0.019685
) X! C6 q0 a* w8 J; A0 c#define CURVE_SECTION_MM 0.5
% w+ ]0 a1 g$ e: ^6 r" O5 Q3 e/ r7 l4 y. b+ j

5 y9 I. A: f0 l: |  m, R9 I) O0 E! {// Set to one if sensor outputs inverting (ie: 1 means open, 0 means closed)
6 w: r" K; p7 j" I, |. Z% q6 X9 e// RepRap opto endstops are *not* inverting.9 o3 z- b; r4 ]2 d, T
#define SENSORS_INVERTING 1+ y" ^' o9 L& S& J, z4 Z
" B( H& t- m% O" m% j! z( o
/****************************************************************************************
' W& n% a+ D* c  ]% x2 s1 i * digital i/o pin assignment
; M" F4 n. ~4 k  h+ z *
: C* H0 O, f$ v& B) G- Z* i: D+ C+ I * this uses the undocumented feature of Arduino - pins 14-19 correspond to analog 0-5$ d' @3 L( Z5 {0 T, r0 G
****************************************************************************************/
$ M, e0 T' B: K' n% f* Y$ r. {# e+ I# T
//camera shutter and control pins( j' q7 _9 O0 t. \) G0 w" }( Q
#define CAM_SHUTTER_PIN1 290 X3 @, ]* b' ?) \2 F. U6 o9 l% @7 B+ {( b
#define CAM_SHUTTER_PIN2 30
1 P9 y( u: ?6 g7 s* i: Q//#define CAM_AUX_PIN1 31 // analog 06 V1 D: X+ v. H* R  m9 m4 ?% s
//#define CAM_AUX_PIN2 32 // analog 1
! F6 l" a5 f% U0 V//#define CAM_AUX_PIN3 33 // analog 2
( I$ S, S9 [8 a4 J# P6 w//#define CAM_AUX_PIN4 34 // analog 3
* m" |& [# q2 a: J/ P6 \
9 n; p- e: t8 D7 F$ n// stepper driver pins& r0 d0 ?4 E% w
#define X_STEP_PIN 72 Q3 V4 \, L' l- t0 p
#define X_DIR_PIN 8
: A, T* t# _7 R1 H% u#define X_ENABLE_PIN 19
; p  z+ {# }2 N- L" v) m/ z
& r7 f6 A* Y7 @" x) C3 I; b4 }#define Y_STEP_PIN 9
0 `) {. t2 E) N! r" A" s1 R  Y6 D) k#define Y_DIR_PIN 10
: @3 d  M. u+ g) I; D) n#define Y_ENABLE_PIN 19
. l6 U8 a4 q/ C# p- v5 {/ h  E
5 b; ]% K: ]4 G#define Z_STEP_PIN 11
. ?& I* e4 O3 L7 E2 u1 V$ u#define Z_DIR_PIN 12
1 W, @4 _' ^2 ?( x" h3 I#define Z_ENABLE_PIN 19
9 }$ F3 D- B; ?3 M2 ~3 \" T8 t
- Y  M+ Q0 X% R+ T#define U_STEP_PIN 138 l! x& R$ }. Q( Y1 V7 |0 A
#define U_DIR_PIN 145 t4 m8 P- m% V: `8 J7 F
#define U_ENABLE_PIN 19; s: h0 t, Z% y  p1 U8 Q
2 `4 c' E7 X1 Q: B" s6 ^; E, ?
// limits not used right now; h4 u8 T2 O8 F
#define X_MIN_PIN 146 r* ?2 l/ ^0 M1 U( W$ I/ }. a8 F+ V! \
#define X_MAX_PIN 14
) M/ j0 P/ F1 r; c' x. Q#define Y_MIN_PIN 14! _% c5 m" W# Q+ J6 R
#define Y_MAX_PIN 14
6 Q: O3 h* e# ?( i% A3 d) `! ]#define Z_MIN_PIN 14
- r$ S' j3 n1 o* N# @' i#define Z_MAX_PIN 14
* N  V* D) ]+ l; N/ x#define U_MIN_PIN 142 d; ?% [8 x8 U6 P1 W* ^( k) M- x
#define U_MAX_PIN 14* V3 H9 _7 m# J. K3 q9 l# T& o
5#
 樓主| 發表于 2014-5-10 09:54:26 | 只看該作者
void init_camera()' w! V3 \7 D- q$ \1 [2 }
{
# d% e7 \, W! f  pinMode(CAM_SHUTTER_PIN1, OUTPUT);
6 O2 s1 ~3 \; ?$ ~: K# v  pinMode(CAM_SHUTTER_PIN2, OUTPUT);! m6 D9 K; }4 Q3 i. B! Y
  //pinMode(CAM_AUX_PIN1, OUTPUT); // analog 0" N$ ]. o+ m8 ]+ t
// pinMode(CAM_AUX_PIN2, OUTPUT); // analog 1/ S% q. a% W5 `5 s( ~! a
// pinMode(CAM_AUX_PIN3, OUTPUT); // analog 2
( s$ p$ l( Z. N // pinMode(CAM_AUX_PIN4, OUTPUT); // analog 3
1 q8 ?1 E7 O0 b4 J  ^}7 W+ r; Z- h3 b' |# i
9 |; }& B3 @+ h0 Q# s
void camera_shutter1()3 \% X! u2 |6 ~
{
1 j6 e5 N& E  k; G' |* H! |' n  // fire the camera shutter via relay...1/4 sec hold time9 y$ _5 A  Q, S, M& i3 M' J
  digitalWrite(CAM_SHUTTER_PIN1, HIGH);
4 z& P8 q# `" V6 f! R* L0 I8 T  delay(250);2 v9 J* s  V5 K2 y' G
  digitalWrite(CAM_SHUTTER_PIN1, LOW);
1 @7 F8 C/ q$ v$ F" ^$ A8 O# D# q% }; b- N
}5 h/ O' C7 h0 j$ m! p* i

$ }. Y4 P8 P7 `' svoid camera_shutter2()
7 q$ u* ^9 M+ {0 M{, f6 D3 {4 [% j
  // fire the camera shutter via relay...1/4 sec hold time
: ~2 o5 }8 `6 `& E, r$ S1 j  b. Q  digitalWrite(CAM_SHUTTER_PIN2, HIGH);8 Y7 e* n: x1 K6 D4 \1 [& j
  delay(250);
' ?2 [! ~2 d- k  digitalWrite(CAM_SHUTTER_PIN2, LOW);& G0 ?; O; e4 I9 i

, |% a. H5 G' |6 T# s$ h5 p}
# y$ }) ?" x/ _; G7 G9 c7 b/*
; `+ s( Q+ f: fvoid camera_aux1_on()# W) H- \7 t2 K9 t2 h
{5 L9 a/ m7 P+ a- y& k
  // turn aux relay 1 on3 `, a+ R. \6 Y8 @
  digitalWrite(CAM_AUX_PIN1, HIGH);( F4 |) s* @& O# X# z; q& S
}
8 c, }" X. N6 l9 r8 J# F7 i2 U- [0 b5 ]0 ~8 V1 l) _
void camera_aux1_off()
7 k, f& s1 p$ H# y; n, F8 e{. ^/ w* R/ M; J- K
  // turn aux relay 1 off
% l5 y: l% k% q# i  digitalWrite(CAM_AUX_PIN1, LOW);
/ s8 a8 K# R/ U0 Z/ k}
6 p, ]$ D) p% Q% F; o6 W: _, k: l/ r7 L3 R4 ]) w2 A
void camera_aux2_on()8 M5 z, B, _& o* U; t" R
{
1 L) `$ {6 G$ V, Y% t5 U0 a  // turn aux relay 2 on
0 l3 I$ h/ r! H: q9 L1 p  digitalWrite(CAM_AUX_PIN2, HIGH);
8 u! V& Z. h# n2 [, q}
3 ]5 {7 ^/ k5 u+ Y* j, ?; |# V4 h
. m5 i0 C, x( Ivoid camera_aux2_off()
7 S' B7 J/ v' A( F5 @/ C1 D+ G  v, h{
' D8 o0 u8 m# W1 J; I" N  K% Q  // turn aux relay 2 off
( r8 v3 T( n% M  digitalWrite(CAM_AUX_PIN2, LOW);
: @5 `! \. }1 }: K2 l5 d}$ f# c# t/ I4 [* _/ g# {
4 a* P& H$ q! I' ^
void camera_aux3_on()) v/ c) P" C0 n) i
{! ?' n* o& Y9 Q. ^  \( D, j
  // turn aux relay 3 on
3 k3 h& c7 [' ~  digitalWrite(CAM_AUX_PIN3, HIGH);0 Z* |% q, P' K: Q8 e4 z$ A
}
) z: J" r6 K) `0 {
, ]: ]( ?# K4 B$ L7 m  H+ N9 Q3 {void camera_aux3_off()# N+ U( F* G. N6 v$ C
{2 s! s. L5 y) @& ]7 l) }2 W
  // turn aux relay 3 off
. \9 U5 a2 J" L2 O' k- T+ F  digitalWrite(CAM_AUX_PIN3, LOW);
0 U7 d8 A3 p# b( Y  @$ a}1 B# \+ M+ e- U! j/ V

. h" W; O6 x) \, a2 hvoid camera_aux4_on()3 W' O4 r* l* G
{. [; Q% i# Z) Z- O; e* A' U& ]
  // turn aux relay 4 on
6 l8 V) ~4 q( s1 T( m7 |" x  digitalWrite(CAM_AUX_PIN4, HIGH);% [1 n* e# A! I% p
}  P( @# ]/ n# u4 l+ K8 Z, q

9 C3 I" s6 l3 x  H. H" L5 ~) ~void camera_aux4_off()3 }, V( }7 K  }3 |+ T
{
  {8 |2 @5 R0 S+ k- E" B; c8 ?  // turn aux relay 4 off
; ]; e3 K. i# a# y# N0 c  digitalWrite(CAM_AUX_PIN4, LOW);
$ k% H6 V& U7 Q}
6#
發表于 2014-5-10 09:54:28 | 只看該作者
樓主推薦的網址不錯/ |  M8 z3 ]9 v7 `6 k3 f' @0 o
請問樓主是玩什么的,用樂高玩具嗎?
7#
 樓主| 發表于 2014-5-10 09:55:02 | 只看該作者
// our point structure to make things nice.! n+ n9 F4 A# J3 O4 \* a1 t
struct LongPoint {
8 S: ]6 `* q, H2 R0 w& N  long x;9 B) u) K6 l1 y: b) l
  long y;, e$ [- c! ?. o- S. a' S! F
  long z;1 U- G. Z4 b  p/ l' X+ Q
  long u;8 [) N$ @& T! d4 t
};3 O% I- `" a* j2 g2 H$ T
' ]0 |! S$ z1 V  _! e! l7 i$ b
struct FloatPoint {" v$ P9 s$ j. w' ^
  float x;6 ~3 m+ U+ |' a0 x. v; ~
  float y;. `8 [+ N! V) L$ p7 X& `" K( S# _
  float z;
$ z' X% \. s6 \) d  ~7 X  float u;5 o, R' R# t- {4 [: l3 B
};0 c" Z1 L! w+ s' ~% w, A) ]

8 v. o. j& V$ B# ?8 ^1 n0 CFloatPoint current_units;+ @* I1 x! O. K5 J: m
FloatPoint target_units;
& _3 @* m; K' x# t& f# ZFloatPoint delta_units;0 x2 n3 v/ ^6 u$ q& j# ^0 S2 _
8 y: r) ~' Q' `
FloatPoint current_steps;
3 |# x4 }0 ~# I: D; f% \FloatPoint target_steps;
: W8 T5 J' v' lFloatPoint delta_steps;
9 S, ^6 c9 B! k; \7 x; o7 X( I, d) s) J+ k$ b5 T
boolean abs_mode = false;   //0 = 增量位置模式; 1 = 絕對位置模式
  g" K3 ?# ?" t9 Y; g! I, n' e3 ^" a; {6 g4 N6 O& W
//default to inches for units. J3 _# I' l+ z, ?
float x_units = X_STEPS_PER_INCH;) a+ e! C: ]. t9 F* U9 d
float y_units = Y_STEPS_PER_INCH;
! r6 l3 ]0 f& y0 kfloat z_units = Z_STEPS_PER_INCH;' a$ z% x% j6 a3 E1 S( V( A
float u_units = U_STEPS_PER_INCH;' P+ u+ f6 A5 Z. c+ I% N
float curve_section = CURVE_SECTION_INCHES;
- S4 ~5 ?2 q. y+ h
% w: q) n+ a- z0 N//our direction vars
; U) T9 `4 S5 d$ y/ _# M# Mbyte x_direction = 1;
& s3 J( T6 a2 _8 a3 P* L  Bbyte y_direction = 1;5 [1 _4 A% i; W$ u/ V% ^& _
byte z_direction = 1;. g$ G- }" n! \9 D; c0 @$ k2 h8 N
byte u_direction = 1;- v& r/ y6 [& j: U6 j0 E* `+ I

; e. @5 F8 A* Z. H9 H//初始化字符串處理
% g1 \- z) z% U$ Vvoid init_process_string()
, S% n7 P* [# B4 L( T' o- H$ R  C{
9 H4 B9 E8 L8 H2 _2 R  //init our command3 d: o6 }) K* d3 T, F) M
  for (byte i=0; i<COMMAND_SIZE; i++)
& O1 }$ ^. B' N: n1 d* A    word_old[i] = 0;+ f) A0 O4 k/ Z6 R7 C" g4 G
  serial_count = 0;
- d/ n% }8 h4 y1 V3 ?, B}) g6 B8 {. }8 ?

2 q- ]$ h3 K. }& b//our feedrate variables.# Q2 t- `8 J4 U. }
float feedrate = 0.0;
& |  ]  I+ X  Ulong feedrate_micros = 0;
  v. i- q$ Z2 D+ J% k5 I
# v* ^' }! P/ u$ n& v* ~* `5 T//讀取并執行命令+ Z0 a4 t0 r: E) W5 ~, ?& T* O+ `
void process_string(char instruction[], int size)! x4 w  {2 O, x: v% H- r
{
4 g1 e6 J7 m) \( e; _" ?  //the character / means delete block... used for comments and stuff.6 s. i- W3 o. y. {6 m8 H" H
  if (instruction[0] == '/')& u5 }4 s$ R8 U' y* I, u3 }2 \
  {' z0 o( U2 V% F: s+ ?% {- q
    // SerialUSB.print("ok");. w! }/ Y6 @; L( V4 {0 W, m5 W6 u9 [
    // SerialUSB.print(byte(78));+ \4 ^* p6 A! }, I! z1 H
    return;
! J* ]) z' K7 K! U- _. d. F0 N  }
9 |: D( F, T9 Z  //init baby!
+ i9 d- l7 \" F" d) B- t  FloatPoint fp;
' M1 s, C# S) k+ O/ D: V  fp.x = 0.0;
5 [( P; B( [6 Y: o1 `  fp.y = 0.0;
& {" c: Z$ o$ t: @5 v' D( ?( W1 I  fp.z = 0.0;
5 `# `7 c$ q! |; v, _) _; j, }  fp.u = 0.0;
9 o) m' P* Z* b8 c( a+ |9 ^8 J7 U# U# r$ R1 d7 a3 b' Y
  byte code = 0;# z: L- E% o& M! [  W3 H
! w7 f9 P, u9 i4 O  t- V, j
  //顯示在處理的命令7 M; f/ S; D0 ^7 F) Y$ @  }
#if (LCD_TYPE == 1604 )# F9 I2 q4 A1 P4 @
  // lcd.setCursor(0, 4);- X2 m& X, g9 G7 B9 X/ U
  // lcd.print(word_old);
. F3 }7 u* V8 a" f/ ]0 b#endif
/ W7 m' e7 Z$ R  \9 o; f  SerialUSB.println();
: t+ W9 v# q, A& [+ ^  SerialUSB.print(instruction);
7 X  R1 k: r. y, o) h5 ]  SerialUSB.print("\t");6 Y; a' C' D4 }7 s1 h# j
5 v7 N& @* n3 p
  //what line are we at?& m( H6 R' E- L# E8 g+ S2 t
  //        long line = -1;' S! t% P5 G' w! M- h6 @# T& O3 r+ w
  //        if (has_command('N', instruction, size))
5 `2 o9 e! M. d# w# N9 p8 Z' g  //                line = (long)search_string('N', instruction, size);; z5 U# Y% U2 z+ c
2 n" j+ n- B1 ?
  /*
* @6 h3 d6 A0 U1 m6 P        Serial.print("line: ");
5 e+ ~. A9 \- W8 e$ j8 ~           Serial.println(line);
. W6 R+ c1 N- [' D+ r. u( p) l+ x           Serial.println(instruction);
4 M- b0 I$ e! t9 a2 h' u   */& }( @# o% w/ d" m
  //判斷是否讀取了個 G代碼?- x" d# C4 R' i" |5 K
  if (" L( _9 j5 W  n3 w" U- V5 Y
    has_command('G', instruction, size) ||
7 f! m( k* O8 l5 K& j) a3 l6 V* C    has_command('X', instruction, size) ||( h5 u8 k/ x* Y/ k: `& K7 ~4 M5 P
    has_command('Y', instruction, size) ||# j7 l3 Y8 a. l+ ]+ T4 H6 k9 I$ l
    has_command('Z', instruction, size) ||
" u  I% Y# E+ j9 a& k    has_command('U', instruction, size)
0 L9 H$ [4 @! P$ {  T    )0 o& L) |2 ~9 h/ r" M
  {7 u7 y+ k' s" W
    //which one?( n3 N, V) f% @) k, I1 E
    code = (int)search_string('G', instruction, size);( I; I+ A' w! z5 \: m
    // Get co-ordinates if required by the code type given
7 k! f2 A, C/ i) f! y    switch (code)
4 h8 j& x! Z* q) [( H( s$ q    {+ u' f: w: ~2 x: E6 A
    case 0:
. g9 t' j/ r( Q    case 1:- D! B" H! W. k: O, j3 v
    case 2:, O/ O  U0 z4 B: V0 w" _
    case 3:* D# g; K( E2 q7 c4 v4 i: i
      if(abs_mode)
  y/ j8 W! w+ {0 S0 w      {& V& M/ l( R+ a
        //we do it like this to save time. makes curves better.
: D+ z* e2 B6 ^% f6 m! y' }8 K        //eg. if only x and y are specified, we dont have to waste time looking up z.$ G' G1 L* b% j9 ~: t- p
        if (has_command('X', instruction, size))
( @- q- G/ Z2 S2 I! w: a7 L+ D          fp.x = search_string('X', instruction, size);/ ~( s* T. H8 @$ }# K
        else
8 K2 F  F4 U* ]8 D& s8 d6 ^2 j          fp.x = current_units.x;# o3 q$ i! T- |9 }0 X

( O( C: \* p6 D        if (has_command('Y', instruction, size))
% @9 |2 ?& b. `+ ]          fp.y = search_string('Y', instruction, size);
, }, @/ r3 b- U7 s6 A& F# N        else
) N+ f$ G" S- j. r          fp.y = current_units.y;
1 A" ^( L) ]% `7 }9 f
. ~  |3 R3 j9 A" V6 S- Q& M4 R        if (has_command('Z', instruction, size))
& W+ Y, V' Y- V          fp.z = search_string('Z', instruction, size);* y/ l! H8 D$ u7 A& \; m
        else
+ S/ L* c% ^$ W, q' F          fp.z = current_units.z;
0 k0 z$ c9 h: M* V, g            j$ H# w) g/ O; U" o
        if (has_command('U', instruction, size))
0 c# P% S/ T$ y$ ]( K* s          fp.u = search_string('U', instruction, size);0 ?. _1 I4 o1 X7 }
        else
" h% H$ T+ a* K2 ~* j, y" o& V          fp.u = current_units.u;0 N3 m* }) ~  ~6 s/ ?
      }
8 |5 _5 L8 w, l3 z$ ^      else
" l, b$ e6 g5 U! `4 r2 b8 S- ^2 L      {
; [8 c3 k. i* a$ s  l" J) f/ I0 D; D        fp.x = search_string('X', instruction, size) + current_units.x;
$ F+ N/ H: o+ P+ v        fp.y = search_string('Y', instruction, size) + current_units.y;7 @) T7 q2 j# [
        fp.z = search_string('Z', instruction, size) + current_units.z;" P( q4 ?  [9 u: w! |
        fp.u = search_string('U', instruction, size) + current_units.u;7 h  t) F6 ^7 r3 n) q% }
      }
% A( L% n+ o+ d# v; u' s) |% y      break;
* W/ T9 s! q. S+ s    }
) @$ i1 q# r2 z' V; ~; {6 u* m    //do something!8 X0 E. L& o& c# s& o
    switch (code)
& N! c* S: R  `9 ]    {
' k: ]0 N! b$ n, K5 p) V) M( a      //Rapid Positioning( k" {% E1 j6 T) T$ g( B
      //Linear Interpolation' I! u5 `4 Y0 p( \2 b
      //these are basically the same thing.
7 R4 Y6 R. N2 Z) v; w8 U& z    case 0:
) w/ o! t  i# `4 f    case 1:
- y) c- _0 L1 o* K& l      //set our target.
+ n; X; k7 O" K' R/ d      set_target(fp.x, fp.y, fp.z, fp.u);% p4 m2 c, e7 j
      //set_targeta( fp.a);7 Z$ ^3 }6 |$ c
      //do we have a set speed?8 H, O9 }% M4 h
      if (has_command('G', instruction, size))
2 k6 D- c6 |4 S: ?  I( h' F      {
& ]% S8 _! V/ j) |        //adjust if we have a specific feedrate.
" {" ?" Q% o( Q3 o  P1 x        if (code == 1): L, K" p4 @0 u3 h; L
        {
; S5 _2 X+ p! N) v. _# X          //how fast do we move?% s$ d- U$ P4 \* x: U3 ]. |
          feedrate = search_string('F', instruction, size);
: O1 V! t- K! D7 @7 W1 |) n- C          if (feedrate > 0)
/ ~# O3 L3 f6 ~( W! s            feedrate_micros = calculate_feedrate_delay(feedrate);1 K, R+ T$ H+ V, _+ P# A
          //nope, no feedrate
9 y* ]. L; E. @' I4 r/ u  w8 c/ D1 `          else+ h! ~+ X9 H7 }& W$ J
            feedrate_micros = getMaxSpeed();
" ?! v, K6 ~1 s, h        }/ J( o% [2 h( U2 ?2 {
        //use our max for normal moves.( G# L& t  d- l: s7 _/ g, g7 v
        else
3 L* [$ Y0 j! f8 s7 i$ H% x- @) t8 X          feedrate_micros = getMaxSpeed();$ y2 f+ a1 L% ^" M6 R. i( j3 ]' ~
      }
8 P4 k7 ]6 h  Q2 F9 E" ~, `      //nope, just coordinates!
3 c! ]6 E9 [7 b3 n4 `" s& h; @# h" z      else
2 }5 w$ l- z  e5 i( t7 m      {/ J" k8 }7 u9 ~! W+ }+ l
        //do we have a feedrate yet?
8 r  D" @0 r& _* }        if (feedrate > 0)
/ h" U9 h8 ^6 R* B. W4 N4 l" Y          feedrate_micros = calculate_feedrate_delay(feedrate);+ a' k/ W2 E; x& \
        //nope, no feedrate# c% B5 R$ {+ `9 [& @
        else
4 i7 B' v2 X. T5 n          feedrate_micros = getMaxSpeed();
. i! b" a  \0 m      }# A9 L5 t' X, s" Z& d! J
* u2 F- L+ j; m
      //finally move.& I! L9 A& W: N" r
      dda_move(feedrate_micros);
& ^; h& W3 I, f% j1 L8 T      if(stop_flag) return;
' g3 T. Q  g: Y      break;! _- i& U" R) s

: O* q( T) u8 \7 f      //Clockwise arc
  b: A. T. A- Z& E    case 2:- W* K: h) Z, C& l
      //Counterclockwise arc
- R! S8 k- }" [, s4 O' \( n+ _    case 3:
4 c/ }. t8 J* o/ {- x  z      FloatPoint cent;
& {0 t" Z3 H4 s/ J6 E  A      // Centre coordinates are always relative
7 @" ^, V" D8 l2 a' _: G1 t      cent.x = search_string('I', instruction, size) + current_units.x;& o* [) h( g' C3 q. Y
      cent.y = search_string('J', instruction, size) + current_units.y;
3 n# d4 B% d  _6 V      float angleA, angleB, angle, radius, length, aX, aY, bX, bY;  K4 g$ N. k- t! R4 z- R

4 |1 R2 r& d; U, }* K( f      aX = (current_units.x - cent.x);
* O( w8 M! d( e/ y0 t0 w$ |      aY = (current_units.y - cent.y);
1 j& W9 K. x# _# w1 t; U  \  j, ~      bX = (fp.x - cent.x);2 ~- T8 j, _7 q; i/ }9 A2 M
      bY = (fp.y - cent.y);6 b: F( M( T; l/ E

6 I/ i; ~/ k' L# H: [2 T9 |$ ~      if (code == 2) { // Clockwise$ `5 H, k8 B6 `1 U: h. ?9 [
        angleA = atan2(bY, bX);
! W3 V* x' t/ ~$ l& K        angleB = atan2(aY, aX);
8 z1 w6 e: d  G      }
* t$ Z- P# `9 Y+ C/ I      else { // Counterclockwise! I3 Z4 N( y6 Y0 i3 m
        angleA = atan2(aY, aX);
: z/ w3 i$ {3 u6 p        angleB = atan2(bY, bX);
" C  V' w! M; X0 {. [- `      }
) t5 A2 T, K3 q' k0 x: k9 O4 ?      // Make sure angleB is always greater than angleA
3 K$ H% z/ ?4 g7 W5 Q      // and if not add 2PI so that it is (this also takes# B' D* }6 `3 z9 F( J: M6 r, k' y
      // care of the special case of angleA == angleB,1 c4 C  F, ~. w* l: i/ f
      // ie we want a complete circle)/ S9 T1 @6 M- L6 I
      if (angleB <= angleA) angleB += 2 * M_PI;
" Y; n* [6 a# o1 ?, e) m$ b. r      angle = angleB - angleA;5 z2 c3 q  _5 o) O2 S
' T9 ?$ V! P9 r, z2 O3 e: u
      radius = sqrt(aX * aX + aY * aY);
0 J. d0 l" L( V% k0 ?( s! J2 j5 A      length = radius * angle;
: I' o9 I) X1 Z      int steps, s, step;* }7 a7 C4 p3 w% Y3 I4 R: E
      steps = (int) ceil(length / curve_section);
1 G; o; E& V) c0 v. ]1 W. s3 x7 @3 M, K) S7 ]- n
      FloatPoint newPoint;% K. [3 j0 @! c0 E
      for (s = 1; s <= steps; s++) {( E  D7 `  Q4 b* }- n
        step = (code == 3) ? s : steps - s; // Work backwards for CW
, B( F& l) J% ]$ k: E1 H$ Z        newPoint.x = cent.x + radius * cos(angleA + angle * ((float) step / steps));' U! f5 u: D) }5 Q4 x0 g) _! O/ s
        newPoint.y = cent.y + radius * sin(angleA + angle * ((float) step / steps));
( [; Y5 s) o5 [        set_target(newPoint.x, newPoint.y, fp.z, fp.u);% c; g+ n, V5 ?! T4 u: m
5 u9 g0 T* H; G$ `2 ^1 d
        // Need to calculate rate for each section of curve
2 z. P6 Y! b( I( j        if (feedrate > 0): {) g5 g) Z8 l1 H  P. _0 o: @
          feedrate_micros = calculate_feedrate_delay(feedrate);
" W/ h/ _. v& P6 S  e) h        else
: A' Q" p% e1 ?1 T, J$ E          feedrate_micros = getMaxSpeed();0 r5 \8 O$ G( \: A  i
0 f2 Q, [+ K2 y, \: H( b
        // Make step
! h8 e$ s  r1 g+ V. P        dda_move(feedrate_micros);
. x9 Y7 w+ N  ?3 r; A7 v! V        if(stop_flag) return;* C2 ^- ]0 }4 ~" [
      }1 E7 L5 k7 D' p) D/ R5 n
0 b# K: h3 J' k" O- G( ?( d% J
      break;
  ~, F3 L) p  v, I/ w8 x0 N3 D, S" y. B3 B: [* ]: H- j3 r
      //Dwell3 l$ U* t- S; y& o8 \- w
    case 4:
6 M0 u  Y& e7 [. Q% ^4 j4 r  o- J      delay((int)search_string('P', instruction, size));
! j/ [( y" q" D% y. c. `      break;4 W2 y& j0 Q4 a7 N' o- t

7 q+ A, {1 V; v5 R/ C      //Inches for Units8 I- R4 m  v) y6 |5 b4 _
    case 20:" ?7 m  P% n; H# @0 X2 h
      x_units = X_STEPS_PER_INCH;
7 N6 j3 x  L) j0 @      y_units = Y_STEPS_PER_INCH;- r1 T1 N# Q5 ~0 d
      z_units = Z_STEPS_PER_INCH;
- L# U& I9 x4 x* V0 ^$ W# D      u_units = U_STEPS_PER_INCH;2 d* j; `" J6 E" U6 |3 s
      curve_section = CURVE_SECTION_INCHES;/ a" @8 E9 ~, n/ }0 g& ]! x& R+ W
      calculate_deltas();& Q/ ^- `, L# V* U: d8 a
      break;9 c5 ~5 V  `. A% A7 s/ w. k

2 }: p# B$ {6 }4 j      //mm for Units* ]" ]$ H# u3 x( m( E
    case 21:7 H, _8 s9 X! M1 r
      x_units = X_STEPS_PER_MM;% `2 `, x8 k# S% i6 \0 P( Y  f
      y_units = Y_STEPS_PER_MM;
% m  e3 L6 W4 l/ P" X      z_units = Z_STEPS_PER_MM;' g# v7 B( h' Y6 ^- Y9 i
      u_units = U_STEPS_PER_MM;' Q- G: S& Z" u8 \1 I( k
      curve_section = CURVE_SECTION_MM;
. E  L# ~7 e1 p( v" [9 I- y      calculate_deltas();
, {' k! e: X+ s. O; h+ p! E5 r      break;
" b$ Y, k1 Y3 G9 Z- |# J" \
$ I4 z1 F; {9 W0 `3 i      //go home.0 ~7 r6 M$ E' d; ~1 T
    case 28:6 ]! i, M% C( s# o4 y( U* a
      set_target(0.0, 0.0, 0.0, 0.0);7 C3 t" ]3 u. M3 T: r
      dda_move(getMaxSpeed());8 J0 I1 u, v% ]8 q5 z
      if(stop_flag) return;& m4 O5 K2 M+ o
      break;# u6 K0 ^$ }% E. n0 H

- M% a) i0 P+ e$ ]8 b      //go home via an intermediate point.7 {' P4 c+ ]  @: u) O" B3 \4 i5 ]
    case 30:
: X+ v$ {1 W9 T' n      fp.x = search_string('X', instruction, size);2 w* c3 Q8 D$ e1 D8 C$ A# x- I
      fp.y = search_string('Y', instruction, size);
. Y2 E, U% v, |7 L      fp.z = search_string('Z', instruction, size);
) H* F1 E, ?, l3 k( V0 ^6 o( }      fp.u = search_string('U', instruction, size);  q8 i5 `. E3 i. y2 U
      //set our target.1 |$ i7 O6 y3 V
      if(abs_mode)
) a6 i5 r. D! l1 Q      {
- P/ Z& M3 f8 L* n4 V- J7 z        if (!has_command('X', instruction, size))( A3 {& R  o- m
          fp.x = current_units.x;3 \( y& b" q! U" a$ m
        if (!has_command('Y', instruction, size))
! {. A: |2 Q' b. F& H          fp.y = current_units.y;3 u" {. k9 `# @: `
        if (!has_command('Z', instruction, size))  J; I2 c& Y& {  w1 `; p# Z/ b
          fp.z = current_units.z;
9 c8 f6 ], ]& x" j5 A3 M4 x5 t: ]        if (!has_command('U', instruction, size))
) ^( o! R1 c- ]8 K( w          fp.u = current_units.u;. o5 u; Q) O& E" `( R# A$ z$ U
        set_target(fp.x, fp.y, fp.z, fp.u);: U* E/ h! ?- K
        
( z+ V$ R8 J; b# G: F' M5 _% \$ m, z      }
0 C8 d' I5 V; f  H4 n* ~4 W      else
& q3 V& T* s  g' d+ b; `7 p        set_target(current_units.x + fp.x, current_units.y + fp.y, current_units.z + fp.z, current_units.u + fp.u );
8 L- n; x) O+ z5 Z0 Y       3 k: b5 U5 _! `, ~2 ]" w
      //go there.
+ T' v6 L) ~* Q" w- [9 l4 ~      dda_move(getMaxSpeed());7 j5 |% a% M0 j& ]1 J  r
      if(stop_flag) return;& P: r* B& F4 l( ^( R

6 k& [' a( f; B* i; O4 Y9 K      //go home.
0 D$ M- ]/ R3 F5 o4 J      set_target(0.0, 0.0, 0.0, 0.0 );+ L$ W* Q2 @' b) `- }# i  `3 j
     ! t! t( ~- p" o' K$ Y! H' S
      dda_move(getMaxSpeed());
/ I: t2 p& [+ d3 R1 X; W2 {7 {. ?      if(stop_flag) return;
6 Y. }0 K$ p) o, Y6 Y6 e9 z6 c: c      break;9 E- H1 d! p. J

& X  z! \% R* X; H9 V1 o      //Absolute Positioning5 U1 h6 d+ E1 Q- l) T
    case 90:
' }9 l( x8 Y+ N& g$ o- v# k# n      abs_mode = true;
7 o& N5 D- d+ Y0 d( Z      break;6 \9 x+ ]$ Q% J4 D, o4 _
$ J4 O0 I7 [7 e& H8 s
      //Incremental Positioning+ n7 `. R/ h+ x( E
    case 91:
5 w3 X$ i0 y' r" h! n) M9 d      abs_mode = false;
4 N+ I+ `# ^/ `  ?% ]      break;
# z  }3 Z- c' b/ S8 T& Z7 z; Z
, S4 w! Q9 r0 o# j6 V) _      //Set as home* C# {2 h, t) S+ j% h
    case 92:  L, G* W& m0 Y1 x7 R7 P, i5 D
     
# C5 u! D  W  t      set_position(0.0, 0.0, 0.0, 0.0 );8 C7 z$ V. d+ p7 w+ g
      5 U0 N6 t+ _6 g5 S. P* M) V
      break;0 z# f; m; T# A4 X; W/ \6 W

6 g; O4 w2 m0 h1 b1 \      /*
8 h" J$ Z" ?) C/ y! l4 r                        //Inverse Time Feed Mode" ]3 i1 x  e( N1 n  T
                               case 93:
3 `0 o1 R" \: l8 k7 v; b* h& u      
5 }0 O$ E+ S) W% P+ L6 v                               break;  //TODO: add this
! N) h7 Y) @5 ~' `" b( p: [$ N$ |$ Z       9 a: b- e# r' T/ F4 r$ Q" ~1 f
                               //Feed per Minute Mode  [( S& \: E3 S: M/ u
                               case 94:: h2 a* p1 ^/ n, o
      
# S, s" Z( ?' N9 g$ j                               break;  //TODO: add this
$ H5 p  c( j/ E; b3 ^6 q$ _       */
6 }' U' z$ O4 t# ?- |% v! t+ x6 }
0 V7 N( Z& y4 y, g8 o  p    default:
$ l# y  G1 |/ K3 m      SerialUSB.print("huh? G");
$ w3 i5 x" D2 p( e0 h4 z4 M& a- S      SerialUSB.println(code,DEC);$ [) I/ u; m% \  c. Z& q* Q% C
    }" d$ q+ m) a( n1 S/ f; T
  }' [; R) j. z% t8 j
. z7 p* O9 r8 z9 m+ k% z
  //find us an m code.0 q5 {) r" M9 E$ _8 L
  if (has_command('M', instruction, size))
( t5 A0 t+ y$ S  {
" V- }5 G. k0 d$ o; j    code = search_string('M', instruction, size);
# z, Q; H" W; ?    switch (code)
# _. E6 U6 j/ ?9 R' Y    {& ^. d) u% W: m5 @) o  W
      //TODO: this is a bug because search_string returns 0.  gotta fix that.
7 c/ M8 ]: V8 C' Y5 C    case 0:
6 c' j& [' u* a  V2 U      true;$ C+ Q* Y- }/ W8 b) |: j& v
      break;
( A; V9 t' d2 }' `# K' S
  o+ ^; J  C2 r0 d8 }    case 100:) Q. _8 C5 y' m/ G' N3 Y0 ^
      break;
/ U* i7 Y- ]% v+ b- U/ ^9 u9 o+ P, U9 N- E8 p, {
      // fire camera relay9 S% q( P4 t8 K; g
    case 101:
  i' J  B& |0 q2 Y2 [0 V      camera_shutter1();! M& L" `3 h4 n
      break;- Z- u2 ]0 P. z$ }2 H

$ v1 b+ U- t( k$ g7 ~  s      // fire camera relay2
, W2 c# P4 l* ?% d3 h" R    case 102:7 \0 ?, O6 t8 [3 K$ \3 s
      camera_shutter2();" n4 t& n/ V, x1 a) ?
      break;% h5 A* p! I* ]
/*" d+ C; K  ^7 r3 d3 R% m
      // turn aux 1 relay on  p* C. L0 N7 ~7 |  `* L2 H
    case 103:0 V* h! h; u% o2 O9 G- k
      camera_aux1_on();
) ~" ^/ b( h& m1 }7 x      break;
% ]8 h0 r4 O' O/ o: x
4 A: K8 {/ k+ V! {+ m" _      // turn aux 1 relay off8 M. q, X( \; D; [. W5 n. ~" a
    case 104:
6 }, i/ b& r+ _# `      camera_aux1_off();/ E  F& Y9 m& S0 y# H) R/ v+ U: T
      break;
; }: ]3 }9 E5 f) K6 G7 T- e
% j: D+ ?' ^- C7 ?3 g3 w' Z& e/ x/ y4 Y3 F      // turn aux 2 relay on) Q  W0 E) P% Q$ ]' J& a/ @
    case 105:
. M! ^, M+ w- I; Q* F; ?      camera_aux2_on();
( ~  x1 B, T/ O. s6 u      break;0 F$ T6 i; [7 R

, b) M% k4 v6 I% c3 I      // turn aux 2 relay off6 U& o" ?2 }0 h7 ~& P6 k
    case 106:" }2 }3 y' S% ?% R1 k1 g3 M
      camera_aux2_off();: Z4 ?% `" A8 u  x+ v2 ~1 Q! B" b
      break;8 a+ u0 ]/ J& |6 \$ X! l, |
% ?& t( M0 n$ U/ a5 G4 j3 K
      // turn aux 3 relay on$ p$ R& ^& {% C) z
    case 107:* N/ k/ D% t0 j0 M& g
      camera_aux3_on();
4 }2 U4 w( z! N% P( N      break;
# [6 d$ h' Z* e+ H) P3 C0 \  v
) T' M% l6 {9 W8 }: O  M% l      // turn aux 3 relay off3 v; h7 k# a8 X$ c
    case 108:
0 X- W5 F2 \- F  k* j  l      camera_aux3_off();
4 e" J/ I/ z" }" }" b      break;. [* V" x' a) Q) F3 l

; z3 d- J, k* Y# W- b3 t      // turn aux 4 relay on
3 Y4 o* y* J4 c    case 109:
# ]$ V- C# a5 J, K      camera_aux4_on();5 v. P) A# ~) n
      break;
) v% f7 D' o" v: y
& i0 H2 w+ J* s* T% O% Y- ~      // turn aux 4 relay off( w" @" M% B+ M5 U9 c3 N* T0 P/ g
    case 110:
! Y9 d) f/ w! |8 I      camera_aux4_off();" k+ E$ ?/ R3 l. t! Z: x% r
      break;6 Y" C. x/ Z9 t) p* g3 k2 B
*/
( O4 Z7 F2 x# m4 y6 D0 e( v( n* M    default:
! g; F, R) W# c
- Z2 }# Q" b2 o  Q% v4 g      SerialUSB.print("Huh? M");
, }/ v& M, d6 {  J. P  i      SerialUSB.println(code);5 ?/ E5 W0 ]1 x
    }
) T- Q/ S: @% f7 x5 b9 h  }6 P( G' E. Y$ ?7 G8 s, V8 Q" @9 j

1 G% O2 M. M0 U9 n( R" q- \  //tell our host we're done.
  Q& ?# i  t  N" O  SerialUSB.print(byte(78));1 l- o5 O/ B0 m/ O, U( \. m) E0 g
: J! D( @5 g8 \3 H
}
7 S8 D, Y; R; O, i! v4 G9 Q
9 K, `' M# F% ?$ a//look for the number that appears after the char key and return it  l2 u. u+ e% v$ O; `2 ~5 r; e  t
double search_string(char key, char instruction[], int string_size)6 b0 t# Z7 P1 T. Q
{
- f. G8 c1 e& m. A  char temp[10] = "         ";
& D- r; o7 \$ F  for (byte i=0; i<string_size; i++)
+ x4 a" E1 _* u7 O3 m) ?  {7 Y( v* o  e. S9 m: r& ?" l
    if (instruction[i] == key)
+ q$ N+ d) r1 l- u; `8 S: T/ L    {
# p- J: ~/ E. }: w6 D! c      i++;      
( k- Z% t, ]4 m+ J+ _- _; A9 Y4 y      int k = 0;
! P0 m" o1 o1 a/ B) L/ r      while (i < string_size && k < 10)
+ ?) t. q* ?1 w* l) r, w4 W      {6 _7 T& k0 N6 j* F$ H3 ^) j$ S
        if (instruction[i] == 0 || instruction[i] == ' ')+ Y8 B) v3 ^) V
          break;
  u4 V2 m; ^" N+ M1 Q" y9 N; g  L
        temp[k] = instruction[i];
6 b( c9 Z; Y, p0 I- [" Q7 O        i++;( C" T3 q* r! e& u
        k++;: v, q2 J1 y, K
      }
: q3 [/ ~$ b5 b$ q4 @3 l3 i. o      return strtod(temp, NULL);6 t3 @2 m  v- g$ _# m: u5 j- a
    }
9 O: _5 u7 a. p) G# C) I  }
: L; v" Y0 t+ U
. X# h- g. e  R# z. m! ^% c  return 0;. ?5 m% P) S) g
}
8 {$ ~6 {  ~8 g. p0 v" O: o7 @# R5 s
//look for the command if it exists.0 f# s: q0 S  j% v+ n
bool has_command(char key, char instruction[], int string_size)
) _1 t7 d' l2 t% T5 V) n{' y. G' |3 a/ }
  for (byte i=0; i<string_size; i++); b0 t. Y: h" Y& G& }/ ]. n
  {
/ Y0 V% Z& _1 _' y& c    if (instruction[i] == key){
, ~8 ^) S' v* Y: |( \. r5 M4 |, U' U7 S
      return true;
" h- i, V# ~( ]. Z, `; m8 U" \: I    }
: @  f6 s+ @" o! _; Y7 ~  }& T/ h, `9 r6 ?5 W

, A- L' r, j# V$ j3 j& _  return false;+ N( O$ S! a! `1 o8 _# H
}& ?; Y/ T- p  g) a2 ?
# o9 G9 }. ^. k& [

# G& \' W3 B: \' D
" h# U' f% v- ]. `  F
8#
 樓主| 發表于 2014-5-10 09:55:37 | 只看該作者

& E3 m7 l* Z, Q$ Y) }//init our variables
5 M) X  I7 j8 o+ z( q' Hlong max_delta;" h% I8 x0 V  ]+ }. C1 c8 @4 j
long x_counter;! c& e1 W9 d" `4 H7 X  ?
long y_counter;
4 q" S" G4 b5 h  I9 q" Qlong z_counter;. A3 K+ Z' F1 e3 ^- K: ?
long u_counter;
. ~3 r( h+ P: _* u4 d& Y6 Ilong x_pos = 0; // x position in terms of absoloute motor stepps- U* I1 M3 o+ Z/ o( P/ `; b$ P- n% n' T
long y_pos = 0; // y position in terms of absoloute motor stepps* P+ V; y; F' W! `+ D
long z_pos = 0; // z position in terms of absoloute motor stepps
5 g7 i2 ?# }# Z! Clong u_pos = 0; // U position in terms of absoloute motor stepps
. {" _+ K: F8 ^% y: J  `+ q" @' n/ Q# t
bool x_can_step;" t+ P8 x) y3 A
bool y_can_step;
+ B7 t1 n! d( jbool z_can_step;, i" D$ K- `' j, z
bool u_can_step;
! U5 C8 L9 [, f7 _, A5 wint milli_delay;% \4 v4 O; f* f
$ h% k/ }7 a; t# l- x0 b
void init_steppers()& m+ Q7 `; m) F- g) B- q
{" ]: o* ?! f% E. F# T7 ~& ^  q. u
  //turn them off to start.
# [& l/ K8 x, L  disable_steppers();  U6 r, ~& o( p" @8 K& P

/ |- P: B& T& e# q  k. d* t  //init our points.' J; S2 F! _3 M2 {0 K
  current_units.x = 0.0;
, Q0 f* z9 _- X1 I0 Y9 X  current_units.y = 0.0;
+ |0 F! k6 g8 }9 \$ `9 B; F. z  current_units.z = 0.0;( B" @8 m% r) z! z) f0 j, W2 t1 a
  current_units.u = 0.0;
. w% R3 n( K8 N6 Q$ ]4 S  target_units.x = 0.0;" S1 Y, t4 K9 C8 u7 G9 s
  target_units.y = 0.0;: e& Q) D# L5 T) F! v
  target_units.z = 0.0;
$ Z- R( I+ W7 m  target_units.u = 0.0;
- _+ [, U( `" l% C8 p4 i3 k  7 D& r* p4 o( m. d* E  L9 y

3 d# D. D, Z/ O- C3 ]8 v  pinMode(X_STEP_PIN, OUTPUT);& W  P$ a; b7 `
  pinMode(X_DIR_PIN, OUTPUT);- p6 G+ V8 S/ |  ]) b  Z* n3 ?
  pinMode(X_ENABLE_PIN, OUTPUT);- W2 ~; ^4 ~& Z, R+ U3 w
  pinMode(X_MIN_PIN, INPUT);
% W) d+ J% G" _' K! E  pinMode(X_MAX_PIN, INPUT);8 e; c  _! p. b, B8 A/ t, Z

' w# B, E" F' ^% A  pinMode(Y_STEP_PIN, OUTPUT);
4 K1 U/ L) `* r: F( x  pinMode(Y_DIR_PIN, OUTPUT);
# k( o, k4 k: ~; _) f  pinMode(Y_ENABLE_PIN, OUTPUT);% N& i) ~5 t4 c: I# R
  pinMode(Y_MIN_PIN, INPUT);
/ w6 Q; W* a9 T  pinMode(Y_MAX_PIN, INPUT);1 l# E9 _, t) d" X5 P

- ^, x# ]' Z% g. m3 D5 e* I  pinMode(Z_STEP_PIN, OUTPUT);
+ W+ K  k8 j8 R1 U  pinMode(Z_DIR_PIN, OUTPUT);
! l2 q* w  d/ L# P8 V1 y  pinMode(Z_ENABLE_PIN, OUTPUT);7 X! z1 {+ F' e, c& u4 l8 G% z
  pinMode(Z_MIN_PIN, INPUT);
3 K% Y( l' c7 y. A' \* e6 `0 N  pinMode(Z_MAX_PIN, INPUT);
& M6 y9 d* s. `' {3 N/ @9 i6 h% a0 [  T' ]: o7 X: O8 v
  pinMode(U_STEP_PIN, OUTPUT);
: i. p& |* l  _/ z  pinMode(U_DIR_PIN, OUTPUT);
  s: y% k5 R; S3 q0 |' \0 R  pinMode(U_ENABLE_PIN, OUTPUT);8 s5 R: O" `1 F/ ^! I, S4 c' l
  pinMode(U_MIN_PIN, INPUT);* f9 G3 k. u% ]( v; F' D
  pinMode(U_MAX_PIN, INPUT);, \' G% m: [% N+ u' W0 p1 S
  //figure our stuff.8 [3 ]. {/ F) K2 W" R
  calculate_deltas();
) X" B) A6 Y; H+ ^$ ^2 R+ q% E}
! d: o3 O2 p0 y0 D- N" Q3 G4 r* p: r
* [4 M' A9 \  i* n7 J' x2 ?void dda_move(long micro_delay)" ?% L" }. ^7 T$ g/ T0 ^# M
{6 E3 i# g, e7 p8 g3 R, r3 m
  //enable our steppers. x5 j# {7 s$ l6 Q' K. h4 z
  digitalWrite(X_ENABLE_PIN, HIGH);
9 p$ v; X3 d" o8 [/ D# u1 Y  digitalWrite(Y_ENABLE_PIN, HIGH);
5 [  A0 O3 D( `+ u& R, v  digitalWrite(Z_ENABLE_PIN, HIGH);2 A! B7 Z) q$ ?8 b: ^
  digitalWrite(U_ENABLE_PIN, HIGH);" U2 l, J- Q/ d7 X3 I% X
  //figure out our deltas
0 h5 _6 |+ L. W  max_delta = max(delta_steps.x, delta_steps.y);
$ U, g3 U, l* |: [  O$ k  max_delta = max(delta_steps.z, max_delta);
) p$ W3 D! \" D5 H6 W% O1 e8 l: E  max_delta = max(delta_steps.u, max_delta);* a2 f8 h- @, o1 H- Z
  //init stuff.: q2 L0 e" \/ {0 T! z9 P: ~
  long x_counter = -max_delta/2;. j/ C) v) h* H, k9 q
  long y_counter = -max_delta/2;
( D) ~( N4 N! B% A  ?' `  long z_counter = -max_delta/2;
9 X6 E' B+ Z! K: m  long u_counter = -max_delta/2;" `. w, X. p2 I$ m
8 c$ y$ @3 E2 k4 Y
  //our step flags, j' _9 Y1 ?! r, x
  bool x_can_step = 0;8 v2 Z5 N- r0 O8 N
  bool y_can_step = 0;' Q/ g2 Z/ s) A7 z3 W' w
  bool z_can_step = 0;
" C+ c$ L, Z( p% L* D; @; e& A  bool u_can_step = 0;
) p$ H# h+ H, g6 z- n6 I$ P  |0 m5 j2 t, K* t
  if (micro_delay >= 16383)
. y0 q8 ]2 J! S7 w% s& @    milli_delay = micro_delay / 1000;7 j* i  B2 O' Z1 `7 `5 [+ W6 a5 x- L
  else) R$ E$ E. v" i; l+ k
    milli_delay = 0;
+ @3 y% m2 D' |( F6 {
0 H3 U& j) Q. V0 d. o) |
9 T3 c: o4 E3 t6 c" o* {+ J. |  //do our DDA line!" ^0 p1 V+ {1 [8 j; F, T

5 b/ O+ Q+ n3 l# e$ Y  do1 |$ B& x0 H. H& t7 b4 F
  {" E, s; ~1 I8 g, H  t- S
    if(( digitalRead(BUTTON_SS)?analogRead(BUTTON_MAN)>>9==0:0) || stop_flag) break;
  \/ o6 u! d) x' G/ ~9 K    x_can_step = can_step(X_MIN_PIN, X_MAX_PIN, current_steps.x, target_steps.x, x_direction);# V' U1 b! B2 C3 N0 V
    y_can_step = can_step(Y_MIN_PIN, Y_MAX_PIN, current_steps.y, target_steps.y, y_direction);
6 H6 K4 d! K. S7 e3 X    z_can_step = can_step(Z_MIN_PIN, Z_MAX_PIN, current_steps.z, target_steps.z, z_direction);
& R% G5 U0 ~2 A; s$ [    u_can_step = can_step(U_MIN_PIN, U_MAX_PIN, current_steps.u, target_steps.u, u_direction);4 J. ^# {5 j( d( P: q! e
    if (x_can_step)3 a- a3 v" k4 v3 c1 Z5 B! b
    {9 x& k" C& m! @6 {5 s
      x_counter += delta_steps.x;
) h. t/ G( i1 N' b7 T
, z1 J, w5 n# @  B: a6 P- x      if (x_counter > 0)
% k" T* q( }. Z1 M6 _" [8 ~      {
8 t) D2 |4 g% y        do_step(X_STEP_PIN);9 N: @; H1 {  G& `( V
        x_counter -= max_delta;7 R2 c+ O2 V, A$ B1 Y% B) |
        if (x_direction)
' q& \2 [( c: a# Z" O" m8 F; c         { current_steps.x++; x_pos++; }5 K9 @2 u0 P5 Q/ C/ t
         
- w: I8 I' S6 R" n- X$ M        else
7 Z* [7 w$ o) e9 E          { current_steps.x--; x_pos--; }$ D8 J4 @! M6 n# W) s3 C
         ; K0 q( o; B5 `
      }
+ _1 _# G* a+ D" U    }, m% E3 E! w4 I& B7 j
    if (y_can_step)
* j. v) H3 c- l" X; T: P3 i    {
) X8 N' c3 a  Y9 E, Y) u      y_counter += delta_steps.y;
5 z6 O+ L3 B& v. s- b# n% \4 d6 z7 F  x; I$ D( j" b0 l
      if (y_counter > 0)
# j/ F9 W4 ~0 q" l      {
8 f1 P/ s7 R& q6 v: N1 v        do_step(Y_STEP_PIN);  ~% C) w' b% n2 U
        y_counter -= max_delta;, x1 U1 Z2 a$ M) W8 `
1 I1 h; T3 ^" I% a1 e
        if (y_direction)
6 M' d  ]3 T8 q        { current_steps.y++; y_pos++; }& Z; Y( ^, ?9 g
      
1 O" U' e1 J. ?9 u: P1 E        else
% ]5 Z7 B4 ~9 ?5 r) ~: V        { current_steps.y--; y_pos--; }# Y8 q6 J+ T/ f" |- P/ v- d& B
        3 v% f! J6 }3 V5 o3 K0 Y
      }$ g7 f2 h. D6 K) j% l
    }$ P' ]/ z/ Z9 J% P* q$ v
% E4 `+ [9 j) c
    if (z_can_step)
8 X* g+ a# A( _) B4 K9 X" h    {
# p* N' B; e: a) [8 U' w  E      z_counter += delta_steps.z;' ?6 i' [3 |; r- F
- [, y. X, E3 y0 r4 ]
      if (z_counter > 0)
) f8 K$ H' e! Y0 [      {2 |& w4 T& l% E. V
        do_step(Z_STEP_PIN);
" u7 Y8 D5 f+ d# a        z_counter -= max_delta;
. ?! I+ B$ k  b( Y
3 a! I0 F. i5 a2 @  t7 x! b        if (z_direction)
+ I9 j; U, M3 g/ g+ x  m6 y        { current_steps.z++; z_pos++; }+ n: J! c; b% ~) n9 }
        
1 s+ q& t/ _+ j! D  m5 t" J$ b        else
" j6 n( Q+ M. d% z/ w5 ^0 m        { current_steps.z--; z_pos--; }# H  y; o$ b1 w; @
        
" l; k5 G% [4 {2 @/ |# p/ d      }
4 q  p" `& K0 I9 Z7 e0 R9 F    }& z! ~4 ^5 H& H+ S
    + V' S! C$ t3 ~& f4 p, f
    if (u_can_step)
+ t/ s: \3 |: O% J- c, r( @5 X" v    {
/ S* ?9 g0 T  h) l& o0 [  j4 K! L      u_counter += delta_steps.u;& s! }2 r  q* s5 ^' ~4 k2 \
4 q: F; z5 Y6 s: ~# C$ [
      if (u_counter > 0)- Q1 `9 ]) N; q7 t4 G
      {
! N3 E0 q- o/ R8 Y' C        do_step(U_STEP_PIN);" G# h, z; t  j- t
        u_counter -= max_delta;
2 Y! Z( J8 d- ?0 s- Q1 X% k+ z/ G& B, R
        if (u_direction); f* s) ?  c8 K! C6 L1 h0 m
        { current_steps.u++; u_pos++; }
1 t; |6 z6 E+ v% Z/ i          7 |0 m: |8 ^1 M
        else
. q& d5 ]  k; e+ s          { current_steps.u--; u_pos--; }
. U9 e. z* c+ ]( p5 s' Z         
9 T- d9 Z* p6 ?! k: p5 H3 ]      }: K* i2 i% w$ h3 A& ?: c" c
    }2 ?  q1 M# T8 l4 v* p/ g
    //wait for next step.
1 ~$ p/ @; Q5 [; G    if (milli_delay > 0){
6 Y$ V8 ]- e; I+ b+ J! D      //if (digitalRead(BUTTON_SP_EN)) SPEEN();  M/ |/ `: D- I1 V, t& }0 A
      delay(milli_delay);
7 d; x9 r" [) A- [: l, }    }               
# E5 r: w! H/ x$ B9 e    else{
+ w8 c, k' D, |& S5 X      //if (digitalRead(BUTTON_SP_EN)) SPEEN();' C/ H$ A# c& b8 u
      if(micro_delay>0)delayMicroseconds(micro_delay);
* q/ j* n8 S* n5 C    }
& k! C$ l- `3 a" |+ b    //if(x_can_step%40 || y_can_step%40 || z_can_step%40);# n% R: ^5 `: C$ Z
  }9 F+ Z3 k8 u* m7 z! H
  while (x_can_step || y_can_step || z_can_step || u_can_step);) H3 c/ h. h: c- y7 y. a' X: b$ g4 [

" o: {8 X4 G) x- ], \* }7 R: |# {' x
4 E9 C0 V  i* z  D  M" D  //set our points to be the same
5 g$ W* ]6 X/ F  current_units.x = (float) x_pos / X_STEPS_PER_INCH;
$ K# Z3 T9 l$ ?" i7 W. k  current_units.y = (float) y_pos / Y_STEPS_PER_INCH;' m# R6 ]9 o( z
  current_units.z = (float) z_pos / Z_STEPS_PER_INCH;
$ ~: I6 z0 m# t# Q& \6 t, r  current_units.u = (float) u_pos / U_STEPS_PER_INCH;
& W+ ?8 Z5 I$ g% C  * o- g+ b5 M6 O: I/ k- b; o
  set_position(current_units.x, current_units.y, current_units.z, current_units.u );
& \" k6 U* {* u  m1 Z / O* H$ m2 N6 ]1 O1 p  d
  long x_pos = 0; // x position in terms of absoloute motor stepps
/ U2 z5 S. D' [/ L4 R2 {2 X  long y_pos = 0; // y position in terms of absoloute motor stepps
: A0 L5 w) ]* v4 t7 l  long z_pos = 0; // z position in terms of absoloute motor stepps, N$ m; q/ z$ U# |0 D' B1 k
  long u_pos = 0; // u position in terms of absoloute motor stepps* ~5 B- d5 W0 e! ^4 e  g$ t9 `
  calculate_deltas();
2 X( e8 H, E- O  ' H, s( I$ y7 f
}  T& G# x* ]3 H# r

1 |$ D9 v% x2 rbool can_step(byte min_pin, byte max_pin, long current, long target, byte direction)
2 i5 H: w; B+ h8 e( [6 a) a/ h{
5 M, L: W) t' h5 d  //stop us if we're on target
5 _: |% X7 X3 J: C. k, x: a  if (target == current)
5 P. S5 {& S, D6 X, l) r- B* I    return false;
. k! P" [4 [3 h, _- a  //stop us if we're at home and still going   b: r" y' I( H0 x
  else if (read_switch(min_pin) && !direction)1 B9 a- U/ J2 n; z3 [. r
    return false;
) [$ ?1 V! g% ~  //stop us if we're at max and still going; c$ O1 \2 s' v. Q) |% h% p
  else if (read_switch(max_pin) && direction)
6 `! D* b* s5 Q- v+ m; N    return false;" \& y8 ^, S* z* w1 ^  @) ~, x, P

6 M2 Q- _( d  V; `0 A) }: b  //default to being able to step3 S) I0 }; f! r2 d$ l
  return true;' [# K: [$ o- O1 |) b
}& f" b# G& K: p
- W( t; A7 p& Z1 S0 Z# o7 \
void do_step(byte step_pin)0 O# `6 d. M" \+ g9 Y' D
{
  R( P4 J4 f. @+ F  digitalWrite(step_pin, HIGH);
( Z  l; ^; N1 V/ `$ o1 w7 {* ^  //delayMicroseconds(1);* E( ^1 r; M( f- e* @
  digitalWrite(step_pin, LOW);
! u0 w" d# s/ A/ f# b# x5 X}6 k! [/ l3 g& q, O
  r- P3 t7 B/ m/ t& y5 H# }( Z
bool read_switch(byte pin)* l! E$ p$ d5 |; w2 v3 N- u( X
{1 R5 Y  H% @* M( o; J
  //dual read as crude debounce
6 u1 V& Z3 n* l/ P, }) {3 z: }6 A
  if ( SENSORS_INVERTING )5 N$ P! |/ N; n% S7 R4 l+ O5 k. z8 ?
    return !digitalRead(pin) && !digitalRead(pin);
0 l" K! G+ `1 V% L2 |: K3 d1 t  else
& p* B, Y$ a0 M$ N; F; i: u    return digitalRead(pin) && digitalRead(pin);3 y! ]0 [: p& L, [% u
}
9 ~/ d: C# |* r+ |" _* }
& s- x. F! ?+ w) s/ k/ }9 along to_steps(float steps_per_unit, float units)5 M: g+ B2 b; x, F
{
: e( Q5 X) E+ N: C  return steps_per_unit * units;6 D2 w# f) p3 D) {: P
}
) I* \5 z  Q0 N; w/ B; a, Q  x: `! N1 T
void set_target(float x, float y, float z, float u), Q/ \( @6 n/ @
{4 g7 y8 P/ K: D, l
  target_units.x = x;
. L, Q1 B) e, B* U9 ~5 a9 h7 s  target_units.y = y;  V+ L! }2 }  d. o
  target_units.z = z;+ }  _6 L6 t& W* m/ U
  target_units.u = u;; S( E; P; l- m  d/ p7 }
  calculate_deltas();
4 w% v8 h- L3 \. T2 e, r}: z; Z. i7 j) v+ i% {0 @  o+ }

3 o/ Y. g5 |; O; d5 `3 yvoid set_position(float x, float y, float z, float u)" ]  R8 g" \- U4 ~" D9 j! k
{
9 t1 o) u  l9 @9 Z  current_units.x = x;$ R5 l: s2 y8 U3 P3 U
  current_units.y = y;
# e; W2 b" ~/ E& U  current_units.z = z;
& b# N. ~. W  N7 G: d# y/ R% p  current_units.u = u;
. `# [; ^+ F* S( u* l* w3 P  calculate_deltas();
- R. g7 s: U9 G$ s! ]}
& u/ P( L! g/ q( ]' u3 O5 R2 j" H+ m3 b+ T3 c9 h) o
void calculate_deltas()5 C% U+ O/ ^- C" S8 J; c/ \3 }
{
2 e* F- W* l: g- ]) r# r& O" m  //figure our deltas.! r4 y, E9 p4 W0 W% }) e( B/ n
  delta_units.x = (target_units.x >= current_units.x) ? (target_units.x - current_units.x) : (current_units.x - target_units.x);. E3 W- u7 K0 n  ~# P
  delta_units.y = (target_units.y >= current_units.y) ? (target_units.y - current_units.y) : (current_units.y - target_units.y);
; o) [5 C) q+ k& t2 R2 d  delta_units.z = (target_units.z >= current_units.z) ? (target_units.z - current_units.z) : (current_units.z - target_units.z);  }0 j; {; s. m* u7 v7 U# R
  delta_units.u = (target_units.u >= current_units.u) ? (target_units.u - current_units.u) : (current_units.u - target_units.u);/ ^6 h: g# Z% T
; j; G5 J. I) _+ s/ J
  //set our steps current, target, and delta( K3 Y( g% `2 S  E+ v# P
  current_steps.x = to_steps(x_units, current_units.x);
: t- E% R5 Z1 N# [3 A% m2 i  current_steps.y = to_steps(y_units, current_units.y);
  g+ e3 J! Y* x! @$ F! s  current_steps.z = to_steps(z_units, current_units.z);
- D, i6 t6 H$ E2 a0 {" N% Y) ~  current_steps.u = to_steps(u_units, current_units.u);
6 }8 @4 U7 {! k- s0 P* F' M8 f0 l  ^9 V
  target_steps.x = to_steps(x_units, target_units.x);! j- \4 z7 ^/ W/ N+ c
  target_steps.y = to_steps(y_units, target_units.y);5 j& y. |. D" S' j
  target_steps.z = to_steps(z_units, target_units.z);
- ~1 Q% ^' Q( Q( ]4 G5 Q- D, L* a6 N  target_steps.u = to_steps(u_units, target_units.u);
' h( e/ G3 |1 T, I$ q; u1 }% v" T+ c
  delta_steps.x = (target_steps.x >= current_steps.x) ? (target_steps.x - current_steps.x) : (current_steps.x - target_steps.x);$ x. E/ l3 s  p8 |1 v( a/ {
  delta_steps.y = (target_steps.y >= current_steps.y) ? (target_steps.y - current_steps.y) : (current_steps.y - target_steps.y);
3 M) _' ]& N+ K0 [  delta_steps.z = (target_steps.z >= current_steps.z) ? (target_steps.z - current_steps.z) : (current_steps.z - target_steps.z);
* Z6 {/ {7 Z1 w6 `7 n+ P, H  delta_steps.u = (target_steps.u >= current_steps.u) ? (target_steps.u - current_steps.u) : (current_steps.u - target_steps.u);
7 Z8 E. X& g  x; p* [! e! z( e; P: U4 m
( \8 q% A* P1 u9 h( g
$ h5 p, i6 F0 H
  //what is our direction
1 U4 g# l0 r7 g: |8 ?  x_direction = (target_units.x >= current_units.x);: C! f  L3 m9 j! x" J
  y_direction = (target_units.y >= current_units.y);) L9 w  c1 S* K7 L& H
  z_direction = (target_units.z >= current_units.z);: q, [+ J. Z, Q. N  w* T- @( q
  u_direction = (target_units.u >= current_units.u);) c5 p7 H( ?6 l
5 \& a2 ~8 j4 R" g4 z8 W0 e( `$ |
  //set our direction pins as well
# c! H4 }; k7 P6 K$ @  digitalWrite(X_DIR_PIN,x_direction);
/ n" i" J& O3 S5 S# C! ~9 j) B1 |  digitalWrite(Y_DIR_PIN,y_direction);' c0 o) Z8 ^7 M! V' y* A
  digitalWrite(Z_DIR_PIN,z_direction);
$ i* Q' V8 P# a; d8 ]4 I8 B  digitalWrite(U_DIR_PIN,u_direction);
9 O1 j5 z, y1 o, a9 m! Q
8 d. \7 S: u$ J& f" j$ `9 s  //繪制LCD
6 b: H% X6 C# [3 q  LCD_DRAW();
1 W- A1 ^- r0 x' ?0 ]$ @. E5 u, N0 K* V, P* }
}5 q$ ~3 \, a5 M# m7 z
1 E0 X& {& b) @

9 \3 W" P" Z* M9 }4 w6 T! Nlong calculate_feedrate_delay(float feedrate)( v# G# e9 e4 u
{" y" ]% y* g( Z4 {. r
  //how long is our line length?9 j& n0 F. q3 a8 b- i
  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);6 N3 o$ J7 |2 T* {3 X$ f6 ]1 |$ p
  long master_steps = 0;
9 `) _) i+ D; ]- f! [# m; X7 _4 P% N* T9 K! ^  N9 b- J, Q
master_steps=(delta_steps.x > delta_steps.y)?delta_steps.x:delta_steps.y;3 C. D. `6 M; u) a7 a
master_steps=(delta_steps.z>master_steps)?delta_steps.z:master_steps;6 \6 q! m. J+ O! Q
master_steps=(delta_steps.u>master_steps)?delta_steps.u:master_steps;
4 a7 |3 N0 U1 h" g! _
) o3 X& l* t/ O5 g8 S- S& s4 d- m% y# |" v$ S# B' C
( t; g$ x/ M+ u$ e5 C6 t6 Y2 |
- ]# ^- U2 o; z' ?5 x2 d) Z
  //calculate delay between steps in microseconds.  this is sort of tricky, but not too bad.
& h3 m- I% b! Q6 _0 _1 Y* z/ E  //the formula has been condensed to save space.  here it is in english:. J& z- f/ y( O+ d# j
  // distance / feedrate * 60000000.0 = move duration in microseconds
1 Z8 Z7 {7 o/ r/ v; E- I  // move duration / master_steps = time between steps for master axis.
, E- O+ S7 I# A6 f  [5 k! d return ((distance * 6000000.0) / feedrate) / master_steps;
: u  Z3 E, Q* f7 A3 c
+ f3 [* ]! q$ v' I3 L- A}
2 _: d7 g9 p2 f7 p( ~
  H8 a" f! F1 P/ {long getMaxSpeed()6 T; e2 L* w, M" {3 B7 l4 _
{
7 X3 r+ ~6 f0 Z! F- _. i, J if (delta_steps.z > 0 || delta_steps.u > 0 )1 w- F& t. t5 _: e
    return calculate_feedrate_delay(FAST_Z_FEEDRATE);
2 h8 p: T0 H6 }! Q  else
( y$ _% K9 C3 L6 T# M8 |$ ]- u    return calculate_feedrate_delay(FAST_XY_FEEDRATE);
* h; I3 g3 Z# E  {8 y. B& N}- B9 D  T3 p7 _
! V0 i" D) i! b
void disable_steppers()
, L* k, I7 B9 e6 h, v5 F: L2 w1 }{
8 B: o8 X5 G5 w9 T% u4 h  T  //enable our steppers
5 X5 j2 ?5 K" P" O8 X4 ~  digitalWrite(X_ENABLE_PIN, LOW);" W& F) v9 }' @1 J/ @
  digitalWrite(Y_ENABLE_PIN, LOW);
% d" f/ |  E+ @. L  digitalWrite(Z_ENABLE_PIN, LOW);8 d7 {8 D2 Q& D) v2 [6 S
  digitalWrite(U_ENABLE_PIN, LOW);
" y1 M' G! ~# G- k- h- g" p+ }2 S% d}
* J5 A- i! x6 H' |
2 C1 K( Q6 |! y1 O6 z3 X9 w! `# \6 j# ]: i* l0 B+ e) R, U9 F
//繪制LCD+ j' e2 C5 v  o
//unsigned int DRAWCount=0;
. Y' B. z1 F$ K7 c6 avoid LCD_DRAW()" w/ `/ R& [: @& u) p
{
5 m0 L4 y$ M8 k. u    lcd.clear(); - j, {. v2 p/ O1 A
    lcd.setCursor(0, 0);
! y' e  v" X* |" \6 ]( ^    lcd.print("    X=");/ y6 U% c3 M2 f8 v7 r  c
    lcd.print(current_units.x);- j( O6 S( k% A  H
    lcd.setCursor(0, 1);
, U" E6 A. {4 P/ D    lcd.print("    Y=");
8 Q4 S  P. L: |- s+ K9 G    lcd.print(current_units.y);
5 S8 h  _& l5 [$ `6 F$ z3 p    lcd.setCursor(0, 2);0 C$ |3 F) w0 M2 a; A: M
    lcd.print("Z=");
* i% p' q+ u  Q8 Q    lcd.print(current_units.z);
$ ?) X- v9 @, f7 f    lcd.setCursor(0, 3);
9 e" t1 \* R/ _$ p+ F2 J    lcd.print("U=");
9 F' x; u$ C7 n7 Q- [; y/ K" _    lcd.print(current_units.u);, X# ?- [- H/ F8 I5 o: |. E
  }2 Z/ [' Y4 K6 Y, N4 q
// else if (DRAWCount>=30)DRAWCount=0;
! Y$ c' L& C- u) V, W# Z& I//  else DRAWCount++;
  x8 }9 W# i7 n) x% g2 q" h void SPEEN()/ }& p# q  e; z* i
{. d% ?5 D8 B6 _! x4 r* `2 S
   delayMicroseconds(analogRead(SPEEN_CTL)+1);* W( j- ~1 z. d5 U0 X
}
' M* ]. }) n, p, _: ]- X& g5 n, N0 v1 p) {- t

+ \* V4 x/ i2 i' q  ^" G //delayMicroseconds(analogRead(SPEEN_CTL)+1);' e! E) C/ `* k2 \. g! V% x
//if (digitalRead(BUTTON_SP_EN)) SPEEN();
' a8 U  h) j& U' P/ u* h: ~1 m1 H; o7 ?3 `$ [- h; }7 O) M  T2 x
8 c2 w1 f! g, }* }% }( }" M
9#
 樓主| 發表于 2014-5-10 09:58:04 | 只看該作者
基本原代碼的大概是這樣,我是斷斷續續搗鼓的,玩到最后版的,后面我會找出來先測試下過,再貼上:)
10#
發表于 2014-5-10 10:48:17 | 只看該作者
請樓主發一份給我,感謝!178354773@qq.com
您需要登錄后才可以回帖 登錄 | 注冊會員

本版積分規則

Archiver|手機版|小黑屋|機械社區 ( 京ICP備10217105號-1,京ICP證050210號,浙公網安備33038202004372號 )

GMT+8, 2025-9-26 02:25 , Processed in 0.077729 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回復 返回頂部 返回列表