Код
#статьи

Программируем робота и настраиваем управление: 2-я часть гайда по сборке робота

Превращаем бездушную машину в имитацию жизни.

Иллюстрация: Катя Павловская для Skillbox Media

Это вторая часть туториала по сборке робота. В предыдущей статье мы подготовили физическую часть проекта: подобрали (или напечатали) детали, подключили электронику.

Сегодня займёмся программированием: напишем код для управления моторами, настроим управление со смартфона и сможем наконец попробовать наш робокар в деле.

Напомним, наша конечная цель — создание механической машинки, которая управляется по 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

Настраиваем управление со смартфона

Важная оговорка: для этого проекта мы использовали приложение Arduino Bluetooth Controller на Android для работы с Bluetooth-модулем HC-06. Похожие программы есть и для iPhone, но мы не можем гарантировать качество работы — возможно, вам придётся самостоятельно искать альтернативы этому приложению.

Теперь нам нужно настроить отправку команд по 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 и небольшого динамика. Как знать, возможно, именно вам суждено собрать первого Терминатора :)

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!

Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Научитесь: Программист микроконтролле­ров Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована