Уже многие распаковывали, описывали и программировали для Mindstorms NXT, поэтому круг поклонников данной серии довольно широк. Сегодня пришло время расширить этот круг описанием особенности данного конструктора — bluetooth, благодаря которому конструктор может спокойно управляться с телефона.
Статья будет полезна тем, кто хочет просто поиграть с чем-нибудь механическим в свободное от работы время.
С детства люблю различные конструкторы, поэтому этим летом решил купить себе Mindstorms 8547, благо цена устраивала и в описании упоминался bluetooth. К моему великому разочарованию выяснилось, что абсолютно не интересно сидеть и складывать кубики вместе — чувствуешь бездарное расходование времени. Но программная сторона вопроса манила. Чтение User Guide показало, что должна быть возможность управления роботом с помощью bluetooth, хотя бы банальными движениями — вперёд/назад/вправо/влево. В Google Play уже достаточно программ управления, но задача в том, чтобы сделать такую самостоятельно.
Дано:
1. Телефон на базе Android (LG P970)
2. Машинка из Mindstorms NXT 2.0
![image](https://habrastorage.org/r/w780q1/getpro/geektimes/post_images/6e4/8b2/e9a/6e48b2e9a8c5c4e1b0b3ba7e46a25d31.jpg)
После нескольких ночей в 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)
Зная протокол обмена, реализация уже не представляет проблемы. Задача подключения к блоку управления тривиальна и описана на сайта Android, единственный интересный момент — это создание сокета. Создать его получилось, используя следующий код:
Наглядный пример:
Статья будет полезна тем, кто хочет просто поиграть с чем-нибудь механическим в свободное от работы время.
Вступление
С детства люблю различные конструкторы, поэтому этим летом решил купить себе Mindstorms 8547, благо цена устраивала и в описании упоминался bluetooth. К моему великому разочарованию выяснилось, что абсолютно не интересно сидеть и складывать кубики вместе — чувствуешь бездарное расходование времени. Но программная сторона вопроса манила. Чтение User Guide показало, что должна быть возможность управления роботом с помощью bluetooth, хотя бы банальными движениями — вперёд/назад/вправо/влево. В Google Play уже достаточно программ управления, но задача в том, чтобы сделать такую самостоятельно.
Дано:
1. Телефон на базе Android (LG P970)
2. Машинка из Mindstorms NXT 2.0
![image](https://habrastorage.org/getpro/geektimes/post_images/6e4/8b2/e9a/6e48b2e9a8c5c4e1b0b3ba7e46a25d31.jpg)
Реализация
После нескольких ночей в 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);
Наглядный пример: