roboforum.ru

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


Вопросы новичка.

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

Re: Вопросы новичка.

Сообщение Dmitry__ » 10 авг 2018, 16:54

Dmitry__ писал(а):Пробовал и две обмотки питать сразу - правильным алгоритмом, с повышением крутящего в 1,4 раза, подумал обмоткам тяжко будет.

Вооот, момент будет ниже и шаги более дерганные. Шаговик рассчитан на постоянное питание обмоток. Просто измерь сопротивление шаговика и выстави такое напряжение, чтоб шаговик потреблял N ватт для данного форм-фактора.
https://en.wikipedia.org/wiki/Stepper_motor

Бегущая "1":
Wave drive (one phase on)
In this drive method only a single phase is activated at a time. It has the same number of steps as the full-step drive, but the motor will have significantly less than rated torque. It is rarely used. The animated figure shown above is a wave drive motor.


Изображение

dimamichev писал(а):Дим, меня вот что смущает (скетч пока не загрузил) на 12 выводе серва сидит, а я её через порт В, получается собираюсь вредничать.


Очень сложно твои исходники читать. Но естественно пины должны соответствовать. Если есть возможность, то лучше пины выставлять на одном порту, чтоб управлять одной командой микроконтроллера для всех контактов шаговвика.
А почему не используешь готовые библы? Ведь для ардуин написаны тонны примеров шаговиков. И там все красиво.
Для одновременного управления 2-мя координатами (рисовать прямые под углом), я тебе раньше расписывал способ - одну координату инкрементируешь на каждом тике, а другую при переполнении аккумулятора. Блин, долго расписывать подробно. Представь аккумулятор 8 бит, на каждом тике прибавляешь константу к аккумулятору, если было переполнение, то инкрементируешь в этом шаге 2-ю координату. Константа будет задавать угол. Если константа = 256, то линия будет 45 град. (для одинаковых координат). Если константа = 1, то линия будет подниматься вверх только на каждом 256-м тике координаты "x"
Очень долго топтать клаву. Надо искать хорошие исходники шаговика...

Добавлено спустя 7 минут 58 секунд:
Нагуглил: "AccelStepper MultiStepper"
http://www.airspayce.com/mikem/arduino/AccelStepper/

Добавлено спустя 46 секунд:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Вопросы новичка.

Сообщение dimamichev » 10 авг 2018, 17:56

Понятно теперь зачем значок & там.
С питанием, надо экспериментировать, но после как чего то получится со скоростями.Написал "иезуитскую" функцию для отрезка типа Otr(-0.5,0.5,15) где +-0.5 размер шага в мм в ту или иную сторону, 15 число шагов - комбинируя можно отрезки под углами рисовать, но как лесенка получается, хоть и симпатично. Вообщем начну думать над "плавным отрезком" длины такой, то под углом таким то.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Scorpio » 10 авг 2018, 18:41

Не очень правильно использовать переменную типа float в качестве числа шагов. лучше явно преобразовывать
Код: Выделить всёРазвернуть
 y=4.7*y;//переводной множитель из миллиметров в число шагов двигателя
int j=0;int k=(y>=0)?1:-1;
// while (j<=abs(y)-1){...}
while (j<=abs(int(y))-1){...}


Добавлено спустя 8 минут 36 секунд:
Если два шаговика одновременно держат относительную скорость, то получается прямая под углом 45.... 3Д принтеры как то ведь рисуют без ступенек плавные контуры..
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Вопросы новичка.

Сообщение dimamichev » 11 авг 2018, 16:43

