PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   iCarDS (http://pccar.ru/forumdisplay.php?f=121)
-   -   iCarDuino + MMI пульт AUDI (http://pccar.ru/showthread.php?t=18860)

filinmd 14.03.2013 12:47

iCarDuino + MMI пульт AUDI
 
Ну что ж, начну свой рассказ ...

Хочу подключить пульт MMI от Audi к своему PCCar/

Подключать буду через Arduino https://duino.ru/arduino.html
Основной задачей пульта будет управление в iCar.
С отправкой и получением команд от пульта я разобрался ( Еще раз ОГРОМНОЕ СПАСИБО crashmilan )

Подключаюсь к пульту через терминал Extem. Настройки 9600,8,2.
PHP код:

#include <SoftwareSerial.h>
SoftwareSerial MMI_Serial(42);
byte mmi2pc;

byte pc2mmi;



void setup()  
{
  
Serial.begin(9600);
  
MMI_Serial.begin(9600);
}

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 // Отправляю на пульт код подтверждения 


Bersenev 14.03.2013 14:36

2 filinmd

Из общения в личке я понял, что ты уже сделал скетч который общается с ардуино и отправляет данные в плагин iCarDuino в нужном формате, а получается что ещё нет.

Давай уточним такой момент. Когда пульт шлет это

67 1A 04 FA 27 C5 00 // Когда появляется питание на пульте он начинает посылать этот код, на который требуется подтверждение получения "06"

Он это делает постоянно с каким-то временным интервалом или один раз и ждёт код подтверждения?

filinmd 14.03.2013 14:56

Цитата:

Сообщение от Bersenev (Сообщение 250628)

Давай уточним такой момент. Когда пульт шлет это

67 1A 04 FA 27 C5 00 // Когда появляется питание на пульте он начинает посылать этот код, на который требуется подтверждение получения "06"

Он это делает постоянно с каким-то временным интервалом или один раз и ждёт код подтверждения?

Мой косяк,что не уточнил в личке что данные идут не в формате плагина.


67 1A 04 FA 27 C5 00 он шлет до получения 06



p.s. сейчас наткнулся на скетч для iBUS.... сижу разбираюсь, задачи похожи.

Bersenev 14.03.2013 15:17

Цитата:

Сообщение от filinmd (Сообщение 250630)
67 1A 04 FA 27 C5 00 он шлет до получения 06


с каким то временным интервалом (если да, то с каким примерно) или без остановки?

filinmd 14.03.2013 15:23

Цитата:

Сообщение от Bersenev (Сообщение 250634)
с каким то временным интервалом (если да, то с каким примерно) или без остановки?

Вообщем так:

Даю 12В на пульт и он начинает посылать этот код раз в секунду ( может и быстрее но терминал выдает его примерно с таким интервалом ). Если не посылать ему ответ то он отправит 20 таких кодов и уйдет в режим ожидания. По этому я ему сразу даю "06" и его это полностью устраивает и с ним у меня проблем нет. Проблема в отправке коде на включение, который нужно отправить пульту.

Bersenev 14.03.2013 15:42

ещё такой вопрос, все команды от пульта начинаются с байта 67, а заканчиваются байтом 00? Кроме кода подтверждения FE 00 разумеется

filinmd 14.03.2013 16:51

Цитата:

Сообщение от Bersenev (Сообщение 250645)
ещё такой вопрос, все команды от пульта начинаются с байта 67, а заканчиваются байтом 00? Кроме кода подтверждения FE 00 разумеется

Ура, я разобрался. Пульт тепреь включает Ардуинка , и нажатие каждой кнопки я могу отправить в Serial в любом удобном виде.
Единственный нюанс что работает только на скорости 9600.


Теперь хотелось бы получить ответ от плагина: какое окно открыто.

Хранить все коды связанные с пультом буду в скетче в таком виде

PHP код:

//*****************************************************          Системные коды          *******************************************************************

byte START_12V[8] = {00x670xFF0x1A0x040xFA0x270xC5}; // 67 FF 1A 4 FA 27 C5 
byte Pult_ON[8] = {00x100x020x700x120x100x030xA7}; // c10 02 70 12 10 03 A7  

byte Pult_ON_Otvet[8] = {00x670xFF0x2A0xDF0xF20x4B0x00 }; //     67 FF 2A DF F2 4B 0 

byte Knopki_ON[8] = {0x100x020x640x990x010x100x030x23}; // 10 02 64 99 01 10 03 23 
byte Podsvetka_ON[8] = {0x100x020x600x9A0x010x100x030x20}; // 10 02 60 9A 01 10 03 20 



Сейчас скетч причешу и выложу...

pierrotm777 15.03.2013 10:59

Sorry,
I don't speak russian,
How do you connect the arduino to your Aud MMI system (what electrical interface)

filinmd 15.03.2013 12:07

Цитата:

Сообщение от pierrotm777 (Сообщение 250836)
Sorry,
I don't speak russian,
How do you connect the arduino to your Aud MMI system (what electrical interface)

MMI ARDUINO

16 pin ---- D2
15 pin ---- D4


Sketch in the next Post

filinmd 15.03.2013 12:18

И так отчитываюсь за проделанную работу.

Ардуиной могу делать с пультом все что угодно :)

Текущий скетч с демонстрацией возможностей.
PHP код:

#include <SoftwareSerial.h>
SoftwareSerial MMI(42); //TX, RX пульта  

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 

//*****************************************************          Системные коды          *******************************************************************

byte START_12V[8] = {00x670xFF0x1A0x040xFA0x270xC5}; // Ответ пульта после подачи +12 67 FF 1A 4 FA 27 C5 
byte Pult_ON[8] = {00x100x020x700x120x100x030xA7}; // Команда включение пульта  10 02 70 12 10 03 A7  

byte Pult_ON_Otvet[8] = {00x670xFF0x2A0xDF0xF20x4B0x00 }; // Ответ пульта после программного включения 67 FF 2A DF F2 4B 0 

byte Knopki_ON[8] = {0x100x020x640x990x010x100x030x23}; // Разрешить подсветку  10 02 64 99 01 10 03 23 
byte Podsvetka_ON[8] = {0x100x020x600x9A0x010x100x030x20}; // Включение общей  подсветки кнопок  10 02 60 9A 01 10 03 20





//*****************************************************           Коды кнопок          *******************************************************************

byte NAVI_DOWN[8] = {00x670xFF0x3E,0xF50xDF0xF20x4B}; // Нажатие кнопки  67 FF 3E F5 DF F2 4B                   *Проверено
byte NAVI_1_DOWN[8] = {00x670xFF0x3A0xEA0xDF0xF20x49}; // Отпустили кнопку 67 FF 3A EA DF F2 49               *Проверено

byte INFO_DOWN[8] = {00x670xFF0x3E0xF30xDF0xF20x49}; //Нажатие кнопки 67 FF 3E F3 DF F2 49                    *Проверено
byte INFO_1_DOWN[8] = {00x670xFF0x3A0xE60xDF0xF20x47}; // Отпустили кнопку 67 FF 3A E6 DF F2 47               *Проверено

byte CAR_DOWN[8] = {00x670xFF0x3E0xF10xBE0xF20x47}; //Нажатие кнопки  67 FF 3E F1 BE F2 47                    *Проверено
byte CAR_1_DOWN[8] = {00x670xFF0x3A0xE20xBE0xF20x45}; // Отпустили кнопку 67 FF 3A E2 BE F2 45                *Проверено

byte SETUP_DOWN[8] = {00x670xFF0x3E0xEF0xBE0xF20x45}; //Нажатие кнопки  67 FF 3E EF BE F2 45                  *Проверено
byte SETUP_1_DOWN[8] = {00x670xFF0x3A0xDE0xBE0xF20x43}; // Отпустили кнопку 67 FF 3A DE BE F2 43              *Проверено

byte RADIO_DOWN[8] = {00x670xFF0x3E0xCF0xDF0xF20x25}; //Нажатие кнопки  67 FF 3E CF DF F2 25                  *Проверено 
byte RADIO_1_DOWN[8] = {00x670xFF0x3A0x9E0xDF0xF20x23}; // Отпустили кнопку 67 FF 3A 9E DF F2 23              *Проверено

byte MEDIA_DOWN[8] = {00x670xFF0x3E0xFB0xBE0xF20x51}; //Нажатие кнопки  67 FF 3E FB BE F2 51                  *Проверено
byte MEDIA_1_DOWN[8] = {00x670xFF0x3A0xF60xBE0xF20x4F}; // Отпустили кнопку 67 FF 3A F6 BE F2 4F              *Проверено 

byte NAME_DOWN[8] = {00x670xFF0x3E0xF90xDF0xF20x4F}; // Нажатие кнопки  67 FF 3E F9 DF F2 4F                  *Проверено
byte NAME_1_DOWN[8] = {00x670xFF0x3A0xF20xDF0xF20x4D}; // Отпустили кнопку 67 FF 3A F2 DF F2 4D               *Проверено

byte TEL_DOWN[8] = {00x670xFF0x3E0xF70xBE0xF20x4D}; // Нажатие кнопки  67 FF 3E F7 BE F2 4D                   *Проверено
byte TEL_1_DOWN[8] = {00x670xFF0x3A0xEE0xBE0xF20x4B}; // Отпустили кнопку 67 FF 3A EE BE F2 4B                *Проверено

byte LeftReturn_DOWN[8] = {00x670xFF0x3E0xE70xDF0xF20x3D}; // Нажатие кнопки  67 FF 3E E7 DF F2 3D            *Проверено
byte LeftReturn_1_DOWN[8] = {00x670xFF0x3A0xCE0xDF0xF20x3B}; //Отпустили кнопку  67 FF 3A CE DF F2 3B         *Проверено

byte Return_DOWN[8] = {00x670xFF0x3E0xE10xDF0xF20x37}; // Нажатие кнопки  67 FF 3E E1 DF F2 37                *Проверено
byte Return_1_DOWN[8] = {00x670xFF0x3A0xC20xDF0xF20x35}; // Отпустили кнопку 67 FF 3A C2 DF F2 35             *Проверено

byte RightReturn_DOWN[8] = {00x670xFF0x3E0xDF0xBE0xBE0xF2}; // Нажатие кнопки  67 FF 3E DF BE BE F2           *Проверено
byte RightReturn_1_DOWN[8] = {00x670xFF0x3A0xBE0xBE0xBE0xF2}; // Отпустили кнопку 67 FF 3A BE BE BE F2        *Проверено 

byte Big_Left[8] = {00x670xFF0xBA0xF40xBE0xF20x11}; // Повернули против часовой  67 FF BA F4 BE F2 11         *Проверено   
byte Big_DOWN[8] = {00x670xFF0x3E0xFD0xBE0xF20x53}; // Нажатие кнопки  67 FF 3E FD BE F2 53                   *Проверено  
byte Big_1_DOWN[8] = {00x670xFF0x3A0xFA0xBE0xF20x51}; // Отпустили кнопку 67 FF 3A FA BE F2 51                *Проверено  
byte Big_Right[8] = {00x670xFF0xBE0xF50xBE0xF20x13}; // Повернули по часовой 67 FF BE F5 BE F2 13             *Проверено  

byte Small_Left[8] = {00x670xFF0xFA0xF50xBE0xF20x31}; // овернули против часовой  67 FF FA F5 BE F2 31        *Проверено   
byte Small_Right[8] = {00x670xFF0xFE0xF40xBE0xF20x33}; // Повернули по часовой 67 FF FE F4 BE F2 33           *Проверено     
byte Small_DOWN[8] = {00x670xFF0x3E0x8F0xBE0xF20xE5}; // Нажатие кнопки  67 FF 3E 8F BE F2 E5                 *Проверено   
byte Small_1_DOWN[8] = {00x670xFF0x3A0x1E0xBE0xF20xE3}; // Отпустили кнопку 67 FF 3A 1E BE F2 E3              *Проверено       

byte LeftUP_DOWN[8] = {00x670xFF0x3E0xEB0xDF0xF20x41}; // Нажатие кнопки  67 FF 3E EB DF F2 41               *Проверено
byte LeftUP_1_DOWN[8] = {00x670xFF0x3A0xD60xDF0xF20x3F}; // Отпустили кнопку 67 FF 3A D6 DF F2 3F            *Проверено

byte LeftDown_DOWN[8] = {00x670xFF0x3E0xE90xBE0xF20x3F}; // Нажатие кнопки  67 FF 3E E9 BE F2 3F             *Проверено
byte LeftDown_1_DOWN[8] = {00x670xFF0x3A0xD20xBE0xF20x3D}; // Отпустили кнопку 67 FF 3A D2 BE F2 3D          *Проверено

byte RightUP_DOWN[8] = {00x670xFF0x3E0xE50xBE0xF20x3B}; // Нажатие кнопки  67 FF 3E E5 BE F2 3B              *Проверено
byte RightUP_1_DOWN[8] = {00x670xFF0x3A0xCA0xBE0xF20x39}; // Отпустили кнопку 67 FF 3A CA BE F2 39           *Проверено

byte RightDown_DOWN[8] = {00x670xFF0x3E0xE30xBE0xF20x39}; // Нажатие кнопки  67 FF 3E E3 BE F2 39            *Проверено
byte RightDown_1_DOWN[8] = {00x670xFF0x3A0xC60xBE0xF20x37}; // Отпустили кнопку 67 FF 3A C6 BE F2 37         *Проверено


//*****************************************************           Коды лампочек           *******************************************************************

byte NAVI_ON[8] = {0x100x020x680x010x050x100x030x93}; // 10 02 68 01 05 10 03 93                             *Проверено
byte NAVI_OFF[8] = {0x100x020x680x000x050x100x030x92}; // 10 02 68 00 05 10 03 92                            *Проверено        

byte INFO_ON[8] = {0x100x020x680x010x060x100x030x94}; // 10 02 68 01 06 10 03 94                             *Проверено
byte INFO_OFF[8] = {0x100x020x680x000x060x100x03 0x93}; // 10 02 68 00 06 10 03 93                           *Проверено        

byte CAR_ON[8] = {0x100x020x680x010x070x100x030x95}; // 10 02 68 01 07 10 03 95                              *Проверено
byte CAR_OFF[8] = {0x100x020x680x000x070x100x030x94}; // 10 02 68 00 07 10 03 94                             *Проверено

byte SETUP_ON[8] = {0x100x020x680x010x080x100x030x96}; // 10 02 68 01 08 10 03 96                            *Проверено
byte SETUP_OFF[8] = {0x100x020x680x000x080x100x030x95}; // 10 02 68 00 08 10 03 95                           *Проверено 

byte RADIO_ON[8] = {0x100x020x680x010x180x100x030xA6}; // > 10 02 68 01 18 10 03 A6                          *Проверено 
byte RADIO_OFF[8] = {0x100x020x680x000x180x100x030xA5}; // > 10 02 68 00 18 10 03 A5                         *Проверено      

byte MEDIA_ON[8] = {0x100x020x680x010x020x100x030x90}; // 10 02 68 01 02 10 03 90                            *Проверено
byte MEDIA_OFF[8] = {0x100x020x680x000x020x100x030x8F}; // 10 02 68 00 02 10 03 8F                           *Проверено   

byte NAME_ON[8] = {0x100x020x680x010x030x100x030x91}; // 10 02 68 01 03 10 03 91                             *Проверено   
byte NAME_OFF[8] = {0x100x020x680x000x030x100x030x90}; // 10 02 68 00 03 10 03 90                            *Проверено   

byte TEL_ON[8] = {0x100x020x680x010x040x100x030x92}; // 10 02 68 01 04 10 03 92                              *Проверено
byte TEL_OFF[8] = {0x100x020x680x000x040x100x030x91}; // 10 02 68 00 04 10 03 91                             *Проверено

byte LeftUP_ON[8] = {0x100x020x680x010x0A0x100x030x98}; // 10 02 68 01 0A 10 03 98                           *Проверено
byte LeftUP_OFF[8] = {0x100x020x680x000x0A0x100x030x97}; // 10 02 68 00 0A 10 03 97                          *Проверено    

byte LeftDown_ON[8] = {0x100x020x680x010x0B0x100x030x99}; // 10 02 68 01 0B 10 03 99                         *Проверено 
byte LeftDown_OFF[8] = {0x100x020x680x000x0B0x100x030x98}; // 10 02 68 00 0B 10 03 98                        *Проверено     
  
byte RightUP_ON[8] = {0x100x020x680x010x0D0x100x030x9B}; // 10 02 68 01 0D 10 03 9B                          *Проверено
byte RightUP_OFF[8] = {0x100x020x680x000x0D0x100x030x9A}; // 10 02 68 00 0D 10 03 9A                         *Проверено       

byte RightDown_ON[8] = {0x100x020x680x010x0E0x100x030x9C}; // 10 02 68 01 0E 10 03 9C                        *Проверено  
byte RightDown_OFF[8] = {0x100x020x680x000x0E0x100x030x9B}; // 10 02 68 00 0E 10 03 9B                       *Проверено   


void setup() 

  
Serial.begin(9600);           // открываем порт на скорости 9600 для передачи в ПК 
  
MMI.begin(9600);              // открываем порт на скорости 9600 для передачи в MMI



void loop() 

  if (
Serial.available())
    {
      
MMI.write(Serial.read());
    }  
  if (
MMI.available() && MMIcom==)
    { 
      
ReadMMI(); 
    }
   else
  {
    
    switch (
otvet)
      {
        case 
1:
          
delay (5);        
          
WriteMMI(Pult_ON8);  
        break;
        
        case 
2
          
delay (5);
          
WriteMMI(Podsvetka_ON,8);
          
delay (5);
          
WriteMMI(Knopki_ON8); 
        break;
        
        case 
3
          
delay (5);
          
WriteMMI(NAVI_ON8);  
        break;
        case 
4:
          
delay (5); 
          
WriteMMI(INFO_ON8);  
        break;
        case 
5
          
delay (5);
          
WriteMMI(CAR_ON8);  
        break;
        case 
6
          
delay (5);
          
WriteMMI(SETUP_ON8);  
        break;
        case 
7
          
delay (5);
          
WriteMMI(RADIO_ON8);  
        break;
        case 
8
          
delay (5);
          
WriteMMI(MEDIA_ON8);  
        break;
        case 
9
          
delay (5);
          
WriteMMI(NAME_ON8);  
        break;
        case 
10
          
delay (5);
          
WriteMMI(TEL_ON8);  
        break;
        case 
11
          
delay (5);
          
WriteMMI(LeftUP_ON8);  
        break;
        case 
12
          
delay (5);
          
WriteMMI(LeftDown_ON8);  
        break;
        case 
13
          
delay (5);
          
WriteMMI(RightUP_ON8);  
        break;
        case 
14
          
delay (5);
          
WriteMMI(RightDown_ON8);  
        break;
        case 
15
          
delay (5);
          
WriteMMI(SETUP_OFF8);  
        break;
        case 
16
          
delay (5);
          
WriteMMI(CAR_OFF8);  
        break;
        case 
17
          
delay (5);
          
WriteMMI(TEL_OFF8);  
        break;
        case 
18
          
delay (5);
          
WriteMMI(LeftUP_OFF8);  
        break;
        case 
19
          
delay (5);
          
WriteMMI(LeftDown_OFF8);  
        break;
        case 
20
          
delay (5);
          
WriteMMI(RightUP_OFF8);  
        break;
        case 
21
          
delay (5);
          
WriteMMI(RightDown_OFF8);  
        break;
        case 
22
          
delay (5);
          
WriteMMI(RADIO_OFF8);  
        break;
        case 
23
          
delay (5);
          
WriteMMI(NAVI_OFF8);  
        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<= 7i++)
          {   
            
MMIbyte[i] = MMI.read();    //read  2,3,4,5,6,7 bytes of data   -  читаем следующие байты 
            
delay(Delay); 
          } 
            
        
ComID=100// по умолчанию не опознаный код
       
        
if(memcmp(MMIbyteSTART_12V8) == ){ComID=1;} 
        if(
memcmp(MMIbytePult_ON_Otvet8) == ){ComID=2;} 
        if(
memcmp(MMIbyteNAVI_DOWN8) == ){ComID=3;} 
        if(
memcmp(MMIbyteNAVI_1_DOWN8) == ){ComID=4;}    
        if(
memcmp(MMIbyteINFO_DOWN8) == ){ComID=5;} 
        if(
memcmp(MMIbyteINFO_1_DOWN8) == ){ComID=6;}
        if(
memcmp(MMIbyteCAR_DOWN8) == ){ComID=7;} 
        if(
memcmp(MMIbyteCAR_1_DOWN8) == ){ComID=8;} 
        if(
memcmp(MMIbyteSETUP_DOWN8) == ){ComID=9;}  
        if(
memcmp(MMIbyteSETUP_1_DOWN8) == ){ComID=10;}  
        if(
memcmp(MMIbyteRADIO_DOWN8) == ){ComID=11;}
        if(
memcmp(MMIbyteRADIO_1_DOWN8) == ){ComID=12;}
        if(
memcmp(MMIbyteMEDIA_DOWN8) == ){ComID=13;}
        if(
memcmp(MMIbyteMEDIA_1_DOWN8) == ){ComID=14;}
        if(
memcmp(MMIbyteNAME_DOWN8) == ){ComID=15;}
        if(
memcmp(MMIbyteNAME_1_DOWN8) == ){ComID=16;}
        if(
memcmp(MMIbyteTEL_DOWN8) == ){ComID=17;}
        if(
memcmp(MMIbyteTEL_1_DOWN8) == ){ComID=18;}
        if(
memcmp(MMIbyteLeftReturn_DOWN8) == ){ComID=19;}
        if(
memcmp(MMIbyteLeftReturn_1_DOWN8) == ){ComID=20;}
        if(
memcmp(MMIbyteReturn_DOWN8) == ){ComID=21;}
        if(
memcmp(MMIbyteReturn_1_DOWN8) == ){ComID=22;}
        if(
memcmp(MMIbyteRightReturn_DOWN8) == ){ComID=23;}
        if(
memcmp(MMIbyteRightReturn_1_DOWN8) == ){ComID=24;}
        if(
memcmp(MMIbyteBig_Left8) == ){ComID=25;}
        if(
memcmp(MMIbyteBig_DOWN8) == ){ComID=26;}
        if(
memcmp(MMIbyteBig_1_DOWN8) == ){ComID=27;}
        if(
memcmp(MMIbyteBig_Right8) == ){ComID=28;}
        if(
memcmp(MMIbyteSmall_Left8) == ){ComID=29;}
        if(
memcmp(MMIbyteSmall_Right8) == ){ComID=30;}
        if(
memcmp(MMIbyteSmall_DOWN8) == ){ComID=31;}
        if(
memcmp(MMIbyteSmall_1_DOWN8) == ){ComID=32;}
        if(
memcmp(MMIbyteLeftUP_DOWN8) == ){ComID=33;}
        if(
memcmp(MMIbyteLeftUP_1_DOWN8) == ){ComID=34;}
        if(
memcmp(MMIbyteLeftDown_DOWN8) == ){ComID=35;}
        if(
memcmp(MMIbyteLeftDown_1_DOWN8) == ){ComID=36;}
        if(
memcmp(MMIbyteRightUP_DOWN8) == ){ComID=37;}
        if(
memcmp(MMIbyteRightUP_1_DOWN8) == ){ComID=38;}
        if(
memcmp(MMIbyteRightDown_DOWN8) == ){ComID=39;}
        if(
memcmp(MMIbyteRightDown_1_DOWN8) == ){ComID=40;}
      
        
MMIcom=1
      } 
      else 
      { 
        
MMIcom=0
      } 
      
MMI.flush(); 


void SerialPrintKey()  //Вывод команды в сериал порт , тут можно привести ее к привычному для iCar виду

    for (
int x=1<= 7x++){   
            
Serial.print(MMIbyte[x], HEX); 
            
Serial.print(" "); 
        } 
    
Serial.println(); 


void WriteMMI(byte Mas[], int Byte)   //  Процедуры отправки команд на пульт 
{   
          for (
int i=0i<Bytei++) { 
          
MMI.write(Mas[i]);
          
delay(2); 



и видео того что получилось http://youtu.be/TGI83w3t2F8


crashmilan 15.03.2013 13:29

Цитата:

Сообщение от filinmd (Сообщение 250844)
И так отчитываюсь за проделанную работу.

Молодца. Вот только почему все огни горят? Ты не делал так чтобы при переключения с медиа на двд медиа погас а двд загорелся? Еще вопрос, как работают крытилки, успевает нормально обработать сигнал ардуино? Ты учел что крутилка при увеличения оборотов повышает сигнал на 1 байт? Очень хочется увидеть как будет работать именно крутилка в икаре к примеру, т.к это самое главное, кнопки подают два сигнала четко а вот с крутилками не так все однозначно. Что делает ардуино если приходит неизвестный сигнал, отправляет 06?

crashmilan 15.03.2013 13:30

Еще одно, у тебя не верный код идет 67 FF 3A D2 BE F2 3D, нужно делать через ключ обязательно.

filinmd 15.03.2013 13:54

Цитата:

Сообщение от crashmilan (Сообщение 250864)
Молодца. Вот только почему все огни горят? Ты не делал так чтобы при переключения с медиа на двд медиа погас а двд загорелся? Еще вопрос, как работают крытилки, успевает нормально обработать сигнал ардуино? Ты учел что крутилка при увеличения оборотов повышает сигнал на 1 байт? Очень хочется увидеть как будет работать именно крутилка в икаре к примеру, т.к это самое главное, кнопки подают два сигнала четко а вот с крутилками не так все однозначно. Что делает ардуино если приходит неизвестный сигнал, отправляет 06?

Все горят потому что это все таки демонстрационный вариант, а так конечно допишу этот момент.

С крутилками вроде справляется нормально , но 1 байт я не учел, попробую с этим тоже разобраться.

Если неизвестная то отправляет 06

filinmd 15.03.2013 13:56

Цитата:

Сообщение от crashmilan (Сообщение 250866)
Еще одно, у тебя не верный код идет 67 FF 3A D2 BE F2 3D, нужно делать через ключ обязательно.

Только один неверный код? или вообще ?

И я так полагаю что не верный на фоне родных кодов?

pierrotm777 15.03.2013 14:03

Цитата:

Сообщение от filinmd (Сообщение 250843)
MMI ARDUINO

16 pin ---- D2
15 pin ---- D4


Sketch in the next Post

If i understand well, you use the originals MMI buttons through a serial connection , but you don't use the can bus !
So it's not possible to use this arduino hardware into a fonctionnal MMI system !

filinmd 15.03.2013 14:10

Цитата:

Сообщение от pierrotm777 (Сообщение 250873)
If i understand well, you use the originals MMI buttons through a serial connection , but you don't use the can bus !

yes

Цитата:

Сообщение от pierrotm777 (Сообщение 250873)
So it's not possible to use this arduino hardware into a fonctionnal MMI system !

I want to use this connection in the other car , on this, the existing system of car Audi has no relation.

crashmilan 15.03.2013 14:27

Все сигналы от пульта должны начинаться с 10. В твоем случае ардуино видит не тот сигнал, плохо это или нет не знаю, но у сделано через ключ.
По возможности запиши видео работы крутилки в икаре.
1 байт советую учесть, у меня сделано так 1= up 1+1=up+up 1+1+1=up+up+up.

filinmd 15.03.2013 14:38

Цитата:

Сообщение от crashmilan (Сообщение 250877)
Все сигналы от пульта должны начинаться с 10. В твоем случае ардуино видит не тот сигнал, плохо это или нет не знаю, но у сделано через ключ.

А схему ключа можно ?

Цитата:

Сообщение от crashmilan (Сообщение 250877)
По возможности запиши видео работы крутилки в икаре.

ок

Цитата:

Сообщение от crashmilan (Сообщение 250877)
1 байт советую учесть, у меня сделано так 1= up 1+1=up+up 1+1+1=up+up+up.

Не очень понял что это значит

crashmilan 15.03.2013 15:06

Цитата:

Сообщение от filinmd (Сообщение 250879)
А схему ключа можно ?
Не очень понял что это значит

1. Схема уже была где-то на сайте, изначально где обсуждали, но только вместо макса ардуино или pl2303 (подобные)
2. Ну смотри
10025001100376 - up
+1бит
10025002100377 - up+up
+2бит
10025003100378 - up+up+up
Если это учесть а не отправлять тупо 06 на эти сигналы, то ты сможешь быстрее прокручивать список без задержек на неизвестный сигнал.
+1 байт идет на всех крутилках, максимум у меня получилось от начального когда + 7байт и на него я сделал тупо pgup ну или семь раз up.

pierrotm777 15.03.2013 15:22

Цитата:

Сообщение от filinmd (Сообщение 250874)
I want to use this connection in the other car , on this, the existing system of car Audi has no relation.

It will be possible to use this interface in same time than an existing Audi MMI system ?

filinmd 15.03.2013 16:35

Цитата:

Сообщение от pierrotm777 (Сообщение 250888)
It will be possible to use this interface in same time than an existing Audi MMI system ?

I think that it will be possible , but later.

filinmd 15.03.2013 16:48

Вложений: 1
Цитата:

Сообщение от crashmilan (Сообщение 250882)
1. Схема уже была где-то на сайте, изначально где обсуждали, но только вместо макса ардуино или pl2303 (подобные)
2. Ну смотри
10025001100376 - up
+1бит
10025002100377 - up+up
+2бит
10025003100378 - up+up+up
Если это учесть а не отправлять тупо 06 на эти сигналы, то ты сможешь быстрее прокручивать список без задержек на неизвестный сигнал.
+1 байт идет на всех крутилках, максимум у меня получилось от начального когда + 7байт и на него я сделал тупо pgup ну или семь раз up.

Теперь понял, попробую разобраться.



Вот этот ключ?

pierrotm777 15.03.2013 17:11

Цитата:

Сообщение от filinmd (Сообщение 250906)
I think that it will be possible , but later.

Coool, I can wait :tease:

crashmilan 15.03.2013 22:15

Цитата:

Сообщение от filinmd (Сообщение 250907)
Теперь понял, попробую разобраться.



Вот этот ключ?

да этот

crashmilan 15.03.2013 22:24

Цитата:

Сообщение от filinmd (Сообщение 250906)
I think that it will be possible , but later.

Нет, тут нужно будет подключать по другому, и использовать его можно будет только в значении NAVI если при условии что navi нет.
Подключается параллельно. Данный скетч не подойдет, нужно его будет переделывать немного. В пративном случаи mmi не будет работать, а сделать чтобы все кнопки (media, radio) управляли компом нельзя при подключенном mmi. Я рассматривал один вариант, фильтрация сигнал через комп и отправка нужных сигналов на блок, к сожаления не получается это сделать нормально, очень большие задержки.
При mmi возможен только такой вариант пульт только другой а смысл тот-же.

filinmd 15.03.2013 23:12

Цитата:

Сообщение от crashmilan (Сообщение 250967)
Нет, тут нужно будет подключать по другому, и использовать его можно будет только в значении NAVI если при условии что navi нет.
Подключается параллельно. Данный скетч не подойдет, нужно его будет переделывать немного. В пративном случаи mmi не будет работать, а сделать чтобы все кнопки (media, radio) управляли компом нельзя при подключенном mmi. Я рассматривал один вариант, фильтрация сигнал через комп и отправка нужных сигналов на блок, к сожаления не получается это сделать нормально, очень большие задержки.
При mmi возможен только такой вариант пульт только другой а смысл тот-же.

Я не говорю что должно все работать с этим скетчем в машине. Для прямого подключения к компу этого достаточно. Позже разберусь с ключом и потом полезу в машину ловить данные ... . А там уж ,как говорится , поживем- увидим :)

awtoap 16.03.2013 00:07

Тут я не скажу, нужно смотреть даташиты на МК ибо ардуинами не страдаю ))). Могу предложить только ПИК типа PIC18F26J50, PIC18F47J53 (2 UART+USB) да еще и кучка других. Или смотреть в сторону AVR xMega...там куча уартов.

