2.1. Драйвер двигателя.md


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

Типы двигателей

Давайте кратко познакомимся с самыми популярными типами двигателей:

  • Коллекторные двигатели постоянного тока (DC-моторы). Это самый простой, распространённый и доступный тип двигателей. Они начинают вращаться сразу после подачи напряжения и меняют направление вращения при смене полярности. Скорость их вращения напрямую зависит от величины напряжения. Именно такие двигатели используются в большинстве игрушек, бытовых приборах и, конечно, в нашем роботе.

  • Бесколлекторные двигатели (BLDC). Более сложные, мощные и надёжные двигатели. У них нет трущихся щёток (коллектора), что делает их почти вечными. Они требуют сложного электронного управления (специального контроллера), который поочерёдно подаёт напряжение на обмотки. Вы можете встретить их в квадрокоптерах, мощных радиоуправляемых моделях и в компьютерных вентиляторах.

  • Шаговые двигатели. Это двигатели для точного позиционирования. Они вращаются не непрерывно, а дискретными «шагами». Подавая импульсы на разные обмотки, можно повернуть вал двигателя на строго заданный угол (например, 1.8 градуса за шаг). Они незаменимы там, где важна точность, а не скорость — в 3D-принтерах, станках с ЧПУ и сканерах.

Редуктор

В наборе AQROBO.PRO используются популярные коллекторные двигатели типа «TT». Но это не просто моторы, а мотор-редукторы.

Редуктор - это система шестерёнок, которая изменяет характеристики вращения вала двигателя.

Маленькие моторчики внутри корпуса вращаются очень быстро (тысячи оборотов в минуту), но с очень маленькой силой (крутящим моментом). Такое вращение бесполезно для робота — он не сможет сдвинуться с места. Редуктор решает эту проблему:

  • Он понижает скорость вращения.
  • Взамен он увеличивает крутящий момент (силу).

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

Принцип управления

Для управления бесколлекторными и шаговыми двигателями требуются сложные контроллеры, которые поочерёдно подают напряжение на разные обмотки. С нашими, коллекторными двигателями, всё гораздо проще, чтобы изменить направление вращения, нужно всего лишь поменять полярность питания.

Тут у вас может возникнуть логичный вопрос: «А почему бы не подключить мотор напрямую к двум GPIO пинам Рудирона? Ведь мы можем программно установить один пин в HIGH, а другой в LOW для вращения в одну сторону, и наоборот — для вращения в другую».

Идея абсолютно верная, но на практике она категорически недопустима.

Пины микроконтроллера являются слаботочными. Они могут выдать лишь очень маленький ток (несколько миллиампер), в то время как двигатель, особенно в момент старта, потребляет ток в десятки, а то и в сотни раз больший. Попытка запитать мотор напрямую от GPIO приведёт к необратимому повреждению микроконтроллера. Пин просто сгорит.

Именно поэтому для управления двигателями всегда используют внешних «силачей». Самая популярная схема для этой задачи называется H-мост. Своё название она получила за внешнее сходство с буквой «H». В её основе лежат четыре мощных транзистора, которые работают как электронные ключи, управляемые слабыми сигналами от Рудирона.

Принцип работы очень прост:

  • Движение вперёд. Рудирон открывает транзисторы Q1 и Q4. Ток течёт от «+» через Q1, двигатель, Q4 и уходит на «-» (GND). Мотор вращается в одну сторону.
  • Движение назад. Рудирон закрывает Q1 и Q4, но открывает Q2 и Q3. Теперь ток течёт через Q3, двигатель (уже в обратном направлении!), Q2 и уходит на «-». Мотор вращается в другую сторону.

Таким образом, управляя всего четырьмя ключами, мы можем заставить мотор вращаться в любую сторону. А если на эти ключи подавать не постоянный сигнал, а ШИМ, мы сможем ещё и плавно регулировать скорость!

Драйвер двигателя

Собирать H-мост из четырёх отдельных транзисторов каждый раз неудобно. Поэтому производители упаковывают всю эту схему, а иногда и две, в одну компактную микросхему, которую и называют драйвером двигателя.

В нашем наборе AQROBO.PRO используется два модуля на базе микросхемы L9110S.

Характеристика L9110S Значение
Рабочее напряжение 2.5 – 12 В
Количество каналов 2 (может управлять двумя моторами)
Максимальный ток на канал 800 мА
Пиковый ток до 1.5 – 2 А

Каждый модуль L9110S имеет два независимых H-моста и может управлять двумя небольшими моторами. Но так как наши моторы с редукторами довольно мощные, мы будем использовать один драйвер на один мотор.

