Как добавить дополнительные модули лего ev3. Замени мозги в Lego Mindstorms. Полный аналог микроконтроллера EV3. Аналоговый вход EV3

- Ты кого хотел бы - сына или дочку?
- Сына!
- Почему?
- Вертолёт хочу радиоуправляемый!!!
Несмешной и баянистый анекдот, но нельзя просто так взять и начать эту публикацию не с него – он в лучшем виде отображает суть того, о чём пойдёт речь далее. Впрочем, из заголовка вы и так поняли, о чём речь.

Осторожно! Публикация может вызвать непреодолимое желание завести сына.

Урок истории

Компания LEGO (название произошло от датской фразы «leg godt», «Играй с удовольствием») не нуждается в представлении – она была основана в далёком 1932 году, хотя первые знакомые всем пластиковые кубики появились значительно позже, в 1947. Примечательно, что кубики LEGO, выпускаемые в те годы, полностью совместимы с теми, что выпускаются сейчас.

История создания компании, выпущенная компанией Pixar к 80-летнему юбилею LEGO:

Сейчас компания производит около 20 миллиардов деталек в год, то есть более 630 штук в секунду. В текущем модельном ряду более 600 различных конструкторов и так уж получилось, что серия Mindstorms является своего рода вершиной технической мысли, самым-самым навороченным конструктором. Если вкратце, то она позволяет делать вполне себе полноценных роботов.

Как гласит википедия, серия LEGO Mindstorms была впервые представлена в 1998 году. Через 8 лет (в 2006) на свет появился набор LEGO Mindstorms NXT 1.0, а уже в 2009 - набор LEGO Mindstorms NXT 2.0. Сегодня речь пойдёт о LEGO Mindstorms EV3 – последнем (третьем) поколении терминатора конструктора, который был представлен почти год назад, 4 января 2013 года (в продаже появился только спустя полгода).

Отличия EV3 от NXT 2.0

В принципе, главная идея осталась прежней – серия предназначена для сборки программируемых роботов. Поэтому первым встаёт вопрос, а что же поменялось с момента выхода предыдущего конструктора и стоит ли покупать новый? Основное отличие заключается в обновленных датчиках/моторах и, самое главное, в интеллектуальном блоке EV3 (EV означает EVolution):
Как видите, разница довольно существенна – было бы странным, если бы за 4 года поменяли только разрешение экрана и набор наклеек.

Ещё одно отличие заключается в том, что серия NXT продавалась в нескольких версиях (в разные годы) и представляла собой разные наборы, базовые и ресурсные. У нового EV3 с этим попроще – пока он продаётся в основном варианте – (601 деталь), из которого можно наделать кучу всего. Но при желании можно докупить базовый набор (541 деталь) с дополнительными сенсорами и детальками (использовать детали от обычных конструкторов также никто не мешает). Кстати, обратите внимание на пятизначные артикулы – на такую нумерацию компания перешла в 2013 году.

Что касается совместимости, то тут было проделано всё возможное. Все NXT-сенсоры и моторы совместимы с EV3 и распознаются как NXT. EV3-сенсоры не работают с NXT, но EV3-моторы вроде как совместимы. NXT-кирпичик может быть запрограммирован софтом от EV3, но некоторые функции могут быть недоступны, а вот запрограммировать EV3-кирпичик NXT-софтом без сторонних решений не получится.

Внутри коробки

Ещё когда я сам был маленький и ездил с родителями в центральный Детский Мир (когда он ещё был), на Лубянку – уже тогда я не мог оторвать глаз от коробок с LEGO. Тогда не было ни Гиктаймс, ни даже Хабра, но с тех пор коробки остались всё такими же яркими и сочными, даже во взрослом возрасте активируют процесс слюновыделения) В этом плане другим производителям есть чему поучиться.

Часть коробки, на самом деле, представляет собой (если её разрезать) трассу с различными цветовыми зонами, которую можно использовать для роботов с сенсорами цвета.

Все детальки аккуратно разложены по пакетикам, в комплекте – инструкция и набор наклеек. Давайте вкратце пройдёмся по тому, что положили в комплект.

Сам EV3 , он же интеллектуальный блок, он же сердце системы, он же «кирпичик» или «кубик». Служит центром управления и энергетической станцией для вашего робота и имеет следующие функциональные элементы:

– Многофункциональный монохромный дисплей с разрешением 178х128
– Шестикнопочный интерфейс управления с функцией изменения подсветки (3 цвета) для индикации режима работы
– 4 порта ввода (1, 2, 3, 4) для подключения датчиков
– 4 порта вывода (A, B, C, D) для выполнения команд
– 1 разъём miniUSB для подключения EV3 к компьютеру
– 1 порт USB–хост (для соединения нескольких EV3 в одну цепь, например)
– 1 слот для карт памяти формата microSD (до 32Гб) – для увеличения объёма доступной памяти EV3
– Встроенный динамик

Кубик EV3 также поддерживает Bluetooth, WiFi (через USB-адаптер NETGEAR WNA1100 Wireless-N 150), для связи с компьютерами имеет программный интерфейс, позволяющий создавать программы и настраивать регистрации данных непосредственно на микрокомпьютере EV3.

» Большой EV3-сервомотор (2 штуки) . Cоздан для работы с микрокомпьютером EV3 и имеет встроенный датчик вращения с точностью измерений до 1 градуса. Используя этот датчик, мотор может соединяться другими моторами, позволяя роботу двигаться с постоянной скоростью. Кроме того, датчик вращения может использоваться и при проведении различных экспериментов для точного считывания данных о расстоянии и скорости.

– Встроенный датчик вращения с точностью измерений до 1 град
– Максимальные обороты до 160-170 об/мин
– Максимальный крутящий момент в 40 Нсм

» Средний EV3-сервомотор. Идеален для задач, когда скорость и быстрота отклика, а также размер робота важнее его грузоподъёмности.

– Встроенный датчик вращения с точностью измерений до 1 градуса
– Максимальные обороты до 240-250 об/мин
– Максимальный крутящий момент в 12 Нсм
– Автоматическая идентификация программным обеспечением EV3