crashmilan 16.03.2013 22:34

Цитата:

Сообщение от awtoap (Сообщение 250972)
Так возьми контроллер с двумя UART и USB и фильтруй все на нем...никаких трудностей не вижу. То есть подключай один уарт к MMI, а другой дальше в систему. Ну по USB прямиком в комп. Или реализовать софтово уарты, что немного сложнее, но так как скорость передачи низкая, вполне задача подъемная.

Поверьте не так все просто. К сожалению блок отправляет очень много сигналов которые программа иногда просто не может их отфильтровать.
Конечно если сильно захотеть можно ....
Но проще всего сделать параллельно.

awtoap 16.03.2013 23:29

На скорости 9600 даже самый чахлый МК это сделает на раз...все зависит от ума программера. Скажем в моем DMX светодиодном димере на скорости 250000 AVR справляется без проблем.

Скажу одно...судя по скетчу прием байта с UART ведется в главном цикле...я предпочитаю делать по прерыванию, тем самым можно разгрузить МК для других задач.

crashmilan 17.03.2013 21:56

Цитата:

Сообщение от awtoap (Сообщение 251087)
На скорости 9600 даже самый чахлый МК это сделает на раз...все зависит от ума программера. Скажем в моем DMX светодиодном димере на скорости 250000 AVR справляется без проблем.

