- Обзор
- Технические характеристики
- Подключению к плате Arduino
- Пример использования
- FAQ
Обзор
В последнее время в радиолюбительских кругах набирает популярность такое направление, как робототехника. Платформа Arduino позволяет присоединиться к этому увлекательному процессу даже начинающих разработчиков, снижая порог вхождения в тему до приемлемого минимума. Роботизированные платформы с дистанционным управлением являются наиболее часто повторяемыми проектами. Думаю, что никто не отказался бы иметь под рукой послушного робота, который исправно выполняет команды своего хозяина.
Чтобы привести в движение шасси робота, разработчики, как правило, применяют моторы-редукторы. Они способны при небольших размерах обеспечивать достаточную силу тяги для реализации уверенного движения. Среди любительских легковесных роботов, фаворитом в этом направлении является мотор постоянного тока с редуктором 1:48, внешний вид которого показан на рисунке №1.
Рисунок №1 – мотор постоянного тока с редуктором 1:48
Редуктор данного мотора содержит шестерни из прочного пластика. Тем не менее, для управления массивными конструкциями использовать его не рекомендуется. Силиконовый хомут не даёт двигателю выпасть из редукторного корпуса, но он может быть отстёгнут вручную. Такой подход позволяет легко заменить двигатель на аналогичный при выходе последнего из строя.
Данный класс моторов с редуктором выпускается 4-х типов, а именно:
- Прямой одноосевой мотор-редуктор;
- Прямой двухосевой мотор-редуктор;
- Угловой одноосевой мотор-редуктор;
- Угловой двухосевой мотор-редуктор.
Рисунок №2 наглядно демонстрирует разницу их конструктивного исполнения. Вне зависимости от внешнего вида, все моторы имеют одинаковые характеристики.
Рисунок №2 – разновидности моторов с редуктором
Технические характеристики
Применительно к данным моторам-редукторам, можно выделить следующие технические характеристики:
- Диапазон напряжений питания: 3В – 8В;
- Номинальный ток потребления при напряжении 3,6В: 240 мА;
- Передаточное число редуктора: 1/48;
- Скорость вращения при напряжении 3,6В без нагрузки: 170 об/мин.
- Крутящий момент при напряжении 6В: 800 г/см;
- Диаметр вала: 5.4 мм;
- Габариты (для прямой модификации): 64мм х 20мм х 20мм;
- Масса: 26 грамм.
Подключение к плате Arduino
Как упоминалось в разделе технических характеристик, потребление данного мотора составляет 250 мА (при напряжении 3,6В). Это означает, что прямое управление с выводов Arduino здесь неуместно. А если учесть, что в большинстве проектов необходимо минимум два таких мотора, то задача становиться ещё интереснее. Первое что приходит в голову, это включение и отключение моторов с помощью полевого транзистора с логическим уровнем управления затвором, например IRL540N (рисунок №3).
Рисунок №3 – схема управления мотором при помощи полевого транзистора
Такое подключение даёт возможность включать и отключать двигатель логическим уровнем. Кроме того, можно управлять скоростью его вращения, изменяя уровень ШИМ на выводе D9 Arduino. Резистор 220 Ом ограничивает ток затвора транзистора, а резистор 100 кОм разряжает затвор, когда на выводе D9 установлен низкий логический уровень. Если его не использовать, то существует вероятность, что двигатель продолжит работать при его отключении. Диод 1N4007 защищает управляющую цепь от выброса высоковольтных импульсов самоиндукции, которые может создавать двигатель во время своей работы. Ниже приведён листинг программы, которая демонстрирует плавный разгон и торможение двигателя согласно вышеприведенной схемы.
#define PIN_MOTOR 9 void setup() { pinMode(PIN_MOTOR, OUTPUT); } void loop() { // Плавно разгоняем двигатель for(uint8_t i = 0; i < 255; i++) { analogWrite(PIN_MOTOR, i); delay(20); } delay(2000); // Двигатель работает 2 сек на полную мощность // Плавно тормозим двигатель for(uint8_t i = 255; i < 0; i--) { analogWrite(PIN_MOTOR, i); delay(20); } delay(2000); // Двигатель 2 сек стоит на месте }
Использование транзистора – это хорошо, но в рабочих роботизированных платформах каждый двигатель должен крутиться как вперёд, так и назад независимо друг от друга, да ещё и с разной скоростью. Поэтому данный вариант подходит только для простых проектов. Чтобы управлять двигателем полноценно, необходим мостовой драйвер. На данный момент большой популярностью пользуется драйвер L298N, который может обеспечить полноценное управление сразу двумя двигателями постоянного тока с возможностью реверса и регулировки скорости. Для того, чтобы напрямую не связываться с микросхемой драйвера, удобнее всего использовать готовый модуль с необходимой обвязкой на борту. Выглядит он так, как показано на рисунке №4.
Рисунок №4 – модуль драйвера L298N
Ниже приведён перечень выводов модуля L298N с кратким описанием каждого из них:
- IN1, IN2 – эти контакты предназначены для управления Мотором №1 (А). В зависимости от логических уровней, установленных на этих контактах, двигатель будет вращаться в ту или иную сторону. Для получения вращения, логические уровни на этих контактах должны быть противоположны друг другу. Например: IN1=1, IN2=0 → двигатель вращается по часовой стрелке; IN1=0, IN2=1 → двигатель вращается против часовой стрелки.
- IN2, IN3 – функционал контактов аналогичен IN1 и IN2, но только для Мотора №2 (В).
- ENA – логическая «1» на этом выводе разрешает вращение Мотора №1 (А). Также на этот контакт можно подавать ШИМ-сигнал, что позволит управлять скоростью вращения двигателя.
- ENB – функционал контакта аналогичен ENA, но только для Мотора №2 (В).
- OUT1, OUT2 – колодка для подключения Мотора №1 (А).
- OUT3, OUT4 – колодка для подключения Мотора №2 (В).
На рисунке №5 приведена схема включение двух двигателей при использовании модуля L298N и Arduino Nano.
Рисунок №5 – подключение моторов к Arduino через драйвер L298N
Согласно вышеприведенной схемы, драйвер L298N и Arduino Nano питаются от напряжения 7В. Этого будет достаточно, чтобы крутить два мотор-редуктора. Для возможности регулировки скорости, выводы ENA и ENB модуля L298N подключены к пинам Arduino, которые способны генерировать ШИМ-сигнал.
Ниже приведён тестовый скетч, который продемонстрирует все возможности драйвера, а именно: плавный разгон, торможение и реверс.
// Выводы управления 1-м мотором #define PIN_IN1 8 #define PIN_IN2 7 #define PIN_ENA 9 // Выводы управления 2-м мотором #define PIN_IN3 6 #define PIN_IN4 5 #define PIN_ENB 3 // Переменная для регулировки скорости вращения моторов uint8_t SPEED = 0; // Переменная общего состояния системы uint8_t STATE = 0; void setup() { // Настройка всех пинов в качестве выхода pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT); pinMode(PIN_ENA, OUTPUT); pinMode(PIN_IN3, OUTPUT); pinMode(PIN_IN4, OUTPUT); pinMode(PIN_ENB, OUTPUT); } void loop() { analogWrite(PIN_ENA, SPEED); analogWrite(PIN_ENB, SPEED); // Вращение мотор редукторов в одну сторону с постепенным наращиванием скорости if(STATE == 0) { SPEED += 17; if(SPEED == 255) STATE = 1; digitalWrite(PIN_IN1, HIGH); digitalWrite(PIN_IN2, LOW); digitalWrite(PIN_IN3, HIGH); digitalWrite(PIN_IN4, LOW); delay(500); } // Вращение моторов на максимальной скорости 5 секунд else if(STATE == 1) { delay(5000); STATE = 2; } // Вращение мотор редукторов в противоположную сторону с постепенным уменьшением скорости else if(STATE == 2) { SPEED -= 17; if(SPEED == 0) STATE = 3; digitalWrite(PIN_IN1, LOW); digitalWrite(PIN_IN2, HIGH); digitalWrite(PIN_IN3, LOW); digitalWrite(PIN_IN4, HIGH); delay(500); } // Остановка моторов на 5 секунд else if(STATE == 3) { delay(5000); STATE = 0; } }
Пример использования
Опираясь на полученные в разделе №3 знания, можно собрать небольшой проект радиоуправляемой роботизированной платформы, которою будут приводить в движение два мотор-редуктора.
Так как управление платформой планируется вести по радиоканалу, необходимо иметь передатчик с пультом управления и приёмник, который будет интегрирован в робота. Наилучшим вариантом для осуществления задуманного будет использование пары радио-модулей NRF24L01. Условно, проект можно разделить на две части: создание пульта управления с передатчиком и создание шасси робота.
Создание пульта управления с передатчиком
Для передатчика актуальными командами будут следующие:
- движение вперёд;
- движение назад;
- движение вправо;
- движение влево;
- изменение скорости движения от 0 до 100%
Первые 4 пункта можно выполнить при помощи тактовых кнопок, а регулировку скорости осуществлять потенциометром. Исходя из вышеизложенного, получаем схему радиопульта, показанную на рисунке №6.
Рисунок №6 – схема радиопульта для роботизированной платформы
Ниже приведён листинг программы с подробными комментариями, который будет обрабатывать команды пользователя, отсылая их в радиоэфир. В качестве дополнения, потребуется установить библиотеку RF24. Следует заметить, что данный пульт управления довольно универсален и может быть использован в других проектах.
#include <SPI.h> // Библиотека для работы с шиной SPI #include <nRF24L01.h> // Файл конфигурации для библиотеки RF24 #include <RF24.h>// Библиотека для работы с модулем NRF24L01 #define PIN_CE 10 // Номер пина, к которому подклюен вывод CE радиомодуля #define PIN_CSN 9 // Номер пина, к которому подклюен вывод CSN радиомодуля RF24 radio(PIN_CE, PIN_CSN); // Создание объекта radio int data[5]; // Массив для передачи 5-ти команд в радиоэфир #define PIN_BUTTON_FORWARD A0 // Номер пина, к которому подключена кнопка "ВПЕРЁД" #define PIN_BUTTON_BACK A1 // Номер пина, к которому подключена кнопка "НАЗАД" #define PIN_BUTTON_RIGHT A2 // Номер пина, к которому подключена кнопка "ВПРАВО" #define PIN_BUTTON_LEFT A3 // Номер пина, к которому подключена кнопка "ВЛЕВО" #define PIN_SPEED A7 // Номер пина, к которому подключен регулятор скорости void setup() { // Настройка пинов кнопок и потенциометра на вход pinMode(PIN_BUTTON_FORWARD, INPUT_PULLUP); pinMode(PIN_BUTTON_BACK, INPUT_PULLUP); pinMode(PIN_BUTTON_RIGHT, INPUT_PULLUP); pinMode(PIN_BUTTON_LEFT, INPUT_PULLUP); pinMode(PIN_SPEED, INPUT); radio.begin(); // Инициализация радиомодуля NRF24L01 radio.setChannel(5); // Выбор канала для передачи данных 2,405 ГГц radio.setDataRate(RF24_1MBPS); // Скорость обмена данными 1Мбит/сек radio.setPALevel(RF24_PA_HIGH); // Установка максимальной мощности передатчика -6dBm radio.openWritingPipe(0x7878787878LL); // Открытие трубы с уникальным ID } void loop() { // Читаем состояние кнопок и потенциометра с записью данных в массив data[0] = digitalRead(PIN_BUTTON_FORWARD); data[1] = digitalRead(PIN_BUTTON_BACK); data[2] = digitalRead(PIN_BUTTON_RIGHT); data[3] = digitalRead(PIN_BUTTON_LEFT); data[4] = analogRead(PIN_SPEED); // Передача массива в радиоэфир radio.write(data, sizeof(data)); }
В главном цикле программы постоянно опрашиваются состояния кнопок и потенциометра. Полученный результат заноситься в массив, после чего он отсылается по радиоканалу, где может быть принят и расшифрован приёмником. На этом подготовка пульта радиоуправления роботом завершена и можно переходить к следующему этапу.
Создание и программирование шасси робота
Для того, чтобы собрать роботизированную платформу нам понадобятся следующие компоненты:
- Arduino Nano – как основной мозг робота;
- Модуль NRF24L01 – как приёмник сигналов с пульта управления;
- Два мотор-редуктора для приведения робота в движение;
- Модуль L298N для полноценного управления моторами;
- Держатель для аккумуляторов или батареек;
- Ну и конечно-же основание, на котором всё это необходимо закрепить.
На рисунке №7 показана электрическая схема будущего робота.
Рисунок №7 – схема робота
При монтаже электросхемы следует смотреть за тем, чтобы все выводы GND были соединены между собой. Также вывод GND модуля L298N желательно пустить отдельным проводом прямо к источнику питания, чтобы не пропускать большие токи через плату Arduino. Вместо 4-х пальчиковых батареек можно использовать два Li-Ion аккумулятора, соединённых последовательно. Такое соединение обеспечит достаточное напряжение для уверенного вращения мотор-редукторов.
Электролитический конденсатор, ёмкостью 100 мкФ в цепи питания радиомодуля обязателен. Без него NRF24L01 будет нестабильно работать или вообще не инициализируется.
Так как моторы будут зеркально развернуты по отношению друг к другу, подключать их необходимо также зеркально. Это хорошо видно на вышеприведенном рисунке, если провести ассоциацию цветов проводов с соответствующими клеммами на двигателе.
Ниже приведён скетч управления роботом с подробными комментариями.
#include <SPI.h> // Библиотека для работы с шиной SPI #include <nRF24L01.h> // Файл конфигурации для библиотеки RF24 #include <RF24.h> // Библиотека для работы с модулем NRF24L01 #define PIN_CE 10 // Номер пина, к которому подклюен вывод CE радиомодуля #define PIN_CSN 9 // Номер пина, к которому подклюен вывод CSN радиомодуля RF24 radio(PIN_CE, PIN_CSN); // Создание объекта radio int data[5]; // Массив для приёма 5-ти команд из радиоэфира #define PIN_IN1 8 // Вывод управления мотором правого колеса #define PIN_IN2 7 // Вывод управления мотором правого колеса #define PIN_ENA 6 // Вывод управления скоростью правого колеса #define PIN_IN3 4 // Вывод управления мотором левого колеса #define PIN_IN4 3 // Вывод управления мотором левого колеса #define PIN_ENB 5 // Вывод управления скоростью левого колеса void setup() { radio.begin(); // Инициализация радиомодуля NRF24L01 radio.setChannel(5); // Выбор канала для передачи данных 2,405 ГГц radio.setDataRate(RF24_1MBPS); // Скорость обмена данными 1Мбит/сек radio.setPALevel(RF24_PA_HIGH); // Установка максимальной мощности передатчика -6dBm radio.openWritingPipe(0x7878787878LL); // Открытие трубы с уникальным ID radio.startListening(); // Активируем прослушивание открытой трубы // Настройка пинов для управления моторами на выход pinMode(PIN_IN1, OUTPUT); digitalWrite(PIN_IN1, LOW); pinMode(PIN_IN2, OUTPUT); digitalWrite(PIN_IN2, LOW); pinMode(PIN_IN3, OUTPUT); digitalWrite(PIN_IN3, LOW); pinMode(PIN_IN4, OUTPUT); digitalWrite(PIN_IN4, LOW); pinMode(PIN_ENA, OUTPUT); analogWrite(PIN_ENA, 0); pinMode(PIN_ENB, OUTPUT); analogWrite(PIN_ENB, 0); } void loop() { if(radio.available()) { // Если из радиоэфира поступили данные radio.read(&data, sizeof(data)); // Занесение принятых данных в массив // Установка скорости движения согласно принятым данным int SPEED = map(data[4], 0, 1023, 0, 255); // Масштабируем полученное значение для ШИМ analogWrite(PIN_ENA, SPEED); // Задаём скорость для правого колеса analogWrite(PIN_ENB, SPEED); // Задаём скорость для левого колеса // Обработка команды "ДВИЖЕНИЕ ВПЕРД" if(data[0] == 0) { digitalWrite(PIN_IN1, HIGH); digitalWrite(PIN_IN2, LOW); // Крутим правое колесо вперёд digitalWrite(PIN_IN3, HIGH); digitalWrite(PIN_IN4, LOW); // Крутим левое колесо вперёд } // Обработка команды "ДВИЖЕНИЕ НАЗАД" else if(data[1] == 0) { digitalWrite(PIN_IN1, LOW); digitalWrite(PIN_IN2, HIGH); // Крутим правое колесо назад digitalWrite(PIN_IN3, LOW); digitalWrite(PIN_IN4, HIGH); // Крутим левое колесо назад } // Обработка команды "ПОВОРОТ ВПРАВО" else if(data[2] == 0) { digitalWrite(PIN_IN1, LOW); digitalWrite(PIN_IN2, LOW); // Правое колесо стоит на месте digitalWrite(PIN_IN3, HIGH); digitalWrite(PIN_IN4, LOW); // Крутим левое колесо вперёд } // Обработка команды "ПОВОРОТ ВЛЕВО" else if(data[2] == 0) { digitalWrite(PIN_IN1, HIGH); digitalWrite(PIN_IN2, LOW); // Крутим правое колесо вперёд digitalWrite(PIN_IN3, LOW); digitalWrite(PIN_IN4, LOW); // Левое колесо стоит на месте } // Обработка команды "КОМАНДА ОСТАНОВКИ" else { digitalWrite(PIN_IN1, LOW); digitalWrite(PIN_IN2, LOW); // Правое колесо стоит на месте digitalWrite(PIN_IN3, LOW); digitalWrite(PIN_IN4, LOW); // Левое колесо стоит на месте } } }
Когда готовы схемы и программное обеспечение, можно уделить время практической сборке узлов. Чтобы легче было ориентироваться, на рисунке №8 представлен один из вариантов крепления моторов и некоторых компонентов проекта. В реальности компонентов будет больше, но здесь важна сама идея, следуя которой можно создать своего уникального робота.
Рисунок №8 – один из вариантов крепления моторов
FAQ. Часто задаваемые вопросы
Ответ: В таком случае рекомендуется намотать на ферритовый сердечник провода, питающие мотор-редуктор. Сам ферритовый сердечник необходимо расположить как можно ближе к двигателю.
Вопрос: Какое сопротивление у обмотки мотор-редуктора?
Ответ: В продаже могут попадаться двигатели с разным диапазоном сопротивлений в пределах 3-6 Ом.
Вопрос: Какое количество оборотов в минуту может развить мотор-редуктор?
Ответ: Количество оборотов в минуту зависит от напряжения питания и от сопротивления обмотки двигателя. В таблице ниже приведены некоторые практические данные, полученные опытным путём:
Напряжение | Мотор-редуктор с обмоткой 3 Ом | Мотор-редуктор с обмоткой 6 Ом | ||
Оборотов/мин. | Потребление | Оборотов/мин. | Потребление | |
3,7V | 195 | 120 мА | 138 | 120 мА |
4,8V | 258 | 130 мА | 192 | 125 мА |
6V | 330 | 150 мА | 246 | 130 мА |
7,4V | 408 | 170 мА | 312 | 135 мА |
12V | 672 | 270 мА | 480 | 160 мА |