easydriver_ver4_steppermotors

art100
Offline
Зарегистрирован: 09.03.2014

Кто-нибудь шаговыми моторами управлял аппаратным драйверочком easydriver ver4 ?

На странице автора что-то мутон с кодом.

Ссылка на adfuit заставляет терять время на кривой код.

Понятно, что народ свои пишет подпрограммки.

должен сразу предупредить AccelSteper.h полное ..ауно. от ADfruit https://github.com/adafruit/AccelStepper

даже с одним мотором сампроизвольно меняет направление

схама типовая 

я  для своих целей написал свои подпрограммки

01//-table------------------------------------
02void step1(boolean dir1,int steps1,int msec1){
03  digitalWrite(dir_Pin1,dir1);                // direction
04  for(int i=0;i<steps1;i++){
05    digitalWrite(stepPin1,HIGH);    delayMicroseconds(msec1);
06    digitalWrite(stepPin1, LOW);    delayMicroseconds(msec1);
07  }
08}
09//-laser------------------------------------
10void step2(boolean dir2,int steps2,int msec2){
11  digitalWrite(dir_Pin2,dir2);               // direction
12  for(int i=0;i<steps2;i++){
13    digitalWrite(stepPin2,HIGH);    delayMicroseconds(msec2);
14    digitalWrite(stepPin2, LOW);    delayMicroseconds(msec2);
15  }
16}
17//-scan------------------------------------
18void scan(boolean scan1){
19  digitalWrite(lasepin,HIGH);
20  step2(true, steplaser,speelaser);       // scan   //dir,steps,speed
21  digitalWrite(lasepin, LOW);
22  step2(false,steplaser,retulaser);       // return
23  digitalWrite(lasepin,HIGH);
24  step1(true, steptable,speetable);       // turn   //dir,steps,speed
25}
26//------------------------------------- 
27 
28void loop(){
29...
30scan(1);
31...
32}

но это чисто одно локальное решение

Я например 2 дня убил на кривые https://github.com/adafruit/AccelStepper

Вопрос:

подпрограмками никто не поделиться на 

одна нога направление

вторая нога шаги

для шаговых двигателей

 

art100
Offline
Зарегистрирован: 09.03.2014

по типовой схеме вы получаете 1/8 микрошага по умолчанию сразу без заморочек

чипы греются конечно но не больше 50 градусов крутя моторы типоразмера NEMA17

на странице автора код попроще на ура

но вот его производные это что-то зя дрянь написана.

ХМ. тема скорей ближе к программированию

xm от spurkfun что-то универсальное нашел

01//////////////////////////////////////////////////////////////////
02//©2011 bildr
03//Released under the MIT License - Please reuse change and share
04//Using the easy stepper with your arduino
05//use rotate and/or rotateDeg to controll stepper motor
06//speed is any number from .01 -> 1 with 1 being fastest -
07//Slower Speed == Stronger movement
08/////////////////////////////////////////////////////////////////
09//#define DIR_PIN  2
10//#define STEP_PIN 3
11//#define DIR_PIN  4
12//#define STEP_PIN 5
13#define DIR_PIN  6
14#define STEP_PIN 7
15void setup() {
16  pinMode(DIR_PIN,  OUTPUT);
17  pinMode(STEP_PIN, OUTPUT);
18}
19//------------------------------------
20void rotate(int steps, float speed){
21  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
22  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
23  int dir = (steps > 0)? HIGH:LOW;
24  steps = abs(steps);
25 
26  digitalWrite(DIR_PIN,dir);
27 
28  float usDelay = (1/speed) * 70;
29 
30  for(int i=0; i < steps; i++){
31    digitalWrite(STEP_PIN, HIGH);
32    delayMicroseconds(usDelay);
33    digitalWrite(STEP_PIN, LOW);
34    delayMicroseconds(usDelay);
35  }
36}
37//------------------------------------
38void rotateDeg(float deg, float speed){
39  //rotate a specific number of degrees (negitive for reverse movement)
40  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
41  int dir = (deg > 0)? HIGH:LOW;
42  digitalWrite(DIR_PIN,dir);
43 
44  int steps = abs(deg)*(1/0.225);
45  float usDelay = (1/speed) * 70;
46 
47  for(int i=0; i < steps; i++){
48    digitalWrite(STEP_PIN, HIGH);
49    delayMicroseconds(usDelay);
50    digitalWrite(STEP_PIN, LOW);
51    delayMicroseconds(usDelay);
52  }
53}
54//------------------------------------
55 
56void loop(){
57  //rotate a specific number of degrees
58  rotateDeg(360, 1);
59  delay(1000);
60  rotateDeg(-360, .1);  //reverse
61  delay(1000);
62 
63  //rotate a specific number of microsteps (8 microsteps per step)
64  //a 200 step stepper would take 1600 micro steps for one full revolution
65  rotate(1600, .5);
66  delay(1000);
67  rotate(-1600, .25); //reverse
68  delay(1000);
69}
70//====================================

