Программирование шаговых двигателей

RentArden
Offline
Зарегистрирован: 01.06.2014

Всем привет. Сразу говорю:"Я нуб". Вопрос мой таков. Подскажите библиотеки для написания кода для ШД кроме той что на сайте: "Stepper". Есть может быть какие нибудь уроки по этому делу. И второе связано с      G-code. Есть ли уроки или что нибудь подобное по программированию прошивки, чтобы G-Code посылать на Ardunio?

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

AccelStepper - в ней есть ещё ускорение и замедление

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

vvadim пишет:

AccelStepper - в ней есть ещё ускорение и замедление

поищиет мои сообщения

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

спрашивайте помогу

а вот AccelStepper отстой его можно пользовать только с одним мотором

самая веселуха когда будет второй

для настольных станков ускорение и замедление не нужно

вот когда покажите мне станки в железе где это нужно поговорим

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

Да, оказывается все только станки и ваяют. МНЕ НРАВИТСЯ... 

И ускорения мне нужны.

Топикстартер сам решит что ему нужно

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

vvadim пишет:

Да, оказывается все только станки и ваяют. МНЕ НРАВИТСЯ... 

И ускорения мне нужны.

Топикстартер сам решит что ему нужно

раскажите

интересно

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

ну вот мы только начали битву на пояльниках в поисках истины

а автор сгинул

что хоть делать будем?

если звездолет для полета на альфа-центавру я присоединяюсь :)

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

В подобной полемике участвовать не хочу. Ваяю фото-видео.

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

vvadim пишет:

..фото-видео.

так две скорости

быстрый прогон

и точная юстировка

все как в станках

холостой ход

рабочий ход

 

 

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

короче многа букАв не осилю

повторяю какой-нибудь код на паре дешевый и мощных  H-мостов типа L298 и мощных движках типа NEMA14 17 23

упрощай нехачу

