Превращаем бездушную машину в имитацию жизни.
Это вторая часть туториала по сборке робота. В предыдущей статье мы подготовили физическую часть проекта: подобрали (или напечатали) детали, подключили электронику.
Сегодня займёмся программированием: напишем код для управления моторами, настроим управление со смартфона и сможем наконец попробовать наш робокар в деле.
Напомним, наша конечная цель — создание механической машинки, которая управляется по Bluetooth через приложение на смартфоне.
Фото: личный архив Екатерины Можеговой
А теперь перейдём к гайду 😉
Готовим среду разработки Arduino IDE
Arduino IDE — это самая популярная и удобная среда разработки для проектов на Arduino, поэтому именно в ней мы и напишем программу для управления роботом. Скачать установочный файл можно с официального сайта.
В Arduino IDE мы напишем код, а потом с помощью этой же программы мы загрузим его на Arduino Uno. Шаблон пустой программы (или скетча) выглядит так:
Скриншот: Arduino IDE
Язык программирования для Arduino IDE основан на C++. C++ используется в робототехнике и за рамками проектов на Arduino, поэтому, если вы хотите в дальнейшем серьёзно заниматься робототехникой, советуем вам изучить его более серьёзно.
Вернёмся к скетчу. Здесь мы видим две (пока что пустые) функции: setup(), loop(). Разберём подробнее, что они означают:
- В setup() обычно инициализируются переменные, а также режимы подключённых контактов (пинов) — через функцию pinMode(). Код внутри setup() выполняется единожды, сразу после запуска Arduino, то есть фактически этот метод используется для начальной настройки платы.
- Функция loop() содержит основной код, который выполняется непрерывно после завершения выполнения функции setup().
- Параметр void перед функцией указывает на тип возвращаемого значения после выполнения команд функции. В переводе на русский язык void означает «пустота» — это значит, что функция ничего не возвращает.
Пишем код
Теперь попробуем написать программу для управления нашей машинкой. Не переживайте: мы подробно расскажем и покажем на примерах, как это сделать, но, если сегодня у вас нет настроения программировать, можете воспользоваться уже готовым кодом 🙂
Напомним, что для управления роботом мы будем отправлять команды с мобильного приложения, а Bluetooth-модуль, подключённый к машинке, будет их принимать. Наша задача — написать программу, которая будет обрабатывать полученные команды, считывая их с Bluetooth-модуля, преобразовывать в управляющие сигналы для моторов и передавать эти сигналы на моторы для выполнения нужных действий.
Коммуникация с модулем происходит по последовательному (serial) порту — чтобы активировать его, добавим в функцию setup() следующую строчку:
Serial.begin(9600);
Эта команда настраивает последовательный порт на нужную скорость передачи данных, которая должна совпадать со скоростью передачи данных на Bluetooth-модуле. 9600 бит/с — это стандартная скорость передачи данных для последовательного порта.
В прошлой части инструкции мы уже физически подключили контакты моторов к пинам 6–9 Arduino. Теперь укажем их в коде. Для этого внутри той же функции setup() добавим следующие строчки:
pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT);
Команда pinMode задаёт режим работы подключённых контактов. Например, pinMode(6, OUTPUT); означает, что мы устанавливаем 6-й пин как выходной и будем отправлять на него управляющие сигналы от Arduino.
Теперь в void loop() опишем основную логику программы.
В этой функции мы проверяем, есть ли в последовательном порте данные, доступные для чтения (в нашем случае — команды управления), реализуем мы это с помощью метода Serial.available(). Если данные доступны, то они читаются.
while(Serial.available() > 0){ data = Serial.read(); }
Значения data в нашем случае могут быть такими:
- ‘F’ (forward): движение вперёд;
- ‘B’ (backward): движение назад;
- ‘L’ (left): движение налево;
- ‘R’ (right): движение направо;
- ‘0’ (stop): остановка.
Допустим, если пришедшая команда — «вперёд», программа активирует пины 6 и 7.
Определить, какие порты нужно включать для разных движений, можно экспериментально: поочерёдно активируя пары пинов и наблюдая, в каком направлении движется машинка.
void loop(){ while(Serial.available() > 0){ data = Serial.read(); if(data == ‘F’){ // Forward digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, LOW); }
В Arduino HIGH, LOW — это логические уровни, управляющие состоянием пинов. Когда мы используем функцию digitalWrite(pin, HIGH), мы подаём высокий уровень напряжения на соответствующий пин, то есть включаем его. А при использовании digitalWrite(pin, LOW) мы подаём низкий уровень напряжения, то есть выключаем пин.
Аналогично будет реализована логика движения и в других направлениях: влево, вправо и назад.
int data; void setup(){ Serial.begin(9600); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); } void loop(){ while(Serial.available() > 0){ data = Serial.read(); if(data == ‘F’){ // Forward digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, LOW); } if (data == ‘B’){ // Backward digitalWrite(6, LOW); digitalWrite(8, HIGH); digitalWrite(7, LOW); digitalWrite(9, HIGH); } if (data == ‘L’){ // Left digitalWrite(6, HIGH); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(9, HIGH); } if (data == ‘R’){ // Right digitalWrite(6, LOW); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(9, LOW); } if(data == ‘0’){ // Stop digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); } } }
Загружаем код на Arduino
Теперь, когда наш код готов, нужно загрузить его на Arduino. Для начала подключаем Arduino к компьютеру через USB и открываем программу Arduino IDE. В IDE настроим параметры для загрузки кода: выбираем соответствующую плату и порт. В списке доступных плат выбираем Arduino Uno, так как именно с этой платой мы работаем.
Скриншот: Arduino IDE
Теперь выберем корректный USB-порт.
Скриншот: Arduino IDE
Готовую программу нужно будет сначала проверить на наличие ошибок. Для этого воспользуемся кнопкой Проверить.
Скриншот: Arduino IDE
Если всё в порядке, то загрузим код на плату.
Скриншот: Arduino IDE
Настраиваем управление со смартфона
Теперь нам нужно настроить отправку команд по Bluetooth с телефона.
1. Для начала установим на телефон приложение Arduino Bluetooth Controller.
2. В интерфейсе выберем корректное устройство для подключения к Bluetooth — HC-06, так как именно такой Bluetooth модуль мы и используем, затем введём пароль по умолчанию — 1234. Далее выберем сценарий Gamepad.
Вы увидите интерфейс управления
Скриншот: Arduino IDE / Skillbox Media
3. При нажатии на кнопки в интерфейсе приложения данные должны посылаться на Arduino по Bluetooth.
Если для сборки вы использовали контроллер Arduino Mega вместо классического Uno, можно проследить, как выглядит отправка команд со смартфона на плату робота.
Для этого нужно загрузить на плату и запустить проверочный код.
void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { if (Serial1.available()){ Serial.println(char(Serial1.read())); } }
Вместо итогов
Поздравляем! 🥳 Вы только что собрали и запрограммировали своего первого робота 😉 Теперь вы сможете сами им управлять! Примерно так:
Благодаря такому несложному проекту мы отточили несколько важных для робототехника навыков: попрактиковались в сборке, поработали с микроконтроллером Arduino, научились подключать моторы и управлять ими. Эти навыки — хорошая база для новых, более сложных проектов.
Что дальше
Теперь можно дорабатывать машинку столько, сколько вам позволяет воображение, — например, подключить к ней датчики освещённости, камеру, микрофон и даже манипулятор для захвата различных предметов.
Разные версии колёсных роботов на базе Arduino
Скриншот: Kuongshun / AliExpress / Supereyes
Отдельные умельцы прикручивают к Arduino ИИ-мозги с помощью API популярных нейронок. Вы можете пойти дальше и научить робота общаться с вами с помощью ChatGPT и небольшого динамика. Как знать, возможно, именно вам суждено собрать первого Терминатора 🙂