Такой кошмар получился для функции ( не оптимизировал код пока, а то запутаюсь). Задавая разные интервалы между шагами получается множество ломаных из двух отрезков, в том числе и вариант одного прямого в точку с координатами х,у.Надо подумать как автоматически задавать скорость каждого мотора (свести функцию к двум переменным), чтобы рисовал один отрезок, а не "клюшку". Совсем всё плавненько будет на синусоидах переменного тока с программируемой частотой где нибудь, дай бог ляпнуть 10-300Гц.
Код: Выделить всёРазвернуть
 void Otrezok(float x, float y,long nx,long ny)
{
 
  long tx=millis();long ty=millis();
  Y=Y+y;//текущий учёт положения пера относительно начала отсчёта
  y=4.7*y;//переводной множитель из миллиметров в число шагов двигателя
  X=X+x;//текущий учёт положения пера относительно начала отсчёта
  x=2*x;//переводной множитель из миллиметров в число шагов двигателя
  int j1=0;int k1;if (y>=0){k1=1;}else {k1=-1;}
  int j2=0;int k2;if (x>=0){k2=1;}else {k2=-1;}
  while ((j1<=(int)abs(y)-1)||(j2<=(int)abs(x)-1))
  {
  if(j1!=(int)abs(y)&&(millis()-ty>ny))//условие совершения шага
  {ty=millis();
  if(i<0){i=12;}if(i>12){i=0;}////условия зацикливания тактов по кругу
  digitalWrite(motor_Y_f1, tablY[i]);digitalWrite(motor_Y_f2, tablY[i+1]);digitalWrite(motor_Y_f3, tablY[i+2]);digitalWrite(motor_Y_f4, tablY[i+3]);
  i=i+4*k1;j1=j1+1;//условия перехода на следующий такт
  }
  if(j2!=(int)abs(x)&&(millis()-tx>nx))//условие совершения шага
  {tx=millis();
  if(i1<0){i1=12;}if(i1>12){i1=0;}//условия зацикливания тактов по кругу
  digitalWrite(motor_X_f1, tablX[i1]);digitalWrite(motor_X_f2, tablX[i1+1]);digitalWrite(motor_X_f3, tablX[i1+2]);digitalWrite(motor_X_f4, tablX[i1+3]);
  i1=i1+4*k2;j2=j2+1;//условия перехода на следующий такт
  } 
  }
  digitalWrite(motor_Y_f1, HIGH); digitalWrite(motor_Y_f2, HIGH); digitalWrite(motor_Y_f3, HIGH); digitalWrite(motor_Y_f4, HIGH);// исходное состояние  - обмотки обесточены
  digitalWrite(motor_X_f1, LOW); digitalWrite(motor_X_f2, LOW); digitalWrite(motor_X_f3, LOW); digitalWrite(motor_X_f4, LOW);// исходное состояние  - обмотки обесточены     
}
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Scorpio » 12 авг 2018, 02:09

dimamichev писал(а): не оптимизировал код пока, а то запутаюсь

Бог с ней, с оптимизацией, если тебе так понятнее. Просто хотел показать возможности работы с портом. Бывает весьма удобно, если нужно сделать что-то, типа бегущего огня на 8 лампочек.
dimamichev писал(а):Понятно теперь зачем значок & там.

Обрати внимание, что PORTB &= tablY[i]; оставит неизменными выводы порта, где уже есть единицы. Значит сначала надо обнулить задействованные тобой ноги PORTB &= 0xF0;, а потом уже записать в них значения PORTB |= tablY[i]; Тут мы уже используем ИЛИ.
Если посмотришь исходник стандартной библиотеки Stepper, то не увидишь там никакой оптимизации. Даже массивом, как ты, воспользоваться не догадались, а тупо используют перебор case, чтобы разобраться с шагами. Одновременное движение там тоже не предполагается. А у тебя оно уже появилось!
Я бы обратил внимание на советы нашего тезки Dmitry__ , и попробовал бы библиотеку AccelStepper. Скетч бы стал более читабельным.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Вопросы новичка.

Сообщение Dmitry__ » 12 авг 2018, 05:13

Scorpio писал(а):Я бы обратил внимание на советы нашего тезки Dmitry__

:beer:
Могу еще добавить - хорошая библиотека обработки шаговых двигателей, требует хорошего опыта программирования - real time, псевдо многопоточность кода и.т.д.
И вот эти извраты со своим кодом, когда еще даже не умеем избавляться от delay и работать с прерываниями, мне непонятны совсем...
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Вопросы новичка.

Сообщение dimamichev » 12 авг 2018, 10:32

Всё, нет больше "делай", отрезки рисуются на постоянной для одного мотора и переменной для другого (в зависимости от отрезка), скорости. Теперь "отрезки можно слышать". Ну, и без библиотеки, наверное это предел для 4 тактов и шагов в 0,5мм, 0,2мм.
Код: Выделить всёРазвернуть
///////////// СТАНОК ДЛЯ РИСОВАНИЯ //////////////////////////////
#include <Servo.h>

#define motor_Y_f1 8
#define motor_Y_f2 9
#define motor_Y_f3 10
#define motor_Y_f4 11

#define motor_X_f1 4
#define motor_X_f2 5
#define motor_X_f3 6
#define motor_X_f4 7

byte a0=140;byte a=a0;// угол исходного положения пера - поднято
int n=10;//переменная единицы временного интервала
int i=0;// счётчик
int i1=0;// счётчик
float X=0;float Y=0;//переменные учёта положения пера относительно начала координат
String inputString;// строка данных
byte tablY[16]={0,1,1,1,
                1,1,0,1,
                1,0,1,1,
                1,1,1,0};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (биполярный)