//art100 20140218 for laserscanner - USB - Arduino - liserline and L298 - Stepper Motor(1.8 gradus=1 step)
// S  ascii 83  Start scanning T ascii 84 sTop scanning 20140423
#include <Stepper.h> //for stepper chip L298
//const for myStepper library first
const int stepsmotor1 = 200;  // *1.8gradus/step = 360 gradus for stepper chip L298
const int stepsmotor2 = 200;  // *1.8gradus/step = 360 gradus for stepper chip L298
Stepper myStepper1(stepsmotor1, 4,5,6,7);   // -L298-motor           
Stepper myStepper2(stepsmotor2, 8,9,10,11); // -L298-motor 
//pins
//serial pin            0
//serial pin            1
//int led2 = 2; //laser green test
int led3 = 3; //laser red work 
//int led11             =11; // test 
//int led12             =12; // test on shield
//int led13             =13; // test led on board always
int but0 =A0; // no solder
int but1 =A1; // button motor1 up    -^-gnd
int but2 =A2; // button motor1 down  -^-gnd
int but3 =A3; // button motor2 up    -^-gnd
int but4 =A4; // button motor2 down  -^-gnd
int but5 =A5; // button start on shield
//type
int temp00=1;
int temp01=1;
int temp02=1;
int temp03=1;
int temp04=1;
int temp05=1;
long step1Laser      = 200; //long step1Laser      = 200; //400step=0.9gradusa/step 200step =1.8gradusa/step 100step=3.6gradusa/step 
long step1Table      = 200; //400step=0.9gradusa/step 200step =1.8gradusa/step 100step=3.6gradusa/step  
int  commandusb        = 0; //
void setup() {
  Serial.begin(9600);    // open COM Port
//  pinMode(led2,OUTPUT);  
  pinMode(led3,OUTPUT); 
  pinMode(but0,INPUT_PULLUP); 
  pinMode(but1,INPUT_PULLUP); 
  pinMode(but2,INPUT_PULLUP); 
  pinMode(but3,INPUT_PULLUP); 
  pinMode(but4,INPUT_PULLUP); 
  pinMode(but5,INPUT_PULLUP); 
//  pinMode(led12, OUTPUT);  
//  pinMode(led13, OUTPUT); 
  myStepper1.setSpeed(50);        // 60 rpm
//  myStepper1.setSpeed(60);        // 60 rpm
  myStepper2.setSpeed(60);        // 60 rpm  
  
  digitalWrite(led3, HIGH); //laser to work befor start
}
//====================================================================
void loop() {
  commandusb=0;  temp00=1;temp01=1;temp02=1;temp03=1;temp04=1;temp05=1;//
  temp01=digitalRead(but1);temp02=digitalRead(but2);temp03=digitalRead(but3);temp04=digitalRead(but4);temp05=digitalRead(but5);temp00=digitalRead(but0);

//  if(temp01==0 || temp02==0 || temp03==0 || temp04==0){// || temp05==0){//temp00==0 || 
//    digitalWrite(led2,  HIGH);delay(1);digitalWrite(led2, LOW); //green
//    digitalWrite(led3,  HIGH);delay(1);digitalWrite(led3, LOW); //red  
//    digitalWrite(led12, HIGH);delay(1);digitalWrite(led12, LOW);//shield red 
//    digitalWrite(led13, HIGH);delay(1);digitalWrite(led13, LOW);//shield red 
//    Serial.print("button press:"); Serial.print(temp00);Serial.print(temp01);Serial.print(temp02);Serial.print(temp03);Serial.print(temp04);Serial.print(temp05);
//    Serial.println(";");
//  }  //test
  
//  //for stepper chip L298----------------------------------
//  if(temp01==0){  myStepper1.step(+1);  Serial.println("temp01==0 button press myStepper1.step(+1)" );  digitalWrite(led13, HIGH);delay(1);digitalWrite(led13, LOW);}//shield red }  //for stepper chip L298
//  if(temp02==0){  myStepper1.step(-1);  Serial.println("temp02==0 button press myStepper1.step(-1)" );  digitalWrite(led13, HIGH);delay(1);digitalWrite(led13, LOW);}//shield red }  //for stepper chip L298
//  if(temp03==0){  myStepper2.step(+1);  Serial.println("temp03==0 button press myStepper2.step(+1)" );  digitalWrite(led13, HIGH);delay(1);digitalWrite(led13, LOW);}//shield red }  //for stepper chip L298
//  if(temp04==0){  myStepper2.step(-1);  Serial.println("temp04==0 button press myStepper3.step(-1)" );  digitalWrite(led13, HIGH);delay(1);digitalWrite(led13, LOW);}//shield red }  //for stepper chip L298
//  //for stepper chip L298----------------------------------

  //for stepper chip L298----------------------------------
  if(temp01==0){  myStepper1.step(+1);  Serial.println("table+" );  digitalWrite(led3, LOW);delay(1);digitalWrite(led3, HIGH);}//shield red }  //for stepper chip L298
  if(temp02==0){  myStepper1.step(-1);  Serial.println("table-" );  digitalWrite(led3, LOW);delay(1);digitalWrite(led3, HIGH);}//shield red }  //for stepper chip L298
  if(temp03==0){  myStepper2.step(+1);  Serial.println("laser+" );  digitalWrite(led3, LOW);delay(1);digitalWrite(led3, HIGH);}//shield red }  //for stepper chip L298
  if(temp04==0){  myStepper2.step(-1);  Serial.println("laser-" );  digitalWrite(led3, LOW);delay(1);digitalWrite(led3, HIGH);}//shield red }  //for stepper chip L298
  //for stepper chip L298----------------------------------


  //motor table motor laser ---------------------------------------------------------------- 
  int n=0; int m=0; int o=0;

  if (Serial.available() > 0) {   
    commandusb = Serial.read();
    if (commandusb==76 ) {digitalWrite(led3, HIGH);} // Laser on
    if (commandusb==108) {digitalWrite(led3,  LOW);} // laser off
    if (commandusb==47 ) {myStepper1.step(+1);} // laser down   /  
    if (commandusb==42 ) {myStepper1.step(-1);} // laser up     *  
    if (commandusb==45 ) {myStepper2.step(+1);} // laser down   +      
    if (commandusb==43 ) {myStepper2.step(-1);} // laser up     -
    if (commandusb==79 ) {myStepper1.step(+200);} // laser up     O
//    Serial.print("commanda usb received: "); Serial.println(commandusb);
  }

  if (commandusb==83 || temp05==LOW) { // S || button start  
//    Serial.println("83"); // Start for aplication 3dscanner
    for (o=0; o<8; o++) {                      // 360 gradus   table
//    for (o=0; o<stepsmotor1; o++) {                      // 360 gradus   table
      for (m=0; m<step1Laser/8; m++) {         // 200step/8=25step 25step*1.8gradus/step = 45 gradus scanning low 
        digitalWrite(led3, HIGH);               //laser on and down
        myStepper2.step(+1);
//        delay(100);                            //for computer tormoz 0,01 sek   
        delay(500);                            //for computer tormoz 0,01 sek         
//        delay(1000);                            //for computer tormoz 1 sek
      } 

      //return on start
      for (m=0; m<step1Laser/8; m++) {         // 200step/8=25step 25step*1.8gradus/step = 45 gradus return
        digitalWrite(led3, LOW);
        myStepper2.step(-1);                   // laser up
        myStepper1.step(+1);                   // table 45 gradus
      } 
      
      delay(1000);                             //for computer tormoz 1   5 sek
    } //table
    Serial.println("T"); // 84 sTop for application 3dscanner
    digitalWrite(led3, HIGH);  //laser to work befor start
  }  
  //motor table motor laser ---------------------------------------------------------------- 
}
//==========================================

//------------------------------------------
//DEC Char  D   Ch  D   Ch D   Ch
//0  null   32  sp  64  @  96  ` 
//1         33  !   65  A  97  a 
//2         34  "   66  B  98  b 
//3         35  #   67  C  99  c 
//4         36  $   68  D  100 d 
//5         37  %   69  E  101 e 
//6         38  &   70  F  102 f 
//7         39  '   71  G  103 g 
//8         40  (   72  H  104 h 
//9  tab    41  )   73  I  105 i 
//10 line   42  *   74  J  106 j 
//11        43  +   75  K  107 k 
//12        44  ,   76  L  108 l 
//13 retur  45  -   77  M  109 m 
//14        46  .   78  N  110 n 
//15        47  /   79  O  111 o 
//16        48  0   80  P  112 p 
//17        49  1   81  Q  113 q 
//18        50  2   82  R  114 r 
//19        51  3   83  S  115 s 
//20        52  4   84  T  116 t 
//21        53  5   85  U  117 u 
//22        54  6   86  V  118 v 
//23        55  7   87  W  119 w 
//24        56  8   88  X  120 x 
//25        57  9   89  Y  121 y 
//26        58  :   90  Z  122 z 
//27        59  ;   91  [  123 { 
//28        60  <   92  \  124 | 
//29        61  =   93  ]  125 } 
//30        62  >   94  ^  126 ~ 
//31        63  ?   95  _  127   
//----------------------------------------


первое что попалось в каталоге

проверил код рабочий

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

спрашивайте что-то вспомню в феврале все таки писано

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

можно прекрасного КотаБота сделать и поучиться пользованию моторами

можно дешевый motor shield на arduino uno с распаянными L293 с дешевыми биполярными моторами намутить пластилином лазерок на 5 волльт и вперед кота развлекат автоматически

кот будет счастлив

кнопки можно активирорвать

смотрю вроде ускорения нет

смотрю по проводу управление есть раз ASCII шпаргалка есть

 

 

 

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

vvadim пишет:

 

дай кода человеку

 

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

art100 пишет:

так две скорости

быстрый прогон

и точная юстировка

все как в станках

холостой ход

рабочий ход

 

 

 

Всё совсем подругому, ни одной строчкой не угадал. 

Станочек себе гравёр сделать собираюсь

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

vvadim пишет:

код

RentArden
Offline
Зарегистрирован: 01.06.2014

Я снова здесь. Занят был. Я ланирую сделать хотя бы 2ух координатник, чтобы лазером выжигало.

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

RentArden пишет:

Я снова здесь. Занят был. Я ланирую сделать хотя бы 2ух координатник, чтобы лазером выжигало.

 

писал не я 

приложение под винду искать (оно у меня почему-то не пошло и я выкинул лень было думать)

или сам ya.ru помучаешь

насколько я понял автор команду парой байт передает (мне конкрентный g-код только подходит)

не вникал

но думаю вполне реализуемо

 

//arduino-DM420A-17HS3404N  лазерная гравировка / выжигание
//int motorPins[3][2] = {{8,9},{10,11},{12, 13}};
int motorPins[3][2] = {{2,3},{4,5},{6,7}};
int count;
int count2[3] = {0,0,0};
int delayTime = 500;
int val = 0;
int rot=0;
int incomingByte = 0;
int sign=1;
int s_p=40;
//Процедура настройки прошивки----------------------------------------------------------------
void setup() {
 int i;
 Serial.begin(9600);
 pinMode(12, OUTPUT); //??? лазер
 for (i=0; i<3; i++) {
  for (count=0; count<4; count++) {   pinMode(motorPins[i][count], OUTPUT); }//установка режима работы цифровых pin'ов Ардуино
 }
 delayTime=2; //задержка между шагами 3 мс (2 мс - время реакции ШД на подачу напряжения)
}
//Поворот двигателя с номерм sm на один шаг вперёд--------------------------------------------
void moveForward(int sm) {
 digitalWrite(motorPins[sm][1], HIGH);
 digitalWrite(motorPins[sm][0], HIGH);
 digitalWrite(motorPins[sm][0], LOW);
}
//Поворот двигателя с номерм sm на один шаг назад--------------------------------------------
void moveBackward(int sm) {
 digitalWrite(motorPins[sm][1], LOW);
 digitalWrite(motorPins[sm][0], HIGH);
 digitalWrite(motorPins[sm][0], LOW);
}
//Одновременный поворот двигателей 0, 1, 2 на x, y, z шагов соответственно--------------------------------------------
void MoveSM(long x, long y, long z) {
  long c[3], c2[3];  double c1[3], d[3];  long m, i;  boolean flg;  long ms;  long d1, d2, t;  c[0] = x;  c[1] = y;  c[2] = z;

  if (z<0) s_p=-z; //количество шагов на 1 пиксель
  m = 1;
  for(i=0;i<2;i++){    if (m < abs(c[i])) m = abs(c[i]);  }
  for(i=0;i<2;i++){    c1[i] = 0;    d[i] = 1.0 * c[i] / m;    c2[i] = 0;  }
  flg = false;
  for(i=0;i<2;i++){    if (abs(c1[i]) < abs(c[i])) flg=true;  }
  t=m;
  if (z>0) {    d1=s_p*z/255;    d2=s_p/2-d1/2;    d1=d2+d1;  }
  
  while (flg) {
    flg=false;
    for (i=0; i<2; i++) {
      if (abs(c1[i]) < abs(c[i]))              c1[i] += d[i];
      if (abs(c1[i]) - abs(c2[i]) >= 0.5) {
       if  (c[i]>0) {                          c2[i]++;        moveForward(i);       } 
       else         {                          c2[i]--;        moveBackward(i);       }
      }
      if (abs(c1[i]) < abs(c[i])) flg=true;
    }
    if (z>0 && t==d1)                          digitalWrite(2, HIGH);
    t--;
    delay(2);     
    if (z>0 && t==d2)                          digitalWrite(2, LOW);
  }
  
}
//------------------------------------------------------------------------
//======================================================================================================
void loop() {
 if (Serial.available() > 0) { //Пришла команда
  long c[3]={0,0,0};  int i;  sign=1;  i=0;
  incomingByte = Serial.read();
  
  while (incomingByte!=';') { //Читаем входящую строку, признак конца строки знак "точка с запятой"
   if (c[i]==0) {    if (incomingByte=='-')     sign=-1;   }
   if (incomingByte==',') {    c[i]*=sign;    sign=1;    i++;   } 
   else if (incomingByte>='0' && incomingByte<='9') {    c[i]=c[i]*10+incomingByte-'0';   }
   while (Serial.available() == 0) {    delay(2);   }
   incomingByte = Serial.read();
  }
  
  c[i]*=sign;
  
  MoveSM(c[0],c[1],c[2]); //Вращаем двигатели на заданное число шагов
  
  Serial.println("OK");  //Отправляем компьютеру сообщение "OK", значит можно высылать новую команду
 }
 else  delay(2); //Если ничего не пришло, ждём 2 миллисекуды.
}
//======================================================================================================

и не стесняйся пиши 

удалось не удалсь

удачи

нашел програмку автора

на форум не знаю как залить

07.06.2014  12:14         1 442 137 cnc_1_0_10.zip
 
опишись она у тебя работет?
я уже ничего не помню
 
а специалисты видишь здесь какие
 
строчки кода дать не могут
 
двоешники
 
в Мсасачусетскойм институте нет проблем с кодом от другой курсовой под Arduino
 
а тут сами ничего писать не умеют 
а все флудят и флудят
 
 

 

RentArden
Offline
Зарегистрирован: 01.06.2014

спасибо. попробуем.

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

поверь это самое простое что есть на просторах интернета

дальше уже парсеры g-code требует намного больше кода

дальше когда код парсера уже совсем не лезет в arduino uno резко перепрыгивают на arduino due

конечно никто не отменял прекрасно работающих программ на lpt порт напрямую в драйвера моторов

потом появляется контроллер

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

и пошла судьбинушка по кочкам

обязательно опишись если в железе что-то собирается

 

 

RentArden
Offline
Зарегистрирован: 01.06.2014

у меня mega 2560. Так что насчёт памяти для кода проблем не должно быть