» Датчик цвета (EV3). Способен определить 8 различных цветов, хотя также может использоваться как датчик освещённости.

– Измеряет отраженный красный свет и внешнее рассеянное освещение, от полной темноты до яркого солнечного света
– Фиксирует и определяет 8 цветов
– Частота опроса до 1 кГц
– Автоматическая идентификация программным обеспечением EV3

» Датчик касания (EV3). Позволяет роботу реагировать на касания, распознает три ситуации: прикосновение, щелчок и освобождение. Также способен определить количество нажатий, как одиночных, так и множественных.

» Цифровой ИК-датчик (EV3). Для определения приближения робота. Также способен улавливать ИК-сигналы от ИК-маяка, позволяя создавать дистанционно управляемых роботов, навигационные системы для преодоления препятствий.

– Измерения приближения/удаления в радиусе 50-70 см
– Радиус улавливания ИК-сигналов до 2 метров
– До 4 индивидуальных каналов приёма сигнала
– Получение удаленных ИК-команд управления
– Автоматическая идентификация программным обеспечением EV3

» Удалённый инфракрасный маяк. Разработан для использования с ИК-датчиком EV3. Маяк излучает ИК-сигнал, улавливаемый датчиком – может использоваться в качестве пульта дистанционного управления микрокомпьютера EV3, передавая сигналы на ИК-датчик.

– До 4 индивидуальных каналов передачи сигнала (переключатель прямо на корпусе)
– Имеет кнопку и тумблер для включения/выключения
– При работе ИК-маяка горит зелёный светодиод
– Автоматическое отключение при простое более 1 часа
– Радиус действия до 2 метров

В отдельном пакетике смотаны провода для подключения датчиков и моторов к кубику, а также USB-шнур для подключения кубика к компьютеру.

Стоит отметить два важных момента. Во-первых, существуют другие датчики Lego, такие как:

» Гироскопический датчик (EV3). Цифровой гироскопический датчик EV3 позволяет измерять движение вращения робота, а также улавливать изменения в его движении и положении. Режим измерения углов с точностью до ± 3 градуса; встроенный гироскоп улавливает вращения с моментом до 440 град/с; частота опроса до 1 кГц.

» Ультразвуковой датчик (EV3). Генерирует звуковые волны и фиксируюет их отражения от объектов, тем самым измеряя расстояние до объектов. Также может использоваться в режиме сонара, испуская одиночные волны. Может улавливать звуковые волны, которые будут являться триггерами для запуска программ. Измеряет расстояния в пределах от 1 до 250 см, а точность измерений составляет ± 1 см.

А во-вторых, поддерживаются сенсоры и прочие аксессуары от сторонних производителей, таких как HiTechnic и Mindsensors – они предлагают всевозможные джойстики, инфракрасные датчики расстояний, магнитные датчики, компасы, гироскопы, акселерометры, таймеры, мультиплексоры, шаровые опоры, и т.д. Так что, если задаться вопросом, можно найти много всего интересного.

В общем, как вы уже поняли, LEGO – это для реальных пацанов!

Первая модель

В комплекте с конструктором идёт бумажная инструкция, по которой можно собрать одну-единственную модель – некое подобие гусеничной самоходной машины.

Сначала я удивился, ведь даже в самых простых наборах (серии типа LEGO Creator) всегда идёт несколько инструкций, а тут вдруг бумаги пожалели или места в коробке не нашли. Оказалось… что только на официальном сайте из набора деталей предлагается собрать 17 разных роботов! Поэтому 17 инструкций в коробке были бы действительно лишними (и для логистики, и для лесов природы). Вот названия роботов: EV3RSTORM , GRIPP3R , R3PTAR , SPIK3R , and TRACK3R . ROBODOZ3R , BANNER PRINT3R , EV3MEG , BOBB3 , MR-B3AM , RAC3 TRUCK , KRAZ3 , EV3D4 , EL3CTRIC GUITAR , DINOR3X , WACK3M , и EV3GAME – инструкции для них придётся качать из инета, равно как и софт для подключения EV3 к компьютеру.

Инструкция наиподробнейшая, накосячить сложно. Сын сказал , что детали в пакетиках расфасованы не очень удачно – на первой же странице может потребоваться вскрыть 3 разных пакета, но это тоже мелочи.

Кубик EV3 необходимо запитать, для чего можно использовать аккумулятор (нет в комплекте) или 6 пальчиковых батареек. Забегая вперёд – ещё 2 батарейки (но уже мизинчиковых) понадобятся для питания ИК-маяка (он же пульт ДУ).

Первую модель ребёнок (7 лет) собрал примерно минут за 30.

Процесс оказался не таким увлекательным, как, например, сборка моделей LEGO Technics – в инструкции предлагается собрать далеко не самого интересного робота: в нём лишь крупные детали, среди которых были практически все датчики и двигатели – видимо, чтобы продемонстрировать работу каждого из них.

Но вот результат превзошёл все детские ожидания – впервые он собрал модель, которая могла двигаться сама: вперёд-назад, поворот, разворот на месте, крутила щупальцами…

Запуск осуществляется с кубика EV3, для чего следует нажать пару кнопок на лицевой панели. Некоторые действия можно запрограммировать прямо на кубике: выбрать количество итераций, настроить подачу звукового сигнала и так далее – в одной статье всего не рассказать, курите мануалы.

Софт

Программировать через компьютер собранную выше модель не пришлось. Тем не менее, возможность такая есть, при этом на разных уровнях хардкорности.

Ребёнку проще всего будет начать с предлагаемого производителем софта, который есть как под Windows, так и под OS X. Во втором случае дистрибутив весит 666 Мб, а установленное приложение займёт гигабайт. Оно называется LEGO Mindstorms EV3 Home Edition и разработано совместно с небезызвестной компанией LabView . На сайте LEGO довольно много обучающих программированию материалов.

Сразу после запуска перед нами возникает интерактивный «гараж» из роботов, которых можно собрать из набора:




Выбираем понравившегося и начинаем собирать: перед нами появится интерактивная инструкция по сборке, видеоролики, а также подборка различных миссий, которые можно выполнить с собранным роботом. Вот почему дистрибутив весил так много.








Не вижу смысла описывать всё в деталях: вы быстрее скачаете приложение сами и увидите, что там есть и на каком уровне. Разве что упомяну один из недостатков, который мне больше всего запомнился: не самый дружелюбный (особенно для детей) интерфейс – от приложения попахивает каким–то банк-клиентом.

Нельзя ещё раз не отметить, что кубиком EV3 можно управлять со смартфона на операционных системах Android или iOS, для чего есть отдельные приложения.

Если всего этого оказалось мало, можете повысить градус хардкора. Для кубика EV3 существуют различные прошивки, которые позволяют расширить его возможности, скорость работы и т.д. Вот, например, альтернативная прошивка leJOS EV3 – прошивка с jvm, позволяющая программировать EV3 на языке Java. Хотите на другом языке? Окей, гугл – в вашем распоряжении почти 60 вариантов на выбор: ASM/C/C++/Perl/Python/Ruby/VB/Haskell/Lisp/Matlab/LabVIEW и многое-многое другое.

Более подробно об этом я рассказывать не буду по нескольким причинам: во-первых, программист из меня полный false (все надежды на сына), во-вторых, пока мы успели собрать только одну модель (и на выходных возьмёмся за вторую), а в-третьих – вы уже и так оформили заказ на этот конструктор и скоро сами всё узнаете;) Ну а если серьёзно, то статья и так уже огромная – вот лучше две ссылочки изучите: раз и два .

Ну и ещё большой плюс – это LEGO-сообщества, которых полно по всему миру. Можете быть уверены, что на любом из этапов экспериментов с роботами вы всегда сможете найти единомышленников и тех, кто сможет помочь с решением проблемы. Помимо дружелюбных сообществ, на просторах сети выложено огромное множество различных инструкций, моделей, исходников, видеороликов и обучающих материалов. Всё это означает одно: с Mindstorms вы не соскучитесь.

Плюсы и минусы

Продукция компании LEGO не первый год славится своим качеством, поэтому в этом плане никаких нареканий нет: эффектная коробка, детальки, наклейки, инструкция – всё проработано до мелочей. Поэтому позволю себе закрыть глаза на все «маленькие плюсы» по сравнению с одним большим: многообразие возможных комбинаций конструкций, которые можно сделать даже из штатного набора деталей (про дополнительные наборы и говорить не стоит), ограничено только вашей фантазией. Возможность по-разному программировать собранную модель – это ещё один плюс, который, на самом деле, гораздо больше, чем кажется на первый взгляд.

А вот из реально существенных минусов я нашёл только один: цену. Ещё летом LEGO Mindstorms EV3 можно было купить за 14-15 тысяч, но стремительный рост курса вечнозелёного президента увеличил прайс аж до 17 тысяч. Кто-то скажет: «да, крутой конструктор… НО ДОРОГО Ж! » И будет прав. Во время изучения набора и его возможностей я офигел от количества тех ресурсов, которые были вложены при его создании; я понимаю, что тут куча электроники и всё остальное… но всё равно пока не могу смириться с такой стоимостью конструктора. За эти деньги можно человека из тюрьмы вытащить (с) выбрать много других подарков: квадрокоптер, ДВС-модельку на радиоуправлении, полноразмерный электромотоцикл, год занятий в спортивной секции, планшет… да много чего! Но на спорт можно ходить в любое время и это вроде как не совсем подарок, а тот же квадрокоптер будет жужжать до первой серьёзной поломки. Лего же в этом плане гораздо более долгоиграющий подарок, совмещающий приятное с полезным, с нереально большим потенциалом. Да, на том же планшете тоже можно учиться программировать, но когда нет возможности вживую пощупать руками результат работы, это уже не так увлекательно. Поэтому решайте сами.

Ах да. Производитель позиционирует данный набор для детей от 10 лет, но даже 7-летнему ребёнку было интересно поиграться – процесс бурного освоения начался. Как думаете, сколько этим парням и во сколько они купят свой первый Порш?)

The end

Новый год у каждого из нас ассоциируется с снегурками ёлкой, мандаринами, тазиком оливье и, конечно же, с подарками. И если говорить о детях, то подарки у них стоят далекоооо не на последнем месте этого списка. И если так получилось, что у вас растёт сын, то можете даже не сомневаться в том, что данный конструктор под ёлкой доведёт его до поросячих визгов радости. А учитывая, что после новогоднего салюта у вас будет ещё почти неделя на то, чтобы поковыряться с ребёнком в кубиках и проводках… вы ведь его ребёнку покупаете, верно?

С наступающим новым годом!

Подключение USB

LEGO Mindstorms EV3 может подключаться к ПК или другому EV3 посредством USB-соединения. Скорость соединения и стабильность в данном случае лучше, чем при любом другом способе, включая Bluetooth.

LEGO Mindstorms EV3 имеет два порта USB.

Связь между LEGO EV3 и другими блоками LEGO EV3 в режиме подключения шлейфом.

Режим подключения шлейфом служит для соединения двух и более блоков LEGO EV3.

Данный режим:

  • предназначен для подключения более одного LEGO Mindstorms EV3;
  • служит для подключения большего количества датчиков, моторов и других устройств;
  • позволяет осуществить связь между несколькими LEGO Mindstorms EV3 (до 4), что даёт нам до 16 внешних портов и такое же количество внутренних портов;
  • даёт возможность управлять всей цепочкой с главной LEGO Mindstorms EV3;
  • не может функционировать при активном подключении Wi-Fi или Bluetooth.

Для включения режима подключения шлейфом перейдем в окно настройки проекта и поставим галочку.

Когда выбран этот режим, то для любого мотора мы можем выбрать блок EV3, который будет задействован, и необходимые датчики.

В таблице приведены варианты применения блоков EV3:

Действие

Средний мотор

Большой мотор

Рулевое управление

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

Гироскопический

Инфракрасный

Ультразвуковой

Вращения мотора

Температуры

Счетчик энергии

Звуковой

Подключение через Bluetooth

