|  | 
|  25.08.2013, 03:24 | #1 | 
| Старший Пользователь  Регистрация: 17.01.2010 Возраст: 49 Город: Самара Регион: 63, 163 Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶ 
					Сообщений: 457
				          |  ИК управление Android по Bluetooth Почитав темы на подобии Резистивные кнопки под андроид, решил сделать управление планшетом с ИК пульта. Почему с ИК пульта и почему по 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 Код: SET CONTROL CD 08 0 SET CONTROL BIND 0 08 RISE DELAY 0 500 SELECT 1 Код: #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);
  }
}Здесь все необходимое для прошивки и настройки HC-05, включая прошивку iWRAP5. Видео как работает устройство. Последний раз редактировалось admin; 16.03.2017 в 00:31. | 
|   |   | 
|  25.08.2013, 15:50 | #2 | |
| Старший Пользователь  Регистрация: 08.05.2011 Регион: Украина Машина: Subaru 
					Сообщений: 233
				  |   Цитата: 
 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 | |
|   |   | 
|  25.08.2013, 16:08 | #3 | |
| Старший Пользователь  Регистрация: 17.01.2010 Возраст: 49 Город: Самара Регион: 63, 163 Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶ 
					Сообщений: 457
				          |   Цитата: 
 | |
|   |   | 
|  25.08.2013, 16:29 | #4 | |
| Старший Пользователь  Регистрация: 08.05.2011 Регион: Украина Машина: Subaru 
					Сообщений: 233
				  |   Цитата: 
 Что бы не париться с обновлением до 5 версии еще можно настроить файл .kl для запуска мультимедиа кнопок через обычные. | |
|   |   | 
|  25.08.2013, 16:39 | #5 | 
| Старший Пользователь  Регистрация: 17.01.2010 Возраст: 49 Город: Самара Регион: 63, 163 Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶ 
					Сообщений: 457
				          |   | 
|   |   | 
|  26.08.2013, 12:28 | #6 | |
| Старший Пользователь  Регистрация: 17.01.2010 Возраст: 49 Город: Самара Регион: 63, 163 Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶ 
					Сообщений: 457
				          |   Цитата: 
 - CONNECT event - RING event - Escape sequence - SELECT command Но почему-то при - CONNECT event и - RING event он этого не делает. На прошивке iWRAP4 и iWRAP4.01 все работало как положено.  Сейчас пытаюсь программно решить, по событию подключено одно или более устройств (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 Код: 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:16. | |
|   |   | 
|  27.08.2013, 00:20 | #7 | |
| Старший Пользователь  Регистрация: 17.01.2010 Возраст: 49 Город: Самара Регион: 63, 163 Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶ 
					Сообщений: 457
				          |   Цитата: 
 Код: SET CONTROL CD 08 0 SET CONTROL BIND 0 08 RISE DELAY 0 500 SELECT 1 | |
|   |   | 
|  | 
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
| 
 |  |