такой код поуниверсалней будет

пары обьявлений смотрю поудобнее через пару подпрограммок проскальзывают

и в логике код покороче получается

надо будет на нескольких моторах поднапряч шаговыми импульсами ардуинку

Еще кто что видел поподпрограмместее? :)

vvadim
Offline
Зарегистрирован: 23.05.2012

art100 пишет:

 

должен сразу предупредить AccelSteper.h полное ..ауно. 

А меня очень даже устраивает

 

art100
Offline
Зарегистрирован: 09.03.2014

я рад за тебя

смотри чтоб не два мотора и не пришлось менять направления регулярно

а какой исходник?

vvadim
Offline
Зарегистрирован: 23.05.2012
art100
Offline
Зарегистрирован: 09.03.2014

что вы хотите сказать?

обратитесь и выскажите автору правду матку в лицо по поводу оставшегося косяка который якобы устранен

1.24 Fixed a problem introduced in 1.23: with runToPosition, which did never returned

именно в его терминологии toPosition от бапды выбирает направление до сих пор

короче

рабочий код управления моторами сколько угодно пока ноги свободные по 2 штуки есть

ПодПрограмма 8 строчек с комментариями 

"просто жутко большой и не читаемый и спрятанный от анализа код"

Особенность НЕ снимает ток в состоянии покоя то есть Удерживает руку в позиции

1 нога направление

1 нога шаг

для того чтобы расслаблять 3-ую ногу SLEEP надо опускать в LOW 

мне лень две строчки дописывать и потом комментировать

1// art100 20140426 write stepper motor 1 table for A3987 easydriver 2 pins-----------------
2void step1(boolean dir1,int steps1,int msec1){
3  digitalWrite(dir_Pin1,dir1);                // direction
4  for(int i=0;i<steps1;i++){
5    digitalWrite(stepPin1,HIGH);    delayMicroseconds(msec1);
6    digitalWrite(stepPin1, LOW);    delayMicroseconds(msec1);
7  }
8}

//--------------------------------------------------------------

применяется в составе 

пара моторов

пара лазерков

джойстик аналоговый загрублен до крайних положений 0 7 (спасибо за быстрый регистровый сдвиг >> от медленная Dimax функция map(,,,,) не нужна в данном случае)

