arduino, AccelStepper и serial

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

arduino, AccelStepper и serial

Сообщение ilalexey » 10 июл 2013, 17:44

Добрый день!
Есть(пока) две проблемы, которые не могу решить:
1. forward или backward должны, по замыслу, работать одновременно с laying. Сейчас этого не происходит.
2. Как добавить ввод NRot(целое число, положительное) в порт после "f" или "b" команд?
-----------------
Суть устройства - приспособление для перемотки шаговых двигателей по типу, как на видео:

-----------------
Код: Выделить всё
#include <AccelStepper.h>

// Define some steppers and the pins the will use
AccelStepper stepper1; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5
AccelStepper stepper2(AccelStepper::FULL4WIRE, 6, 7, 8, 9);
AccelStepper stepper3(AccelStepper::FULL4WIRE, 10, 11, 12, 13);

int NRot = 3; //value of rotation
int NRot_tmp = 0;
int X = 24;
char inc_b; // incoming serial data;

void forward()
{
    stepper2.moveTo(40);
    stepper2.runToPosition();
    stepper2.setCurrentPosition(0);
    stepper3.moveTo(20);
    stepper3.runToPosition();
    stepper3.setCurrentPosition(0);
    stepper2.moveTo(-40);
    stepper2.runToPosition();
    stepper2.setCurrentPosition(0);
    stepper3.moveTo(-20);
    stepper3.runToPosition();
    stepper3.setCurrentPosition(0);
}

void backward()
{
    stepper2.moveTo(-40);
    stepper2.runToPosition();
    stepper2.setCurrentPosition(0);
    stepper3.moveTo(-20);
    stepper3.runToPosition();
    stepper3.setCurrentPosition(0);
    stepper2.moveTo(40);
    stepper2.runToPosition();
    stepper2.setCurrentPosition(0);
    stepper3.moveTo(20);
    stepper3.runToPosition();
    stepper3.setCurrentPosition(0);
}

void laying()
{
    stepper1.moveTo(X);
    stepper1.runToPosition();
    stepper1.setCurrentPosition(0);
    stepper1.moveTo(-X);
    stepper1.runToPosition();
    stepper1.setCurrentPosition(0);
}

void laying_home()
{
  stepper1.disableOutputs();
  stepper2.disableOutputs();
  stepper3.disableOutputs();
}

void setup()

    Serial.begin(9600);
    Serial.println("Enter 'f' or 'b' for dir then value for number of rotation");
    stepper1.setMaxSpeed(600.0);
    stepper1.setAcceleration(400.0);
   
    stepper2.setMaxSpeed(1000.0);
    stepper2.setAcceleration(600.0);
   
    stepper3.setMaxSpeed(1000.0);
    stepper3.setAcceleration(600.0);
}

void loop()
{
    if (Serial.available())
    {
      delay(10);
      inc_b = Serial.read();
      if (inc_b == 'f') //forward
      {
        NRot_tmp = 0;
        while(NRot_tmp < NRot)
        {
          forward();
          NRot_tmp++;
        }
      for (int a=1; a < NRot; a++)
      {
        laying();
      }
      Serial.flush();
      //Serial.print("forward ");
      }
      else if (inc_b == 'b')  //backward
      {
        NRot_tmp = 0;
        while(NRot_tmp < NRot)
        {
          backward();
          NRot_tmp++;
        }
      for (int a=1; a < NRot; a++)
      {
        laying();
      }
      Serial.flush();
      //Serial.print("backward ");
      }
     
      else if (inc_b == 'l')  //laying
      {
      laying();
      Serial.flush();
      }
     
      else if (inc_b == 'q')  //exit
      {
      laying_home();
      Serial.flush();
      }
     
    }
    //stepper1.run();
    //stepper2.run();
    //stepper3.run();
    //stepper1.stop();
    //stepper2.stop();
    //stepper3.stop();
}
Вложения
stepper_proteus.zip
симуляция в протеусе
(30.22 КиБ) Скачиваний: 0
Последний раз редактировалось ilalexey 11 июл 2013, 15:07, всего редактировалось 1 раз.
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: arduino, AccelStepper и serial

Сообщение Myp » 10 июл 2013, 20:24

так вот как оно делается....на видео.

а по теме, странноватая библиотека имхо.
когда я пробовал с неё управлять ШД, ШД делали не совсем те движения которые я запрограммировал.
типа я пишу движение 50, -100, 50, чтобы пройти туда сюда
а ШД делает 20, 40, -100.
я так и не понял что за фигня происходит, в коде одно, а на выходе другое.

а нет случаем желания управлять станком G кодами как в настоящем чпу?
есть проект GRBL для ардуины.
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: arduino, AccelStepper и serial

Сообщение ilalexey » 10 июл 2013, 20:34

Про GRBL в курсе: http://forums.reprap.org/read.php?54,76841,186145#msg-186145 :)
Решил отдельым устройством слепить из "сорных" шаговиков от офисной техники и ULN2003.
Фишки с непонятными перемещениями уже встретил - в том случае помог setCurrentPosition
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: arduino, AccelStepper и serial

Сообщение linvinus » 12 июл 2013, 15:29

Если я правильно понял то проблема в том как передать число?
вот пример функции получения числа, главное за диапазон int16_t не выйти
Код: Выделить всё
#define MAX_COUNT 5

int16_t read_number(){
   int16_t tmp=0 //int16_t -32766 .. 32766
   uint8_t count=0;
   uint8_t b;
   int8_t minus=1;
   do{
      //wait for next byte
      while(!Serial.available()){delay(1);}
      b = Serial.read();
      if(count==0 && b== '-'){
         minus=-1;
      }else
      if(b>= '0' && b<='9'){
         tmp*=10;
         tmp+=(b-'0');
         count++;
      }else{ //non integer byte!
         return tmp*minus;
      }
   }while( count<MAX_COUNT )
   return tmp*minus;
}


тогда твой код будет таким (пример послыки "f1000 ")
признаком окончания числа является любой не числовой символ, пробел,#,$,%,^ и т.п. как тебе удобнее,
либо 5 знаков,
но символ '-' в начале числа означает отрицательное
например
f-30000f20000
f1 f2 f30 f-2 f5

Код: Выделить всё
if (inc_b == 'f') //forward
      {

        NRot_tmp = 0;
        NRot = read_number();//считываем число.
        while(NRot_tmp < NRot)
        {
          forward();
          NRot_tmp++;
        }
      for (int a=1; a < NRot; a++)
      {
        laying();
      }
      Serial.flush();
      //Serial.print("forward ");
      }


Добавлено спустя 19 минут 3 секунды:
упс, в твоём коде нет обработки значения NRot <0, тут тебе нужно подумать как обрабатывать отрицательные значения.

Добавлено спустя 39 минут 27 секунд:
>1. forward или backward должны, по замыслу, работать одновременно с laying. Сейчас этого не происходит.

а чтобы это работало, нужно сначала получить команду а потом приниматься за исполнение.
при этом счётчики положения у каждого двигателя должны быть свои.
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: arduino, AccelStepper и serial

Сообщение ilalexey » 12 июл 2013, 15:37

NRot отрицательным быть не должен - это количество витков.
f и b для направления намотки
----
Ещё я передумал тактику laying: виток, потом шажок (laying).Шажки делать от 0 до числа XXX, потом в обратную сторону до 0 и всё это, пока цикл не достигнет NRot. Но как это в коде должно быть для меня пока загадка.
Код: Выделить всё
#include <AccelStepper.h>

// Define some steppers and the pins the will use
AccelStepper stepper1; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5
AccelStepper stepper2(AccelStepper::FULL4WIRE, 6, 7, 8, 9);
AccelStepper stepper3(AccelStepper::FULL4WIRE, 10, 11, 12, 13);

int NRot = 3; //value of rotation
int NRot_tmp = 0;
int X = 20;
//int z = 0;
char inc_b; // incoming serial data;

void forward()
{
    stepper2.moveTo(40);
    stepper2.runToPosition();
    stepper2.setCurrentPosition(0);
    stepper3.moveTo(20);
    stepper3.runToPosition();
    stepper3.setCurrentPosition(0);
    stepper2.moveTo(-40);
    stepper2.runToPosition();
    stepper2.setCurrentPosition(0);
    stepper3.moveTo(-20);
    stepper3.runToPosition();
    stepper3.setCurrentPosition(0);
}

void backward()
{
    stepper2.moveTo(-40);
    stepper2.runToPosition();
    stepper2.setCurrentPosition(0);
    stepper3.moveTo(-20);
    stepper3.runToPosition();
    stepper3.setCurrentPosition(0);
    stepper2.moveTo(40);
    stepper2.runToPosition();
    stepper2.setCurrentPosition(0);
    stepper3.moveTo(20);
    stepper3.runToPosition();
    stepper3.setCurrentPosition(0);
}

void laying()
{
    stepper1.moveTo(X);
    stepper1.runToPosition();
    stepper1.setCurrentPosition(0);
}
void laying_b()
{
    stepper1.runToNewPosition(-X);
    stepper1.setCurrentPosition(0);
    //stepper1.moveTo(-X);
    //stepper1.runToPosition();
    //stepper1.setCurrentPosition(0);
}

void laying_home()
{
  stepper1.disableOutputs();
  stepper2.disableOutputs();
  stepper3.disableOutputs();
}

void setup()

    Serial.begin(9600);
    Serial.println("Enter 'f' or 'b' for dir then value for number of rotation");
    stepper1.setMaxSpeed(600.0);
    stepper1.setAcceleration(400.0);
   
    stepper2.setMaxSpeed(1000.0);
    stepper2.setAcceleration(600.0);
   
    stepper3.setMaxSpeed(1000.0);
    stepper3.setAcceleration(600.0);
}

void loop()
{
    if (Serial.available())
    {
      delay(10);
      inc_b = Serial.read();
      if (inc_b == 'f') //forward
      {
        NRot_tmp = 0;
        while(NRot_tmp < NRot)
        {
          forward();
          laying();
          NRot_tmp++;
        }
        //NRot = 0;
       
      Serial.flush();
      //Serial.print("forward ");
      }
      else if (inc_b == 'b')  //backward
      {
        NRot_tmp = 0;
        while(NRot_tmp < NRot)
        {
          backward();
          laying();
          NRot_tmp++;
        }
       
        Serial.flush();
      //Serial.print("backward ");
      }
     
      else if (inc_b == 'l')  //laying
      {
      laying();
      Serial.flush();
      }
     
      else if (inc_b == 'q')  //exit
      {
      laying_home();
      Serial.flush();
      }

/*   
      for (int a=0; NRot_tmp < NRot; a++)
      {
        laying();
      }  */
    }
    //stepper1.run();
    //stepper2.run();
    //stepper3.run();
    //stepper1.stop();
    //stepper2.stop();
    //stepper3.stop();
}
Последний раз редактировалось ilalexey 12 июл 2013, 18:26, всего редактировалось 1 раз.
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: arduino, AccelStepper и serial

Сообщение linvinus » 12 июл 2013, 15:55

тебе нужно задать насколько нужно сдвинуть laying во время намотки одного витка.
далее в коде void backward() и void forward()
что то типа
Код: Выделить всё
void forward()
{
      stepper2.moveTo(40);//намотка
      stepper1.moveTo(X);//laying
      while (stepper2.distanceToGo() != 0 || stepper1.distanceToGo() != 0){
         stepper2.run();
         stepper1.run();
      }
      stepper2.setCurrentPosition(0);
      stepper1.setCurrentPosition(0);
      
      stepper3.moveTo(20);
      stepper1.moveTo(X);//laying
      while (stepper3.distanceToGo() != 0 || stepper1.distanceToGo() != 0){
         stepper3.run();
         stepper1.run();
      }
      stepper3.setCurrentPosition(0);
      stepper1.setCurrentPosition(0);
      
      stepper2.moveTo(-40);
      stepper1.moveTo(X);//laying
      while (stepper2.distanceToGo() != 0 || stepper1.distanceToGo() != 0){
         stepper2.run();
         stepper1.run();
      }
      stepper2.setCurrentPosition(0);
      stepper1.setCurrentPosition(0);      
      
      stepper3.moveTo(-20);
      stepper1.moveTo(X);//laying
      while (stepper3.distanceToGo() != 0 || stepper1.distanceToGo() != 0){
         stepper3.run();
         stepper1.run();
      }
      stepper3.setCurrentPosition(0);
      stepper1.setCurrentPosition(0);      
}
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: arduino, AccelStepper и serial

Сообщение ilalexey » 12 июл 2013, 16:12

так laying(это укладчик провода,сдвигает виток) шагает только в одну сторону. На 100 витков, в зависимости от габаритов катушки двигателя может приходиться всего 5 циклов laying туда/сюда
..в смысе, лэинг н раз в 5 проходов(проход вперёд, потом назад, потом вперёд и тд)
Код: Выделить всё
f:
>----
|    |
|    |
|    |
----
b:
----<
|    |
|    |
|    |
----

        <-laying->
  ////|
|||| |
|||| |
||||/
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: arduino, AccelStepper и serial

Сообщение linvinus » 12 июл 2013, 16:42

Это я понял.
Я пока плохо понимаю как ты реализовал саму намотку.
Как я понимаю алгоритм работы такой
цикл j< витков всего

цикл i<витков в одном ряду
1) делаем один виток (это движение по прямоугольнику как я понял 40 20 -40 -20)
2) сдвигаем укладчик на толщину провода в одну сторону
конец цикла

цикл i<витков в одном ряду
1) делаем один виток
2) сдвигаем укладчик на толщину провода в другую сторону
конец цикла

конец цикла

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

Добавлено спустя 3 минуты 27 секунд:
Ок, мысли сходятся.
НО
>1. forward или backward должны, по замыслу, работать одновременно с laying. Сейчас этого не происходит.
почему они должны работать одновременно?
Это намотка на разные зубцы?

Добавлено спустя 1 минуту 18 секунд:
на видео три зуба наматываются одновременно в одну сторону вроде.
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: arduino, AccelStepper и serial

Сообщение ilalexey » 12 июл 2013, 16:57

"одновременно" я писал что передумал
виток --- сдвиг на толщину ---виток.... и так до края катушки потом виток --- сдвиг на толщину в обратную сторону.
шаговики мотаются в разном направлении: зуб двойным проводом в одну сторону, через зуб в другую
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: arduino, AccelStepper и serial

Сообщение linvinus » 12 июл 2013, 17:12

ну тогда вроде у тебя всё есть :)
наверное в идеале нужно передавать размер зуба (Ш x В x Г) , диаметр провода, и количество витков на зуб, а прога сама должна рассчитать размеры сдвигов., т.к. он будет меняться в зависимости от наматываемого слоя.

Добавлено спустя 3 минуты 55 секунд:
хотя наверное каретка всегда двигается по максимальному размеру, тогда достаточно Ш x В, количество витков в одном слое, количество витков всего.
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: arduino, AccelStepper и serial

Сообщение ilalexey » 12 июл 2013, 18:32

>ну тогда вроде у тебя всё есть
эслибы это было так, я не создавал бы темы )
--
по пежнему не представляю куда и как писать цикл возврата
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: arduino, AccelStepper и serial

Сообщение avr123.nm.ru » 12 июл 2013, 20:57

Очень понравилась машина для намотки! :good:
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: arduino, AccelStepper и serial

Сообщение ilalexey » 12 июл 2013, 21:27

Вот ещё варианты:





Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: arduino, AccelStepper и serial

Сообщение linvinus » 13 июл 2013, 00:46

ilalexey писал(а):>ну тогда вроде у тебя всё есть
эслибы это было так, я не создавал бы темы )
--
по пежнему не представляю куда и как писать цикл возврата

что за цикл возврата?
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: arduino, AccelStepper и serial

Сообщение ilalexey » 14 июл 2013, 14:08

тот, который меняет направление шагания лэинг при достижении края катушки.
В голове крутится что-то вроде этого:
Код: Выделить всё
bool lay_dir = false;
int lay_min = 0;
int lay_max = 5;
if(....) // ???
{
  X = X*1;
  lay_dir = true;
}
else if(....) // ???
{
  X = X*-1;
  lay_dir = false;
}
laying();
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

След.

Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5