Занятие 4: Управление движением робота по Bluetooth

Робототехника на Hobot L в mBlock Scratch
Для связи роботов друг с другом, с компьютерами и другими устройствами (смартфон, планшет) используется радиосвязь. Существует много видов беспроводной связи (например, часто используется Wi-Fi), но мы используем самый простой в реализации вариант - связь с роботом по Bluetooth.
В этом занятии изучим Bluetooth модуль, который выглядит так:
Технология Bluetooth используется для передачи данных между двумя устройствами, которые находятся в непосредственной близости друг с другом, причем не обязательна прямая видимость.
Модуль предназначен для передачи информации с помощью радиосигнала. Дальность передачи на открытой местности порядка 10 - 15 метров. Его можно использовать для дистанционного управления Вашим роботом.

Установка используемых расширений

Для занятия потребуются три расширения:

  1. Расширение для работы с Bluetooth модулем
  2. Расширение для связи Arduino с компьютером в режиме Загрузка
  3. Расширение для связи компьютера с Arduino в режиме Загрузка

Примечание: первые два расширения добавляются во вкладке Устройства, третье - во вкладке Персонажи.

  1. Установим расширение для работы с Bluetooth модулем. Достаточно простое и надёжное расширение - Bluetooth HC-05 PCM. Для его установки нажмите кнопку +расширение под Палитрой команд (разноцветными кругами с разделами блоков) и введите в поле Поиск вверху слева запрос Bluetooth:
2. Найдите в результатах поиска Bluetooth HC-05 PCM. Если справа сверху на расширении находится символ “+” - сначала нажмите его и дождитесь установки расширения.
3. Нажмите кнопку + Добавить внизу под расширением Bluetooth HC-05 PCM.
4. Снова войдите в Центр расширений, удалите поисковый запрос. В верхней строке должно находится расширение для связи с компьютером в режиме Загрузка – Upload Mode Broadcast. Добавьте его в проект.
5. Перейдите во вкладку Персонажи. Нажмите +расширение, чтобы попасть в Центр расширений.
6. Найдите и добавьте в проект расширение Трансляция режима передачи (находится во второй строке всех расширений):

Передача информации c Arduino на компьютер - тест

Bluetooth модуль работает только в режиме Загрузки, поэтому, в отличие от ранее использованной передачи в режиме Онлайн просто через общие для Arduino и персонажа переменные, требуется дополнительные два расширения. Одно будет выполнять передачу данных с Arduino, второе - прием их компьютером. Схема передачи:

Переключитесь на режим Загрузка во вкладке Устройства:
Обратите внимание, что теперь команда Начало в разделе События выполняет не блок При нажатии флажка (он стал неактивным), а блок При запуске Arduino Uno. Подсоединённые к нему блоки начинают выполняться когда подключается питание робота. Блок При запуске Arduino Uno быть только один, при наличии в программе двух и более таких блоков контроллер, скорее всего, будет выполнять только одну из запускаемых блоком программ.
В качестве сигналов используем просто счёт секунд (для него создайте переменную Счёт), который будет делать контроллер Arduino в роботе и отправлять его на компьютер. Алгоритм передачи сигнала для Arduino:
  1. Начало
  2. Повторять всегда:
  • Отправить сообщение в режиме загрузки message со значением Счёт
  • Изменить Счёт на 1
  • Подождать 1 секунду
Алгоритм приёма полученного сигнала компьютером, записи в переменную Показать (должна быть создана) и вывода его персонажем на экран с помощью команды Сказать:

При получении сообщения message в режиме загрузки:

  1. Задать для Показать значение сообщение в режиме загрузки message значение

1. Начало

2. Повторять всегда:

  • Сказать Показать
Загрузив в контроллер его программу и запустив программу персонажа, можно увидеть, что персонаж говорит полученное с контроллера значение, но с двумя знаками после запятой (не 87, а 87.00).
Примечание: у автора программа корректно работала только когда была включена вкладка Устройства
Уберём знаки после запятой, использовав блок округлить из раздела Оператор. Исправим программу для получения сообщения:

