Працюємо з Lego Mindstorms EV3 з .NET. З'єднання двох і більше блоків EV3 Підключення через Wi-Fi

Підключення 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.

Виберіть режим екрану

Вибір режиму
Текстове поле блоку
Введення
Кнопка попереднього перегляду

Виберіть тип тексту або графіки, який потрібно побачити, за допомогою вибору режиму. Після вибору режиму можна вибрати значення вводів. Доступні вводи змінюватимуться залежно від режиму. Режими та введення описані нижче.

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

Екранні координати

Багато режимів блоку «Екран» використовують координати X і Y для визначення розташування елемента. Координати визначають положення пікселів на екрані модуля EV3. Положення (0, 0) знаходиться у верхньому лівому кутку екрана, як показано на малюнку нижче.

Розміри екрана: 178 пікселів завширшки і 128 пікселів заввишки. Діапазон значень X координат: від 0 на екрані ліворуч до 177 праворуч. Діапазон значень координат Y: від 0 зверху до 127 знизу.

Поради та підказки

Ви можете використовувати кнопку «Попередній перегляд» у верхньому лівому куті блоку «Екран» для пошуку правильних екранних координат.

Текст – Пікселі

Режим «Текст – Пікселі» дозволяє відображати текст у будь-якому місці екрана модуля EV3.

Вікно скидання налаштувань

Режим «Вікно скидання налаштувань» повертає екран модуля EV3 до стандартного інформаційного екрана, що відображається під час роботи програми. Цей екран показує ім'я програми та іншу інформацію зворотного зв'язку. Коли ви запускаєте програму на модулі EV3, екран відображається до виконання першого блоку програми «Екран».

Забезпечення видимості елементів, що відображаються

Після завершення програми EV3 екран модуля EV3 очищається та повертається до екрана меню модуля EV3. Будь-який текст або графіка, які відображаються програмою, будуть стерті. Якщо, наприклад, ваша програма має один блок «Екран» і нічого більше, екран буде так швидко очищений відразу після завершення програми, що ви не побачите результати блоку «Екран».

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

Відображення кількох елементів

Якщо ви бажаєте відобразити на екрані одночасно кілька текстових або графічних елементів, важливо не очищати екран модуля EV3 між елементами. Кожен режим блоку "Екран" має введення "Очистити екран" . Якщо «Очистити екран» – істина, весь екран буде очищено перед відображенням елемента. Це означає, що для відображення декількох елементів, ви повинні налаштувати "Очистити екран" на "Брехня" для кожного блоку "Екран", крім першого.

Відображення чисел

Для відображення числового значення у вашій програмі підключіть шину даних до введення «Текст» блоку «Відображення тексту». Шина числових даних буде автоматично конвертуватися в текст за допомогою перетворення типу шини даних (детальнішу інформацію див.

Ідея замінити мікрокомп'ютер у конструкторі на , Beaglebone , або інший не є новою. Але з виходом EV3 стало можливим не тільки отримати 100% аналог, але і підвищити продуктивність вашого легоробота.

Відео-презентація проекту:

E VB повністю підтримує систему Lego Mindstorms Ev3 як на апаратному, так і на програмному рівні, 100% сумісний з усіма Lego-датчиками і моторами. Блок працює також як і блок Lego Mindstorms EV3:

BeagleBone Black- Одноплатний Linux-комп'ютер.Є конкурентом Raspberry Pi. Має потужний процесор AM335x 720MHz ARM®. кількість входів/виходів, можливості можуть бути розширені додатковими платами.

Lego Mindstorms EV3 має процесор ARM9 (TI Sitara AM180x) 300MHz, тому перехід на процесор ARM Cortex-A8 (TI Sitara AM335x) 1GHz BeagleBone Black підвищує продуктивністьплюс з'являється можливість підключення додаткових плат розширення!

Найголовніше, що Lego Mindstorms EV3 має відкритий опис всього програмного забезпечення та апаратних засобів!

Наприклад, зібраний і продемонстрований відомий робот-збирач кубика рубика. Тільки замість EV3 встановили розроблений EVB. Пропонуємо подивитися відео:

Автори проекту вже випускають та продають EVB. Суттєво розширити виробництво планують до кінця квітня 2015 року. Крім того, вони розробили та виробляють кілька сумісних датчиків.

Традиційно роботи, збудовані на платформі 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 = новий BluetoothCommunication("COM9"); var brick = _brick = новий Brick(communication);

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

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 вони оминули. У той же час вони корисні на зірваннях керованих роботів, наприклад, у футболі роботів.

Програму можна завантажити та встановити за цим посиланням: