Дистанционное управление LEGO Mindstorms EV3 при помощи NXT.

Обсуждение статей, размещенных на сайте.
Ответить
Автор
Сообщение
burmirmur
Сообщения: 19

Дистанционное управление LEGO Mindstorms EV3 при помощи NXT.

#1 Сообщение burmirmur » Вс мар 01, 2015 2:12 pm


Давным давно мною был приобретен набор LEGO Mindstorm NXT (1.0). Поигрался немного, собрал пару роботов и отложил в долгий ящик. Даже как-то пытался его продать. Прошло несколько лет. LEGO выпустило набор NXT 2.0. Его я пропустил. Затем вышел EV3, который был на порядок мощнее NXT. Естественно, был куплен сразу же, как только стал доступен в России. Тоже поигрался, тоже положил в коробку.

Как-то в телефоне лазил я по PlayMarket, смотрел, какой новый софт предлагается для Android по тематике Lego. И набрел на интересную программку - "EV3-NXT Gateway" от немецкого автора Ferdinand Stueckler. Заинтересовался - что это за программа?
ptext
Как известно, несколько NXT могут общаться между собой по Bluetooth. У меня NXT был один, поэтому попробовать связь не было возможности. В стандартном программном обеспечении, поставляемым с NXT, для этого используется модель "почтовых ящиков". Один NXT может отправлять другим NXT "сообщения". NXT-адресаты считывают эти "сообщения" и могут их использовать как управляющие команды. "Почтовые ящики" могут служить для передачи либо текстовых строк, либо чисел и логических (да/нет) значений. Оказалось, что NXT и EV3 не могут напрямую общаться, т.к. компания LEGO сознательно не обеспечила совместимость протоколов обмена по Bluetooth.

Так вот, эта программа и служит мостиком между разными протоколами обмена по Bluetooth.

Сразу же возникла идея - из NXT, как менее мощного, сделать пульт управления для EV3. Например, используя два мотора NXT как датчики, использовать их значения для управления скоростью движения и углом поворота рулевых колес некоего транспортного средства, оборудованного EV3. Этим я и занялся.

Сразу же решил, что использовать буду только стандартное программное обеспечение, поставляемое с NXT. Несмотря на убогость этого ПО, даже для EV3, удалось все сделать.

Для начала, свой "кирпич" NXT 1.0 преобразовал в NXT 2.0. Для этого понадобилось установить ПО от NXT 2.0 и обновить прошивку блока. Аппаратная начинка блока NXT 1.0 и 2.0 абсолютно одинакова! Взять последнюю версию софта Mindstorm NXT 2.0 можно здесь.

Затем стал колдовать с пультом управления. Изначально хотел сделать аналог куркового пульта управления для радиоуправляемых моделей. Примерно вот такого:
ptext
Один из первых вариантов пульта:
ptext
Но мотор NXT довольно тугой и сделать курок легким в нажатии и с небольшим ходом не удавалось.
ptext
Тогда плюнул и использовал сам мотор NXT как рычаг управления. Получилось более громоздко, но вариант оказался рабочим.
ptext
ptext
Наклоняем рычаг с рулем вперед - едем вперед, наклоняем назад - едем назад. Устанавливаем вертикально - останавливаемся. Одновременно с вращением руля вращаются колеса. Чем больше повернули - тем сильнее повернулись колеса. Нажатие кнопок на блоке NXT также можно использовать для управления.

Затем собрал простенькое шасси с жесткой подвеской, блоком EV3 и двумя моторами - один на привод, другой на управление рулевыми колесами.

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

Программа для блока NXT - пульта управления. Здесь все просто. Делаем два потока команд. В каждом потоке считывем несколько раз в секунду значение датчика - мотора и передаем эти значения через почтовые ящики по Bluetooth.
ptext
Секрет работы через программу "EV3-NXT Gateway" - используем т.н. "Connection" номер "ноль" и не более 3-х почтовых ящиков.

Можно еще добавить третий поток команд со считыванием нажатия кнопок на блоке NXT:
ptext
В отличие от моторов, при нажатии кнопок передаем в почтовый ящик не числовое значение, а тектовые строки. Например "ENTER", "RIGHT", "LEFT".
Теперь о принимающей программе для EV3.

Делаем в программе также два потока команд. В каждом из них цикл - ожидание поступления сообщения и обработка этого сообщения. Нужно учесть, что отправленные в NXT на почтовый ящик N 1 сообщения поступают через программу "EV3-NXT Gateway" как сообщения с заголовком "mb1", с ящика N 2 с заголовком "mb2" и с ящика N 3 с заголовком "mb3". Программа-посредник умеет работать не более чем с 3-мя ящиками.

Рассмотрим обработку команд движения вперед-назад.
ptext
Итак, первый блок программы ожидает поступление собщения с заголовком "mb2".

Опытным путем я определил, что ход рычага управления скоростью на пульте NXT у меня составляет диапазон примерно "-50" до "+50". Причем максимальный наклон вперед это "-50", а назад "+50". Диапазон же мощности (и скорости) моторов от "-100" до "+100". Поэтому второй блок программы меняет знак у поступившего значения датчика с пульта NXT и заодно преобразует интервал "-50..50" в "100..-100" путем умножения. Полученное значение запоминаем.

Мы никогда не сможем установить рычаг пульта строго в вертикальное положение для остановки нашего управляемого транспортного средства так, чтобы значение датчика передавалось как ноль. Поэтому третьим блоком мы определяем "примерно вертикальное" положение рычага - сравниваем полученное число с интервалом "-10..10". Если число попадает в этот интервал, считаем, что рычаг установлен вертикально и мотор, отвечающий за движение вперед-назад нужно остановить. Если же число находится в интервалах меньше "-11" или больше "11" - подаем команду на мотор двигаться с заданной мощностью (скоростью).

Теперь самое сложное - рулевое управление. Итак, мы считываем положение руля в градусах относительно начальной нулевой позиции, передаем по Bluetooth из NXT в EV3 и там обрабатываем полученное значение.
ptext
Для обработки рулевого управления мы создаем отдельный поток команд. Сначала инициализируем несколько переменных, которые нам понадобятся:

- mb1 - здесь будем хранить последнее обработанное значение отклонения руля от начального положения в градусах;
- value - здесь будем хранить текущее полученное значение отклонения руля от начального положения в градусах;
- delta - здесь будем вычислять изменение текущего положения и ранее обработанное (value - mb1);
- max и min - максимальное и минимальное допустимое значение отклонения руля, при которых мы еще поворачиваем колеса вправо-влево (ограничители);
- scale - масштабный коэффициент, определяет, во сколько раз отклонение колес от прямого положения будет меньше фактического поворотя руля.

Вся остальная обработка после инициализации переменных - один большой бесконечный цикл.
ptext
Первый блок в цикле ожидает поступления по Bluetooth сообщения с заголовком mb1. Затем полученное значение записывается в переменную value. На всякий случай добавил блок умножения на константу - если понадобится изменение знака полученного значения.

Далее сравниваем полученное value и максимально допустимое значение max. Если value превышает max - приравниваем value = max.
ptext
Далее сравниваем полученное value и минимально допустимое значение min. Если value меньше min - приравниваем value = min.

Теперь нам нужно определить delta - на сколько нужно повернуть мотор, управлющий рулевыми колесами. Вычисляем delta = value - mb1.
ptext
Полученное значение изменения delta масштабируем, т.е. делим на коэффициент scale. Округляем полученное значение и поворачиваем мотор, управляющий рулевыми колесами, на соответствующее количество градусов. К значению mb1, которое соответстовало предудущему положению рулевых колес, также добавляем delta текущего шага цикла.

Зачем нам scale? Это позволяет нам сделать руль более плавным. При повороте рулевого колеса на большое количество градусов - например на 100, колеса будут поворачиваться на 15-20 градусов. Как на настоящих авто.

Перед включением пульта и машины нужно установить рычаг управления на пульте параллельно плоскости блока NXT, чтобы рычаг оказался в среднем своем положении. Колеса на машине также нужно установить в среднее (прямое) положение. После запуска программ для них это будет нулевое положение датчиков и моторов. Не забываем после включения блоков NXT и EV3 запустить на смартфоне программу EV3-NXT Gateway и соединить ее с блоками. Кстати - эта программа у меня с первого раза никогда не подсоединяется - всегда приходится дважды нажимать кнопки подсоединения.

Ну и теперь посмотрим как все это выглядит в работе:




Статья на сайте
Последний раз редактировалось burmirmur Пн мар 02, 2015 12:33 am, всего редактировалось 22 раза.
Причина: Updated in Drupal

Ответить

Вернуться в «Статьи»