пятница, 1 мая 2015 г.

Простое управление шаговым двигателем с компьютера через ардуино.

Используя плату ардуино (можно заказать по этой ссылке http://ali.pub/1v22bh) можно создать устройство для связи драйвера шагового двигателя с компьютером через USB порт. Причём это устройство в сборке будет достаточно простое для того чтобы его смог собрать любой не только радиолюбитель но и даже любой умеющий работать руками человек (при наличии готового драйвера и источника питания).

Если используется Arduino UNO R3 то его можно подключить к компьютеру через переходник для подключения принтера. Если в этом Arduino используется микросхема CH340G то на компьютер необходимо установить драйвер для этой микросхемы. После подключения ардуино надо зайти в диспетчер устройств (в windows7 - правой кнопкой мыши по компьютер(мой компьютер) - свойства - диспетчер устройств) потом кликнуть по появившемуся неизвестному устройству, выбрать - установить драйвер, выбрать ранее скачанный драйвер и установить. Среду Arduino IDE для закачивания в Arduino скетчей и взаимодействия с Arduino можно бесплатно скачать из интернета. После установки драйвера (если это было необходимо т.к. для большинства Arduino драйвер скачивается вместе со средой Arduino IDE) среду необходимо настроить для этого во вкладке инструменты-порт выбирается порт который появился после подключения ардуино, установки драйвера в диспетчере устройств а также во вкладке инструменты-плата выбрать название используемого ардуино (например если используется ардуино уно то выбирается Arduino Uno). После настройки можно писать скетчи и загружать их нажатием кнопки "Вгрузить" (если среда на русском) если в коде есть ошибка то среда сообщит об этом в нижнем поле. Если на компьютере установлен антивирус Avast то, перед загрузкой скетча, его необходимо отключить на некоторое время (в windows7 -правой кнопкой мыши на значке avast-управление экранами avast!-отключить на 10 минут-в появившемся окне нажать "да"). Если всё таки аваст добрался до ардуино в момент загрузки и удалил файл objcopy то его надо будет достать и снова поставить на то место откуда он исчез, среда об этом напомнит при следующей попытке загрузки. Скетчи пишуться на языке C++ (или C или С подобном языке) и обычно состоят из двух функций "setup" (для кода который выполняется в начале один раз где обычно происходит инициализация портов и всего прочего), "loop" (что то вроде основного цикла (или основной цикл и есть) который повторяется постоянно после выполнения функции "setup"), инициализации переменных и возможно заголовочных файлов.
Рассмотрим один из возможных скетчей для управления шаговым двигателем с компьютера:

int d = 8;
int c = 9;
int b = 10;
int a = 11;
int delay_for_speed = 1000;
int message_for_motor = 0;
int condition_rotate = 0;
void setup()
{
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
Serial.begin(9600);
}
void loop()
{
  if (Serial.available() > 0) 
  {
    message_for_motor = Serial.read();
    Serial.println(message_for_motor);

      if(message_for_motor == 'l')
      {
        condition_rotate = 1;
      }
      else if(message_for_motor == 'r')
      {
        condition_rotate = 2;
      }
      else if(message_for_motor == 's')
      {
         condition_rotate = 0;
      }
      else if(message_for_motor == '1')
      {
        delay_for_speed=1000;
      }
      else if(message_for_motor == '2')
      {
        delay_for_speed=800;
      }
      else if(message_for_motor == '3')
      {
        delay_for_speed=400;
      }
      else if(message_for_motor == '4')
      {
        delay_for_speed=200;
      }
      else if(message_for_motor == '5')
      {
        delay_for_speed=100;
      }
      else if(message_for_motor == '6')
      {
        delay_for_speed=50;
      }
      else if(message_for_motor == '7')
      {
        delay_for_speed=20;
      }
      else if(message_for_motor == '8')
      {
        delay_for_speed=10;
      }
      else if(message_for_motor == '9')
      {
        delay_for_speed=5;
      }
  }
  
  if(condition_rotate == 0)
  {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    delay(delay_for_speed);
  }
  else if(condition_rotate == 1)
  {
    digitalWrite(a, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(a, LOW);
      delay(delay_for_speed);
    
    digitalWrite(c, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(c, LOW);
      delay(delay_for_speed);
    
    digitalWrite(b, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(b, LOW);
      delay(delay_for_speed);
    
    digitalWrite(d, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(d, LOW);
      delay(delay_for_speed);
  }
  else if(condition_rotate == 2)
  {
    digitalWrite(d, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(d, LOW);
      delay(delay_for_speed);
    
    digitalWrite(b, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(b, LOW);
      delay(delay_for_speed);
    
    digitalWrite(c, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(c, LOW);
      delay(delay_for_speed);
    
    digitalWrite(a, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(a, LOW);
      delay(delay_for_speed);
  }
}

Первые 7 строчек это инициализации переменных. Переменные a,b,c,d -это переменные соответствующие пинам 11,10,9,8 (соответственно). С этими пинами соединяются входы драйвера шагового двигателя выходы соединяются с обмотками шагового двигателя. Обмотки должны быть соединены правильно иначе ротор двигателя не будет крутиться. Пин 11 д.б. через драйвер управлять (подавать либо не нулевое напряжение либо нулевое) первым выводом первой обмотки, пин10 управлять вторым выводом первой обмотки, пин9 - первым выводом второй обмотки, пин8 - вторым выводом второй обмотки. Далее в коде следует функция "setup" в которой данные пины конфигурируются как выходы и устанавливается скорость приемопередатчика. Потом следует функция "loop" в которой при приёме символа 
if (Serial.available() > 0) 

выполняется запись этого символа

 message_for_motor = Serial.read();

 и далее в зависимости от того какой это символ либо устанавливается состояния вращения

       if(message_for_motor == 'l')//принят символ l (эл)
      {
        condition_rotate = 1; //остановка
      }
      else if(message_for_motor == 'r') 
      {
        condition_rotate = 2; //вращение в одну сторону
      }
      else if(message_for_motor == 's')
      {
         condition_rotate = 0;  //вращение в другую сторону
      }

либо устанавливается задержка соответствующая какой либо скорости вращения ротора:

      else if(message_for_motor == '1')
      {
        delay_for_speed=1000;
      }
      else if(message_for_motor == '2')
      {
        delay_for_speed=800;
      }
      else if(message_for_motor == '3')
      {
        delay_for_speed=400;
      }
      else if(message_for_motor == '4')
      {
        delay_for_speed=200;
      }
      else if(message_for_motor == '5')
      {
        delay_for_speed=100;
      }
      else if(message_for_motor == '6')
      {
        delay_for_speed=50;
      }
      else if(message_for_motor == '7')
      {
        delay_for_speed=20;
      }
      else if(message_for_motor == '8')
      {
        delay_for_speed=10;
      }
      else if(message_for_motor == '9')
      {
        delay_for_speed=5;
      }

После чего, в зависимости от состояния вращения в переменной condition_rotate , выполняется либо остановка либо вращение в одну сторону либо в другую

if(condition_rotate == 0) //остановка
  {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    delay(delay_for_speed);
  }
  else if(condition_rotate == 1) //вращение в одну сторону
  {
    digitalWrite(a, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(a, LOW);
      delay(delay_for_speed);
    
    digitalWrite(c, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(c, LOW);
      delay(delay_for_speed);
    
    digitalWrite(b, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(b, LOW);
      delay(delay_for_speed);
    
    digitalWrite(d, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(d, LOW);
      delay(delay_for_speed);
  }
  else if(condition_rotate == 2) //вращение в другую сторону
  {
    digitalWrite(d, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(d, LOW);
      delay(delay_for_speed);
    
    digitalWrite(b, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(b, LOW);
      delay(delay_for_speed);
    
    digitalWrite(c, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(c, LOW);
      delay(delay_for_speed);
    
    digitalWrite(a, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(a, LOW);
      delay(delay_for_speed);
  }

Для того чтобы отослать сообщение на ардуино можно, в среде, войти по вкладке Инструменты-Монитор последовательного порта и в появившемся окне в верхнем текстовом поле вписывать символы и отсылать нажатием кнопки "отправить" символ придёт на ардуино и для данного случая если отослать символ l то ротор будет вращаться в одну сторону, если символ r то в другую, если цифру от 1 до 9 то будет изменена скорость вращения. Код можно изменять как угодно на своё усмотрение для конкретных задач управления двигателем, можно даже написать свою программу для отсылания символов в ардуино с компьютера. Но при этом важно помнить что для некоторых драйверов (например таких) необходимо правильное управление иначе они выходят из строя и при этом могут вывести что нибудь ещё например источник, поэтому очень важно позаботиться о правильном управлении и правильном подключении двигателя к драйверу и драйвера к ардуино.


КАРТА БЛОГА (содержание)

8 комментариев:

  1. Скетч скорее всего работает не проверял, но ты объявлешь переменную типа int (int message_for_motor = 0;) а проверку ведешь как у строки if(message_for_motor == 's') и тд.

    ОтветитьУдалить
    Ответы
    1. Извините ошибся, но компилятор ошибок не выдаёт и всё работает (см. видео выше).

      Удалить
    2. Здравствуйте! Подскажите, пожалуйста, как увеличить скорость (9-той не хватает) вращения двигателя в этой программе.

      Удалить
    3. В этой программе самое простое что можно сделать это поставить delay_for_speed=1; вместо delay_for_speed=5;
      после строки
      else if(message_for_motor == '9')
      и скобочики {

      если всё равно не хватит то можно изменять способ управления с полношагового например на полушаговый
      после строки
      if(condition_rotate == 1)
      и скобочки{

      и после строки
      if(condition_rotate == 2)
      и скобочки{

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

      Можно также вместо функции delay() использовать функцию delayMicroseconds() тогда все скорости увеличатся в 1000 раз, соответственно delay_for_speed для каждого случая надо будет увеличить до приемлемого уровня.

      Удалить
  2. А подскажите как изменить скетч что бы при включении кнопки которая подключена к пин 3 двигатель начинал вращаться.ардуино амега + рампс 1.4 + dvr8825 который как и двигатель подключенны на ось х

    ОтветитьУдалить
    Ответы
    1. Если надо изменить скетчь на данной странице (который не работает с рампс и dvr8825) то надо просто например вместо if(message_for_motor == 'l') поставить if(digitalRead(3) == LOW) если кнопка подтягивает вывод к земле, перед этим третий пин естественно надо сконфигурировать как вход pinMode(3, INPUT); и "подтянуть" резистором вывод к плюсу питания.

      Удалить
  3. А можно привязать энкодер?

    ОтветитьУдалить
    Ответы
    1. Можно но под него придётся переделывать скетчь.

      Удалить