roboforum.ru

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

ПРограмирование шагового двигателя

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

Re: ПРограмирование шагового двигателя

Сообщение RootAdmin » 03 ноя 2014, 22:13

Все ж надо проверить - рабочий ли вывод для ДИР и меняется ли там уровень. Тестером или светодиодом через пару килоом.

Добавлено спустя 1 минуту 10 секунд:
В даташите описан подстроечник для регулировки.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 04 ноя 2014, 17:25

Не думаю, что дело всё в DIR, т.к. количество шагов так же не соблюдается. Двигатель просто включается и крутится без остановки, пока не загрузишь другую программу или не отключишь питание.
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение RootAdmin » 04 ноя 2014, 23:21

И если прлсто блинк загрузить - тоже? Так. Значит он подключен неправильно. Он подключен сейчас как? Питание на оптроны развязки подается с какого вывода ардуины? Желательро- фото... и лучше померить напряжения, написав скетч (переделав блинк) на выставление "1" на ногах управления.

Добавлено спустя 2 минуты 13 секунд:
Подозреваю, что не 5 вольт на питание оптронов идет.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 05 ноя 2014, 09:35

OneWire, Blink работают нормально. Программу на шаговик я прерываю загрузкой блинка.

http://pixs.ru/showimage/DSC0023JPG_555 ... 586345.jpg
http://pixs.ru/showimage/DSC0024JPG_297 ... 586348.jpg

Слева направо на драйвер: красный - EN, желтый - STP, следом 2 черных - DIR и Vcc. Последние два - GND и V+ с блока питания.
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение Myp » 05 ноя 2014, 12:02

kabephe писал(а):Вал при щелчках действительно подёргивается, но провода подключал по паспортным данным двигателя и драйвера. Ни фазы ни +/- не перепутаны

сигнал step у тебя был перепутан с enable.
в результате вместо шагания, шаговик блокировался и разблокировался.

step настраивай на 13 вывод ардуины, чтобы было видно как моргает светодиод.
как светодиод моргает - так и мотор должен крутится.

Добавлено спустя 2 минуты 34 секунды:
kabephe писал(а): К тому же шаговик очень сильно греется. Мне кажется сильнее, чем должен.

60 градусов нормальная температура.
ток регулировать надо, он должен быть такой чтобы усилие на валу было чуть больше чем необходимо
чтоб не грелся зря.

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

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 05 ноя 2014, 12:54

С самой первой попытки запуска я уже неоднократно вставлял выводы в разные пины. Но ни разу они не были перепутаны. RootAdmin был прав, предположив, что разрешающим для EN является другой уровень сигнала. Поменял его в программе и двигатель стал работать и с задействованным выводом EN. Step через 13 pin я тоже пробовал подключать. Диоды моргают(видимо согласно частоте подаваемых сигналов), но всё же проблема в том же двигатель крутится без остановки и только в одну сторону. Сократил количество степов в программе до 5. И оставил только один вызов к программе, т.е. двигатель должен был совершить 5 шагов и остановится, но этого не произошло. Приходится либо загружать блинк, либо отсоединять от сети схему.
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение Myp » 05 ноя 2014, 14:40

я в 4м сообщении этой темы дал ссылку на хорошую библиотеку управления ШД.
давно бы уже всё запустил и сделал свой автомат.

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

Re: ПРограмирование шагового двигателя

Сообщение RootAdmin » 05 ноя 2014, 16:01

Программу - в студию.
И сейчас проверю подключение.

Добавлено спустя 23 минуты 27 секунд:
Итак:
ардуино драйвер
5V Должно быть на выводе 3 колодки - черный, наверно он.
9 STEP Должен быть на 5 выводе колодки. А он на каком??? на 3 или 4?
10 EN Должен быть на 6 выводе колодки. Зачем он на 5?
7 В программе определен как 12???? WTF? то есть !!пустой!!! вывод прикручен на 6 вывод колодки (EN)
Так - работать не будет.
Двигатель крутился ИМХО от наводок на 6 вывод.
Я бы подключил так, как в программе написано... А то сам засомневался.

Добавлено спустя 13 минут 3 секунды:
1. Подключаем как пишу:
По вот этому даташиту: http://www.nervoussquirrel.com/UIM240Manual.pdf
ардуина драйвер
10 6 (en)
9 5 (step)
12 4 (dir)
5v 3 (vcc)
Трижды проверяем правильность. И лучше - не оставлять длинных оголенных участков около колодки. Замкнет...

2. Грузим программу. Именно ту, что давал я.
3. Проверяем
4. Если не работает -отсоединяем вывод 6 ДРАЙВЕРА (en) - и пробуем.

Добавлено спустя 2 минуты 33 секунды:
2 Мур: активный уровень EN там - высокий, мотор работает когда через оптрон ток не идет (вывод в воздухе). dir в общем непринципиален, да и step - прямоугольный, по какому фронту будет срабатывать - вся разница.

Добавлено спустя 3 минуты 34 секунды:
Да, программу на 1 странице подправил. forum86/topic14716.html#p313581
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 05 ноя 2014, 17:44

Я прошу прощения, что не написал выше о том, что проверяя работают ли пины, менял и в самой программе, так что в ней у меня сейчас так:
Код: Выделить всёРазвернуть
int Motor1EN = 7;
int Motor1dir = 9;
int Motor1step = 11;

void setup ()
{
  pinMode(Motor1EN, OUTPUT);
  pinMode(Motor1dir, OUTPUT);
  pinMode(Motor1step, OUTPUT);
 
  digitalWrite(Motor1EN, LOW);
  digitalWrite(Motor1dir, LOW);
  digitalWrite(Motor1step, HIGH);
}
void loop ()
{

stepMotor1(1, 5);


delay (10);





 
 
  }



void stepMotor1(int dir, int step)

{
  //Сначала включим драйвер
  digitalWrite(Motor1EN, HIGH);

  //потоми проверим - какое направление выбрано?
  if (dir)
   {
    //если направление "1" - ставим единицу на выводе Motor1dir
    digitalWrite(Motor1dir, HIGH);}

    else
    //иначе - ставим ноль на выводе Motor1dir
     {    digitalWrite(Motor1dir, LOW);}

for (int i=0;i<step; i++)
   {
     delay(30);
     //Поставили ноль на выводе Motor1step (начало импульса),
     digitalWrite(Motor1step, LOW);
     //Пауза (длительность импульса
     delay(10);
     //Поставили единицу на выводе Motor1step (конец импульса)
     digitalWrite(Motor1step, HIGH);
}
    delay(70); //Пауза чтобы успел шагнуть до выключения питания.
     digitalWrite(Motor1EN, HIGH);
  }


Вроде как и подключено верно всё.
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение RootAdmin » 05 ноя 2014, 18:01

Загрузите подправленную программу. У вас EN сейчас неправильно сделан.

Добавлено спустя 3 минуты 4 секунды:
То есть сейчас соединено как?
7 - 6 (en)
11- 5 (step)
9 - 4 (dir)
5v 3 (vcc)
Так?
На фото -не 11 вывод ардуины а 10!

Добавлено спустя 59 секунд:
Хотя, может там провод согнут.. не видно.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 05 ноя 2014, 20:34

Не помогло. Такое ощущение, что алгоритм не завершается. Ниже привёл, что при смене значений в разных строчках происходит:
Код: Выделить всёРазвернуть
int Motor1EN = 7;
int Motor1dir = 9;
int Motor1step = 11;

void setup ()
{
  pinMode(Motor1EN, OUTPUT);
  pinMode(Motor1dir, OUTPUT);
  pinMode(Motor1step, OUTPUT);
 
  digitalWrite(Motor1EN, LOW);
  digitalWrite(Motor1dir, LOW); //при смене на HIGH ничего не изменилось
  digitalWrite(Motor1step, HIGH);
}
void loop ()
{

stepMotor1(1, 10); // при смене 1 на 0 ничего не изменилось, при смене 10 на 1 - вместо 10 шагов совершает по 1 до отключения питания.


delay (10);






 
 
  }



void stepMotor1(int dir, int step)

{
 
  digitalWrite(Motor1EN, HIGH); // при LOW не запускается

 
  if (dir)
   {
   
    digitalWrite(Motor1dir, HIGH);} //при LOW никаких изменений

    else
   
     {    digitalWrite(Motor1dir, LOW);} // при HIGH никаких изменений

for (int i=0;i<step; i++)
   {
     delay(30);
     
     digitalWrite(Motor1step, LOW);
     
     delay(10);                        //при одинаковый уровнях Motor1step выше и ниже не запускается
     
     digitalWrite(Motor1step, HIGH);
}
    delay(70);
     digitalWrite(Motor1EN, HIGH); //наличие этой строчки в программе ни на что не влияет
  }
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение RootAdmin » 06 ноя 2014, 10:53

Переключаем провод от драйвера с 9 на 13 вывод ардуины (там светодиод).
Заливаем спрограмму - проверяем, моргает ли светодиод.
Ничего в программе - не меняем, просто переключаем провод.
И - как сейчас стоят джамперы на драйвере, которые делитель определяют?

Если двигатель крутится в одну сторону, отключаем от 13 ноги ардуины провод.
Направление поменялось?
Подключаем его (провод) на землю ардуины, именно ардуины. Направление поменялось?
Какие-нибудь приборы доступны? Мультиметр, например? Ток бы через dir померить.


Код: Выделить всёРазвернуть
int Motor1EN = 7; //6 вывод колодки (en)
int Motor1dir = 13;      //4 колодка (dir)
int Motor1step = 11;    // 5 колодка (step)

void setup ()
{
  pinMode(Motor1EN, OUTPUT);
  pinMode(Motor1dir, OUTPUT);
  pinMode(Motor1step, OUTPUT);
 
  digitalWrite(Motor1EN, HIGH);
  digitalWrite(Motor1dir, LOW); //при смене на HIGH ничего не изменилось А и не должно, ибо тут задаются НАЧАЛЬНЫЕ значения. Этих трех строк вообще может не быть. Просто хороший тон.
  digitalWrite(Motor1step, LOW);
}
void loop ()
{


stepMotor1(1, 100); // Светодиод на 13 ноге должен светиться секунд 8. (и светится - проверил)


delay (1000);


stepMotor1(0, 100); // // Светодиод на 13 ноге НЕ должен светиться секунд 8.

delay (1000);






 
 
  }



void stepMotor1(int dir, int step)

{
 
  digitalWrite(Motor1EN, HIGH); // при LOW не запускается

 
  if (dir)
   {
   
    digitalWrite(Motor1dir, HIGH);} //при LOW никаких изменений

    else
   
     {    digitalWrite(Motor1dir, LOW);} // при HIGH никаких изменений

for (int i=0;i<step; i++)
   {
     delay(50);//задержка в 1/20 секунды
     
     digitalWrite(Motor1step, LOW); 
     
     delay(50);                        //Это - не уровни, это задержка в одну двадцатую секунды.
                                       //То есть двигатель делает 10 шагов в секунду.
     digitalWrite(Motor1step, HIGH);
}
    delay(100);
     digitalWrite(Motor1EN, HIGH); //наличие этой строчки в программе ни на что не влияет Она, строчка эта, выключает драйвер после использования
  }


Добавлено спустя 54 секунды:
Да, если светодиод моргает - алгоритм нормально завершается. Только что проверил на реальном железе.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 06 ноя 2014, 14:09

При подключении к 13 пину светодиод моргает. Манипуляции с выводом dir изменения направления не дали.
RootAdmin писал(а):Да, если светодиод моргает - алгоритм нормально завершается. Только что проверил на реальном железе.


Т.е. на вашем оборудовании программа работает нормально?

Завтра будет возможность проверить на другом драйвере и двигателе.
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Re: ПРограмирование шагового двигателя

Сообщение RootAdmin » 06 ноя 2014, 16:15

У меня - да, работает. Предполагаю, что драйвер (оптрон, скорее всего) неисправен. Поэтому - надо этот вывод прозвонить. Хотя бы ток померить - должно быть с него на землю около 3-8 ма. И звониться с 3 выводом колодки должен как диод с сопротивлением последовательно.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: ПРограмирование шагового двигателя

Сообщение kabephe » 07 ноя 2014, 17:36

Взял другой драйвер, всё работает. Спасибо огромное! Ну и да, цикл там не завершается. Для завершения добавил проверку константы.
Код: Выделить всёРазвернуть
int Motor1EN = 7;
int Motor1dir = 5;
int Motor1step = 6;
int ENUP = 1;
void setup ()
{
  pinMode(Motor1EN, OUTPUT);
  pinMode(Motor1dir, OUTPUT);
  pinMode(Motor1step, OUTPUT);
 
  digitalWrite(Motor1EN, LOW);
  digitalWrite(Motor1dir, LOW);
  digitalWrite(Motor1step, HIGH);
}
void loop ()
{

if (ENUP == 1) {stepMotor1(1, 300);}



  ENUP = 0;
 
 
  }



void stepMotor1(int dir, int step)

{
  //Сначала включим драйвер
  digitalWrite(Motor1EN, HIGH);

  //потоми проверим - какое направление выбрано?
  if (dir)
   {
    //если направление "1" - ставим единицу на выводе Motor1dir
    digitalWrite(Motor1dir, HIGH);}

    else
    //иначе - ставим ноль на выводе Motor1dir
     {    digitalWrite(Motor1dir, LOW);}

for (int i=0;i<step; i++)
   {
     delay(30);
     //Поставили ноль на выводе Motor1step (начало импульса),
     digitalWrite(Motor1step, LOW);
     //Пауза (длительность импульса
     delay(1);
     //Поставили единицу на выводе Motor1step (конец импульса)
     digitalWrite(Motor1step, HIGH);
}
    delay(70); //Пауза чтобы успел шагнуть до выключения питания.
     digitalWrite(Motor1EN, LOW);
  }
kabephe
 
Сообщения: 23
Зарегистрирован: 30 окт 2014, 14:28

Пред.След.

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

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

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