Как собрать MindCub3r из набора LEGO MINDSTORMS EV3
- Инструкция по сборке v1.0 (Набор EV3 31313): загрузить
- Инструкция по сборке v1.1 (Набор EV3 Education 45544+45560): загрузить
- EV3 Программа для Color Sensor RGB Block v1.00: смотреть далее
- EV3 Основная программа: смотреть далее
MindCub3r – робот, которого можно собрать из одного набора LEGO MINDSTORMS EV3 Обычная версия (31313) или из наборов EV3 Education Core и Expansion sets (45544+45560).
Этот робот способен полностью решить и правильно собрать известную головоломку Кубик Рубика (Rubik’s Cube puzzle).
Все программы для MindCub3r будут правильно работать с прошивкой LEGO firmware v1.06H (home) или v1.06E (Education), а также с последующими новыми версиями прошивок.
Рекомендуется всегда обновлять программное обеспечение центрального блока EV3 ( прошивку) до самой последней официальной версии от LEGO.
Аккуратно соберите робота по инструкции Инструкция по сборке (Обычная версия EV3 31313) или Инструкция по сборке (Образовательная версия EV3 Education 45544) , затем загрузите и установите программное обеспечение, как описано далее.
Программное обеспечение MindCub3r состоит из трех частей:
- Файл проекта: MindCub3r-v1p8.ev3 or MindCub3r-Ed-v1p8.ev3, который содержит программу управления моторами и сенсорами.
Она создана в стандартном визуальном редакторе программ и проектов LEGO MINDSTORMS EV3 - Дополнительная запускаемая программа: mc3solver-v1p8.rtf, которая написана на C++ и реализует более эффективный и быстрый алгоритм решения головоломки, чем тот, который использовался для предыдущей версии NXT MindCuber ( для набора LEGO NXT)
- Приложение для EV3: “MC3 Solver v1p8”, которое используется для запуска программы mc3solver-v1p8.rtf
The main program and mc3solver-v1p8.rtf executable program communicate with each other via shared files on the EV3.
Примечаниеe: Файл v1p8 использует расширение .rtf для возможности загрузки его в блок EV3 с помощью стандартного программного обеспечения LEGO MINDSTORMS EV3 для персонального компьютера.
Расширение .rtf , которое обычно используется для текстовых файлов, в данном случае применяется к запускаемой программе, в качестве альтернативы.
Пожалуйста, не открывайте этот файл с помощью обычного текстового редактора.
MindCub3r использует датчик EV3 color sensor (сенсор цвета) в режиме RGB, чтобы сделать возможным распознавание тех оттенков цветов, которые обычно не определяются в стандартном режиме сенсора, по умолчанию используемом в программном обеспечении LEGO MINDSTORMS EV3 .
Программа Color Sensor RGB Block должна быть импортирована в программное обеспечение LEGO MINDSTORMS EV3 для персонального компьютера, чтобы поддерживать режим RGB для сенсора.
USB подключение EV3 к ПК
В комплект базового или домашнего набора Lego EV3 входит USB кабель типа «USB — miniUSB». Этот кабель предназначен для прямого соединения компьютера с роботом. Нужно включить модуль EV3 и вставить разъем miniUSB в порт модуля. USB разъем необходимо соединить с USB портом персонального компьютера.
подключение по USB
Подключение EV3 к компьютеру остается самым надежным видом соединения. Основным недостатком такого соединения является небольшая длина соединительного кабеля. Кабель не дает возможности на большом расстоянии заливать программу в робота и производить отладку программы.
2. Инфракрасный датчик. Режим «Приближение»
Этот режим работы инфракрасного датчика похож на режим определения расстояния ультразвуковым датчиком. Разница кроется в природе световых волн: если звуковые волны отражаются от большинства материалов практически без затухания, то на отражение световых волн влияют не только материалы, но и цвет поверхности. Темные цвета в отличие от светлых сильнее поглощают световой поток, что влияет на работу инфракрасного датчика. Диапазон работы инфракрасного датчика также отличается от ультразвукового — датчик показывает значения в пределах от 0 (предмет находится очень близко) до 100 (предмет находится далеко или не обнаружен). Еще раз подчеркнем: инфракрасный датчик нельзя использовать для определения точного расстояния до объекта, так как на его показания в режиме «Приближение» оказывает влияние цвет поверхности исследуемого предмета. В свою очередь это свойство можно использовать для различия светлых и темных объектов, находящихся на равном расстоянии до робота. С задачей же определения препятствия перед собой инфракрасный датчик справляется вполне успешно.
Решим практическую задачу, похожую на Задачу №14 Урока №7 , но, чтобы не повторяться, усложним условие дополнительными требованиями.
Задача №17: написать программу прямолинейно движущегося робота, останавливающегося перед стеной или препятствием, отъезжающего немного назад, поворачивающего на 90 градусов и продолжающего движение до следующего препятствия.
У робота, собранного по инструкции small-robot-31313 , впереди по ходу движения установлен инфракрасный датчик. Соединим его кабелем с портом «3» модуля EV3 и приступим к созданию программы.
Рассмотрим программный блок «Ожидание» Оранжевой палитры, переключив его в Режим: — «Сравнение» — «Приближение» (Рис. 3) . В этом режиме программный блок «Ожидание» имеет два входных параметра: «Тип сравнения» и «Пороговое значение» . Настраивать эти параметры мы уже умеем.
- Начать прямолинейное движение вперед
- Ждать, пока пороговое значение инфракрасного датчика станет меньше 20
- Прекратить движение вперед
- Отъехать назад на 1 оборот двигателей
- Повернуть вправо на 90 градусов (воспользовавшись знаниями Урока №3, рассчитайте необходимый угол поворота моторов)
- Продолжить выполнение пунктов 1 — 5 в бесконечном цикле.
Попробуйте решить Задачу № 17 самостоятельно, не подглядывая в решение.
А теперь для закрепления материала попробуйте адаптировать решение Задачи №15 Урока №7 к использованию инфракрасного датчика! Получилось? Поделитесь впечатлениями в комментарии к уроку.
Run it Again
Use the Brick Buttons and navigate to the File Manager tab. Open the BrkProg_SAVE folder, select Try and click the center button to run it again.
Коммуникационный интерфейс
Всем кому по тем или иным причинам не подходит разработка с помощью готовых API, описанных выше, придётся возиться с коммуникационным интерфейсом. Протокол общения между модулем LEGO MINDSTORMS EV3 и любым типом подключаемого устройства одинаковый для разных типов подключения: Bluetooth, USB или WiFi. Чтобы его освоить, нужно изучать официальную документацию или анализировать API для .NET, описанный выше.
Официальную документацию можно найти на странице загрузок 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. Здесь я буду приводить примеры кода на языке Java для Android-приложения. Для начала рассмотрим самый простой пример, в котором по нажатию на кнопку мы подключаемся к EV3 и посылаем команду для проигрывания звука:
Подключение к EV3 производится во всех средах разработки и операционных системах по-разному, поэтому я не буду на этом останавливаться.
Сразу скажу, что в статье я не буду описывать все возможные команды и ответы, для этого есть официальная документация. Но я опишу сообщения, которые используются в примерах.
Итак, обратим внимание на сообщение, которое мы передали модулю EV3. В восьмеричной системе переданный массив байт будет выглядеть так: 0E00 0000 80 0000 94 0102 82 E803 82 E803. Первые два байта 0x0E00 – это размер сообщения в байтах (тип unsigned short), но без учёта этих двух байтов, т.е. если, как в примере, после первых двух байт идёт 14 байтов, то сюда записываем 14 (0x0E в восьмеричной системе). Младший байт записывается первым (порядок байт Little Endian).
Следующие 2 байта 0x0000 – это порядковый номер сообщения. Например, для первого сообщения нужно передавать 0, для второго – 1, и так далее по порядку. Если число достигнет максимума, т.е. 65535 (0xFFFF), можно начинать снова с нуля. Номер сообщения пригодится вам для идентификации ответа, ведь ответ будет пронумерован тем же порядковым номером, что и сообщение, для которого он получен. Порядок байт здесь тоже Little Endian.
Следующий байт – это тип команды или команд. Здесь возможны следующие варианты: 0x01 – системная команда, требуется ответ; 0x81 – системная команда, ответ не требуется; 0x00 – прямая команда или команды, требуется ответ; 0x80 (как в примере) – прямая команда или команды, ответ не требуется.
Остальные байты будут разными для разных типов команд. Для системных команд следующий байт обозначает команду, например, 0x92 – начало загрузки файла на EV3 (BEGIN_DOWNLOAD), 0x9E – запись в почтовый ящик (WRITEMAILBOX) и т.п. А затем идут байты специфичные для каждой системной команды.
Для прямых команд, как в примере, следующие два байта (в примере – это 0x0000 ) показывают, сколько места для локальных и глобальных переменных вы хотите зарезервировать. В примере мы не ждём ответа, поэтому место не резервируется. Формат здесь такой: в младших 10-ти битах здесь хранится количество байт выделенных для глобальных переменных, а в 6-ти старших битах – для локальных. С помощью глобальных переменных вы будете получать ответы от EV3. Если в сообщении у вас две команды, то нужно зарезервировать место для двух глобальных переменных, если три, то для трёх переменных и т.д. После получения ответа вы сможете считать результат из этих переменных. Подробнее об этом будет написано ниже.
В остальных байтах содержится одна команда или несколько команд идущих друг за другом. Первый байт – это сама команда, в примере, указана команда 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 . Быстро пробежимся по значениям этих байтов:
-
-
-
- 0x0D00 – это размер сообщения;
- 0x0100 – порядковый номер сообщения (номер 1);
- 0x00 – тип команды (прямая команда, требуется ответ);
- 0x0400 – сколько байт резервируется для переменных (здесь резервируется 4 байта для одной глобальной переменной);
- 0x99 – команда для работы с устройствами ввода (opInput_Device), дальше идут параметры команды:
- 0x1D – специфический параметр команды обозначающий, снятие замера с устройства ввода в международных единицах измерения;
- 0x00 – номер модуля EV3 (если у вас соединено несколько модулей, то используем значения от 0 до 3);
- 0x00 – номер порта (от 0 до 3: 0 обозначает 1-й порт, 1 – 2-й и т.д.);
- 0x00 – тип подключенного к порту устройства (0 – означает, что тип менять не нужно) (таблицу с типами устройств и режимами датчиков можно найти в п. 5 «Device type list» документа EV3 Firmware Developer Kit);
- 0x02 – режим датчика (2 – означает режим измерения цвета);
- 0x01 – количество возвращаемых переменных (в данном случае – одна переменная);
- 0x60 – обозначает индекс глобальной переменной, в которую будет записан результат измерения (число 0x60 обозначает, что переменная глобальная с индексом 0).
Число, указывающее индекс глобальных переменных строится сложным образом. Если значение индекса меньше 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).
Теперь посмотрим, что приходит в ответ. В восьмеричном формате ответ в примере будет выглядеть так: 0700 0100 02 0000A040 . В ответном сообщении, точно так же как и в исходящем сообщении, первые два байта будут указывать размер сообщения. Затем следуют два байта – порядковый номер (в нашем случае номер 1), а пятый байт — будет содержать тип результата: 0x03 – системная команда выполнена успешно, 0x05 – системная команда выполнена с ошибкой, 0x02 – прямая команда (или команды) выполнена успешно, 0x04 – прямая команда (или команды) выполнена с ошибкой.
Следующие байты для системных и прямых команд будут разными. Для системных команд, после байта с результатом, идёт байт обозначающий команду, для которой был дан ответ, в следующем байте статус выполнения команды, а затем байты специфичные для каждой системной команды.
Для прямых команд следующие байты – это пространство глобальных переменных. В нашем примере здесь только одна переменная имеющая значение 0x0000A040 (тип переменной float). Если бы мы вызывали несколько команд, то здесь было бы больше переменных, идущих друг за другом. В нашем примере в переменной приходит номер цвета от 1 до 7 или 0, если цвет не определён.
Для того, чтобы было проще записывать сообщения в поток в Java, я написал следующие функции:
Используя эти функции, сообщение, которое мы отправляли в первом примере, можно будет отправить так:
Как видите, с помощью функций, байт-код, отправляемый на EV3, стал понятным и удобным. А сообщение из второго примера теперь можно отправить так:
Теперь давайте с помощью этих функций рассмотрим ещё несколько примеров. Вот пример, в котором одновременно запускаются два двигателя, подключенных к порту B и C, делают 3 оборота, причём последние пол оборота двигатели постепенно замедляются:
А здесь мы узнаём, какие датчики и моторы подключены к EV3, и к каким портам (здесь описана лишь часть возможных вариантов, полный перечень см. в описании прошивки «EV3 Firmware Developer Kit» в пункте 5 «Device type list»):
Вот, собственно, и всё, что я хотел написать. Если у вас будут какие-то вопросы, задавайте их в комментариях.
С помощью описанного в статье коммуникационного интерфейса вы сможете сделать удалённое управление модулем EV3 для любых операционных систем на любых языках программирования. А разработчики .NET, iOS и Node.js смогут использовать уже готовые API.
Надеюсь, что в статье я дал достаточное количество знаний для старта. Возможно, кто-нибудь благодаря этой статье, сделает удобный пульт управления для смартфона или компьютера, или создаст API для ещё какого либо языка программирования или платформы. Своими разработками или замечаниями можете поделиться с помощью комментариев.
Снимки экрана
- Компьютер
- Для мобильных устройств
Робототехника дистанционно?
Последние два месяца самыми актуальными вопросами для преподавателей образовательной робототехники являются вопросы «Как работать?»
Я еще несколько лет назад начала рассматривать разные варианты для возможности проведения занятия по робототехнике с детьми 7-13 лет не только с реальными конструкторами, но и с использованием разных симуляторов и других инструментов. Нельзя сказать, что выбор доступных средств достаточно широк. Однако, за последнее время мы видим тенденцию развития данных направлений. Появляются новые платформы. Уже существующие платформы снижают плату за свое использование или делают использование бесплатным на определенный период.
Техническая поддержка по сериям решений
Исследуйте наши планы занятий комплексные STEM, Maker, программирование, информатика, социальное и эмоциональное развитие, и более! Уроки практики, имеют различные уровни сложности и продолжительности от 30 до 120 минут.
Часы работы: с Понедельника по Пятницу, с 09:00 до 18:00
Телефон: 8 495 120 21 86
-
-
-
-