roboforum.ru

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

Управление шаговым двигателем Arduino + A4988

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

Управление шаговым двигателем Arduino + A4988

Сообщение Badaboom » 05 янв 2015, 22:30

Здравствуйте.
Решил собрать станочек.
При этом электротехника была только в универе, а программированием не заробатывал...
Нашел простую схему подкючения:
2s8096e.jpg

Использую arduino uno + контроллер A4988 + униполярные шаговые двигатели 4shg-023a39s.
Характеристики двигателя:
Тип двигателя: Шаговый, униполярный.
Угол поворота за один шаг: 1.8 градуса.
Количество шагов на полный оборот вала: 200.
Количество выводов: 6.
Количество обмоток: 2 со средней точкой.
Напряжение питания: 2.3В.
Сопротивление обмоток: 1.5Ом.
Потребляемый ток: 1.53А.
Момент удержания ротора: 4кг/см.
Радиальная нагрузка: 75N (max).
Осевая нагрузка: 15N (max).
Температурный диапазон: -20...+50 градусов.
Размеры: 57х57×41 мм.
Вес: 540 грамм.

Решил сперва собрать схему для одного ЩД:
a4988 diagram.png

Собрал схему, в качестве доп.питания использовал 4 АА батарейки.
В ардуино закатал скетч(в скетче доп.указания по подключению):
Код: Выделить всёРазвернуть
//simple A4988 connection
//jumper reset and sleep together
//connect  VDD to Arduino 3.3v or 5v
//connect  GND to Arduino GND (GND near VDD)
//connect  1A and 1B to stepper coil 1
//connect 2A and 2B to stepper coil 2
//connect VMOT to power source (9v battery + term)
//connect GRD to power source (9v battery - term)


int stp = 13;  //connect pin 13 to step
int dir = 12;  // connect pin 12 to dir
int a = 0;     //  gen counter

void setup()
{               
  pinMode(stp, OUTPUT);
  pinMode(dir, OUTPUT);       
}


void loop()
{
  if (a <  200)  //sweep 200 step in dir 1
   {
    a++;
    digitalWrite(stp, HIGH);   
    delay(10);               
    digitalWrite(stp, LOW); 
    delay(10);             
   }
  else
   {
    digitalWrite(dir, HIGH);
    a++;
    digitalWrite(stp, HIGH); 
    delay(10);               
    digitalWrite(stp, LOW); 
    delay(10);
   
    if (a>400)    //sweep 200 in dir 2
     {
      a = 0;
      digitalWrite(dir, LOW);
     }
    }
}

http://forum.arduino.cc/index.php?topic=133894.msg1449404#msg1449404
Ни звуков, ни движения не возникло.
Проверил двигатель вручную - попеременно давая напряжение то на одну, то на вторую обмотку, двигатель работает.
Минут 5 перезагружал ардуино, менял порядок полюсов, почуял запах - процессор на А4988 начал перегреваться. Наверно сдох.
Подключал два других А4988 - ноль реакции.

Подскажите:

1)можно ли использовать приведенные мною схемы?
2)какие источники питания лучше использовать для этих схем?
3)зачем на А4988 регулируемый резистор?
4)почему сгорел первый контроллер?
Может дадите ссылочки, что почитать. Заранее признателен.
Badaboom
 
Сообщения: 3
Зарегистрирован: 05 янв 2015, 21:34

Re: Управление шаговым двигателем Arduino + A4988

Сообщение Myp » 05 янв 2015, 22:37

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

Re: Управление шаговым двигателем Arduino + A4988

Сообщение RootAdmin » 05 янв 2015, 22:47

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

Re: Управление шаговым двигателем Arduino + A4988

Сообщение Myp » 05 янв 2015, 22:52

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

Re: Управление шаговым двигателем Arduino + A4988

Сообщение Badaboom » 06 янв 2015, 03:13

С компа питание со старого снять что ли....
А куда Enable подключать? ни разу на схемах не видел.
Все, увидел. Он на пине висит. Пойду читать документацию и искать скетч.

Добавлено спустя 2 часа 3 минуты 12 секунд:
нашел блок питания 12В 30А. двигатели потребляют 1.53А каждый. Что будет если его использовать?)
Badaboom
 
Сообщения: 3
Зарегистрирован: 05 янв 2015, 21:34

Re: Управление шаговым двигателем Arduino + A4988

Сообщение RootAdmin » 06 янв 2015, 09:02

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

Re: Управление шаговым двигателем Arduino + A4988

Сообщение Ande » 06 янв 2015, 11:45

Использую такую же связку, все работает. ENABLE в воздухе. БП 12В, +5 с ардуины
IMG_20150106_113949.jpg
Аватара пользователя
Ande
 
Сообщения: 83
Зарегистрирован: 17 июл 2008, 14:21
Откуда: Тольятти
прог. языки: Delphi, Bascom

Re: Управление шаговым двигателем Arduino + A4988

Сообщение Badaboom » 06 янв 2015, 18:32

Большое спасибо. Попробую. А про ток - где-то читал что блоки питания не любят когда их подключают без минимальной нагрузки(в процентах от максимальной).

Добавлено спустя 1 час 43 минуты 20 секунд:
Запитал драйвер от 12 В .
Загрузил скетч:
Код: Выделить всёРазвернуть
int Motor1EN = 10;
int Motor1dir = 12;
int Motor1step = 9;
void setup ()
{
  pinMode(Motor1EN, OUTPUT);
  pinMode(Motor1dir, OUTPUT);
  pinMode(Motor1step, OUTPUT);
}
void loop ()
{   
digitalWrite(Motor1EN, HIGH);
if (Motor1dir) 
{
  digitalWrite(Motor1dir, HIGH);

else     

  digitalWrite(Motor1dir, LOW);
}
digitalWrite(Motor1step, LOW);
for (int i=0;i<1000; i++) 
{   
  delay(200);   
  digitalWrite(Motor1step, HIGH);   
  delay(200);   
  digitalWrite(Motor1step, LOW);
}
delay(200);   
digitalWrite(Motor1EN, LOW); 
}

^Enable подкючил.
блок питания откючается когда ардуино включается...
Код вроде правиьный?


^Повесил Enable в воздух.
вбил скетч:
Код: Выделить всёРазвернуть
int Motor1dir = 12;
int Motor1step = 9;
void setup ()
{
  pinMode(Motor1dir, OUTPUT);
  pinMode(Motor1step, OUTPUT);
}
void loop ()
{   
digitalWrite(Motor1dir, HIGH);
digitalWrite(Motor1step, LOW);
for (int i=0;i<1000; i++) 
{   
  delay(200);   
  digitalWrite(Motor1step, HIGH);   
  delay(200);   
  digitalWrite(Motor1step, LOW);
}
delay(200);   
 
}

бп делает писк и выключается.

Добавлено спустя 3 часа 4 минуты 37 секунд:
Все, купил новый бп. Все работает)
Badaboom
 
Сообщения: 3
Зарегистрирован: 05 янв 2015, 21:34

Re: Управление шаговым двигателем Arduino + A4988

Сообщение maxvalin » 08 фев 2016, 23:26

есть ли кто еще в теме?
Люди добрые подскажите пожалуйста, пытаюсь подружиться с arduino, взял самое простое:
Взял 2560 и рампс 1.4 с принтера. на оси X установил драйвер. Полного описания pinout по рампсу не нашел, судя по прошивке то пины соответсвуют // For RAMPS 1.4
#define X_STEP_PIN 54
#define X_DIR_PIN 55
#define X_ENABLE_PIN 38
#define X_MIN_PIN 3
#define X_MAX_PIN 2

концевики ладно, а вот что делать со step, dir, enable?
есть такой вот скетч (библиотеку уже портировал)
#include <AccelStepper.h>
AccelStepper Stepper1(1,13,12); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988)
int dir = 1; //используется для смены направления
void setup() {
Stepper1.setMaxSpeed(3000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
Stepper1.setAcceleration(13000); //устанавливаем ускорение (шагов/секунду^2)
}
void loop() {
if(Stepper1.distanceToGo()==0){ //проверка, отработал ли двигатель предыдущее движение
Stepper1.move(1600*dir); //устанавливает следующее перемещение на 1600 шагов (если dir равен -1 будет перемещаться -1600 -> противоположное направление)
dir = dir*(-1); //отрицательное значение dir, благодаря чему реализуется вращение в противоположном направлении
delay(1000); //задержка на 1 секунду
}
Stepper1.run(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя
}

вместо 12 и 13 назначаю свои 55 и 54, а что за режим "external driver"? и где enable подевался?
Извините если смешно со стороны но ... увяз в общим. (читаю параллельно документацию)

может блок питания тоже хандрит.. Хотя 3А и при включении никаких просадок, ровненько 12.1в.
эхо идет, когда прописывал. Гуглю, все на драйверах и "на соплях" собирают, рядом сканер цыклоп стоит- собрал так же без шилда на uno и с тем же БП и прекрасно работает. А тут все стандартно, уже все сбито и нифига не пашет. Не ужели никто не применяет рампс помимо принтеров! :o

Добавлено спустя 2 часа 28 минут 23 секунды:
проверил под марлин прошивкой, двигатель управляется 100% (под тем же БП). значит с пинами чет не то..

Добавлено спустя 2 часа 8 минут 6 секунд:
разобрался, при шилде используется high и low вот работающий кусок скеча:

int ledPin = 13; // LED connected to digital pin 13
int enx = 38;
int stepx = 54;
int dirx = 55;
int Z =1;

// The setup() method runs once, when the sketch starts

void setup() {
// initialize the digital pin as an output:
pinMode(ledPin, OUTPUT);
pinMode(enx, OUTPUT);
pinMode(stepx, OUTPUT);
pinMode(dirx, OUTPUT);
digitalWrite(enx, HIGH);
digitalWrite(stepx, LOW);
digitalWrite(dirx, LOW);

}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop()
{
digitalWrite(enx, LOW);
digitalWrite(dirx, HIGH);
digitalWrite(ledPin, HIGH); // set the LED on
for (int x = 0; x<800; x++){ //not sure how this line is effecting the entire system, x< any# does not change how long the motors step for me
digitalWrite(stepx, HIGH);
delay(1); //using this and the below delay to control speed, but only a few different combinations between 0-3 run smoothly so i could use help here
digitalWrite(stepx, LOW);
delay(1);
} //no matter what both motors are running in sync, not what i want
for (int b = 0; b<50; b++){

delay(0);
}
}

Добавлено спустя 1 минуту 1 секунду:
начинает нравится мне эта дуня :D
maxvalin
 
Сообщения: 132
Зарегистрирован: 03 апр 2015, 19:34
Откуда: маленькая страна в центре Европы, (в КВН-е)
прог. языки: с


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

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

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