Занятие 13 Коммуникация по Bluetooth
.docКурс «Основы робототехники». Занятие 13 Коммуникация по Bluetooth между контроллером Arduino и смартфоном, планшетом
“Все становится лучше, когда в нем есть Bluetooth”
Шелдон Купер, Теория Большого Взрыва
Bluetooth модуль установлен на роботе на самостоятельно сделанную соединительную плату с Arduino Nano. Для связи с модулем можно использовать стандартные пины Serial 0, 1 (RX, TX) и в роботах на готовой плате Zelectro так и сделано. Но при этом возможны проблемы с прошивкой контроллера (чтобы закачать программу в контроллер, иногда приходится извлекать модуль Bluetooth). Поэтому в самодельной плате используются два других пина – 5 и 7, а связь через них с Bluetooth модулем обеспечивается библиотекой Software Serial:
#include <SoftwareSerial.h> // подключаем библиотеку SoftwareSerial SoftwareSerial mySerial(5, 7); // создаем объект mySerial – связь с Bluetooth через пины 5 и 7 char symbol = 'n'; // переменная для хранения принятого символа
void setup() { // подключаемся к Bluetooth модулю, соединенному с Arduino по Software Serial: mySerial.begin(9600); // настройте тут пины, к которым подключены моторы роботов, как Output } |
Для робота на базе платы Zelectro в верхней части кода нет необходимости, используется следующий код:
void setup() { // подключаемся к Bluetooth модулю, соединенному с Arduino по Serial: Serial.begin(9600); // настройте тут пины, к которым подключены моторы роботов, как Output } |
Для управления роботами на Arduino с планшета или смартфона имеется ряд приложений: как текстовые, передающие и принимающие буквы и числа на робота и с него (например, Bluetooth SPP), так и графические, с готовыми или создаваемыми пользователем кнопками, нажатие на каждую из которых передает на робота по Bluetooth какую-либо букву или цифру. Для получения этого символа на Arduino в блоке loop используется следующий код:
if (mySerial.available()) { //если есть принятый символ, symbol = mySerial.read(); // то читаем его и сохраняем в symbol } else { symbol = 'n'; // если ничего не принято, записываем символ "нет команды", чтобы робот не выполнял постоянно последнюю принятую команду } |
Примечание: для робота на базе платы Zelectro в данном коде нужно заменить mySerial на Serial
В клубе для управления роботами используется приложение Arduino Bluetooth RC Car (см. приложенный файл о его установке и подключении к роботу по Bluetooth). Данное приложение передает символы F (Forward, вперед), B(Backward, назад), R (Right, вправо), L (Left, влево)
Напишите программу, включающую моторы робота в зависимости от пришедшего символа. Можно использовать несколько if, но, учитывая, что в дальнейшем будут отрабатываться и остальные кнопки приложения, передающие свои буквы, более корректно будет использовать функцию switch-case:
switch (symbol) { // выполняем команду в соответствии с принятым символом (если он есть) case 'F': // принят символ с кнопки Вперед // команды для езды вперед break;
case 'B': // принят символ с кнопки Назад // команды для езды назад break;
case 'L': // принят символ с кнопки Влево // команды для езды влево break;
case 'R': // принят символ с кнопки Вправо // команды для езды вправо break; |
Одним из вариантов реализации команд для езды является просто включить моторы (например, digitalWrite (HIGH) на пины In1 и In3). В этом случае робот будет ехать в заданном направлении, пока не будет подана другая команда (в этом случае для кнопки Назад лучше реализовать команду Стоп – остановить моторы). Но более точное перемещение робота будет обеспечиваться при выполнении следующего алгоритма:
-
включить моторы для езды в заданном направлении
-
выполнить паузу (delay)
-
остановить моторы
В этом случае реализуется прерывистое перемещение робота – при нажатии на кнопку он проедет определенное расстояние (или повернет на определенный угол) и остановится. Расстояние и угол определяется скоростью робота и временем паузы
Практическое занятие 1. Напишите программу, реализующую движение робота по управлению с Bluetooth используя приведенные выше части кода
Практическое занятие 2: Добавим управление фарами робота (если они будут установлены, пока в качестве замены используем светодиод на Arduino Nano). Добавьте в код следующие участки:
int led_pin = 13; // в самом начале … pinMode(led_pin, OUTPUT); // в блоке setup … // внутри switch: case 'W': // включение передних фар digitalWrite(led_pin, HIGH); break; case 'w': // выключение передних фар digitalWrite(led_pin, LOW); break; … |
Домашнее задание: готовиться к внутриклубным соревнованиям, которые будут проводиться на занятии 15 и 16. Занятие 14 также будет посвящено подготовке к этим соревнованиям:
Соревнования на занятии 15
1. Движение по траектории (один, два или более датчиков освещенности на роботе, черная линия). Желательна более совершенная программа, чем рассмотренная на занятии 12 (обеспечивающая бОльшую скорость и точность). Соревнование индивидуальное – каждый участник клуба закачивает свою программу в робота и он едет по линии от старта до финиша. Три попытки. Засчитывается лучшее время
2. Робофутбол – несколько команд, каждый участник команды управляет своим роботом по Bluetooth со смартфона или планшета, программа в роботе – загруженная в робота самостоятельно (например, рассмотренная на занятии 13, ее можно модифицировать или написать свою). Задача – управляя роботом, забить мяч в ворота противника. Победит команда, забившая большее количество голов за отведенное время. Ориентировочно 2 на 2 робота
Соревнования на занятии 16
1. Конкурс проектов. Выполненные (или находящиеся в процессе выполнения) личные проекты слушателей курса. Можно выступить с несколькими проектами (если они есть). Желателен показ работы проекта и демонстрация презентации по нему (в лаборатории 417 есть проектор и экран). Обязательны рассказ о проекте (для чего применяется, из чего состоит, что было сделано участником (разработка схемы, сборка и т.д.)) и ответы на вопросы жюри
2. Робосумо. Автономные роботы. Выбрать клубного робота или использовать своего, установить на него датчики и загрузить самостоятельно написанную программу. Рекомендуется пара датчиков линии спереди и пара сзади для предотвращения падения с ринга и ультразвуковой датчик расстояния для нахождения противника. Правила – стандартные для робосумо (см. приложение). Первостепенная задача – постараться столкнуть с ринга робота противника и не упасть с него самому. Второстепенная задача – находиться по возможности ближе к центру ринга. Робот, не перемещающийся по рингу, считается проигравшим. Время каждого раунда 1-2 минуты, выигравшим считается робот, столкнувший противника или оказавшийся ближе к центру ринга, по окончании раунда.
После проведения соревнований победившим будут вручены призы (если они будут представлены ПГТУ) и всем закончившим курс «Основы робототехники» – сертификаты об окончании курса.