byte tablX[16]={1,0,0,0,
                0,1,0,0,
                0,0,1,0,
                0,0,0,1};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (униполярный)               

Servo servo1;



void setup() {
Serial.begin(9600);
servo1.attach(12);
servo1.write(a0);delay(10*n);servo1.write(a0-5);//начальный подъём пера
pinMode(motor_Y_f1, OUTPUT);   //  определение вывода как ВЫХОД
pinMode(motor_Y_f2, OUTPUT);
pinMode(motor_Y_f3, OUTPUT);
pinMode(motor_Y_f4, OUTPUT);
digitalWrite(motor_Y_f1, HIGH); digitalWrite(motor_Y_f2, HIGH); digitalWrite(motor_Y_f3, HIGH); digitalWrite(motor_Y_f4, HIGH);// исходное состояние  - обмотки обесточены 
pinMode(motor_X_f1, OUTPUT);   //  определение вывода как ВЫХОД
pinMode(motor_X_f2, OUTPUT);
pinMode(motor_X_f3, OUTPUT);
pinMode(motor_X_f4, OUTPUT);
digitalWrite(motor_X_f1, LOW); digitalWrite(motor_X_f2, LOW); digitalWrite(motor_X_f3, LOW); digitalWrite(motor_X_f4, LOW);// исходное состояние  - обмотки обесточены 
}

void loop()
    {
 

   ///////////////////////// кубик ////////////////////////////
  Otrezok (-15,10);
   up_down_pen(true);
   Otrezok (-15,0); Otrezok (0,15); Otrezok (16,0); Otrezok (0,-15);Otrezok (0,15);
   Otrezok (-8,8);Otrezok (-14.5,0);Otrezok (0,-15); Otrezok (8,-8); Otrezok (0,15); Otrezok (-7,7);
    up_down_pen(false);
    //////////////////////// призма ////////////////////////////////////
    Otrezok (-3,-20);
    up_down_pen(true);
     Otrezok (-20,0);Otrezok (10,10);Otrezok (10,-10);up_down_pen(false);Otrezok (-10,10);up_down_pen(true);
     Otrezok (-15,5);Otrezok (-10,-10); Otrezok (16,-5);
 
    VozvratPera ();
      me:goto me;
    }
/////////////////////////////////////////////////////////////
////// функция рисования отрезка длиной d под углом a
////////////////////////////////////////////////////////////
void Vektor(float d,int a)
{
  float x=d*cos(PI*a/180); float y=d*sin(PI*a/180);
   Otrezok(x,y);
  }
////////////////////////////////////////////////////////////////
////функция рисования отрезка по конечным координатам x и y
////////////////////////////////////////////////////////////////
void Otrezok(float x, float y)
{
  int nx;
  int ny=10;//принимаем как постоянную для задания скорости
  if (x!=0&&y!=0){nx=ny*2.35*abs(y)/abs(x);if (nx==0){nx=5;}}else {nx=50;}// вычисляем вторую постоянную для отрезка с учётом крайних недопустимых значений - 0 и бесконечность
  long tx=millis();long ty=millis();
  Y=Y+y;//текущий учёт положения пера относительно начала отсчёта
  y=4.7*y;//переводной множитель из миллиметров в число шагов двигателя
  X=X+x;//текущий учёт положения пера относительно начала отсчёта
  x=2*x;//переводной множитель из миллиметров в число шагов двигателя
  int j1=0;int k1;if (y>=0){k1=1;}else {k1=-1;}
  int j2=0;int k2;if (x>=0){k2=1;}else {k2=-1;}
  while ((j1<=(int)abs(y)-1)||(j2<=(int)abs(x)-1))
  {
  if(j1!=(int)abs(y)&&(millis()-ty>ny))//условие совершения шага
  {ty=millis();
  if(i<0){i=12;}if(i>12){i=0;}////условия зацикливания тактов по кругу
  digitalWrite(motor_Y_f1, tablY[i]);digitalWrite(motor_Y_f2, tablY[i+1]);digitalWrite(motor_Y_f3, tablY[i+2]);digitalWrite(motor_Y_f4, tablY[i+3]);
  i=i+4*k1;j1=j1+1;//условия перехода на следующий такт
  }
  if(j2!=(int)abs(x)&&(millis()-tx>nx))//условие совершения шага
  {tx=millis();
  if(i1<0){i1=12;}if(i1>12){i1=0;}//условия зацикливания тактов по кругу
  digitalWrite(motor_X_f1, tablX[i1]);digitalWrite(motor_X_f2, tablX[i1+1]);digitalWrite(motor_X_f3, tablX[i1+2]);digitalWrite(motor_X_f4, tablX[i1+3]);
  i1=i1+4*k2;j2=j2+1;//условия перехода на следующий такт
  } 
  }
  digitalWrite(motor_Y_f1, HIGH); digitalWrite(motor_Y_f2, HIGH); digitalWrite(motor_Y_f3, HIGH); digitalWrite(motor_Y_f4, HIGH);// исходное состояние  - обмотки обесточены
  digitalWrite(motor_X_f1, LOW); digitalWrite(motor_X_f2, LOW); digitalWrite(motor_X_f3, LOW); digitalWrite(motor_X_f4, LOW);// исходное состояние  - обмотки обесточены     
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////функция возврата пера в исходное положение на начало отсчёта
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void VozvratPera ()
{
  up_down_pen(false);
  Otrezok (-X,-Y);
  X=0;Y=0;

  }
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////функция поднимания-опускания пера (значения аргумента false и true  соответственно)/////
void  up_down_pen(boolean  k)
{
  while (a>87&&k==1)
  {servo1.write(a);a=a-1;delay(n);}if(k== true ){a=87;}
   while (a<a0&&k==0)
  {servo1.write(a);a=a+1;delay(n);}if (k==false){a=a0;delay(10*n);servo1.write(a0-5);}
  }
  /////////////////////////////////////////////////////////////////////////////////////////////////
Вложения
IMG.jpg
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Dmitry__ » 12 авг 2018, 15:47

dimamichev писал(а):Всё, нет больше "делай"

Я насчитал 4 delay и 6 millis :D
millis, в таком виде как у тебя, не отличается от delay. Про delay говорилось во всей программе, а не только в одной функции рисования прямой. Учи библу AccelStepper и не спорь :)

Добавлено спустя 2 минуты 26 секунд:
Максимум, где можно допустить delay, это в: void setup() {}. А в основном цикле получилось: Рисуй или умри :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Вопросы новичка.

Сообщение ilalexey » 12 авг 2018, 15:56

Через AccelStepper ULN пахабно работает. Тормозит.
Как микрошаг на ULN сделать(на дуне)?
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: Вопросы новичка.

Сообщение dimamichev » 12 авг 2018, 16:04

Точно, забыл про опускание, поднимание пера. Ну это тоже через "миллис легко". А почему плохо много раз вызывать её? И да!, не изучавши ещё библиотеку - наверняка потребует ШИМ ? и переделку схемы?.

Добавлено спустя 2 минуты 30 секунд:
Про рисуй или умри и вновь... это точно, никаких механизьмов прерывания процесса и возврата к исходу нет.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение Dmitry__ » 12 авг 2018, 16:05

ilalexey писал(а):Как микрошаг на ULN сделать(на дуне)?

Если бы был проработан план действий (о чем я несколько раз спрашивал), то uln не было бы :) Т.к. нормальный драйвер step/dit стОит как uln, а работает в 1000 раз лучше. А без плана: давайте сделаем на сервах, потом - не, давайте на шаговиках, то получится, как получилось :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Вопросы новичка.

Сообщение ilalexey » 12 авг 2018, 16:16

Dmitry__ писал(а):Т.к. нормальный драйвер step/dit стОит как uln

Так ведь не стоит так же. Микруха улн - одын грн, а платка с алегро 30-50 грн(года три назад так было).
Вопрос был больше для интереса и чтоб добавить вопросов в копилку тс.
Аватара пользователя
ilalexey
 
Сообщения: 3202
Зарегистрирован: 13 май 2011, 21:37
Откуда: Bb

Re: Вопросы новичка.

Сообщение dimamichev » 12 авг 2018, 16:22

Так у меня транзисторы-ключи стоят.., как микрошаг в униполярном режиме - сходу не нашёл.
Аватара пользователя
dimamichev
 
Сообщения: 1386
Зарегистрирован: 03 янв 2013, 16:27

Re: Вопросы новичка.

Сообщение ilalexey » 12 авг 2018, 16:24

dimamichev писал(а):Так у меня транзисторы-ключи стоят

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

Re: Вопросы новичка.

Сообщение Dmitry__ » 12 авг 2018, 16:42

ilalexey писал(а):Так ведь не стоит так же. Микруха улн - одын грн

Платы стоЯт одинаково. А вот паять на рассыпухе - это как нужно себя не любить? Мой день стоИт около 3 т.р., а спаянная плата стОит 110р. :)
Раз:
http://roboparts.ru/products/uln2003-board
Два:
http://roboparts.ru/products/a4988-driver
Во втором случае - почувствуй разницу, насколько такой драйвер лучше :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Пред.След.

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

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

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