Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Управление DC-мотором при помощи Arduino и драйвера моторов

Материал из Онлайн справочника
Перейти к: навигация, поиск

Проверка/Оформление/Редактирование: Мякишев Е.А.


Управление DC-мотором при помощи Arduino и драйвера моторов

Данный пример демонстрирует управление DC-мотором с помощью Arduino и драйвера моторов L293D(SN754410 или любого совместимого).

Код примера демонстрирует управление направлением вращения и скоростью мотора с помощью драйвера моторов L293D(SN754410 или любого совместимого). Скорость и направление вращения двигателя зависит от положения движка потенциометра. При считываемых значениях с потенциометра в диапазоне 462-562 вызывается функция break() для остановки двигателя, в диапазоне 562-1023 вызывается функция forward() для движения вперед, в диапазоне 0-462 вызывается функция reverse() для движения в обратном направлении. С помощью подачи ШИМ сигнала на вход 1,2EN(1) микросхемы драйвера моторов мы можем регулировать скорость вращения двигателя.

Необходимое оборудование

  • Плата Arduino
    ArduinoUno R3 Front.jpg
    Здесь можно купить Arduino Uno:AliExpress
  • Провода перемычки
  • Потенциометр
  • Макетная плата
  • DC-мотор
  • Драйвер двигателя L293D или SN754410 или любой совместимый
  • Дополнительный источник питания(например крона )

Цепь

Соберите схему согласно изображению.

Arduino uno motor l293D bb.png


Arduino uno motor SN754410 bb.png

Схематичное изображение принципа работы драйвера моторов:

H bridge.svg

Таблица состояний входов и выходов драйвера моторов L293D(SN754410)

Вход Выход
A EN Y
H H H
L H L
X L Z
Pinout l293d.png

Назначение контактов драйвера моторов L293D(SN754410):

  • GND(4, 5, 12, 13) - выводы для подключения к земле;
  • Vcc2(8) - вывод для подключения напряжения питания нагрузки;
  • Vcc1(16) - вывод для подключения питания микросхемы драйвера моторов;
  • 1Y и 2Y(3, 6) - вывод для подключения первого двигателя;
  • 1A и 2A(2, 7) - выводы для управления первым двигателем;
  • 1,2EN(1) - вывод для включения и отключения первого двигателя;
  • 3Y и 4Y(11, 14) - вывод для подключения второго двигателя;
  • 3A и 4A(10, 15) - выводы для управления первым двигателем;
  • 3,4EN(9) - вывод для включения и отключения второго двигателя;

Код

  1. #define EN  9                                            //9-ый цифровой вход Arduino подключен к входу включения двигателя EN драйвера моторов
  2. #define MC1 3                                            //управляющий вход 1 драйвера моторов подключен к 3-му контакту Arduino
  3. #define MC2 2                                            //управляющий вход 2 драйвера моторов подключен к 2-му контакту Arduino
  4. #define POT 0                                            //подключение потенциометра к 0-му аналоговому входу
  5.  
  6. int val = 0;                                             //хранение данных, считываемых с потенциометра
  7. int velocity = 0;                                        //хранение данных скорости мотора
  8.  
  9. void setup()
  10. {
  11.     pinMode(EN, OUTPUT);                                 //вход 9 устанавливаем как выход
  12.     pinMode(MC1, OUTPUT);                                //вход 3 устанавливаем как выход
  13.     pinMode(MC2, OUTPUT);                                //вход 2 устанавливаем как выход
  14.     brake();                                             //останавливаем двигатель
  15. }
  16.  
  17. void loop()
  18. {
  19.     val = analogRead(POT);                              //считываем значение с потенциометра
  20.  
  21.     if (val > 562)                                      //если значение больше 562 двигаемся вперед
  22.     {
  23.         velocity = map(val, 563, 1023, 0, 255);         //преобразуем интервал значений
  24.         forward(velocity);                              //движемся со скоростью пропорциональной переданному значению функции
  25.     }
  26.  
  27.     else if (val < 462)                                 //если значение меньше 462 двигаемся назад
  28.     {
  29.         velocity = map(val, 461, 0, 0, 255);            //преобразуем интервал значений и инвестируем его
  30.         reverse(velocity);                              //движемся со скоростью пропорциональной переданному значению функции
  31.     }
  32.  
  33.     else                                                //если значение в диапазоне между 462 и 562
  34.     {
  35.         brake();                                        //останавливаем двигатель
  36.     }
  37. }
  38.  
  39. /*
  40. *Движение двигателя вперед с заданной скоростью
  41. *Диапазон значений:0-255
  42. */
  43. void forward (int rate)                                
  44. {
  45.     digitalWrite(EN, LOW);                        //на вход EN драйвера моторов подаем низкий уровень сигнала
  46.     digitalWrite(MC1, HIGH);                      //на управляющий вход 1 драйвера моторов подаем высокий уровень сигнала
  47.     digitalWrite(MC2, LOW);                       //на управляющий вход 2 драйвера моторов подаем низкий уровень сигнала
  48.     analogWrite(EN, rate);                        //на вход EN драйвера моторов подаем ШИМ сигнал
  49. }
  50.  
  51. /*
  52. *Движение двигателя назад с заданной скоростью
  53. *Диапазон значений:0-255
  54. */
  55. void reverse (int rate)
  56. {
  57.     digitalWrite(EN, LOW);                       //на вход EN драйвера моторов подаем низкий уровень сигнала
  58.     digitalWrite(MC1, LOW);                      //на управляющий вход 1 драйвера моторов подаем низкий уровень сигнала
  59.     digitalWrite(MC2, HIGH);                     //на управляющий вход 2 драйвера моторов подаем высокий уровень сигнала
  60.     analogWrite(EN, rate);                       //на вход EN драйвера моторов подаем ШИМ сигнал
  61. }
  62.  
  63. /*
  64. *Остановка двигателя
  65. */
  66. void brake ()
  67. {
  68.     digitalWrite(EN, LOW);                       //на вход EN драйвера моторов подаем низкий уровень сигнала
  69.     digitalWrite(MC1, LOW);                      //на управляющий вход 1 драйвера моторов подаем низкий уровень сигнала
  70.     digitalWrite(MC2, LOW);                      //на управляющий вход 2 драйвера моторов подаем низкий уровень сигнала
  71.     digitalWrite(EN, HIGH);                      //на вход EN драйвера моторов подаем высокий уровень сигнала
  72. }

См.также

Внешние ссылки