Bluetooth позволяет LEGO Mindstorms EV3 подключиться к ПК, другому LEGO Mindstorms EV3, смартфонам и другим Bluetooth-устройствам. Дальность связи по каналу Bluetooth – до 25 м.

К одному LEGO Mindstorms EV3 можно подключить до 7 блоков. Главный блок EV3 позволяет отправлять и получать сообщения для каждого подчинённого EV3. Подчинённые EV3 могут только отправлять сообщения на главный блок EV3, но не между собой.

Последовательность соединения EV3 через Bluetooth

Для того чтобы соединить два и более блоков EV3 между собой по Bluetooth, нужно выполнить следующие действия:

1. Открыть вкладку Настройка .

2. Выберите Bluetooth и нажмите центральную кнопку.

3. Ставим Флажок видимости Bluetooth.

4. Проверьте, что знак Bluetooth ("<") виден на верхней левой стороне.

5. Сделайте упомянутую выше процедуру для нужного количества блоков EV3.

6. Войдите во кладку Подключение (Connection):

7. Нажмите на кнопку Поиск (Search):

8. Выберите EV3, которое вы хотите подключить (или к которому вы хотите подключиться) и нажмите центральную кнопку.

9. Соединяем между собой один и второй блок с ключом доступа.

Если сделать всё правильно, то в верхнем левом углу появится значок "<>", аналогично выполняется подключение других блоков EV3, если их больше двух.

Если вы выключили LEGO EV3, то связь пропадет и вам все пункты необходимо будет повторить.

Важно: для каждого блока должна быть написана своя программа.

Пример программы:

Первый блок: при нажатии датчика касания первый блок EV3 передает текст на второй блок с задержкой 3 секунды (главный блок).

Пример программы для 2 блока:

Второй блок ожидает принятия текста с первого блока, и как только он его получил, выведет на экран слово (в нашем примере это слово "Hello") в течение 10 секунд (подчинённый блок).

Подключение через Wi-Fi

Более дальняя связь возможна при подключении Wi-Fi Dongle к порту USB на EV3.

Чтобы использовать Wi-Fi, нужно установить на блок EV3 специальный модуль, используя USB-разъем (Wi-Fi адаптер (Netgear N150 Wireless Adapter (WNA1100), а также можно подключить Wi-Fi Dongle.

Традиционно роботы, построенные на платформе Lego Mindstorms EV3 , программируются с использованием графической среды LabVIEW. В этом случае программы запускаются на контроллере EV3 и робот работает автономно. Здесь я расскажу про альтернативный способ управления роботом - использование платформы.NET, запущенной на компьютере.

Но прежде чем мы перейдем непосредственно к программированию, давайте рассмотрим случаи, когда это может быть полезно:

  • Требуется удаленное управление роботом с ноутбука (например, по нажатию кнопок)
  • Требуется собирать данные с контроллера EV3 и обрабатывать их на внешней системе (например, для IoT-систем)
  • Любые другие ситуации, когда хочется написать алгоритм управления на.NET и запускать его с компьютера, подключенного к контроллеру EV3

LEGO MINDSTORMS EV3 API for .NET

Управление контроллером EV3 из внешней системы осуществляется путем отправки команд в последовательный порт. Сам формат команд описан в Communication Developer Kit .

Но реализация этого протокола вручную - дело скучное. Поэтому можно воспользоваться готовой.NET-оберткой , которую заботливо написал Brian Peek. Исходные коды этой библиотеки размещены на Github , а готовый к использованию пакет можно найти в Nuget .

Подключение к контроллеру EV3

Для связи с контроллером EV3 используется класс Brick . При создании этого объекта в конструктор требуется передать реализацию интерфейса ICommunication - объект, описывающий способ подключения к контроллеру EV3. Доступны реализации UsbCommunication , BluetoothCommunication и NetworkCommunication (подключение через WiFi).

Наиболее популярный способ подключения - через Bluetooth. Рассмотрим поподробнее этот способ подключения.

Прежде чем мы сможем программно подключиться к контроллеру через Bluetooth, контроллер необходимо подключить к компьютеру, используя настройки операционной системы.

После того, как контроллер подключен, идём в настройки Bluetooth и выбираем вкладку COM-порты. Находим наш контроллер, нам нужен исходящий порт. Его и будем указывать при создании объекта BluetoothCommunication .

Код для подключения к контроллеру будет выглядеть так:

Public async Task Connect(ICommunication communication) { var communication = new BluetoothCommunication("COM9"); var brick = _brick = new Brick(communication); await _brick.ConnectAsync(); }

Опционально можно указать таймаут подключения к контроллеру:

Await _brick.ConnectAsync(TimeSpan.FromSeconds(5));

Подключение к блоку через USB или WiFi осуществляется аналогично, за тем исключением, что используются объекты UsbCommunication и NetworkCommunication .

Все дальнейшие действия, выполняемые с контроллером, осуществляются через объект Brick .

Покрутим моторами

Для выполнения команд на контроллере EV3 обратимся к свойству DirectCommand объекта Brick . Для начала попробуем запустить моторы.

Предположим, что наш мотор подключен к порту A контроллера, тогда запуск этого мотора на мощности 50% будет выглядеть так:

Await _brick.DirectCommand.TurnMotorAtPowerAsync(OutputPort.A, 50);

Есть и другие методы для управления мотором. Например, можно повернуть мотор на заданный угол, используя методы StepMotorAtPowerAsync() и StepMotorAtSpeedAsync() . Всего доступно несколько методов, которые являются вариациями на режимы включения моторов - по времени, скорости, мощности и т.д.

Принудительная остановка осуществляется методом StopMotorAsync() :

Await _brick.DirectCommand.StopMotorAsync(OutputPort.A, true);

Второй параметр указывает на использование тормоза. Если его установить в false , то мотор будет останавливаться «накатом».

Чтение значений с датчиков

Контроллер EV3 имеет четыре порта для подключения сенсоров. Дополнительно к этому, моторы также имеют встроеные энкодеры, что позволяет использовать их как сенсоры. В итоге мы имеем 8 портов, с которых можно считывать значения.

Доступ к портам для считывания значений можно получить через свойство Ports объекта Brick . Ports - это коллекция портов, доступных на контроллере. Поэтому для работы с конкретным портом нужно его выбрать. InputPort.One ... InputPort.Four - это порты для датчиков, а InputPort.A ... InputPort.D - это энкодеры моторов.

Var port1 = _brick.Ports;

Датчики в EV3 могут работать в разных режимах. Например, датчик цвета EV3 можно использовать для измерения внешнего освещения, измерения отраженного света или для определения цвета. Поэтому, чтобы «сообщить» сенсору о том, как именно мы хотим его использовать, нужно задать его режим:

Brick.Ports.SetMode(ColorMode.Reflective);

Теперь, когда датчик подключен и режим его работы задан, можно считать из него данные. Получить можно «сырые» данные, обработанное значение и значение в процентах.

Float si = _brick.Ports.SIValue; int raw = _brick.Ports.RawValue; byte percent = _brick.Ports.PercentValue;

Свойство SIValue возвращает обработанные данные. Здесь все зависит от того, какой именно датчик используется и в каком режиме. Например, при измерении отраженного света мы получим значения от 0 до 100 в зависимости от интенсивности отраженного света (черный/белый).

Свойство RawValue возвращает «сырое» значение, полученное с АЦП. Иногда удобнее использовать именно его для последующей обработки и использования. Кстати, в среде разработки EV3 тоже есть возможность получения «сырых» значений - для этого нужно воспользоваться блоком из синей панели.

Если используемый датчик предполагает получение значений в процентах, то можно также воспользоваться свойством PercentValue .

Выполнение команд «пачкой»

Предположим, в нашем распоряжении есть робот-тележка с двумя колесами и мы хотим развернуть его на месте. В этом случае два колеса должны вращаться в противоположном направлении. Если мы воспользуемся DirectCommand и последовательно отправим две команды контроллеру, между их выполнением может пройти некоторое время:

Await _brick.DirectCommand.TurnMotorAtPowerAsync(OutputPort.A, 50); await _brick.DirectCommand.TurnMotorAtPowerAsync(OutputPort.B, -50);

В этом примере мы отправляем команду для вращения мотора A на скорости 50, после успешного окончания отправки этой команды, повторяем то же самое с мотором, подключенным к порту B. Проблема в том, что отправка команд происходит не моментально, поэтому моторы могут начать крутиться в разное время - пока передается команда для порта B, мотора A уже начнет крутиться.

Если для нас критически важно заставить крутится моторы одновременно, можно отправлять команды контроллеру «пачкой». В этом случае следует воспользоваться свойством BatchCommand вместо DirectCommand:

Brick.BatchCommand.TurnMotorAtPower(OutputPort.A, 50); _brick.BatchCommand.TurnMotorAtPower(OutputPort.B, -50); await _brick.BatchCommand.SendCommandAsync();

Теперь подготавливается сразу две команды, после чего они отправляются на контроллер одним пакетом. Контроллер, получив эти команды, начнет вращение моторов одновременно.

Что ещё можно сделать

Кроме вращения моторов и считывания значений сенсоров, можно выполнять ещё ряд действий на контроллере EV3. Не буду подробно останаливаться на кадом из них, перечислю только список того, что можно сделать:

  • CleanUIAsync() , DrawTextAsync() , DrawLineAsync() и др. - манипуляция встроенным экраном контроллера EV3
  • PlayToneAsync() и PlaySoundAsync() - использование встроенного динамика для воспроизведения звуков
  • WriteFileAsync() , CopyFileAsync() , DeleteFileAsync() (из SystemCommand) - работа с файлами

Заключение

Использование.NET для управления роботами Mindstorms EV3 хорошо демонстрирует как технологии «из разных миров» могут работать совместно. В качестве результата исследования EV3 API для.NET было создано небольшое приложение, которое позволяет управлять роботом EV3 с компьютера. К сожалению, аналогичные приложения существуют для NXT, а EV3 они обошли стороной. В то же время они полезны на сорвнованиях управляемых роботов, например в футболе роботов.

Приложение можно загрузить и установить по этой ссылке:

Если вам также как и нам не хватает возможностей стандартных датчиков EV3, не достаточно 4-х портов для датчиков в ваших роботах или вы хотите подключить к своему роботу какую-нибудь экзотическую периферию - эта статья для вас. Поверьте, самодельный датчик для EV3 - это проще чем кажется. "Крутилка громкости" из старого радиоприемника или пара гвоздей, воткнутых в землю в цветочном горшке в качестве датчика влажности почвы - отлично подойдут для эксперимента.

Удивительно, но каждый порт датчика EV3 скрывает в себе целый ряд различных протоколов, в основном это сделано для совместимости с датчиками NXT и датчиками сторонних производителей. Давайте рассмотрим как устроен кабель EV3


Странно, но красный провод - это земля (GND), зеленый - плюс питания 4,3В. Синий провод - одновременно SDA для шины I2C и TX для протокола UART. Кроме этого синий провод - вход аналогово-цифрового преобразователя для EV3. Желтый провод - одновременно SCL для шины I2C и RX для протокола UART. Белый провод - вход аналогово-цифрового преобразователя для датчиков NXT. Черный - цифровой вход, для датчиков, совместимых с NXT - он дублирует GND. Непросто, не так ли? Давайте по порядку.

Аналоговый вход EV3

В каждом порту датчика есть канал аналогово-цифрового преобразователя. Он используется для таких датчиков, как Touch Sensor (кнопка), датчиков NXT Light Sensor и Color Sensor в режиме измерения отраженного света и внешней освещенности, NXT датчика звука и NXT-термометра.

Сопротивление в 910 Ом, подключенное согласно схеме сообщает контроллеру, что данный порт необходимо переключить в режим аналогового входа. В таком режиме к EV3 можно подключить любой аналоговый датчик, например от Arduino. Скорость обмена с таким датчикаом при этом может достигать нескольких тысяч опросов в секунду, это самый быстродействующий тип датчиков.

Датчик освещенности

Термометр

Датчик влажности почвы

Также можно подключить: микрофон, кнопку, ИК дальномер и многие другие распространенные сенсоры. Если для датчика не достаточно питания в 4,3В, можно запитать его от 5В от разъема USB-порта, расположенного на боковой стороне контроллера EV3.

Упомянутая выше "крутилка громкости" (она же переменный резистор или потенциометр) является отличным примером аналогового датчика - ее можно подключить вот так:

Для чтения значений с такого датчика в стандартной среде программирования LEGO необходимо использовать синий блок RAW

Протокол I2C

Это цифровой протокол, по нему работает например ультразвуковой датчик NXT, многие датчики Hitechnic, такие как IR Seeker или Color Sensor V2. Для иных платформ, например для Arduino, есть масса i2c-датчиков их вы тоже сможете подключить. Схема следующая:

Сопротивление 82 Ом рекомендованы LEGO Group, однако в разных источниках встречаются упоминания о 43 Ом и менее. На самом деле мы попробовли вообще отказаться от этих сопротивлений и все работает, по крайней мере "на столе". В реальном роботе, работающем в условиях различного рода помех, линии SCL и SDA стоит все же притянуть к питанию через сопротивления, как это указано на схеме выше. Скорость работы i2c в EV3 довольно невелика, примерно 10000 кбит/с, именно поэтому всеми любимый Hitechnic Color Sensor V2 такой тормозной:)

К сожалению для стандартного EV3-G от LEGO не существует полноценного блока для двухсторонней связи с i2c датчиком, но используя сторонние среды программирования, такие как RobotC, LeJOS или EV3 Basic можно взаимодействовать практически с любыми i2c датчиками.

Способность EV3 работать по i2c протоколу открывает интересную возможность для подключения нескольких датчиков к одному порту. I2C протокол позволяет поключить к одной шине до 127 подчиненных устройств. Представляете? По 127 датчиков к каждому из портов EV3:) Более того, часто кучу i2c датчиков совмещают в одном устройстве, например на фото ниже датчик 10 в 1 (содержит компас, гироскоп, акселерометр, барометр и т.д.)

UART

Почти все стандартыне EV3-датчики, за исключением Touch Sensor, работают по протоколу UART и именно поэтому они не совместимы с контроллером NXT, который хоть и имеет такие же разъемы, но на портах датчиков у него UART не реализован. Взгляните на схему, она немного проще, чем в предыдущих случаях:

UART-датчики автоматически согласовывают с EV3 скорость своей работы. Первоначально соединившись на скорости 2400 кбит/с они договариваются о режимах работы и скорости обмена, переходя затем на повышенную скорость. Типичные скорости обмена для разных датчиков 38400 и 115200 кбит/с.
LEGO реализовала в своих UART-датчиках довольно замысловатый протокол, поэтому сторонних датчиков, предназначенных изначально не для этой платформы, но совместимых с ней, не существует. Тем не менее этот протокол очень удобен для подключения "самодельных"
датчиков, на базе микроконтроллеров.
Для Arduino существует замечательная библиотека EV3UARTEmulation , написанная известным LeJOS-разработчиком Lawrie Griffiths, которая позволяет этой плате притвориться UART-LEGO-совместимым датчиком. В его блоге LeJOS News есть масса примеров подключения датчиков газа, IMU-сенсора и цифрового компаса с использованием данной библиотеки.

Ниже на видео - пример использования самодельного датчика. У нас нет достаточного числа оригинальных датчиков расстояния LEGO, поэтому один из датчиков на роботе мы используем самодельный:


Задача робота - стартовать с зеленой клетки, найти выход из лабиринта (красная клетка) и вернуться на место старта кратчайшим путем, не заезжая в тупики.

В статье содержится описание опыта использования конструктора Lego Mindstorms EV3 для создания прототипа робота с его последующим программным и ручным управлением при помощи Robot Control Meta Language (RCML).

  • Сборка прототипа робота на базе конструктора Lego Mindstorms EV3
  • Быстрая установка и настройка RCML для Windows
  • Программное управление роботом на базе контроллера EV3
  • Ручное управление периферией робота с помощью клавиатуры и геймпада
Забегая немного вперед, добавлю, что для реализации управления Lego-роботом с помощью клавиатуры требуется создать программу, содержащую всего 3 строки программного кода. Подробней о том, как это сделать написано под катом.

1. Для начала из конструктора Lego Mindstorms EV3 был создан прототип робота, который будет использоваться для программирования и ручного пилотирования.

Описание прототипа робота

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



2. Следующий шаг - подготовка RCML для работы с конструктором Lego Mindstorms EV3.

Следует скачать архивы с исполняемыми файлами и файлами библиотек и .

Скаченные архивы нужно извлечь в каталог с произвольным именем, однако следует избегать русских букв в названии.

Содержимое каталога после распаковки в него архивов



Далее необходимо создать файл конфигурации config.ini, который необходимо расположить в этом же каталоге. Для реализации возможности управления контроллером EV3 при помощи клавиатуры и геймпада, следует подключить модули lego_ev3, keyboard и gamepad.

Листинг конфигурационного файла config.ini для RCML

Module = lego_ev3 module = keyboard module = gamepad


Далее следует произвести сопряжение контроллера EV3 и адаптера.

Инструкция для сопряжения контролера EV3 и Bluetooth адаптера

Инструкция содержит пример сопряжения контроллера Lego Ev3 и ПК под управлением операционной системы Windows 7.

1. Нужно перейти в раздел настроек контроллера Ev3, далее в пункт меню «Bluetooth».

2. Следует убедиться в правильности установки параметров конфигурации. На против пунктов “Visibility”,” Bluetooth” должны быть установлены галочки.

3. Необходимо перейти в «Панель управления», далее «Устройства и принтеры», далее «Устройства Bluetooth».

4. Необходимо нажать кнопку «Добавление устройства». Откроется окно для выбора доступных Bluetooth устройств.

5. Следует выбрать устройство “EV3” и нажать кнопку «Далее».

6. На экране контроллера EV3 отразится диалоговое окно «Connect?». Нужно выбрать вариант галочки, и подтвердить свой выбор нажатием центральной клавиши.

7. Далее отобразиться диалоговое окно «PASSKEY», в строке ввода должны быть указаны цифры «1234», далее следует подтвердить ключевую фразу для сопряжения устройств, путем нажатия центральной клавиши на позиции с изображением галочки.

8. В мастере сопряжения устройства появится форма для ввода ключа для сопряжения устройств. Нужно ввести код «1234» и нажать клавишу «Далее».

10. На ПК необходимо вернуться в «Панель управления», далее «Устройства и принтеры», далее «Устройства Bluetooth». В списке доступных устройств отобразится устройство, с которым было произведено сопряжение.

11. Следует двойным нажатием зайти в свойства подключения “EV3”.

14. Указанный в свойствах индекс COM-порта, следует использовать в конфигурационном файле config.ini модуля lego_ev3. В примере показаны свойства Bluetooth подключения контроллера Lego EV3 с использованием стандартного последовательного порта COM14.


Дальнейшая конфигурация модуля сводится к тому, что необходимо прописать в конфигурационном файле модуля lego_ev3 адрес COM-порта, через который осуществляется коммуникация с роботом Lego.

Листинг конфигурационного файла config.ini для модуля lego_ev3

Connection = COM14 dynamic_connection = 0


Теперь необходимо произвести настройку модуля keyboard. Модуль находится в каталоге control_modules, далее keyboard. Следует создать конфигурационный файл config.ini рядом с файлом keyboard_module.dll. Перед тем, как создать конфигурационный файл, необходимо определить, какие действия должны быть совершены по нажатию клавиш.

Модуль клавиатуры позволяет задействовать клавиши, которые имеют определенный числовой код. Таблицу виртуальных кодов клавиш можно посмотреть .

В качестве примера, буду использовать нажатия следующих клавиш:

  • Стрелки вверх/вниз используются для вращения мотора задних колес вперед/назад
  • Стрелки влево/вправо поворачивают колеса влево/вправо
Файл конфигурации модуля keyboard описывает, какие оси доступны программисту, для осуществления взаимодействия с роботом в режиме ручного управления. Таким образом, в примере получилось две управляющих группы – это оси клавиатуры. Для добавления новой оси, следует придерживаться следующих правил описания осей.

Правила описания осей для модуля keyboard

1. При добавлении новой оси, необходимо в секцию добавить свойство, имя которого есть имя оси, и присвоить ему значение кнопки клавиатуры в HEX формате, при этом на каждую кнопку заводится подобная запись, т.е. имя оси может быть использовано несколько раз. В общем случае запись в секцию будет выглядеть следующим образом:

Имя_оси = значение_кнопки_клавиатуры_в_HEX_формате
2. Необходимо установить максимальное и минимальное значение, которое может откладываться по данной оси. Для этого необходимо с новой строки добавить секцию в конфигурационном файле config.ini , одноименную с именем оси, и задать свойства upper_value и lower_value , которые соответствуют максимум и минимуму оси соответственно. В общем виде данная секция выглядит следующим образом:

[имя_оси] upper_value = максимальное_значение_оси lower_value = минимальное_значение_оси
3. Далее следует определить, какое значение будет иметь ось в случае нажатия кнопки на клавиатуре, которая ранее была прикреплена к ней. Определение значений происходит посредством создания секции, название которой состоит из имени оси и значения кнопки клавиатуры в HEX формате, разделенные между собой символом нижнего подчеркивания. Для задания значения по умолчанию (в не нажатом) и нажатом состоянии используются свойства unpressed_value и pressed_value соответственно, в которые передаются значения. Общий вид секции в таком случае выглядит следующим образом:

[имя-оси_значение-кнопки-клавиатуры] pressed_value = значение_оси_при_нажатой_клавише unpressed_value = значение_оси_при_отжатой_клавише
Текст спойлера для удобства просмотра скопирован из документации по RCML .


Для реализации управления прототипом робота был создан конфигурационный файл модуля keyboard, который включает в себя оси go и rotate. Ось go используется для задания направления движения робота. При нажатии клавиши “стрелка вверх” ось получит значение 100, при нажатии клавиши “стрелка вниз” ось примет значение -50. Ось rotate используется для установки угла поворота передних колес. При нажатии клавиши “стрелка влево” значение оси будет равно -5, при нажатии «стрелки вправо» ось примет значение 5.

Листинг конфигурационного файла config.ini для модуля keyboard

;Обязательная секция ;название_оси = код_клавиши (в HEX формате) ;Ось go получает значения от стрелки_вверх go = 0x26 ;Ось go получает значения от стрелки_вниз go = 0x28 ;Ось rotate получает значения от стрелки_влево rotate = 0x25 ;Ось rotate получает значения от стрелки_вправо rotate = 0x27 ;Описание оси go, всегда должно иметь оба ключа ;Верхняя граница значений оси go upper_value = -100 ;Нижняя граница значений оси go lower_value = 100 ;Описание оси rotate, всегда должно иметь оба ключа ;Верхняя граница значений оси rotate upper_value = -100 ;Нижняя граница значений оси rotate lower_value = 100 ;Описание поведения оси go для клавиши *стрелка_вверх* (0x26) ;При нажатии клавиши *стрелка_вверх* значение оси задать равным 50 pressed_value = 100 ;При отпускании клавиши *стрелка_вверх* значение оси задать равным 0 unpressed_value = 0 ;Описание поведения оси go для клавиши *стрелка_вниз* (0x28) ;При нажатии клавиши *стрелка_вниз* значение оси задать равным -50 pressed_value = -50 ;При отпускании клавиши *стрелка_вниз* значение оси задать равным 0 unpressed_value = 0 ;Описание поведения оси rotate для клавиши *стрелка_влево* (0x25) ;При нажатии клавиши *стрелка_влево* значение оси задать равным -5 pressed_value = -5 ;При отпускании клавиши *стрелка_влево* значение оси задать равным 0 unpressed_value = 0 ;Описание поведения оси rotate для клавиши *стрелка_вправо* (0x27) ;При нажатии клавиши *стрелка_вправо* значение оси задать равным 5 pressed_value = 5 ;При отпускании клавиши *стрелка_вправо* значение оси задать равным 0 unpressed_value = 0


