roboforum.ru

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

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

Управление шаговым двигателем 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)почему сгорел первый контроллер?
Может дадите ссылочки, что почитать. Заранее признателен.

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

Myp » 05 янв 2015, 22:37

зачем нужен резистор написано в документации
ищи где накосячил с подключением, раз микра завоняла значит что-то замкнул и она сгорела, хотя она с встроенной защитой.

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

RootAdmin » 05 янв 2015, 22:47

Во-первых 6 вольт для драйвера маловато. Надо хоть 12. Во-вторых очень легко горят при отключении обмотки двигателя под питанием. В третьих - вывод Enable подключать надо.

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

Myp » 05 янв 2015, 22:52

а, не заметил фразу про питание шанговика от батареек
нужен нормаольный блок питания минимум 12 вольт.

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

Badaboom » 06 янв 2015, 03:13

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

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

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

RootAdmin » 06 янв 2015, 09:02

Работать будет.
Регулярно вижу непонимание такого типа. На БП указан максимальный ток как правило. Нельзя его превышать.

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

Ande » 06 янв 2015, 11:45

Использую такую же связку, все работает. ENABLE в воздухе. БП 12В, +5 с ардуины
IMG_20150106_113949.jpg

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 секунд:
Все, купил новый бп. Все работает)

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


Rambler\'s Top100 Mail.ru counter