При получении сообщения message в режиме загрузки:

  1. Задать для Показать значение округлить сообщение в режиме загрузки message значение

Передача информации с модуля Bluetooth на Arduino и на компьютер

  1. Для того, чтобы убедиться, что модуль Bluetooth и приложение Bluetooth на смартфоне или планшете (с которого будем управлять роботом) передают команды роботу и узнать, какие именно команды, передадим их на компьютер и выведем на монитор (в виде переменной и их будет говорить персонаж), схема передачи команд:
Переименуйте переменную Счёт в Приём
Алгоритм приема команд с Bluetooth модуля для Arduino и передачи их на компьютер:
  1. Начало
  2. Bluetooth HC-05 RxD|TX: 11, TxD|RX: 10 Baudrate 9600 // подключить Bluetooth модуль на пины 11 и 10 со скоростью передачи 9600
  3. Повторять всегда:
  • Если HC-05 receiving data: // если пришло сообщение на модуль
  • Read data from HC-05 // прочитать сообщение с модуля
  • Задать для Приём значение HC-05 data received // записать в переменную Приём то, что пришло с модуля Bluetooth
  • Отправить сообщение в режиме загрузки message со значением Приём // отправить на компьютер значение переменной Приём
Программа, реализующая данный алгоритм:
Примечание: у автора, чтобы загрузить код, приходилось отсоединять Bluetooth модуль от робота. Для используемых в программе пинов 10 и 11 - Bluetooth модуль подсоединен на контроллере к разъёму номер 1 (находится над USB разъемом)
2. Приём сообщения персонажем – код аналогичен реализованному ранее.
3. Для передачи сообщения на Bluetooth модуль робота используем смартфон или планшет под Android (система Apple не взаимодействует с Bluetooth модулями HC, используемыми в роботе). Можно использовать любое приложение (есть даже приложения, обеспечивающее голосовое управление), но для удобства управления роботом лучше найти приложение, обеспечивающее движения вперёд, назад, вправо, влево и диагональные движения:
Данному требованию удовлетворяет, например, приложение Arduino car, его можно найти в Google Play по этому названию, логотип приложения:
Если данное приложение еще не установлено на Ваш смартфон или планшет - установите его.
4. Подключите Bluetooth модуль робота к телефону. Для этого включите питание робота (Bluetooth модуль должен быть подключен), зайдите в настройки телефона, зайдите в настройки Bluetooth и включите Bluetooth. В доступных устройствах должно появиться устройство HC-06. Нажмите на это устройство и введите PIN-код 1234, установите сопряжение.
Примечание: если включено несколько роботов с Bluetooth модулями одновременно, все они появятся в списке, поэтому, чтобы “подружить” с телефоном именно своего робота, лучше попросить коллег выключить их роботов и подсоединять роботов к телефонам по очереди.
5. Запустите приложение Arduino car. Вы увидите на экране смартфона/планшете что-то подобное:
6. Нажмите на кнопку BLUETOOTH CONNECTED слева сверху.
Примечание: на случай, если к телефону подключалось несколько роботов, чтобы различать их модули, рекомендуется на модуле написать их отличительные цифры, которые Вы увидите после нажатия на джойстик - индивидуальное имя данного модуля, например, 00:23:09:01:10:01. Первые четыре символа часто повторяются, поэтому автор для отличия Bluetooth модулей друг от друга пишет на модуле последние 4 символа, например, для модуля из примера это 10:01
7. Нажмите на имя Bluetooth модуля Вашего робота и дождитесь его подсоединения. Вы услышите на телефоне голосовое сообщение “Bluetooth connected” (звук на телефоне должен быть включен)
Примечание: если Вы не услышали данного сообщения, попробуйте отключить и снова подключить Bluetooth модуль к роботу и повторить попытку подключения к приложению.
8. Запустите на компьютере в mBlock ранее написанную программу
Примечание: напоминание, что для корректной передачи данных Вы должны находиться на вкладке Устройства. Персонаж на экране должен говорить коды при нажатии на кнопки на экране телефона
9. Составим таблицу кодов, полученных по Bluetooth для базовых кнопок управления направлениями:
Примечание: Данные числа - коды передаваемых приложением букв F, B, L, R, S в таблице символов ASCII

Управление перемещением робота по Bluetooth

Мы можем написать программу, аналогичную ранее написанной программе управления с компьютера, просто поменяв коды - вместо 1, 2, 3, 4 и 5 используем те числа, которые передает роботу Bluetooth приложение. Также в начале программы зададим пины для управления моторами и опрос Bluetooth модуля:

  1. Начало
  2. Задать для Мотор левый Направление значение 4
  3. Задать для Мотор правый Направление значение 7
  4. Задать на 4 значение “низкий”
  5. Задать на 7 значение “низкий” // как показал опыт, для корректной работы робота в режиме Загрузка требуется один раз подать уровень на номер пина, а не на переменную
  6. Задать для Мотор левый Скорость значение 5
  7. Задать для Мотор правый Скорость значение 6
  8. Задать для Скорость Левая значение 150
  9. Задать для Скорость Правая значение 150
  10. Bluetooth HC-05 RxD|TX: 11, TxD|RX: 10 Baudrate 9600
  11. Повторять всегда:
  • Если HC-05 receiving data:
  • Read data from HC-05
  • Задать для Приём значение HC-05 data received
  • Отправить сообщение в режиме загрузки message со значением Приём // этот блок используется для отладки, потом для более быстрой реакции робота на команды его можно убрать
  • Если Приём = 70:
  • Вперёд
  • Если Приём = 66:
  • Назад
  • Если Приём = 76:
  • Влево
  • Если Приём = 82:
  • Вправо
  • Если Приём = 83:

Стоп

Алгоритмы для функций такие же, как использовали ранее:

Определить Вперёд:

  1. Задать на Мотор левый Направление значение “высокий”
  2. Задать на Мотор правый Направление значение “высокий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая

Определить Назад:

  1. Задать на Мотор левый Направление значение “низкий”
  2. Задать на Мотор правый Направление значение “низкий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая

Определить Влево:

  1. Задать на Мотор левый Направление значение “низкий”
  2. Задать на Мотор правый Направление значение “высокий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая

Определить Вправо:

  1. Задать на Мотор левый Направление значение “высокий”
  2. Задать на Мотор правый Направление значение “низкий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая

Определить Стоп:

  1. Установить на порт Мотор левый Скорость ШИМ 0
  2. Установить на порт Мотор правый Скорость ШИМ 0
Загрузите программу в робота и убедитесь, что робот двигается по 4 основным направлениям, когда Вы нажимаете стрелки на экране телефона в приложении.

Управление перемещением робота по Bluetooth - 8 направлений

Для повышения перемещения мы часто используем не движение с поворотом вокруг своей оси (например, автомашина, когда поворачивает). Робот, который имеет возможность двигаться не только вперед, назад и разворачиваться на месте, но и двигаться по дуге, будет более маневренным, за счет этого лучше выполнять свои задачи.

  1. В приложении Arduino car движения по дуге реализуются, когда Вы нажимаете сразу две кнопки направлений. Например, при одновременном нажатии кнопок Вперёд и Вправо приложение отправляет на робота код, приняв который, робот должен двигаться в направлении вперёд, смещаясь при этом вправо. Запустим приложение и добавим в таблицу 4 направления и их коды:
2. Очевидно, что нужно добавить еще 4 функции направлений движения, которые будут запускаться при получении роботом соответствующих сообщений (71, 72, 73 или 74). Через раздел Мои блоки сделайте еще 4 функции:

Вперёд Влево