Скажу одно...судя по скетчу прием байта с UART ведется в главном цикле...я предпочитаю делать по прерыванию, тем самым можно разгрузить МК для других задач.

Подключитесь к блоку mmi и все поймете. Я спорить с вами не планировал. Если знаете решения и есть опыт буду рад выслушать, а спорить и утверждать Вам то, что вы даже не видели я не буду.
К сожалению скорость потока данных который идет от блока меняется, а если поднять скорость выше 9600 то данные получает комп не те.
Если просто даже подключиться к пульту и любой программой считать ком порт, то увидите, что иногда код идет склеиваемый либо разбитый на несколько частей. Сделать четкий фильтр без тормазов я считаю не так просто. Мы с программистом (а он не ламер) пробовали тупо сделать пропускания через комп не трогая код, у нас не вышло, к примеру крутилка очень сильно тормозила. Даже если просто считывать долго код с пульта то можно увидеть что код иногда разбивается.
К примеру код может идти 06 10 ..... а должен 06, 10...

filinmd 18.03.2013 14:57

Цитата:

Сообщение от crashmilan (Сообщение 250965)
да этот

Спаял, подключил и получил результат который начинается на 10 02.

Скетч из-за этого переделывать пока не буду, так как не вижу смысла, при условии что пульт используется не в Ауди

P.S. 2Bersenev Надо было все таки создавать отдельную тему :)

Bersenev 18.03.2013 16:38

перенёс в отдельную тему.

По передачи команд из икара в ардуино.

Для универсальности сделаю в плагине команду, которая позволяет передать в ардуино любую шестнадцатеричную последовательность, допустим

SendToDuino,1a_ff_ab_56_12

отправит в ардуино последовательность байтов

1A FF AB 56 12

а что с ними делать уже будешь решать сам.

А в скине сделаю возможность при переходе на основные экраны и экраны встроенных программ или при смене медиаисточников выдавать эту команду. Значение последовательностей для каждого случая можно будет задать в ini файле. Выносить их в настройки скина не вижу смысла, всё таки редко кому нужна обратная связь.

filinmd 18.03.2013 16:54

Цитата:

Сообщение от Bersenev (Сообщение 251338)
перенёс в отдельную тему.

По передачи команд из икара в ардуино.

Для универсальности сделаю в плагине команду, которая позволяет передать в ардуино любую шестнадцатеричную последовательность, допустим

SendToDuino,1a_ff_ab_56_12

отправит в ардуино последовательность байтов

1A FF AB 56 12

а что с ними делать уже будешь решать сам.

А в скине сделаю возможность при переходе на основные экраны и экраны встроенных программ или при смене медиаисточников выдавать эту команду. Значение последовательностей для каждого случая можно будет задать в ini файле. Выносить их в настройки скина не вижу смысла, всё таки редко кому нужна обратная связь.


СПАСИБО!!!

Можно еще добавить возможность выдавать эту команду после выхода из сна?

Bersenev 18.03.2013 17:37

Цитата:

Сообщение от filinmd (Сообщение 251341)
Можно еще добавить возможность выдавать эту команду после выхода из сна?

В принципе можно назначить на любое событие, в том числе на запуск скина, на изменение темы день-ночь, на уход в сон и выход из сна, на запуск основных экранов и экранов встроенных программ, на закрытие скина, на выключение компьютера.

filinmd 19.03.2013 08:53

Цитата:

Сообщение от Bersenev (Сообщение 251349)
В принципе можно назначить на любое событие, в том числе на запуск скина, на изменение темы день-ночь, на уход в сон и выход из сна, на запуск основных экранов и экранов встроенных программ, на закрытие скина, на выключение компьютера.

Замечательно! Обновления плагина ждать вместе с официальным обновлением iCar? :)

Bersenev 19.03.2013 12:10

Цитата:

Сообщение от filinmd (Сообщение 251486)
Обновления плагина ждать вместе с официальным обновлением iCar? :)

Закончу плагин WiFi менеджера и сделаю

gukov 19.03.2013 15:18

Цитата:

Сообщение от filinmd (Сообщение 251317)
Спаял, подключил и получил результат который начинается на 10 02.

