- PVSM.RU - https://www.pvsm.ru -

Android, NXT и Bluetooth

Уже многие распаковывали [1], описывали [2] и программировали [3] для Mindstorms NXT, поэтому круг поклонников данной серии довольно широк. Сегодня пришло время расширить этот круг описанием особенности данного конструктора — bluetooth, благодаря которому конструктор может спокойно управляться с телефона.

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

Вступление

С детства люблю различные конструкторы, поэтому этим летом решил купить себе Mindstorms 8547, благо цена устраивала и в описании упоминался bluetooth. К моему великому разочарованию выяснилось, что абсолютно не интересно сидеть и складывать кубики вместе — чувствуешь бездарное расходование времени. Но программная сторона вопроса манила. Чтение User Guide показало, что должна быть возможность управления роботом с помощью bluetooth, хотя бы банальными движениями — вперёд/назад/вправо/влево. В Google Play [4] уже достаточно программ управления, но задача в том, чтобы сделать такую самостоятельно.

Дано:
1. Телефон на базе Android (LG P970)
2. Машинка из Mindstorms NXT 2.0

image

Реализация

После нескольких ночей в google выяснилось, что сайт Lego содержит всю необходимую информацию [5] (не надеялся на такого подарок). Есть описание всего внутреннего содержимого блоков, сенсоров и протоколов передачи данных. Нас интересует только «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,

0x00,
0x04,
(byte)0xFF,
100,
0x01,
0x00,
0x00,
0x20,
(byte)0x80,
0x00,
0x00,
0x00
};

Запуск залитой программы:

byte[]command = new byte[] {
0x0E,
0x00,
0x00,
0x00,
'M',
'i',
'n',
'd',
'e',
'r',
'1',
'.',
'r',
'x',
'e',
0x00
};

Зная протокол обмена, реализация уже не представляет проблемы. Задача подключения к блоку управления тривиальна и описана на сайта Android [6], единственный интересный момент — это создание сокета. Создать его получилось, используя следующий код:

Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
BluetoothSocket sendSocket = (BluetoothSocket) m.invoke(device, 1);

Наглядный пример:

Автор: merl1n


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/android/13879

Ссылки в тексте:

[1] распаковывали: http://habrahabr.ru/post/111458/

[2] описывали: http://habrahabr.ru/post/116408/

[3] программировали: http://habrahabr.ru/post/120367

[4] Google Play: https://play.google.com/store/search?q=mindstorms&c=apps

[5] необходимую информацию: http://mindstorms.lego.com/en-us/support/files/default.aspx

[6] описана на сайта Android: http://developer.android.com/guide/topics/connectivity/bluetooth.html