Далее для реализации управления при помощи геймпада, необходимо настроить модуль gamepad. Конфигурирование модуля включает в себя создание конфигурационного файла config.ini рядом с gamepad_module.dll, находящего в каталоге control_modules, далее gamepad.

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

;Обязательная секция описания используемых осей ;Ось для завершения режима ручного управления Exit = 9 ; 11 бинарных осей, соответствующих кнопкам геймпада B1 = 1 B2 = 2 B3 = 3 B4 = 4 L1 = 7 L2 = 5 R1 = 8 R2 = 6 start = 10 T1 = 11 T2 = 12 ; 4 оси стиков;Правый стик движение вверх/вниз RTUD = 13 ;Правый стик движение влево/вправо RTLR = 16 ;Левый стик движение вверх/вниз LTUD = 15 ;Левый стик движение влево/вправо LTLR = 14 ; 2 оси крестовины;Движение крестовины вверх/вниз arrowsUD = 17 ;Движение крестовины влево/вправо arrowsLR = 18 ;Описание поведения оси B1 ;При нажатии кнопки B1 значение оси задать равным 1 upper_value = 1 ;При отпускании кнопки B1 значение оси задать равным 0 lower_value = 0 upper_value = 1 lower_value = 0 upper_value = 1 lower_value = 0 upper_value = 1 lower_value = 0 upper_value = 1 lower_value = 0 upper_value = 1 lower_value = 0 upper_value = 1 lower_value = 0 upper_value = 1 lower_value = 0 upper_value = 1 lower_value = 0 upper_value = 1 lower_value = 0 upper_value = 1 lower_value = 0 ;Описание поведения оси правого стика движение вверх/вниз ;Значение оси при перемещении в максимально возможное верхнее положение upper_value = 0 ;Значение оси при перемещении в максимально возможное нижнее положение lower_value = 65535 upper_value = 0 lower_value = 65535 upper_value = 0 lower_value = 65535 upper_value = 0 lower_value = 65535 ;Описание поведения оси крестовины движение вверх/вниз ;Значение оси при нажатии стрелки вверх upper_value = 1 ;Значение оси при нажатии стрелки вниз lower_value = -1 upper_value = 1 lower_value = -1


Дополнительная информация об особенностях настройки модуля gamepad отображена в справочном руководстве по RCML .

3. Следующий шаг - написание программы на языке RCML.

В корне созданного каталога, необходимо создать файл программы. Имя файла программы и его расширение может быть любым, однако следует избегать русских букв в названии. В примере использовано имя файла - hello.rcml.

Для модуля lego_ev3 программный код резервирования робота, имеет следующий вид:

@tr = robot_lego_ev3;

На странице подключения модуля lego_ev3 описано большинство функций, поддерживаемых контроллером. В качестве тестового примера, была создана программа для автоматического вхождения робота в занос.

Алгоритм программы следующий:

После резервирования первого свободного робота, устанавливается связь двух двигателей для последующей работы с ними, как с одним. Затем робот начинает выполнять заносы. Программное описание действий робота позволяет точно устанавливать углы поворота передних колес и скорость вращения задних. Использование этого приёма позволяет добиваться результатов, которые сложно повторить во время ручного пилотирования с клавиатуры или геймпада.

Листинг программы для Lego робота на языке RCML

function main() { @tr = robot_lego_ev3; //Резервирование робота @tr->setTrackVehicle("B","C",0,0); //Установка синхронизации двигателей @tr->motorMoveTo("D",100,0,0); system.sleep(500); @tr->trackVehicleForward(-100); system.sleep(1000); @tr->motorMoveTo("D",50,-50,0); system.sleep(4000); @tr->motorMoveTo("D",50,50,0); system.sleep(4000); @tr->trackVehicleOff(); system.sleep(1000); }


Для компилирования программы необходимо использовать командную строку window. Сначала следует переместиться в созданный каталог с исполняемыми файлами rcml_compiler.exe и rcml_intepreter.exe. Далее нужно ввести следующие команды.

Команда для компилирования файла hello.rcml:

Rcml_compiler.exe hello.rcml hello.rcml.pc
В результате компилирования, в созданной директории появится новый файл hello.rcml.pc.

Скриншот командой строки после успешного компилирования



Теперь следует убедиться в том, что контроллер EV3 включен, сопряжен с Bluetooth адаптером. Геймпад должен быть подключен к ПК. После этого нужно выполнить команду исполнения программного файла:

Rcml_intepreter.exe hello.rcml

Внешний вид командной строки во выполнения программы



Видеоролик демонстрирующий программу движения робота расположен внизу статьи.

4. Следующий шаг – управление роботом в ручном режиме при помощи клавиатуры.

При помощи клавиатуры возможно управление любым двигателем робота. В рамках примера реализовано управление следующими механизмами:

  • Углом поворота передних колес
  • Направлением вращения задних колес

Листинг программы взаимодействия клавиатуры и робота Lego на базе контроллера EV3

function main() { @tr = robot_lego_ev3; //Резервирование робота @tr->setTrackVehicle("B","C",0,0); //Установка синхронизации двигателей system.hand_control(@tr,"keyboard", "straight","go", "speedMotorD","rotate"); }


Далее следует откомпилировать программу и выполнить её. Результат ручного управления Lego роботом при помощи на клавиатуры показан на видео внизу страницы.

5. Помимо клавиатуры доступен модуль gamepad позволяющий манипулировать роботом при помощи геймпада. Для реализации управления робота при помощи геймпада необходимо описать на уровне программы, какие оси робота будут принимать значения осей геймпада.

Листинг программы взаимодействия геймпада и робота Lego

function main() { @tr = robot_lego_ev3; //Резервирование робота @tr->setTrackVehicle("B","C",0,0); //Установка синхронизации двигателей system.hand_control(@tr,"gamepad", "straight"," RTUD", "speedMotorD"," RTLR"); }


Далее следует повторить процесс компилирования программы и затем выполнить её. Далее показан результат ручного управления Lego роботом при помощи на геймпада, и все ранее подключенные способы:

В статье кратко продемонстрированы только лишь некоторые возможности RCML. Наиболее подробное описание находиться в справочном руководстве.



Понравилась статья? Поделиться с друзьями: