Spiiin’s blog
Среди существующих программ для Lego Mindstorms большинство умеют лишь управлять моторами. Не нашлось таких, которые умеют читать состояние сенсоров, менять схему управления роботом на свою (например, управлять через USB-джойстик) или превратить телефон в центр управления роботами (запускать и удалять загруженные в них программы).
Поэтому решил разобраться, как написать свою (в итоге, пока у меня тоже только управление моторами и запуск программ по имени, зато своё ^_^).
Для установки соединения можно использовать шаблон отсюда.
После установки Bluetooth-соединения NXT-кирпичу можно начинать слать команды (они описаны в доке LEGO MINDSTORMS NXT Direct commands, но весьма поверхностно, подробнее про управление моторами есть здесь, для понимания параметров всех команд лучше изучить ещё мануал по программированию роботов на каком-нибудь языке из списка отсюда).
Отправка команд выглядит примерно так:
//слегка модифицированный класс BTConnect из примера по ссылке
BTConnect btConnect = new BTConnect();
//присоединяемся к NXT-блоку
btConnect.connectToNXTs();
//Запуск моторов, подключенных к портам B и C в полную силу без дополнительных опций
byte[]command1 = new byte[] { 0x0C, 0x00, 0x00, 0x04, (byte)0x01, (byte)100, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00 };
byte[]command2 = new byte[] { 0x0C, 0x00, 0x00, 0x04, (byte)0x02, (byte)100, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00 };
btConnect.writeMessage(command1);
btConnect.writeMessage(command2);
/*
. Робот продолжает условно «ехать вперёд» (зависит от того, как он собран, конечно).
*/
//Остановка всех моторов
byte[]command3 = new byte[] { 0x0C, 0x00, 0x00, 0x04, (byte)0xFF, 0, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00 };
btConnect.writeMessage(command3);
Дальше сел собирать такого робота (инструкция по сборке есть в книжке автора):
https://www.youtube.com/watch?v=c2MUd5O6aWc
… и завис за этим на всю ночь. После сборки оказалось, что The Snatcher (хочется назвать его за манеру действий по-русски в честь перевода фильма Snatch от Гоблина) хватает своей рукой выше положенного уровня и робота пришлось ещё час отлаживать, в ходе чего выяснилось, что я просто неправильно прикрепил руку к вездеходу.
В демонстрационной программе от автора он находит и поднимает ближайший предмет и произносит его цвет.
На практике, часто пытается ухватиться за ногу или кровать, перевернуть и разбросать тестовые предметы по комнате.
Чётко умеет воровать крышки с флаконов. Поэтому тестовая программа запускается редко, вместо этого при некоторой сноровке с помощью дистанционного управления можно притащить к себе подходящие по форме клешни предметы весом грамм в 150.
Приведённый в книге для примера циллиндр из картона по форме удивительно напоминает стопку. Проверил на практике — наполненную жидкостью стопку робот почти гарантированно не проливает и доносит.
Так что лучше всего этот робот пригоден для того, чтобы приносить алкоголь. Чувствую себя изобретателем Гэллегером, построившим себе робота для открывания банок с пивом.
Дистанционное управление NXT через Bluetooth
На прошедшем недавно V открытом городском фестивале технического творчества учащихся в ДПиШ г.Челябинска был один вид соревнований, связанный с дистанционным управлением роботом. В связи с этим, я задался вопросом, как управлять роботом удобнее всего?
Варианта возможно всего два:
Требования к программе выделим следующие:
- Возможность поворота и одновременно движения вперед;
- Возможность двигать дополнительным мотором, кроме двух ведущих;
- Удобство использования.
Самая распространенная ОС на устройствах, имеющихся у нас в наличии – Андройд. Поэтому и рассматриваться будут приложения для этой ОС. Ну и рассмотрим только бесплатные приложения.
В первую очередь, что нам предлагает Google Play.
- NXT Remote Control от автора Jacek Fedorynski.
Страница в Google Play.
Внешний вид приложения, подключенного к NXT:
Достоинства: небольшой размер (45 Кб), возможность регулировки мощности.
Недостатки: нельзя одновременно ехать вперед и влево. Нет возможности управлять третьим мотором.
Итог: не подходит. - NXT Controller Plus от Lukas Dilik.
Страница в Google Play.
Внешний вид приложения:
Достоинства: возможность работы с датчиками (все 4 порта одновременно), плавные повороты. Небольшой размер (233 Кб).
Недостатки: По-прежнему нет возможности управлять третьим мотором.
Итог: не подходит. - NXT Remote by iCount от iCount.pl.
Страница в Google Play.
Внешний вид приложения:
От предыдущего отличается только тем, что нет возможности работы с датчиками.
Итог: не подходит. - NXT GSensor Remote от Ferdinand Stueckler.
Страница в Google Play.
Внешний вид приложения:
Особенностью приложения является то, что управление роботом осуществляется с помощью наклона смартфона (планшета) в нужную сторону. Это забавно, но очень не практично. Нет управления третьим мотором.
Итог: не подходит.
Подведем небольшой итог. Среди рассмотренных бесплатных приложений ни одно не удовлетворяет всем условиям. Использовать их для соревнований нельзя.
Обратимся к платным приложениям. Установкой и апробацией их не занимался, поэтому только информация, получаемая из Google Play.
- NxtRemote от SmartphoneRemote .
Страница в Google Play.
Внешний вид приложения:
С помощью данной программы возможно следующее:
Управление всеми моторами;
Считывание показаний всех сенсоров;
Считывание списка программ и запуск нужной.
Стоимость: 122,38 руб.
Итог: подходит.
Другие платные приложения не рассматриваю, поскольку не нашел среди них ни одного, удовлетворяющего всем условиям.
Среди рассмотренных бесплатных приложений не нашлось ни одного, подходящего по всем параметрам. Надо либо покупать приложение. либо писать свое. На просторах интернета встретил несколько статей, каким образом осуществляется взаимодействие. Будем работать в этом направлении.
Управление с компьютера рассмотрим в следующей статье.
Android, NXT и Bluetooth
Уже многие распаковывали, описывали и программировали для Mindstorms NXT, поэтому круг поклонников данной серии довольно широк. Сегодня пришло время расширить этот круг описанием особенности данного конструктора — bluetooth, благодаря которому конструктор может спокойно управляться с телефона.
Статья будет полезна тем, кто хочет просто поиграть с чем-нибудь механическим в свободное от работы время.
Вступление
С детства люблю различные конструкторы, поэтому этим летом решил купить себе Mindstorms 8547, благо цена устраивала и в описании упоминался bluetooth. К моему великому разочарованию выяснилось, что абсолютно не интересно сидеть и складывать кубики вместе — чувствуешь бездарное расходование времени. Но программная сторона вопроса манила. Чтение User Guide показало, что должна быть возможность управления роботом с помощью bluetooth, хотя бы банальными движениями — вперёд/назад/вправо/влево. В Google Play уже достаточно программ управления, но задача в том, чтобы сделать такую самостоятельно.
Дано:
1. Телефон на базе Android (LG P970)
2. Машинка из Mindstorms NXT 2.0
Реализация
После нескольких ночей в google выяснилось, что сайт Lego содержит всю необходимую информацию (не надеялся на такого подарок). Есть описание всего внутреннего содержимого блоков, сенсоров и протоколов передачи данных. Нас интересует только «Bluetooth Developer Kit». Внутри 4 файла:
• LEGO MINDSTORMS NXT Bluetooth Developer Kit.pdf
• Appendix 1-LEGO MINDSTORMS NXT Communication protocol.pdf
• Appendix 2-LEGO MINDSTORMS NXT Direct commands.pdf
• Appendix 3-LEGO MINDSTORMS NXT ARM7 Bluetooth Interface specification.pdf
Итого, вся задача сводится к тому, чтобы:
1. установить сопряжение телефона и блока управления NXT
2. подключиться к блок NXT
3. передать правильную команду.
4. получить ответ
Формат команды:
byte 0: младшая часть длины команды
byte 1: старшая часть длины команды
byte 2: тип команды
byte 3: команда
byte . аргументы, зависят от команды.
Примеры:
Получение заряда батареи:
GETBATTERYLEVEL
Byte 0: 0x00 or 0x80
Byte 1: 0x0B
Return package:
Byte 0: 0x02
Byte 1: 0x0B
Byte 2: Status Byte
Byte 3-4: Voltage in millivolts (UWORD)
код:
byte[]command = new byte[] 0x02, 0x00, 0x00, 0x0b
>;
mmOutStream.write(command);
mmOutStream.flush();
Движение вперёд:
byte[]command = new byte[] 0x0C,
0x00,
Запуск залитой программы:
Зная протокол обмена, реализация уже не представляет проблемы. Задача подключения к блоку управления тривиальна и описана на сайта Android, единственный интересный момент — это создание сокета. Создать его получилось, используя следующий код:
Method m = device.getClass().getMethod(«createRfcommSocket», new Class[] < int.class >);
BluetoothSocket sendSocket = (BluetoothSocket) m.invoke(device, 1);