Главная > Hard > NXT и Android через Bluetooth

NXT и Android через Bluetooth

Lego MindstormsВ 2011 году получилось найти в Москве на скидке конструктор Lego Mindstorms NXT.   Lego всегда производил качественные игрушки и прикинув, что его можно продать по цене покупки, приобрёл посмотреть.

Конструктор впечатлил своими возможностями, хотя есть что-то детское в его программировании и не хватает интеллектуальности блока управления. Больше всего в нём понравился bluetooth. Подключившись к контроллеру конструктора с телефона уже можно было отдавать указания.

 Эта статья и призвана немного прояснить этот вопрос.

Начало

Дано:

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

image

Реализация

Сайт 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);

Моё приложение

https://github.com/Kanaris/mindstorms

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

  1. Петр
    17 Январь 2015 в 22:32 | #1

    Классный

  1. Пока что нет уведомлений.