Вперёд Вправо

Назад Влево

Назад Вправо

3. Доработаем алгоритм управления, добавив запуск еще 4 “диагональных” направления при получении соответствующих кодов с Bluetooth модуля:
  1. Начало
  2. Задать для Мотор левый Направление значение 4
  3. Задать для Мотор правый Направление значение 7
  4. Задать на 4 значение “низкий”
  5. Задать на 7 значение “низкий”
  6. Задать для Мотор левый Скорость значение 5
  7. Задать для Мотор правый Скорость значение 6
  8. Задать для Скорость Левая значение 250
  9. Задать для Скорость Правая значение 250
  10. Bluetooth HC-05 RxD|TX: 11, TxD|RX: 10 Baudrate 9600
  11. Повторять всегда:
  • Если HC-05 receiving data:
  • Read data from HC-05
  • Задать для Приём значение HC-05 data received
  • Отправить сообщение в режиме загрузки message со значением Приём // этот блок используется для отладки, потом для более быстрой реакции робота на команды его можно убрать
  • Если Приём = 70:
  • Вперёд
  • Если Приём = 66:
  • Назад
  • Если Приём = 76:
  • Влево
  • Если Приём = 82:
  • Вправо
  • Если Приём = 83:
  • Стоп
  • Если Приём = 71:
  • Вперёд Влево
  • Если Приём = 73:
  • Вперёд Вправо
  • Если Приём = 72:
  • Назад Влево
  • Если Приём = 74:
  • Назад Вправо
Программа получилась достаточно сложная, но в соревнованиях управляемых роботов, таких как Футбол и Гонки, такое управление даёт преимущество за счёт лучшей управляемости роботов.
4. Испытайте написанную программу, попробовав управлять движениями робота с помощью приложения на смартфоне/планшете. Если робот движется слишком быстро - уменьшите левую и правую скорость, если едет не по прямой, а забирает в сторону – уменьшите скорость стороны, противоположной той, в которую поворачивается робот, после чего загрузите программу снова.
5. Как реализуется движение по “диагональным” направлениям? Ниже приведена таблица и диаграммы с пояснениями.
Графическое представление скоростей (большая и малая стрелки) для наглядности:

Движение Вперёд Влево:

Движение Вперёд Вправо:

Запомните принцип: уменьшаем скорость той стороны, в которую робот должен повернуть.
6. Таким образом, движения Вперёд Влево и Вперёд Вправо - это движения вперёд (то есть направления обоих моторов - вперёд), но на моторы подаётся разная скорость. Чтобы не создавать еще две новые переменные, просто делим скорости мотора, который должен крутится медленнее, на определённое число (от него зависит крутизна поворота):

Определить Вперёд Влево:

  1. Задать на Мотор левый Направление значение “высокий”
  2. Задать на Мотор правый Направление значение “высокий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая / 2
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая

Определить Вперёд Вправо:

  1. Задать на Мотор левый Направление значение “высокий”
  2. Задать на Мотор правый Направление значение “высокий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая / 2
Создадим эти две функции в mBlock:
7. Аналогично сделаем алгоритмы и программы для направлений Назад Влево и Назад Вправо:

Определить Назад Влево:

  1. Задать на Мотор левый Направление значение “низкий”
  2. Задать на Мотор правый Направление значение “низкий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая / 2
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая

Определить Назад Вправо:

  1. Задать на Мотор левый Направление значение “низкий”
  2. Задать на Мотор правый Направление значение “низкий”
  3. Установить на порт Мотор левый Скорость ШИМ Скорость левая
  4. Установить на порт Мотор правый Скорость ШИМ Скорость правая / 2
8. Загрузите программу в робота, запустите его и убедитесь, что робот двигается по всем 8 направлениям.
9. По возможности проведите испытания роботов в соревновании Гонки, Футбол или тому подобных (можно даже устроить небольшую битву роботов).
Made on
Tilda