сильныеНоги

Урок 3. Усиливаем «ноги робота». Драйвер двигателей.

Что делать в ситуации когда моторам необходимо много тока, а у микропроцессорной платы его просто нет? Правильно — «звать друзей» J.

Какие возможны варианты?

  1. Применять реле
  2. Применять транзисторы
  3. Применять специальные микросхемы –драйверы моторов

Первый и второй путь более сложные с точки зрения миниатюризации и уменьшения количества контактов на пайке, поэтому сразу пойдем третьим путем.

Итак – нам необходима специальная микросхема-драйвер двигателей, которая поможет нам справиться с токами, необходимыми для питания моторов робота.

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

Мы выберем оптимальный драйвер для таких моторов, как у нас – TB6612FNG (www.pololu.com). Этот драйвер, основанный на одноименной микросхеме может управлять двумя моторами сразу, что нам и необходимо. В документации к нему мы можем найти необходимые для нас параметры.

На данной картинке приведены основные характеристики драйвера моторов TB6612FNG и описание контактов для его подключения к микропроцессорному контроллеру и моторам. Итак, драйвер может обеспечить моторы напряжением питания от 4,5V до 13,5V. Обеспечить продолжительный ток до 1А на каждый из 2-х двигателей (нам надо 300-900mA) и пиковый до 3A (нам надо максимум 1,6A на каждый при полной блокировке двигателей). В таком варианте наши «мозги» будут целы, «ноги» сыты. Обратите внимание, что микросхема может нагреваться при нагрузках – всегда проверяйте ее температуру, если суморобот проводил долгий и сложный бой.

Ниже представлен вариант схемы подключения микропроцессорной платы AStar 32U4 и драйвера двигателей TB6612FNG с моторами Pololu HP:

Обратите внимание – мы подсоединяем к контактам PWMA и PWMB  драйвера двигателей контакты микропроцессорной платы 3 и 9 соответственно, помеченные специальным значком «~». Этот значок говорит нам, что данные цифровые выводы микропроцессорной платы имеют возможность передавать  PWM или ШИМ (широтно-импульсно модулированный) сигнал. Не вдаваясь в теоретизирование просто скажем, что позже, в программе, мы сможем управлять скоростью вращения двигателей, используя ШИМ или PWM (pulse-width modulation).

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

Для того, чтобы приступить к программированию, необходимо разобраться, как же подавать сигналы с контактов микропроцессорной платы №0,№1,№2,№3,№7,№9 на соответствующие входы драйвера двигателей PWMA, AIN1, AIN2 и PWMB, BIN1, BIN2 для того, чтобы  моторы заработали.

Для решения этой задачи обратимся к рекомендации по использованию драйвера двигателей TB6612FNG. В ней на странице 4 мы найдем управляющую таблицу, с помощь которой сможем понять логику работы драйвера.

В таблице указано, что при подаче на IN1 (AIN1 или BIN1) (столбец 1, IN1) логического нуля — сигнала «LOW» («L»), а на IN2 (AIN2 или BIN2 (столбец 2) логической единицы — сигнала «HIGH» («H»), и на контакт PWM (PWMA или PWMB) сигнала «HIGH» («H»), мотор будет крутиться против часовой стрелки («CCW»), а при изменении сигналов на контактах IN1 и IN2 наоборот будет крутиться по часовой стрелке («CW»). Скорость вращения моторов будет задаваться ШИМ (PWM) сигналом на контактах PWMA и PWMB.

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

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

//для мотора, подключенного к контактам AO1 и //AO2

digitalWrite(1, LOW);

digitalWrite(0, HIGH);

analogWrite(3, 255);

delay(1000);

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

digitalWrite(1, HIGH);

digitalWrite(0, LOW);

analogWrite(3, 255);

delay(1000);

заставят его вращаться по часовой стрелке ровно одну секунду.

Кажется все.

Нет.

Не все.

Во первых, после вращения одну секунду что произойдет с мотором? Мотор продолжит крутиться или остановится? А мы ему дали команду круться или остановиться? Нет. Такие ситуации в программировании моторов нежелательны, так как в разной ситуации разные моторы могут вести себя совсем непредсказуемо – в одном случае он продолжит вращение, в другом просто остановится… Эта неопределенность поможет Вам безусловно увидеть в роботе элементы собственного сознания и даже своенравия… J

Прекратим шутить и вернемся к вопросу.

Как остановить моторы? Смотрим в таблицу – чтобы остановить мотор необходимо подать на оба ввода драйвера логическую единицу – сигнал «HIGH» («H») и на PWM – любой сигнал.

digitalWrite(1, HIGH);

digitalWrite(0, HIGH);

analogWrite(3, LOW);

delay(10);

 

Теперь мотор остановится. Зачем нужна небольшая задержка — delay(10);? – для снятия инерции крутящихся моторов и более надежного торможения – мы живем в инерциальном мире. Чем больше задержка – тем сильнее торможение.

Для второго мотора, подключенного к выводам драйвера BO1 и BO2. все приведенные выше команды также справедливы при замене номеров контактов микропроцессорной платы, подключенной к вводам драйвера двигателей, отвечающим за этот мотор.

Обратим внимание на контакт драйвера двигателей STBY (standby). При подаче на него сигнала «HIGH» («H») все функции драйвера двигателя будут доступны, при сигнале «LOW» драйвер будет находиться в спящем режиме.

Для упрощения и с учетом того, что бои сумороботов проходят очень скоротечно мы сразу подключили данный контакт к +5V, питающим саму микросхему драйвера двигателей – подали постоянный сигнал «HIGH».

Как изменить скорость вращения двигателей?

Вот здесь нам и пригодится упомянутое выше свойство контактов микропроцессорной платы передавать PWM или ШИМ сигнал. Вспомним о том, что мы использовали контакты, которые имеют такое свойство – передавать PWM сигнал. Как Вы уже заметили мы использовали команду analogWrite(pin, value); для формирования ШИМ (PWM) сигнала.

В этой команде значение value может находиться в диапазоне от 0 до 255. При этом 0 в analogWrite равнозначен LOW в digitalWrite, 255 равнозначно HIGH.

Для первого мотора исполнение команд

digitalWrite(1, LOW);

digitalWrite(0, HIGH);

analogWrite(3, 125);

delay(1000);

будет соответствовать вращению мотора против часовой стрелки примерно с половинной скоростью от максимальной (без нагрузки). Обратите внимание, что вместо 255 в команде analogWrite также можно использовать системную константу HIGH или LOW интегрированной среды разработки Arduino.

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

//Скетч 2

//крутим моторы вперед назад с частотой 1 //секунда с половинной скоростью

//переменные для моторов pololu через драйвер //TB6612FNG

#define PWMA 3

#define AIN1 1

#define AIN2 0

#define BIN1 2

#define BIN2 7

#define PWMB 9

void setup()

{

pinMode(PWMA,OUTPUT);

pinMode(AIN1,OUTPUT);

pinMode(AIN2,OUTPUT);

pinMode(PWMB,OUTPUT);

pinMode(BIN1,OUTPUT);

pinMode(BIN2,OUTPUT);

}

 

void loop()

{

//запускаем оба мотора против часовой стрелки

digitalWrite(AIN1, LOW);

digitalWrite(AIN2, HIGH);

analogWrite(PWMA, 125);

 

digitalWrite(BIN1, LOW);

digitalWrite(BIN2, HIGH);

analogWrite(PWMB, 125);

delay(1000);

//останавливаем моторы

digitalWrite(AIN1,HIGH);

digitalWrite(AIN2,HIGH);

digitalWrite(PWMA,LOW);

digitalWrite(BIN1,HIGH);

digitalWrite(BIN2,HIGH);

digitalWrite(PWMB,LOW);

delay(10);

//запускаем оба мотора в другую сторону

digitalWrite(AIN1, HIGH);

digitalWrite(AIN2, LOW);

analogWrite(PWMA, 125);

 

 

digitalWrite(BIN1, HIGH);

digitalWrite(BIN2, LOW);

analogWrite(PWMB, 125);

delay(1000);

}

Что в этом скетче появилось нового для нас:

Директивы #define – они назначают константам AIN1, AIN2, BIN1, BIN2, PWMA, PWMB (которые мы можем затем использовать в программе в качестве замены номеров контактов микропроцессорной платы) номера соответствующих выводов микропроцессорной платы.

В процедуре setup() появились функции pinMode(pin, state), где pin – номер соответствующего контакта микропроцессорной платы и state имеет значение либо OUTPUT (вывод) – мы управляем драйвером, либо INPUT (ввод данных – пригодится нам при получении информации с датчиков в следующих темах).

 Пример работы скетча моторов

Вопросы для проверки:

1. Зачем нужен драйвер двигателей?

2. В чем отличие команд digitalWrite от analogWrite

3. Как изменить скорость вращения моторов нашего робота?

4. Подумайте, в какую сторону должны вращаться моторы робота, расположенные по его правой и левой стороне для того чтобы робот а) ехал вперед, б) назад, в) поворачивал направо, г)поворачивал налево.*

Aboutadmin