001//art100 20140426 for joystick/usb - arduinouno - A3967 easydriver ver 4.4 2pins - two Stepper Motor(1.8 gradus=1 step)
005//
006// pins---------------------------------------
007// joystick --------------------------
008int joypinx = A0; //joystick pin
009int joypiny = A1; //joystick pin
010int joypinf = 10; //joystick pin
011// lasers leds ----------------
012int led3 = 3; //laser red work
013// stepper motors ------------
014int dir_Pin1 = 4;// table
015int stepPin1 = 5;//
016int dir_Pin2 = 6;// laser
017int stepPin2 = 7;//
018int stepxcor =10;// for correction >0<
019int stepycor =10;// for correction >0<
020// constants for scan-------------------------------------
021int steptable =400;// 3200/8 gear 160/18=8,88 3200 steps full return
022int speetable =100; //very speed  follow
023int steplaser =1000;//       gear        5.22 2000 steps full return
024int speelaser =20000;//very slow  to work
025int retulaser =100;  //very speed  return
026// constants for joystick -------------------------------------------
027int sp1table =1000;//slow
028int sp2table = 100;//speed
029int sp1laser =1000;//slow
030int sp2laser = 100;//speed
031int joyx = 0;     //joystick
032int joyy = 0;     //joystick
033int joyf = 0;     //joystick
034// usb------------------------------
035int  commandusb        = 0; //
036//---------------------------
037void setup() {
038  pinMode(joypinx, INPUT);        //joystick X
039  pinMode(joypiny, INPUT);        //joystick Y
040  pinMode(joypinf, INPUT_PULLUP); //joystick fire pin
041   
042  pinMode(led3,OUTPUT); //laser
043//  pinMode(led8, OUTPUT);//on shield 
044//  pinMode(led9, OUTPUT);//on shield   
045//  pinMode(but5,INPUT_PULLUP);//joystickfire
046 
047  digitalWrite(led3, HIGH); //laser to work befor start
048//  digitalWrite(led8, HIGH); //laser to work befor start
049//  digitalWrite(led9, HIGH); //laser to work befor start
050   
051  pinMode(dir_Pin1, OUTPUT);//table
052  pinMode(stepPin1, OUTPUT);//table
053  pinMode(dir_Pin2, OUTPUT);//laser
054  pinMode(stepPin2, OUTPUT);//table
055 
056  Serial.begin(9600);
057}
058// stepper motor 1 table for A3987 easydriver 2 pins------------------------------------
059void step1(boolean dir1,int steps1,int msec1){
060  digitalWrite(dir_Pin1,dir1);                // direction
061  for(int i=0;i<steps1;i++){
062    digitalWrite(stepPin1,HIGH);    delayMicroseconds(msec1);
063    digitalWrite(stepPin1, LOW);    delayMicroseconds(msec1);
064  }
065}
066// stepper motor 2 laser for A3987 easydriver 2 pins------------------------------------
067void step2(boolean dir2,int steps2,int msec2){
068  digitalWrite(dir_Pin2,dir2);               // direction
069  for(int i=0;i<steps2;i++){
070    digitalWrite(stepPin2,HIGH);    delayMicroseconds(msec2);
071    digitalWrite(stepPin2, LOW);    delayMicroseconds(msec2);
072  }
073}
074 
075//========================================================================
076void loop(){
077   
078  // joystick ----------------------------------------------------------
079  joyx = analogRead(joypinx)>>7;  // shift 7 0.1.2.3.4.5.6.7 sanks for speed registry shift Dimax
080  joyy = analogRead(joypiny)>>7;  // shift 7 0.1.2.3.4.5.6.7 sanks for speed registry shift Dimax
081  //  Serial.print('X');Serial.print(joyx);Serial.print(';');  Serial.print('Y');Serial.print(joyy);Serial.println(';'); //test
082  if(joyx==0){step1(false,stepxcor,sp1table);}//speed
083  if(joyx==7){step1(true ,stepxcor,sp1table);}//speed
084  if(joyy==0){step2(false,stepycor,sp2laser);}//speed
085  if(joyy==7){step2(true ,stepycor,sp1laser);}//speed   !!! sp1laser !!! slow down
086  // laser and led --------------------------------------------------------
087  if(digitalRead(joypinf)==LOW) { digitalWrite(led3, LOW); } // laser to work
088  else                          { digitalWrite(led3,HIGH); } // laser to work
089//  if(digitalRead(joypinf)==LOW) { digitalWrite(led9, LOW); } // led control for test
090//  else                          { digitalWrite(led9,HIGH); } // led control for test
091  // joystick ----------------------------------------------------------
092   
093  // usb ----------------------------------------------------------------
094  if (Serial.available() > 0) {  
095    commandusb = Serial.read();
096    if (commandusb==76 ) {digitalWrite(led3, HIGH);}//digitalWrite(led9, HIGH);} // Laser on  L
097    if (commandusb==108) {digitalWrite(led3,  LOW);}//digitalWrite(led9,  LOW);} // laser off l
098    if (commandusb==47 ) {step2(true, stepxcor,sp2table);}                    // table     / 
099    if (commandusb==42 ) {step2(false,stepxcor,sp2table);}                    // table     * 
100    if (commandusb==45 ) {step1(true, stepycor,sp2laser);}                    // laser down+     
101    if (commandusb==43 ) {step1(false,stepycor,sp2laser);}                    // laser up  -
102    //Serial.print("commanda usb received: "); Serial.println(commandusb);
103  }
104  // usb ---------------------------------------------------------------- 
105 
106  //....
107 
108}
109 
110//========================================================================
111// for L298 4 pins--------------------------
112////    for (o=0; o<stepsmotor1; o++) {                      // 360 gradus   table
113//      for (m=0; m<step1Laser/8; m++) {         // 200step/8=25step 25step*1.8gradus/step = 45 gradus scanning low
114//        digitalWrite(led3, HIGH);               //laser on and down
115//        //myStepper2.step(+1);
116//        step2(true, steptable,speetable);
117////        delay(100);                            //for computer tormoz 0,01 sek  
118//        delay(500);                            //for computer tormoz 0,01 sek        
119////        delay(1000);                            //for computer tormoz 1 sek
120//      }
121//      //return on start
122//      for (m=0; m<step1Laser/8; m++) {         // 200step/8=25step 25step*1.8gradus/step = 45 gradus return
123//        digitalWrite(led3, LOW);
124//        //myStepper2.step(-1);                   // laser up
125//        //myStepper1.step(+1);                   // table 45 gradus
126//        step2(false,steptable,speetable);
127//        step1(true, steptable,speetable);
128//      }
129//      delay(1000);                             //for computer tormoz 1   5 sek
130   
131//------------------------------------------
132//DEC Char  D   Ch  D   Ch D   Ch
133//0  null   32  sp  64  @  96  `
134//1         33  !   65  A  97  a
135//2         34  "   66  B  98  b
136//3         35  #   67  C  99  c
137//4         36  $   68  D  100 d
138//5         37  %   69  E  101 e
139//6         38  &   70  F  102 f
140//7         39  '   71  G  103 g
141//8         40  (   72  H  104 h
142//9  tab    41  )   73  I  105 i
143//10 line   42  *   74  J  106 j
144//11        43  +   75  K  107 k
145//12        44  ,   76  L  108 l
146//13 retur  45  -   77  M  109 m
147//14        46  .   78  N  110 n
148//15        47  /   79  O  111 o
149//16        48  0   80  P  112 p
150//17        49  1   81  Q  113 q
151//18        50  2   82  R  114 r
152//19        51  3   83  S  115 s
153//20        52  4   84  T  116 t
154//21        53  5   85  U  117 u
155//22        54  6   86  V  118 v
156//23        55  7   87  W  119 w
157//24        56  8   88  X  120 x
158//25        57  9   89  Y  121 y
159//26        58  :   90  Z  122 z
160//27        59  ;   91  [  123 {
161//28        60  <   92  \  124 |
162//29        61  =   93  ]  125 }
163//30        62  >   94  ^  126 ~
164//31        63  ?   95  _  127  
165//----------------------------------------

от некой ADFruit AccelStepper .ауно оно и в африке .ауно

автор самой платки вменяемее код показывает