Скетч из-за этого переделывать пока не буду, так как не вижу смысла, при условии что пульт используется не в Ауди

Да в принципе без разницы где он будет использоваться, главное стабильность кода и читаемость.

Для начало надо подключить к компу по COM и посмотреть в терминальной программе настройки при которых пульт работает стабильно.

Первый признак неправильной настройки это энкодоры UP и DOWN будут считаться с одинаковым значением.

filinmd 19.03.2013 15:43

Цитата:

Сообщение от gukov (Сообщение 251522)
Да в принципе без разницы где он будет использоваться, главное стабильность кода и читаемость.

Для начало надо подключить к компу по COM и посмотреть в терминальной программе настройки при которых пульт работает стабильно.

Первый признак неправильной настройки это энкодоры UP и DOWN будут считаться с одинаковым значением.

У меня вроде все значения разные.

Я чуть позже переделаю скетч с учетом ключа и попробую на выходных в машине по тестировать.

filinmd 21.03.2013 14:23

Теперь мучаюсь с получение "правильных данных" через транзисторный ключ.


Результат как то не радует и не понятен....


Согласно найденной информации на одном немецком форуме ( Сидел читал его с помощью Google перевода, это конечно ппц :) ) пакет должен выглядеть таким образом : 10 02 10 03 .

скетчем который я выкладывал выше получаю правильно из этого только первую половину, т.е. 10 02 а дальше не сходится ни разу.

Если читать скетчем, который представлен ниже то, первые несколько раз я получаю правильный код а потом опять только половину
PHP код:

uint8_t ETX_Pin=3//// VRbot Пин ETX 
uint8_t ERX_Pin=4//// VRbot Пин ERX 

void setup() 
{    
  
pinMode(0INPUT); 
  
pinMode(1OUTPUT); 

  
pinMode(ETX_PinINPUT); 
  
pinMode(ERX_PinOUTPUT);  


void loop() 

        
int pc2vrbot digitalRead(0); 
        
digitalWrite(ERX_Pinpc2vrbot); 
     
        
int vrbot2pc digitalRead(ETX_Pin); 
        
digitalWrite(1vrbot2pc); 


Какие у кого есть мысли по этому поводу?

gukov 22.03.2013 11:46

Цитата:

Сообщение от filinmd (Сообщение 251808)
Результат как то не радует и не понятен...

Какие у кого есть мысли по этому поводу?

Я что то упустил или не допонял.

Допустим код не совпадает, но он (код) одинаковый при нажатие одной команды (допустим 10 раз подряд) или не стабилен?


Часовой пояс GMT +4, время: 16:16.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot