PDA

Просмотр полной версии : ИК управление Android по Bluetooth


lti1
25.08.2013, 03:24
Почитав темы на подобии Резистивные кнопки под андроид (http://pccar.ru/showthread.php?t=18478), решил сделать управление планшетом с ИК пульта. Почему с ИК пульта и почему по bluetooth? Да потому, что нет у меня кнопок на руле, зато есть такой (http://www.ebay.com/itm/Car-Universal-Steering-Wheel-Remote-Control-Learning-/180640140979?pt=UK_In_Car_Technology&hash=item2a0efdceb3#ht_4133wt_1344) пульт и мой Galaxy Tab 2 не может работать одновременно с USB OTG и зарядкой.
Состоит данное устройство из двух частей, bluetooth модуля HC-05
32461
покупал на ebay (http://www.ebay.com/itm/180957186752?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649), цена не больше 6$ и Carduino Nano (https://duino.ru/arduino-nano-v7--carduino-nano-duo-.html) (в дальнейшем, в моем случае будет Arduino Pro Mini). На этом (http://forum.easyelectronics.ru/viewtopic.php?f=9&t=7506&sid=afeae0438f4c35c7a04d7efacfe44b36&start=50) форуме вычитал, что можно прошить HC-05 прошивкой iWRAP4 от WT12, с данной прошивкой модуль может прикидываться HID устройством, здесь (http://byron76.blogspot.ru/) инструкция как прошивать и схема LPT программатора. Но прошивка iWRAP4 не позволяет использовать мультимедийные клавиши клавиатуры, такие как: Play/pause, Next Track, Previous Track и т.д. Зато с этим успешно справляется iWRAP5, описание здесь (http://www.keyglove.net/2013/05/30/complex-bluetooth-hid-with-iwrap-and-the-bluegiga-wt12/). С помощью утилиты iWRAPUpdateClient, скачанной с сайта techforum.bluegiga.com производителя WT12 обновился до iWRAP5, но данная прошивка не работает без кода лицензии. На дурака, зарегистрировался на форуме techforum.bluegiga.com и по придуманному мной MAC адресу (должен быть такого вида 00:07:80:**:**:**) запросил код лицензии и о чудо, любезные сотрудники Bluegiga сообщили мне код, который был успешно залит вместе MAC адресом с помощью PSTool (входит в состав BlueSuite2_4) в мой модуль (PSKEY_BDADDR и PSKEY_MODULE_SECURITY_CODE, не забываем так же заменить PSKEY_ANA_FREQ и PSKEY_ANA_FTRIM). Потом попробовал попросить еще два кода с другой учетной записи и то же все предоставили.
Решено.
Пока не все работает гладко, а именно после подключение к планшету, приходится вручную, кнопкой пульта подавать команду модулю "SELECT 1", что бы он перешел в режим "data mode", документация не вся изучена, с английским у меня туго, думаю в скором времени решу.
Схема подключения HC-05 (https://duino.ru/product_info.php/info/p2309_Bluetooth-modul-HC-06.html) к Arduino.
32457
Ссылки:
Здесь (http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html), здесь (http://www.youtube.com/watch?v=AjIASUNiWkY) как работать с ИК и Arduino.
32458
Только я использовал пин 10, а не 11, что то на arduino v.7 11-й не захотел работать.

Команды настройки HC-05, делал с помощью Blue Terminal:
SET BT NAME IR Remote lti1
SET BT CLASS 00540
SET BT IDENT BT:47 f000 1.0.0 IR Remote lti1
SET BT SSP 3 0
SET PROFILE HID d 40 100 0 en 0409 IR Remote lti1
HID SET F2 05010906a1010507850119e029e71500250175019508810295 01750881019505750105088501190129059102950175039103 95067508150025650507190029658100c0050c0901a1018502 050c1500250109e909ea09e209cd19b529b87501950881020a 8a010a21020a2a021a23022a27027501950881020a83010a96 010a92010a9e010a94010a060209b209b4750195088102c005 010902a1010901a10085030509190129031500250195037501 810295017505810305010930093109381581257f7508950381 06050c0a380295018106c0c006abff0a0002a1018504750815 0026ff00951009018102951009029102c0
SET CONTROL AUTOCALL 11 10000 HID
SET CONTROL BAUD 9600,8n1
Добавить если автоматически при подключении не переходит в режим "data mode". Занимает PIO3 "WAKE UP".
SET CONTROL CD 08 0
SET CONTROL BIND 0 08 RISE DELAY 0 500 SELECT 1
Скетч для arduino v.7:
#include <IRremote.h>

int RECV_PIN = 10; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // включить приемник
}

void loop()
{
IR_resiver();
}

void IR_resiver()
{
static int a=0; // переменная переключения режима, при нажатии кнопки она принимает значение +1
static int b=0; //
static int c=0; //
static int d=0; //
static int e=0; //
static int f=0; //
static int g=0; //

static unsigned long time_a;
static unsigned long time_b;
static unsigned long time_c;
static unsigned long time_d;
static unsigned long time_e;
static unsigned long time_f;
static unsigned long time_g;

static byte NEXT_TRACK[7] = {0x9f, 0x05, 0xa1, 0x02, 0x10, 0x00, 0x00}; // нажать Next Track 0x9f 0x05 0xa1 0x02 0x10 0x00 0x00
static byte PREVIOUS_TRACK[7] = {0x9f, 0x05, 0xa1, 0x02, 0x20, 0x00, 0x00}; // нажать Previous Track 0x9f 0x05 0xa1 0x02 0x20 0x00 0x00
static byte PLAY_PAUSE[7] = {0x9f, 0x05, 0xa1, 0x02, 0x08, 0x00, 0x00}; // нажать Play/pause 0x9f 0x05 0xa1 0x02 0x08 0x00 0x00
static byte RELEASE[7] = {0x9f, 0x05, 0xa1, 0x02, 0x00, 0x00, 0x00}; // отпустить все мультимедиа кнопки
static byte ALT_TAB[12] = {0x9f, 0x0a, 0xa1, 0x01, 0x04, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00}; // нажать Alt+Tab 0x9f 0x0a 0xa1 0x01 0x04 0x00 0x2b 0x00 0x00 0x00 0x00 0x00
static byte ALT[12] = {0x9f, 0x0a, 0xa1, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // нажать Alt 0x9f 0x0a 0xa1 0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00
static byte RELEASE_KEY[12] = {0x9f, 0x0a, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // отпустить все клавиши 0x9f 0x0a 0xa1 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
static byte R_CTRL[12] = {0x9f, 0x0a, 0xa1, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // RIGHT CTRL для таскера

static unsigned long pauseMillis = 0;

if (irrecv.decode(&results))
{ //0x4AB5FD02, 0x4AB57D82, 0x4AB5BD42, 0x4AB53DC2, 0x4AB5E51A, 0x4AB5B748, 0x4AB54FB0 кодs клавиш моего пульта Pioneer
if (results.value == 0x4AB5FD02) {a++,time_a=millis();} // Arrow Up // обработка нажитя клавиши, здесь переменная принимает значение +1
if (results.value == 0x4AB57D82) {b++,time_b=millis();} // Arrow Down
if (results.value == 0x4AB5BD42) {c++,time_c=millis();} // Arrow Left
if (results.value == 0x4AB53DC2) {d++,time_d=millis();} // Arrow Right
if (results.value == 0x4AB5E51A) {e++,time_e=millis();} // Play/pause
if (results.value == 0x4AB5B748) {f++,time_f=millis();} // B (Задача Tasker)
if (results.value == 0x4AB54FB0) {g++,time_g=millis();} // A (Alt Tab)

irrecv.resume();
}
if (a==1 && time_a == millis()){
Serial.write(NEXT_TRACK,7); // Двойное нажатие Next Track, следующая папка 0x9f 0x05 0xa1 0x02 0x10 0x00 0x00
Serial.write(RELEASE,7); // Отпушена Next Track 0x9f 0x05 0xa1 0x02 0x00 0x00 0x00
delay(100);
Serial.write(NEXT_TRACK,7); // Второй раз нажата Next Track 0x9f 0x05 0xa1 0x02 0x10 0x00 0x00
Serial.write(RELEASE,7); // Отпушена Next Track 0x9f 0x05 0xa1 0x02 0x00 0x00 0x00
delay(10);}
else if ((time_a + 200) < millis() && a != 0) {a=0;} // действие после нажатия кнопки, если переменная стала равна 1 то

if (b==1 && time_b == millis()){
Serial.write(PREVIOUS_TRACK,7); // Двойное нажатие Previous Track, предыдущая папка 0x9f 0x05 0xa1 0x02 0x20 0x00 0x00
Serial.write(RELEASE,7); // Отпушена Previous Track 0x9f 0x05 0xa1 0x02 0x00 0x00 0x00
delay(100);
Serial.write(PREVIOUS_TRACK,7); // Второй раз нажата Previous Track 0x9f 0x05 0xa1 0x02 0x20 0x00 0x00
Serial.write(RELEASE,7); // Отпушена Previous Track 0x9f 0x05 0xa1 0x02 0x00 0x00 0x00
delay(10);}
else if ((time_b + 200) < millis() && b != 0) {b=0;}

if (c==1 && time_c == millis()){
Serial.write(PREVIOUS_TRACK,7); // Нажата Previous Track 0x9f 0x05 0xa1 0x02 0x20 0x00 0x00
Serial.write(RELEASE,7); // Отпушена Previous Track 0x9f 0x05 0xa1 0x02 0x00 0x00 0x00
delay(10);}
else if ((time_c + 200) < millis() && c != 0) {c=0;}

if (d==1 && time_d == millis()){
Serial.write(NEXT_TRACK,7); // Нажата Next Track 0x9f 0x05 0xa1 0x02 0x10 0x00 0x00
Serial.write(RELEASE,7); // Отпушена Next Track 0x9f 0x05 0xa1 0x02 0x00 0x00 0x00
delay(10);}
else if ((time_d + 200) < millis() && d != 0) {d=0;} // действие после отпускания кнопки

if (e==1 && time_e == millis()){
Serial.write(PLAY_PAUSE,7); // Нажата Play/pause 0x9f 0x05 0xa1 0x02 0x08 0x00 0x00
Serial.write(RELEASE,7); // Отпушена Play/pause 0x9f 0x05 0xa1 0x02 0x00 0x00 0x00
delay(10);}
else if ((time_e + 200) < millis() && e != 0) {e=0;} // действие после отпускания кнопки

if (f==1 && time_f == millis()){
Serial.write(R_CTRL,12); // Задача Tasker
delay(10);}
else if ((time_f + 200) < millis() && f != 0) {
// Serial.write(RELEASE_KEY,12);
f=0;}

if (g==1 && time_g == millis()){Serial.write(ALT_TAB,12); // Alt+Tab 0x9f 0x0a 0xa1 0x01 0x04 0x00 0x2b 0x00 0x00 0x00 0x00 0x00
Serial.write(ALT,12); // Alt нажат, Tab отпушен 0x9f 0x0a 0xa1 0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00
pauseMillis = 0;
delay(10);}
else if ((time_g + 200) < millis() && g != 0) { // действие после отпускания кнопки, ждет 1 секунду потом все клавиши отпушены 0x9f 0x0a 0xa1 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
pauseMillis = millis();
g=0;}

if(pauseMillis && millis()-pauseMillis >= 1000)
{
pauseMillis = 0;
Serial.write(RELEASE_KEY,12);
}
}
Для перехода по альбомам, кнопка вверх и вниз, используется двойное нажатие Next Track и Previous Track, т.е. arduino отсылает код два раза с паузой 0.1 секунды. Для работы функции в настройках Poweramp необходимо включить двойное и тройное нажатие.
32459
Здесь (https://www.dropbox.com/s/dqakqx8qvsg3mz7/iWRAP5.zip) все необходимое для прошивки и настройки HC-05, включая прошивку iWRAP5.
Видео (https://www.dropbox.com/s/4g2x1gsk2egnqa6/%D0%92%D0%B8%D0%B4%D0%B5%D0%BE%2023.08.13%2C%2012% 2007%2051.mov) как работает устройство.

mas_u
25.08.2013, 15:50
Но прошивка iWRAP4 не позволяет использовать мультимедийные клавиши клавиатуры, такие как: Play/pause, Next Track, Previous Track и т.д.

Из доки на iWRAP4 -

Example how to send play/pause report:
0x9f 0x05 0xa1 0x03 0x08 0x00 0x00 0x9f 0x05 0xa1 0x03 0x00 0x00 0x00

Example how to send next track report:
0x9f 0x05 0xa1 0x03 0x10 0x00 0x00 0x9f 0x05 0xa1 0x03 0x00 0x00 0x00

Example how to send previous track report:
0x9f 0x05 0xa1 0x03 0x20 0x00 0x00 0x9f 0x05 0xa1 0x03 0x00 0x00 0x00

lti1
25.08.2013, 16:08
Из доки на iWRAP4 -

Example how to send play/pause report:
0x9f 0x05 0xa1 0x03 0x08 0x00 0x00 0x9f 0x05 0xa1 0x03 0x00 0x00 0x00

Example how to send next track report:
0x9f 0x05 0xa1 0x03 0x10 0x00 0x00 0x9f 0x05 0xa1 0x03 0x00 0x00 0x00

Example how to send previous track report:
0x9f 0x05 0xa1 0x03 0x20 0x00 0x00 0x9f 0x05 0xa1 0x03 0x00 0x00 0x00

И ниже примечание, что работает только на iWRAP4.1 и выше. Прошивку 4.1 не нашёл, наверное какая то бета была, официальная утилита предлагает обновить только на 4, 4.01 и 5.01. Из выше перечисленных работает только на 5.01, сам проверял.

mas_u
25.08.2013, 16:29
И ниже примечание, что работает только на iWRAP4.1 и выше. Прошивку 4.1 не нашёл, наверное какая то бета была, официальная утилита предлагает обновить только на 4, 4.01 и 5.01. Из выше перечисленных работает только на 5.01, сам проверял.
Да, согласен. Не работает на 4.0.0.
Что бы не париться с обновлением до 5 версии еще можно настроить файл .kl для запуска мультимедиа кнопок через обычные.

lti1
25.08.2013, 16:39
Что бы не париться с обновлением до 5 версии еще можно настроить файл .kl для запуска мультимедиа кнопок через обычные.

А что там париться? Прошивку 5.01 я выложил, а вопрос с лицензией решается за 30 минут (в рабочее время).

lti1
26.08.2013, 12:28
Пока не все работает гладко, а именно после подключение к планшету, приходится вручную, кнопкой пульта подавать команду модулю "SELECT 1", что бы он перешел в режим "data mode", документация не вся изучена, с английским у меня туго, думаю в скором времени решу.

Из "Руководства пользователя iWRAP5 Version 1.19" следует, что модуль должен сам переходить в "data mode" при следующих событиях:
- CONNECT event
- RING event
- Escape sequence
- SELECT command
Но почему-то при - CONNECT event и - RING event он этого не делает. На прошивке iWRAP4 и iWRAP4.01 все работало как положено.:sad2:
32470

Сейчас пытаюсь программно решить, по событию подключено одно или более устройств (CD signal is driven high if there are one or more connections.)
SET CONTROL CD 08 0
SET CONTROL BIND 0 08 RISE SELECT 1
Но команда "SELECT 1" проходит слишком рано и модуль в "data mode" не переходит. Нужно что бы команда проходила после последней строчки "HID 1 OUTPUT 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00".
RING 0 12:34:56:78:9a:bc 11 HID
SELECT 1
SYNTAX ERROR
RING 1 12:34:56:78:9a:bc 13 HID
HID 1 OUTPUT 01 00 00 00 00 00 00 00 00
HID 1 OUTPUT 02 00 00 00
HID 1 OUTPUT 03 00 00 00 00 00
HID 1 OUTPUT 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

lti1
27.08.2013, 00:20
Сейчас пытаюсь программно решить, по событию подключено одно или более устройств (CD signal is driven high if there are one or more connections.)
SET CONTROL CD 08 0
SET CONTROL BIND 0 08 RISE SELECT 1
Решил, добавив пауза 0,5 сек. Теперь все работает как надо.
SET CONTROL CD 08 0
SET CONTROL BIND 0 08 RISE DELAY 0 500 SELECT 1