Lego mindstorms управление bluetooth
Роботы LEGO NXT серии Mindstorms получили широкое распространение в качестве устройств для апробации алгоритмов управления робототехническими средствами. Целью работы являлось исследование удаленного управления роботом посредством Bluetooth-соединения. Проведено тестирование возможностей встроенного в робота LEGO NXT модуля беспроводной связи CSR BlueCore 4 v2.0. Тестирование осуществлялось пересылкой пакетов данных различной длины по беспроводному каналу между роботом и компьютером. Полученные результаты затем сравнивались с показателями, требующимися для решения реальных задач. Поставленный эксперимент наглядно продемонстрировал, что имеющийся в роботе Bluetooth-модуль нe обеспечивает достаточной скорости передачи данных. В работе предложено переносить требовательные ко времени реакции задачи с компьютера на управляющий микроконтроллер робота с целью обойти ограничения беспроводного канала связи в задаче управления роботом в реальном времени.
В настоящее время роботы Mindstorms NXT компании LEGO нашли самое широкое применение в учебном процессе в высших учебных заведениях. Роботы используются при проведении различных соревнований по мехатронике, робототехнике и искусственному интеллекту. Ежегодно проводится до 100 крупных соревнований международного уровня, самым крупным из которых является WRO (World Robot Olympiad — Всемирная олимпиада роботов). В России крупнейшим мероприятием подобного уровня являются ежегодные соревнования Робофест. Большое развитие получило движение робототехнических кружков.
Распространенность и популярность роботов NXT серии Mindstorms обоснована, в первую очередь, их доступностью широкому кругу пользователей. Процесс программирования и сборки роботов был максимально упрощен компанией LEGO. Сборка конструкции робота осуществляется с помощью универсальных строительных блоков. Написание управляющей программы возможно с использованием простых и наглядных в освоении графических языков, например NXT-G, а также более серьезных графических и процедурных языков, таких как LabView или С. Инженеры LEGO создали модульный конструктор с большими возможностями для построения как простых, так и сложных роботов. Исходные тексты управляющей программы, описания протоколов, а также полное описание внутренней архитектуры находятся в открытом доступе, что открывает широкое поле для деятельности конструкторам и любителям со всего мира. В связи с этим роботы LEGO нередко используются для апробации различных алгоритмов управления робототехническими устройствами.
Аппаратное устройство робота Lego NXT
Управляющий блок робота, так называемый брик, оснащен управляющим микроконтроллером AT91SAM7S256 производства корпорации Atmel на базе 32-битного микропроцессора ARM7. В табл. 1 приведены основные характеристики микроконтроллера.
ARM7TDMI 32-битный, RISC- архитектура
Объем внутренней Flash-памяти
Объем внутренней SRAM-памяти
Таблица 1. Основные характеристики AT91SAM7S256
Определяет до шести различных цветов: синий, зеленый, красный, желтый, белый и черный
Определяет уровень яркости
Реагирует на нажатие на кнопку
Измеряет расстояние в диапазоне от 9 до 75 см
Измеряет громкость звука
Позволяет определить направление Севера
Определяет ускорение и направление движения робота
Таблица 2. Основные типы датчиков робота LEGO NXT
Объем внутренней RAM- памяти
Объем внешней Flash- памяти
Таблица 3. Характеристики модуля CSR BlueCore 4 v2.0 и EDR System
На рис. 1 представлена структурная схема, которая иллюстрирует взаимосвязь всех компонент робота.
Рис. 1. Структурная схема робота LEGO NXT
Способы управления роботом Lego NXT
Аппаратное и программное обеспечение Lego NXT, представленное прошивкой LEGO MINDSTORM Firmware 1.28, позволяют осуществлять управление роботом тремя возможными способами.
воспитательная: воспитывать трудолюбие и стремление добиваться выполнения поставленной задачи.
Оборудование: компьютер, конструктор Lego Mindstorms EV3, проектор, smart доска.
Ход занятия
Организационный момент.
Блиц опрос.
Какую функцию в среде программирования Lego Mindstorms EV3 выполняет компонент Мой блок?
Какую функцию выполняет ультразвуковой датчик?
3) В каких режимах может работать датчик цвета?
4) Какую зубчатую передачу называют повышающей?
5) Какие виды циклов вы знаете?
Изучение нового материала.
О способах дистанционного управления.
На сегодняшний день для конструкторов Lego Mindstorms EV3 наиболее популярными являются 3 способа дистанционного управления:
С помощью ИК датчика и ИК пульта (удаленного маяка).
Чтобы все успешно работало: на маяк нужно поставить 2 батарейки типа ААА, а в модуль EV3 робота нужно загрузить составленную программу и запустить на выполнение. Способ хороший и надежный, но датчик и маяк нужно отдельно купить.
Использование бесплатных программ: Robot Commander, RemotEV3, для управления роботом по Bluetooth с телефона (или планшета).
Скачиваем программу с Play Market и устанавливаем. Включаем Bluetooth на телефоне (планшете) и на модуле EV3 нашего робота, делая их видимыми. Сопрягаем устройства между собой.
Управление роботом простое. Можно менять направление движения, но не скорость (мощность).
Использование пульта управления по Bluetooth из расширенного набора Lego Mindstorms EV3.
Пульт получается громоздким (инструкция состоит из 76 шагов). А программы для пульта и управляемого робота необходимо настроить.
В качестве альтернативы к 3 варианту можно предложить более компактный пульт управления, состоящий только из 5 кнопочного переключателя.
Главный модуль
Присваиваем нашему модулю имя EV3_2 (теперь это будет главный модуль) и загружаем в него программу EV3_2:
Подчиненный модуль
Присваиваем модулю на роботе имя EV3 (теперь это будет подчиненный модуль) и загружаем в него программу EV3:
Сопрягаем модули (EV3_2 и EV3) главный и управляемый.
На модуле EV3_2 заходим в общие настройки, выделяем пункт Bluetooth и открываем настройки Bluetooth.
Важно обратить внимание, чтобы активным было свойство Visibility (видимость). Далее выбираем и открываем пункт Connections (связь) и в нем пункт Search (поиск), чтобы главный модуль обнаружил управляемый (потребуется немного подождать). При обнаружении название модуля отобразится!
Далее, аналогичную процедуру нужно проделать и на управляемом модуле EV3, чтобы он обнаружил главный модуль EV3_2.
Таким образом сопряжение модулей будет выполнено!
Запуск робота по Bluetooth.
Осталось сделать самое простое - проверить работу Bluetooth соединения.
Размещаем управляемого робота в удобном месте. Запускаем на главном модуле (его вы держите в руках) программу EV3_2, а на управляемом роботе программу EV3 и можно управлять роботом с помощью пульта ДУ.
Подведение итогов.
Оценка деятельности обучающихся.
Вопросы по проведённому занятию:
а) Что вызвало у вас наибольшие затруднения при работе?
б) Какой полезный вывод можете сделать для себя?
в) Где вы смогли бы применить знания, полученные на сегодняшнем занятии?
Во-первых нужно создать подходящего робота на базе двух моторов с рулевым управлением и средним мотором, как на фото выше. Можно сделать гоночный болид с управлением влево-вправо с помощью среднего мотора.
В состав стандартных наборов обычно входят два Больших мотора (сервомотора, серводвигателя) и один Средний мотор. Большой мотор содержит в себе встроенный датчик вращения с разрешением в 1 градус для точного контроля угла вращения. Большой мотор оптимизирован для приводных механизмов роботизированных платформ различных видов и назначений.
- Скорость вращения большого мотора 160 – 170 оборотов в минуту
- Вращающий момент 20 ньютон/метр
- Пусковой момент 40 ньютон/метр, то есть медленнее, но мощнее. Еще вращающий момент называют крутящий момент или момент силы
Большой мотор поддерживает автоматическую идентификацию с программным обеспечением EV3. Двигатели можно соединять с любыми выходными портами A, B, C, D. По умолчанию большие моторы подключаются к портам B и C.
Средний мотор — это достаточно точный мотор, который реагирует на команды более точно и быстро, чем большой мотор. Его размер меньше чем у большого мотора и нет встроенного редуктора, за счет этого его мощность не очень большая. Он также содержит в себе встроенный датчик вращения с разрешением в 1 градус для точного контроля угла вращения. Средний мотор чаще всего используется для каких-либо захватов, различных типов передач.
- Скорость вращения среднего мотора 250 – 260 оборотов в минуту
- Его вращающий момент 8 ньютон/метр
- Пусковой момент 12 ньютон/метр, то есть работает быстрее, но с меньшей мощностью
Средний мотор также поддерживает автоматическую идентификацию с программным обеспечением EV3. Как и большой мотор EV3 его можно соединять с любыми выходными портами A, B, C, D. По умолчанию средний мотор подключаются к порту А.
Когда соберете подобного робота, необходимо Программное обеспечение LEGO MINDSTORMS Education EV3. По поиску его не трудно найти, но оно громоздкое, поэтому выкладывать здесь не буду. А дальше подключаете вашего робота-машину через USB к компьютеру и включаете его. Запущенная программа LEGO MINDSTORMS Education EV3, должна его обнаружить.
Прежде чем начинать программировать подключение по Блютуз, вам необходимо скачать на телефон или планшет с Play Market, Microsoft Store или с AppStore следующую программу: EV3 Numeric Pad Plus. Запущенная она выглядит вот так:
Подключение к нашему роботу на базе Lego EV3 Mindstorm в программе происходит следующим образом. Во-первых при запуске спросит разрешение включить Блютуз, необходимо включить. Дальше на роботе в меню, находим опцию Bluetooth и ставим галочку на включение, так же проверьте должна стоять галка на опции Visible. Переходим к телефону и нажимаем кнопку Connect. Ждем, и если все правильно подключаемся к роботу, по умолчанию должно выйти имя робота — EV3 (00:16:53:52:C1:3D — эти символы адрес, он у всех разный).
Принцип работы приложения EV3 Numeric Pad следующий: когда вы касаетесь голубого прямоугольника и водите по нему пальцем, вы тем самым передвигаете по нему красную мишень. В это время приложение постоянно передаёт координаты мишени (по осям X и Y) модулю EV3. Координата по оси X – передаётся в диапазоне от -100 до 100 в почтовый ящик с именем «x», а координата по оси Y – тоже передаётся в диапазоне от -100 до 100, но в почтовый ящик с именем «y» (слева сверху отображаются текущие числа переданные EV3). Такая же ситуация с нижней сине-зеленой полоской, но данный только передаются в почтовый ящик «z». Ну и следуя этой логике начинаем выставлять команды в своей программе для робота. Мы с ребятами ставим блок подключение через Блютуз, а затем бесконечный цикл. Все делаем по минимуму пока, главное чтобы заработало. Совершенству нет предела и программе лоск наводить потом можно так же бесконечно, в зависимости от ваших потребностей.
Продолжить можно с помощью блока на Синей вкладке — «Подключение через Bluetooth».
Аналогичная ситуация с поворотами, т.е. передвижением пальца на телефоне по оси «х». Если х<0 то поворот влево, если x>0 то вправо.
Нам осталось прописать команды для среднего мотора, для которого идут данные в ящик «z». Замечу сразу, если вы не рассчитаете обороты мотора, то встретив препятствие и не выполнив до конца команду, робот подвиснет, и пока не остановите его, другие команды выполняться не будут.
Вот у вас получилась самая простенькая программа, которая позволяет управлять моделью Lego EV3 через Bluetooth.
Стандартный робот под управлением блютуз. Можно сделать и другие модельки, гоночного болида.
Эта статья будет интересна тем, кто хочет сделать программу для дистанционного управления роботом EV3 со стандартной заводской прошивкой через Bluetooth, WiFi или USB и не важно, с какого устройства или операционной системы. Здесь мы рассмотрим протокол взаимодействия между модулем EV3 и вашей программой.
Основная идея статьи состоит в том, чтобы приложение могло управлять роботом EV3, со стандартной заводской прошивкой. Т.е. мы не будем рассматривать здесь всевозможные прошивки, которые загружаются с SD-карт, такие как leJOS EV3, ev3dev или MonoBrick EV3 Firmware.
Вот пример, как будет выглядеть подключение к EV3 через USB-кабель:
После этого вы можете управлять моторами, например, вот так:
Устанавливать режим работы датчикам, например, так:
И считывать показания датчиков в трёх разных форматах: Raw (как есть, без изменений), SI (международная система единиц) или проценты. Вот пример получения данных в SI:
Есть даже событие, оповещающее об изменении какого либо свойства EV3, будь то нажатие на кнопку модуля EV3 или изменение значения любого из датчиков. Работает это вот так:
MonoBrick Communication Library
Вот так подключается EV3 через USB:
Так происходит управление моторами:
А можно сразу управлять тележкой или роботом на гусеницах вот так:
Так читаем значения датчиков:
А вот так можно задать режим работы датчиков:
А при работе с подключенными «в гирлянду» несколькими модулями EV3 код будет таким:
legoev3cpp
legoev3cpp - это небольшое кроссплатформенное API для C++ 14. И хотя разработка заявлена как кроссплатформенная, на сегодняшний момент реализована поддержка только iOS. Разработчик приглашает присоединиться к проекту всех заинтересовавшихся. Страничка проекта находится здесь. В папке «Jove's Landing» вы найдёте приложение демонстрирующее использование legoev3cpp.
ev3-Nodejs-bluetooth-Api
Коммуникационный интерфейс
Официальную документацию можно найти на странице загрузок LEGO MINDSTORMS EV3. Здесь вы можете скачать описание прошивки (EV3 Firmware Developer Kit) и комплект разработчика системы передачи данных (LEGO MINDSTORMS EV3 Communication Developer Kit). Эти два документа можно скачать и с нашего сайта:
Описание прошивки LEGO Mindstorms EV3.
Комплект разработчика системы передачи данных LEGO MINDSTORMS EV3.
Все команды, которые вы будете использовать, разделяются на прямые и системные. Прямые команды представляют из себя микропрограммы, состоящие из набора определённых байт-кодов, и выполняются параллельно с работающими пользовательскими программами. Использовать прямые команды нужно очень осторожно, т.к. здесь нет никаких ограничений на использование «опасных» кодов или конструкций, например, здесь возможны блокировки и зацикливания. Однако, в таких случаях, пользовательская программа будет продолжать работать нормально. Описание прямых команд вы сможете найти в первом документе (EV3 Firmware Developer Kit) в разделе 4 (Byte code definition and functionality), а примеры использования – во втором (LEGO MINDSTORMS EV3 Communication Developer Kit) в разделе 4 (Direct Commands).
Системные команды используются для передачи данных в модуль EV3 или из него. Описание этих команд вы можете найти во втором документе (LEGO MINDSTORMS EV3 Communication Developer Kit) в разделе 3 (System Command).
Подключение к EV3 производится во всех средах разработки и операционных системах по-разному, поэтому я не буду на этом останавливаться.
Следующий байт – это тип команды или команд. Здесь возможны следующие варианты: 0x01 – системная команда, требуется ответ; 0x81 – системная команда, ответ не требуется; 0x00 – прямая команда или команды, требуется ответ; 0x80 (как в примере) – прямая команда или команды, ответ не требуется.
Остальные байты будут разными для разных типов команд. Для системных команд следующий байт обозначает команду, например, 0x92 – начало загрузки файла на EV3 (BEGIN_DOWNLOAD), 0x9E – запись в почтовый ящик (WRITEMAILBOX) и т.п. А затем идут байты специфичные для каждой системной команды.
В остальных байтах содержится одна команда или несколько команд идущих друг за другом. Первый байт – это сама команда, в примере, указана команда 0x94 (opSound) – это команда для работы со звуком. В следующих байтах содержатся параметры команды. Первый параметр – это специфический параметр, определяющий, что именно будет делать команда. В примере 0x01 обозначает, что нужно проиграть звук определённой громкости, тональности и продолжительности. Следующие три параметра - это громкость (от 0 до 100), частота (от 250 до 10000) и длительность в миллисекундах.
Параметры передаются следующим образом: если значение параметра является числом меньшим 32, то такой параметр можно передавать в коротком формате, т.е. как есть одним байтом. В остальных случаях используется длинный формат, в котором первый байт определяет тип значения, а само значение идёт в следующих байтах. Вот возможные варианты:
- 0x81 – однобайтовое число unsigned byte или byte, в зависимости от команды (в документации обозначается как Data8);
- 0x82 – двухбайтовое число unsigned short или short, в зависимости от команды (в документации - Data16);
- 0x83 – четырёхбайтовое число unsigned int или int (в документации – Data32);
- 0x84 – строка оканчивающаяся нулём.
Как видите, в примере, первые два параметра 0x01 и 0x02 меньше 32, и поэтому они передаются в коротком формате без указания типа значения, а третий и четвёртый параметры – это двухбайтовые числа имеющие значение 0xE803 и для них задаётся тип 0x82.
Теперь давайте отправим команду на чтение цвета с датчика, подключенного к порту 1, и считаем ответ:
Здесь массив байт, который мы отправили модулю EV3 в восьмеричной системе, выглядит так: 0D00 0100 00 0400 99 1D 00 00 00 02 01 60 . Быстро пробежимся по значениям этих байтов:
Число, указывающее индекс глобальных переменных строится сложным образом. Если значение индекса меньше 32, то индекс можно задать одним байтом вот так: 0x60 & i. Здесь 0x60 – это биты, обозначающие небольшой индекс глобальной переменной, а i – это наш индекс. С помощью такой схемы мы сможем задать индекс от 0 до 31, а байт при этом получится от 0x60 до 0x7F . Если вам нужно указать индекс больше 31, то первый байт будет обозначать тип и размер индекса, а в следующих байтах будет храниться значение индекса. Для значения индекса от 0 до 255 первый байт будет равен 0xE1, а затем следующим байтом будет идти само значение. Для значения от 0 до 65535, первый байт будет равен 0xE2, а в следующих двух байтах нужно задать значение. Для значения индекса больше 65535, первый байт будет равен 0xE3, а в следующих четырёх будет значение.
Подробно об этом написано в разделе 3.4 «Parameter encoding» документа EV3 Firmware Developer Kit. Также в качестве подсказки можно использовать макросы GV0(i), GV1(i), GV2(i) и GV4(i) в файле bytecodes.h, который можно найти в исходных кодах аппаратного ПО (исходные коды можно скачать на странице загрузок LEGO MINDSTORMS EV3).
Следующие байты для системных и прямых команд будут разными. Для системных команд, после байта с результатом, идёт байт обозначающий команду, для которой был дан ответ, в следующем байте статус выполнения команды, а затем байты специфичные для каждой системной команды.
Для прямых команд следующие байты – это пространство глобальных переменных. В нашем примере здесь только одна переменная имеющая значение 0x0000A040 (тип переменной float). Если бы мы вызывали несколько команд, то здесь было бы больше переменных, идущих друг за другом. В нашем примере в переменной приходит номер цвета от 1 до 7 или 0, если цвет не определён.
Теперь давайте с помощью этих функций рассмотрим ещё несколько примеров. Вот пример, в котором одновременно запускаются два двигателя, подключенных к порту B и C, делают 3 оборота, причём последние пол оборота двигатели постепенно замедляются:
А здесь мы узнаём, какие датчики и моторы подключены к EV3, и к каким портам (здесь описана лишь часть возможных вариантов, полный перечень см. в описании прошивки «EV3 Firmware Developer Kit» в пункте 5 «Device type list»):
Вот, собственно, и всё, что я хотел написать. Если у вас будут какие-то вопросы, задавайте их в комментариях.
Надеюсь, что в статье я дал достаточное количество знаний для старта. Возможно, кто-нибудь благодаря этой статье, сделает удобный пульт управления для смартфона или компьютера, или создаст API для ещё какого либо языка программирования или платформы. Своими разработками или замечаниями можете поделиться с помощью комментариев.
Читайте также: