. Практическое программирование Arduino/CraftDuino — драйвер двигателей L293D
Практическое программирование Arduino/CraftDuino — драйвер двигателей L293D

Практическое программирование Arduino/CraftDuino — драйвер двигателей L293D

Для этого воспользуемся самым популярным драйвером, используемым для управления моторчиками – микросхемой L293D.

L293D содержит два драйвера для управления электродвигателями небольшой мощности. Имеет две пары входов для управляющих сигналов и две пары выходов для подключения электромоторов. Кроме того, у L293D есть два входа для включения каждого из драйверов. Эти входы используются для управления скоростью вращения электромоторов с помощью ШИМ (PWM).

Рассмотрим блок-схему L293D, приведённую в datasheet-е (нумерация для SO-корпуса):

К выходам OUTPUT1 и OUTPUT2 подключается электромотор MOTOR1 (для микросхемы в DIP-корпусе – ножки 3 и 6). Соответственно MOTOR2 подключается к выходам OUTPUT3 и OUTPUT4 (ножки 11 и 14).

Сигналы, подаваемые на ENABLE1(2) управляют соответствующим драйвером (ножки 1 и 9 соответственно).

Подавая на вход ENABLE1 сигнал HIGH ( или просто соединив с плюсом источника питания +5V) – включаем драйвер 1-го моторчика. Если при этом на входы INPUT1 и INPUT2 сигналы не подавать, то моторчик вращаться не будет. Подавая HIGH на INPUT1 и LOW на INPUT2 мы заставим моторчик вращаться. А если теперь поменять сигналы местами и подавать на INPUT1 сигнал LOW, а на INPUT2 сигнал HIGH – мы заставим моторчик вращаться в другую сторону.

Аналогично для второго драйвера.

Выход Vss (ножка 16) отвечает за питание самой микросхемы, а выход Vs (ножка 8) отвечает за питание моторчиков – это обеспечивает разделение электропитания для микросхемы и для управляемых ею двигателей, что позволяет подключить электродвигатели с напряжением питания отличным от напряжения питания микросхемы. Разделение электропитания микросхем и электродвигателей также необходимо для уменьшения помех, вызванных бросками напряжения, связанными с работой моторов.

Четыре контакта GND (ножки 4, 5, 12,13) нужно соединить с землёй. Так же эти контакты обеспечивают теплоотвод от микросхемы.

Характеристики L293D

Если использовать микросхему L293E, то допустимый ток нагрузки на каждый канал уже будет 1А (а пиковый ток – 2А), но придётся использовать внешние защитные диоды, которые у L293D встроены в саму микросхему.

Попробуем смоделировать как Arduino справляется с управлением моторчиками 🙂

Запускаем Proteus и открываем проект с Arduino 🙂 Добавим на схему наш драйвер – L293D

Соединим выводы Vss и Vs с положительным полюсом батареи, выводы GND соединим с землёй, а к выводам 3,6 и 11,14 подсоединим моторчики – соответственно MOTOR1 и MOTOR2.

В реальной схеме — параллельно к моторчику нужно припаять конденсатор – он помогает справиться с наводками от работающего электродвигателя ( это распространённая практика — разберите любую игрушку с моторчиком и увидите, что прямо к моторчику припаян керамический конденсатор номиналом где-то в 0,1 мкф )

А как же соединить входы драйверов? Для начала, посмотрим – как вообще это работает на практике 🙂 Загрузим в МК скетч Blink или Blink_HL, а далее, как показано на рисунке, соединим INPUT1 и ENABLE1 с digital pin 13, к которому подключен светодиод, а INPUT2 соединим с землёй. Запустим симуляцию и увидим, что моторчик одну секунду вращается в одну сторону, а потом останавливается на секунду. Т.е. получили моторчиковый Blink 🙂

Итак, получается, что для управления одним моторчиком требуется три порта(один из них — PWM). Если скоростью вращения моторчика управлять не требуется, то можно сэкономить на PWM-портах (ENABLE1 и ENABLE2). Тогда, для управления одним моторчиком нужно будет задействовать два порта.

Итак, определимся с портами (в скобках – соответствующий номер ножки МК из pin mapping ):

Изменим наш проект в Proteus-е:

А теперь напишем скетч.

Для удобства – будем хранить номера портов не в обычных переменных типа int, а объединим их структурой:

однако, если просто объявить такую структуру в коде скетча, например так:

То при попытке скомпилировать — получим ошибку:

error: variable or field ‘set_m_pins’ declared void In function ‘void setup()’: — дело в том, что дополнительные структуры данных должны объявляться в заголовочных (.h) файлах. Т.е. нужно создать библиотечный файл и подключиться его к скетчу директивой #include

Однако, тут компилятору не нравится именно обращение к новому типу данных по указателю.

Три секунды оба моторчика вращаются вперёд, затем пол-секунды второй моторчик вращается назад, а потом снова вперёд.

Перенесём структуру и функции в нашу библиотеку RoboCraft.

А скетч тогда будет таким:

Функции вращения принимают два параметра – номер моторчика(1-2) и скорость вращения (0-255). Если номер отличается от 1-2, то вращение задаётся сразу обоим моторчикам.

У меня под рукой оказалась микросхема L293E – поэтому необходимо использовать защитные диоды (1N4007), которых для двух моторчиков нужно аж 8 штук 🙂

Так же у L293E не 16, а целых 20 ножек:

Впрочем, для тестирования можно собрать схему только для одного моторчика 😉

Соответственно нужно внести изменения в скетч:

— крутим наш моторчик 3 секунды вперёд, а затем одну секунду назад.

📎📎📎📎📎📎📎📎📎📎