Подключать буду через Arduino https://duino.ru/arduino.html
Основной задачей пульта будет управление в iCar.
С отправкой и получением команд от пульта я разобрался ( Еще раз ОГРОМНОЕ СПАСИБО crashmilan )
Подключаюсь к пульту через терминал Extem. Настройки 9600,8,2.
void loop() // run over and over { if (MMI_Serial.available()) { mmi2pc = MMI_Serial.read(); Serial.write(mmi2pc); MMI_Serial.write(06); // это ответ пульту, что данные получены }
if (Serial.available()) { pc2mmi = Serial.read(); MMI_Serial.write(pc2mmi); } }
И все шикарно работает, и отправка и получение.
Вроде бы все хорошо, но как всегда без "НО" не обошлось...
Попробовал по управлять iCar.
Без бубна не обошлось. Для этого мне пришлось программно включать пульт через терминал( Для этого надо отправить на пульт команду 10 02 70 12 10 03 A7 и после этого можно получить инфу о нажатии кнопок) а потом запускать iCarDS и в настройках плагина назначать кнопки. Одна кнопка в iCar имеет несколько значений, но это как я понял из за того что плагин получает не привычное для него количество байт.
А вот теперь расскажу про "НО"...
Пытался сделать что бы пульт программно включала Arduino, а так же обработать полученные значения с кнопок и преподнести их в привычном для iCar виде, но так и не добился результата.
Пробовал обрабатывать через switch case... вроде что то получалось, но отправить заветный код (10 02 70 12 10 03 A7) включения так и не смог, хотя код подтверждения (06) отправляется и пульт его прекрасно понимает.
Прошу помощи у Вас, великие Гуру, разобрать с отправкой кодов на пульт.
Вот пример общения в терминале:
PHP код:
1: 67 1A 04 FA 27 C5 00 // Когда появляется питание на пульте он начинает посылать этот код, на который требуется подтверждение получения "06" 2: 67 1A 04 FA 27 C5 00 // Когда появляется питание на пульте он начинает посылать этот код, на который требуется подтверждение получения "06" 3: 06 // Отправляю на пульт код подтверждения 4: 10 02 70 12 10 03 A7 // Отправляю на пульт код [B]включения [/B] 5: 7E 00 // Ответ пульта что он принял код
67 2A DF F2 4B 00 // Ответ пульта что он включился 6: 06 // Отправляю на пульт код подтверждения 7: 10 02 64 99 01 10 03 23 // Отправляю на пульт код [B]разрешения на включение подсветки возле кнопок[/B] 8: 7E 00 // Ответ пульта что он принял код 9: 06 // Отправляю на пульт код подтверждения 10: 10 02 68 01 02 10 03 90 // Отправляю на пульт код [B]включения подсветки возле кнопки MEDIA[/B] 11: 7E 00 // Ответ пульта что он принял код 12: 06 // Отправляю на пульт код подтверждения
Последний раз редактировалось admin; 21.03.2017 в 02:31.
Из общения в личке я понял, что ты уже сделал скетч который общается с ардуино и отправляет данные в плагин iCarDuino в нужном формате, а получается что ещё нет.
Давай уточним такой момент. Когда пульт шлет это
67 1A 04 FA 27 C5 00 // Когда появляется питание на пульте он начинает посылать этот код, на который требуется подтверждение получения "06"
Он это делает постоянно с каким-то временным интервалом или один раз и ждёт код подтверждения?
с каким то временным интервалом (если да, то с каким примерно) или без остановки?
Вообщем так:
Даю 12В на пульт и он начинает посылать этот код раз в секунду ( может и быстрее но терминал выдает его примерно с таким интервалом ). Если не посылать ему ответ то он отправит 20 таких кодов и уйдет в режим ожидания. По этому я ему сразу даю "06" и его это полностью устраивает и с ним у меня проблем нет. Проблема в отправке коде на включение, который нужно отправить пульту.
ещё такой вопрос, все команды от пульта начинаются с байта 67, а заканчиваются байтом 00? Кроме кода подтверждения FE 00 разумеется
Ура, я разобрался. Пульт тепреь включает Ардуинка , и нажатие каждой кнопки я могу отправить в Serial в любом удобном виде.
Единственный нюанс что работает только на скорости 9600.
Теперь хотелось бы получить ответ от плагина: какое окно открыто.
Хранить все коды связанные с пультом буду в скетче в таком виде
PHP код:
//***************************************************** Системные коды *******************************************************************
int MMIreceiveByte = 0; // byte reading from MMI byte MMIbyte[8] = {0,0,0,0,0,0,0,0}; // key byte sequence int Delay = 10; //delay in millisec int MMIcom = 0; //boolean value set 1 if comand detected int ComID = 0; // comand ID (for easy select case routine) int otvet = 0; // id otveta
int incomingByte = 0; // byte reading from serial port
//***************************************************** Системные коды *******************************************************************
void setup() { Serial.begin(9600); // открываем порт на скорости 9600 для передачи в ПК MMI.begin(9600); // открываем порт на скорости 9600 для передачи в MMI }
void loop() { if (Serial.available()) { MMI.write(Serial.read()); } if (MMI.available() && MMIcom==0 ) { ReadMMI(); } else {
switch (otvet) { case 1: delay (5); WriteMMI(Pult_ON, 8); break;
case 2: delay (5); WriteMMI(Podsvetka_ON,8); delay (5); WriteMMI(Knopki_ON, 8); break;
case 3: delay (5); WriteMMI(NAVI_ON, 8); break; case 4: delay (5); WriteMMI(INFO_ON, 8); break; case 5: delay (5); WriteMMI(CAR_ON, 8); break; case 6: delay (5); WriteMMI(SETUP_ON, 8); break; case 7: delay (5); WriteMMI(RADIO_ON, 8); break; case 8: delay (5); WriteMMI(MEDIA_ON, 8); break; case 9: delay (5); WriteMMI(NAME_ON, 8); break; case 10: delay (5); WriteMMI(TEL_ON, 8); break; case 11: delay (5); WriteMMI(LeftUP_ON, 8); break; case 12: delay (5); WriteMMI(LeftDown_ON, 8); break; case 13: delay (5); WriteMMI(RightUP_ON, 8); break; case 14: delay (5); WriteMMI(RightDown_ON, 8); break; case 15: delay (5); WriteMMI(SETUP_OFF, 8); break; case 16: delay (5); WriteMMI(CAR_OFF, 8); break; case 17: delay (5); WriteMMI(TEL_OFF, 8); break; case 18: delay (5); WriteMMI(LeftUP_OFF, 8); break; case 19: delay (5); WriteMMI(LeftDown_OFF, 8); break; case 20: delay (5); WriteMMI(RightUP_OFF, 8); break; case 21: delay (5); WriteMMI(RightDown_OFF, 8); break; case 22: delay (5); WriteMMI(RADIO_OFF, 8); break; case 23: delay (5); WriteMMI(NAVI_OFF, 8); break;
} otvet = 0; }
if (MMIcom==1) { switch (ComID) // обрабатываем команды, Основные Case это 1 и 2 , остальные связаны с кнопками. Сейчас я их использую что бы зажигать лампочки возле кнопок. // ************************************************************** впринципе их можно не использовать, либо использовать если нужна обработка длинных нажатий. { case 100: SerialPrintKey(); MMI.write(06); break;
case 1: MMI.write(06); otvet = 1; break;
case 2: MMI.write(06); otvet = 2; break;
case 3: SerialPrintKey(); MMI.write(06);
break;
case 4: SerialPrintKey(); MMI.write(06); otvet = 3; break;
case 5: SerialPrintKey(); MMI.write(06);
break;
case 6: SerialPrintKey(); MMI.write(06); otvet = 4; break;
case 7: SerialPrintKey(); MMI.write(06);
break;
case 8: SerialPrintKey(); MMI.write(06); otvet = 5; break;
case 9: SerialPrintKey(); MMI.write(06);
break;
case 10: SerialPrintKey(); MMI.write(06); otvet = 6; break; case 11: SerialPrintKey(); MMI.write(06);
break;
case 12: SerialPrintKey(); MMI.write(06); otvet = 7; break;
case 13: SerialPrintKey(); MMI.write(06);
break;
case 14: SerialPrintKey(); MMI.write(06); otvet = 8; break;
case 15: SerialPrintKey(); MMI.write(06);
break;
case 16: SerialPrintKey(); MMI.write(06); otvet = 9; break;
case 17: SerialPrintKey(); MMI.write(06);
break;
case 18: SerialPrintKey(); MMI.write(06); otvet = 10; break;
case 19: SerialPrintKey(); MMI.write(06);
break;
case 20: SerialPrintKey(); MMI.write(06); otvet = 15; break;
case 21: SerialPrintKey(); MMI.write(06);
break;
case 22: SerialPrintKey(); MMI.write(06); otvet = 16; break;
case 23: SerialPrintKey(); MMI.write(06);
break;
case 24: SerialPrintKey(); MMI.write(06); otvet = 17; break;
case 25: SerialPrintKey(); MMI.write(06); otvet = 18; break;
case 26: SerialPrintKey(); MMI.write(06);
break;
case 27: SerialPrintKey(); MMI.write(06); otvet = 19; break;
case 28: SerialPrintKey(); MMI.write(06); otvet = 20; break;
case 29: SerialPrintKey(); MMI.write(06); otvet = 21; break;
case 30: SerialPrintKey(); MMI.write(06); otvet = 22; break;
case 31: SerialPrintKey(); MMI.write(06);
break;
case 32: SerialPrintKey(); MMI.write(06); otvet = 23; break;
case 33: SerialPrintKey(); MMI.write(06);
break;
case 34: SerialPrintKey(); MMI.write(06); otvet = 11; break;
case 35: SerialPrintKey(); MMI.write(06);
break;
case 36: SerialPrintKey(); MMI.write(06); otvet = 12; break; case 37: SerialPrintKey(); MMI.write(06);
break; case 38: SerialPrintKey(); MMI.write(06); otvet = 13; break;
case 39: SerialPrintKey(); MMI.write(06);
break;
case 40: SerialPrintKey(); MMI.write(06); otvet = 14; break;
}
MMIcom = 0; MMI.flush(); } }
void ReadMMI() { MMIreceiveByte = MMI.read(); //read 1-st byte Если 67 то это пульт if (MMIreceiveByte==0x67) { MMIbyte[1]=0x67; for (int i=2; i <= 7; i++) { MMIbyte[i] = MMI.read(); //read 2,3,4,5,6,7 bytes of data - читаем следующие байты delay(Delay); }
void SerialPrintKey() //Вывод команды в сериал порт , тут можно привести ее к привычному для iCar виду { for (int x=1; x <= 7; x++){ Serial.print(MMIbyte[x], HEX); Serial.print(" "); } Serial.println(); }
void WriteMMI(byte Mas[], int Byte) // Процедуры отправки команд на пульт { for (int i=0; i<Byte; i++) { MMI.write(Mas[i]); delay(2); } }