Показать сообщение отдельно
Старый 15.03.2013, 12:18   #10
filinmd
Старший Пользователь
 
Аватар для filinmd
 
Регистрация: 20.03.2012
Возраст: 33
Город: Москва
Регион: 77, 97, 99, 177
Машина: Ford Focus 2, Audi Q7
Сообщений: 163
filinmd will become famous soon enoughfilinmd will become famous soon enough
По умолчанию

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

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

Текущий скетч с демонстрацией возможностей.
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

filinmd вне форума   Ответить с цитированием