Android, NXT и Bluetooth

в 15:27, , рубрики: android, bluetooth, Песочница, метки: ,

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

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

Вступление

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

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

image

Реализация

После нескольких ночей в 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,

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, единственный интересный момент — это создание сокета. Создать его получилось, используя следующий код:

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

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

Автор: merl1n

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js