Doublebrick - Российское сообщество энтузиастов конструкторов LEGO!
DoubleBrick в Facebook DoubleBrick в Twitter DoubleBrick в ВКонтакте RSS каналы DoubleBrick
Следи за новостями!

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

Статья | 01.03.2015 | 12:55 | Автор: burmirmur  | Серии: EV3 | Mindstorms | NXT Разделы: Своими руками

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

Как-то в телефоне лазил я по PlayMarket, смотрел, какой новый софт предлагается для Android по тематике Lego. И набрел на интересную программку - "EV3-NXT Gateway" от немецкого автора Ferdinand Stueckler. Заинтересовался - что это за программа?

Как известно, несколько 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 можно здесь.

Затем стал колдовать с пультом управления. Изначально хотел сделать аналог куркового пульта управления для радиоуправляемых моделей. Примерно вот такого:

Один из первых вариантов пульта:

Но мотор NXT довольно тугой и сделать курок легким в нажатии и с небольшим ходом не удавалось.

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

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

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

Долго пришлось экспериментировать с параметрами программы на EV3.

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

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

Секрет работы через программу "EV3-NXT Gateway" - используем т.н. "Connection" номер "ноль" и не более 3-х почтовых ящиков.

Можно еще добавить третий поток команд со считыванием нажатия кнопок на блоке NXT:

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

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

Рассмотрим обработку команд движения вперед-назад.

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

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

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

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

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

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

Вся остальная обработка после инициализации переменных - один большой бесконечный цикл.

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

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

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

Теперь нам нужно определить delta - на сколько нужно повернуть мотор, управлющий рулевыми колесами. Вычисляем delta = value - mb1.

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

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

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

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

1.


Спасибо за внимание!

Поделиться |

Голосование
?
Ваша оценка
(1)
0.0
Голосовать могут только зарегистрированные пользователи.

5172 просмотра