Запуск двух двигателей NEMA 17, один за другим, с использованием Arduino Uno.

Я новичок в Arduino. Я пытаюсь запустить два шаговых двигателя NEMA 17 через соответствующие драйвер A4988 и управление через Arduino Uno.

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

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

int x, y; // шаговый двигатель 'x' и шаговый двигатель 'y'
#define BAUD (9600)


void setup() 
{
  Serial.begin(BAUD);
  pinMode(6,OUTPUT); // Включить для х
  pinMode(5,OUTPUT); // Шаг для х
  pinMode(4,OUTPUT); // Каталог для x
  digitalWrite(6,LOW); // Установить низкий уровень разрешения для x

  pinMode(9,OUTPUT); // Включить для y
  pinMode(8,OUTPUT); // Шаг для y
  pinMode(7,OUTPUT); // Каталог для y
  digitalWrite(9,LOW); // Установите низкий уровень разрешения для y
}

void loop() 
{

  digitalWrite(9,LOW); // Установите низкий уровень разрешения для y



  for(y = 0; y < 20; y++)
  {
     digitalWrite(6,LOW); // Установить низкий уровень разрешения для x
     digitalWrite(4,HIGH); // Установить Dir на высокий уровень для x - по часовой стрелке

     Serial.println("CLOCKWISE HORIZONTAL SCANNING IN PROGRESS");

     for(x = 0; x < 50; x++) // Цикл 50 раз
     {
      digitalWrite(5,HIGH); // Вывод максимума для x
      delay(10); // Ждать
      digitalWrite(5,LOW); // Выводим низкий уровень для x
      delay(100); // Ждать
     }

    digitalWrite(6,LOW); // Установить низкий уровень разрешения для x
    digitalWrite(4,LOW); // Установить Dir на низкий уровень для x - против часовой стрелки

    Serial.println("ANTICLOCKWISE HORIZONTAL SCANNING IN PROGRESS");

    for(x = 0; x < 50; x++) // Цикл 50 раз
    {
      digitalWrite(5,HIGH); // Высокий уровень вывода
      delay(10); // Ждать
      digitalWrite(5,LOW); // Низкий уровень вывода
      delay(100); // Ждать
    }

    Serial.println("ONE STEP CLIMB ON VERTCAL AXIS");

    digitalWrite(7,HIGH); // Устанавливаем Dir высоким для y

    digitalWrite(8,HIGH); // Выводим высокий уровень для y
    delay(100); // Ждать
    digitalWrite(8,LOW); // Выводим низкий уровень для y
    delay(100); // Ждать
  }

  digitalWrite(9,LOW); // Установите низкий уровень разрешения для y
  digitalWrite(7,LOW); // Установить Dir на низкий уровень для y

  Serial.println("RESETTING ON VERTCAL AXIS");

  for(y = 0; y < 20; y++) // Цикл 20 раз
    {
      digitalWrite(8,HIGH); // Выводим высокий уровень для y
      delay(10); // Ждать
      digitalWrite(8,LOW); // Выводим низкий уровень для y
      delay(100); // Ждать
    }

}

Нужно ли мне следить за предоставленной задержкой??

, 👍1

Обсуждение

Глупый вопрос, но вы ожидаете, что моторы будут двигаться одновременно?, @Code Gorilla

Прежде всего, я нахожу странным, что вы указываете скорость передачи в качестве макроса, а контакты - в качестве констант. Я настоятельно рекомендую объявлять имена контактов как константы (например, const byte X_EN = 6;), чтобы вы могли легко переопределить их и не забыть. Тогда вы уверены, что второй мотор не двигается? Может быть, шаговый двигатель делает 200 шагов/оборот, и за один оборот вы перемещаетесь на 1 мм, поэтому полные 20 шагов составляют 0,1 мм, и вы этого не видите... Можете ли вы попробовать поменять местами двигатели X и Y?, @frarugi87

@ code gorilla - Нет, оба двигателя не будут работать одновременно. X мотор - 50 шагов вправо, затем 50 шагов влево. Тогда двигатель Y переместится на один шаг вверх. Снова двигатель X перемещается на 50 шагов вправо, а затем на 50 шагов влево. Затем снова двигатель Y переместится на один шаг вверх. Этот цикл продолжается в течение 20 шагов двигателя Y. В конце 20-го мотор Y перемещается на 20 шагов вниз. цикл продолжается., @anshul_p

@frarugi - Да второй мотор вообще не работает. Я также попытался поменять местами оба двигателя. Но никакого результата. Я хочу поделиться одной вещью: я использую драйверы A4988 и HR4988. Это какие-то проблемы?? Потому что, когда они используются вместе, двигатель, подключенный к A4988, не работает, а двигатель, подключенный к HR4988, работает. Когда я поменял местами драйвера, ни один из двух двигателей не работает., @anshul_p


1 ответ


1

Незначительная проблема, которая, вероятно, не повлияет на ваш результат, заключается в том, что

Serial.println("ONE STEP CLIMB ON VERTCAL AXIS");
--> digitalWrite(9,LOW);  // Эта строка требует добавления
digitalWrite(7,HIGH); // Устанавливаем Dir высоким для y

Я не вижу в коде ничего, что мешало бы запуску моторов. Хорошо, чтобы начать движение, потребуется ~13 секунд, но оно должно двигаться.

Итак, без какого-либо оборудования, прикрепленного к шпинделям двигателя, можно ли переключить двигатели, чтобы проверить, не обрыва ли проводки? Когда один двигатель работает, а другой нет, это означает, что либо двигатель сломан, либо проводка сломана, либо цепь драйвера нарушена. Если неисправность перемещается, то это неисправность двигателя/проводки, если она не меняется, то это неисправность драйвера.

,

это в начале, и это никогда не модифицируется..., @frarugi87

@ frarugi87 - Да, и то же самое для оси X, но это также установлено в цикле. Это просто мое естественное недоверие инженера-программиста к оборудованию, которое говорит, что это может быть так, потому что вы никогда не знаете, что пикси делают на этой синей плате. :), @Code Gorilla