Управление драйвером L9110S очень простое:

  • На него подаётся питание для логики (от Рудирона) и отдельное силовое питание для моторов (от аккумуляторов).
  • Для каждого мотора есть два управляющих входа. Подавая на них HIGH и LOW в разной комбинации, мы задаём направление вращения.
  • Подавая на один из этих входов ШИМ-сигнал, мы регулируем скорость.

КРИТИЧЕСКИ ВАЖНОЕ ПРЕДУПРЕЖДЕНИЕ! Драйвер L9110S имеет ограничение по току. Коллекторный двигатель потребляет максимальный ток в момент старта или когда его вал заблокирован (т.е. ток короткого замыкания). Если вы будете удерживать колесо робота рукой, не давая ему вращаться, или если колёса будут сильно прижаты к корпусу и не смогут свободно крутиться, ток, потребляемый двигателем, резко возрастёт! Это может привести к перегреву и необратимому выходу драйвера из строя. Драйвер сгорит! Всегда следите, чтобы колёса робота могли вращаться свободно.

Питание робота

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

Одновременно с этим то же самое напряжение от аккумуляторов мы подадим на вход VIN платы Рудирон (или на разъём Jack). Встроенный на плате стабилизатор-преобразователь понизит это напряжение до 5В, необходимых для работы самого микроконтроллера и другой логики.

Ключевой момент. В автономном режиме вся система (и «мозги», и «мышцы») питается от одного источника. Во время отладки, когда Рудирон подключён к компьютеру по USB, удобно питать микроконтроллер от USB, а силовую часть — от аккумуляторов. Но в обоих случаях обязательно нужно соединять «земли» (GND) Рудирона и силовой части (драйверов), чтобы у всей схемы был общий опорный уровень напряжения.

Подключение

У модуля драйвера есть несколько выводов:

  • VCC - питание для логической части микросхемы (подключается к 5V Рудирона).
  • GND - общая земля.
  • A-IA и A-IB - управляющие входы для первого мотора.
  • B-IA и B-IB - управляющие входы для второго мотора.
  • Клеммники - выходы для подключения моторов.

Для управления одним мотором нам понадобятся два GPIO пина Рудирона. Логика управления очень проста:

  • Один пин (dir) задаёт направление вращения.
  • На второй пин (speed) подаётся ШИМ-сигнал для регулировки скорости.

Давайте соберём тестовый стенд для одного мотора.

Программа

Для управления одним мотором через драйвер L9110S нам понадобится два GPIO пина Рудирона. Один пин будет задавать направление вращения, а на второй мы будем подавать ШИМ-сигнал для регулировки скорости.

Логика управления драйвером L9110S очень проста и показана в таблице:

Вход dirPin Вход speedPin (ШИМ) Результат
0 0 - 255 Вращение вперёд со скоростью, заданной ШИМ
1 255 - 0 Вращение назад со скоростью, заданной ШИМ
0 0 Остановка
1 0 Остановка

Давайте напишем простую программу, которая продемонстрирует эту логику в действии.

Пример кода (плавное вращение вперёд и назад):

// Пины, к которым подключены управляющие входы драйвера
const int dirPin = 13;   // Пин для направления (A-IA)
const int speedPin = 12; // Пин для скорости (A-IB), должен поддерживать ШИМ

void setup() {
  pinMode(dirPin, OUTPUT);
  pinMode(speedPin, OUTPUT);
}

void loop() {
  // --- Вращение вперёд с нарастающей скоростью ---
  digitalWrite(dirPin, LOW); // Задаём направление "вперёд"
  
  // Плавно увеличиваем ШИМ на speedPin от 0 до 255
  for (int speed = 0; speed <= 255; speed++) {
    analogWrite(speedPin, speed);
    delay(10);
  }
  
  // Останавливаемся на секунду
  analogWrite(speedPin, 0);
  delay(1000);

  // --- Вращение назад с нарастающей скоростью ---
  digitalWrite(dirPin, HIGH); // Задаём направление "назад"

  // Плавно увеличиваем ШИМ на speedPin от 0 до 255
  for (int speed = 0; speed <= 255; speed++) {
    analogWrite(speedPin, speed);
    delay(10);
  }

  // Останавливаемся на секунду
  analogWrite(speedPin, 0);
  delay(1000);
}

Эта программа заставит мотор плавно раскрутиться в одну сторону, остановиться, а затем плавно раскрутиться в другую.


Вы познакомились с основами управления двигателями! Теперь вы знаете, как с помощью драйвера и ШИМ можно задавать направление и скорость вращения. В следующем параграфе мы применим эти знания на практике и научим нашего робота выполнять первые осмысленные движения.