Почитав темы на подобии
Резистивные кнопки под андроид, решил сделать управление планшетом с ИК пульта. Почему с ИК пульта и почему по bluetooth? Да потому, что нет у меня кнопок на руле, зато есть
такой пульт и мой Galaxy Tab 2 не может работать одновременно с USB OTG и зарядкой.
Состоит данное устройство из двух частей, bluetooth модуля HC-05

покупал на
ebay, цена не больше 6$ и
Carduino Nano (в дальнейшем, в моем случае будет Arduino Pro Mini). На
этом форуме вычитал, что можно прошить HC-05 прошивкой iWRAP4 от WT12, с данной прошивкой модуль может прикидываться HID устройством,
здесь инструкция как прошивать и схема LPT программатора. Но прошивка iWRAP4 не позволяет использовать мультимедийные клавиши клавиатуры, такие как: Play/pause, Next Track, Previous Track и т.д. Зато с этим успешно справляется iWRAP5, описание
здесь. С помощью утилиты 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 к Arduino.

Ссылки:
Здесь,
здесь как работать с ИК и Arduino.

Только я использовал пин 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 05010906a1010507850119e029e715002501750195088102950175088101950575010508850119012905910295017503910395067508150025650507190029658100c0050c0901a1018502050c1500250109e909ea09e209cd19b529b87501950881020a8a010a21020a2a021a23022a27027501950881020a83010a96010a92010a9e010a94010a060209b209b4750195088102c005010902a1010901a10085030509190129031500250195037501810295017505810305010930093109381581257f750895038106050c0a380295018106c0c006abff0a0002a10185047508150026ff00951009018102951009029102c0
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 необходимо включить двойное и тройное нажатие.
Здесь все необходимое для прошивки и настройки HC-05, включая прошивку iWRAP5.
Видео как работает устройство.