roboforum.ru

Технический форум по робототехнике.


arduino, AccelStepper и serial

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

Re: arduino, AccelStepper и serial

Сообщение linvinus » 15 июл 2013, 16:37

А как ты узнаёшь в каком положении находится укладчик в момент начала программы?
И по программе у тебя получается ты сначала мотаешь все витки потом двигаешь укладчик.


X - это количество витков в одном слое.
NRot/X = количество слоёв
Должно быть что то типа такого.

Код: Выделить всёРазвернуть

int16_t Xtmp;
int16_t Xstep=2;//сдвигаем укладчик на диаметр провода после каждого оборота

void laying()
{
   if(Xtmp>0){
      if( Xtmp<X)
         Xtmp++;
      else
         Xtmp=-1;//меняем направление
   }else{
      if( (-1*Xtmp)<X)
         Xtmp--;
      else
         Xtmp=1;//меняем направление
   }
   
    stepper1.moveTo( (Xtmp>0 ? Xstep : -1*Xstep ) );
    stepper1.runToPosition();
    stepper1.setCurrentPosition(0);
}

..........
        NRot_tmp = 0;
        Xtmp=1;
        while(NRot_tmp < NRot)
        {
          forward();//один виток
        laying();//двигаем укладчик.
          NRot_tmp++;
        }

............
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 » 15 июл 2013, 20:51

в моём случае X - это "диаметр провода", другими словами 1 небольшой сдвиг после 1 витка.
Вопрос в том, как найти, быть ему положительным или отрицательным.
..не совсем понял выражение в скобках: stepper1.moveTo( (Xtmp>0 ? Xstep : -1*Xstep ) );

Добавлено спустя 1 час 15 минут 30 секунд:
в симуляции мотор1 делает шаг, потом стоит дёргается.

Добавлено спустя 45 минут 50 секунд:
пока так(вроде) вышло:
Код: Выделить всёРазвернуть
#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);

byte NRot = 9; //value of rotation
int NRot_tmp = 0;
bool lay_dir = true;
int lay_tmp = 0;
int lay_min = 0;
int lay_max = 3;
int X = 10;
char inc_b; // incoming serial data;
//char buff[]= "0000000000";

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()
{
    //int t=0;
    if (Serial.available())
    {
      delay(10);
      inc_b = Serial.read();
      if (inc_b == 'f') //forward
      {
        NRot_tmp = 0;
        while(NRot_tmp < NRot)
        {
          forward();
          if (lay_dir == true && lay_tmp < lay_max)
          {
            X = X*1;
            lay_dir = true;
            lay_tmp++;
          }
          else
          {
            lay_dir = false;
          }
          if (lay_dir == false && lay_tmp == lay_max || lay_tmp == lay_min)
          {
            X = X*-1;
            lay_dir = false;
            lay_tmp--;
          }
          else
          {
            lay_dir = true;
          }
          laying();
          NRot_tmp++;
        }
        //NRot = 0;
       
      Serial.flush();
      }
      else if (inc_b == 'b')  //backward
      {
        NRot_tmp = 0;
        while(NRot_tmp < NRot)
        {
          backward();
          if (lay_dir == true && lay_tmp < lay_max)
          {
            X = X*1;
            lay_dir = true;
            lay_tmp++;
          }
          else
          {
            lay_dir = false;
          }
          if (lay_dir == false && lay_tmp == lay_max || lay_tmp == lay_min)
          {
            X = X*-1;
            lay_dir = false;
            lay_tmp--;
          }
          else
          {
            lay_dir = true;
          }
          laying();
          NRot_tmp++;
        }
       
        Serial.flush();
      }
     
      else if (inc_b == 'l')  //laying
      {
      laying();
      Serial.flush();
      }
     
      else if (inc_b == 'q')  //exit
      {
      laying_home();
      Serial.flush();
      }
    }
}


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

Re: arduino, AccelStepper и serial

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

сообщения не правятся

Добавлено спустя 10 минут 48 секунд:
вот так работает:
Код: Выделить всёРазвернуть
если (lay_dir похож на true и lay_tmp меньше lay_max или lay_dir похож на true и lay_tmp похож на lay_min или lay_dir похож на false и lay_tmp похож lay_min)
Вложения
prot_001.png
proteus.zip
симуляция и код
(31.03 КиБ) Скачиваний: 0
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: arduino, AccelStepper и serial

Сообщение ilalexey » 19 июл 2013, 18:39

продолжил наращивать фишки
Вложения
step_lcd.jpg
step_lcd.zip
(41.68 КиБ) Скачиваний: 0
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: arduino, AccelStepper и serial

Сообщение Tomasina » 01 фев 2016, 11:46

Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.
Tomasina
 
Сообщения: 5
Зарегистрирован: 28 июн 2015, 22:45

Re: arduino, AccelStepper и serial

Сообщение ilalexey » 01 фев 2016, 12:50

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

Re: arduino, AccelStepper и serial

Сообщение ilalexey » 25 фев 2017, 00:01

Немного фоток самой конструкции:
Вложения
IMG_1035.JPG
IMG_1036.JPG
IMG_1037.JPG
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Пред.

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

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

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