Страница 1 из 6 123456 ПоследняяПоследняя
Показано с 1 по 10 из 59

Тема: Arduino и I-BUS

  1. #1
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Arduino и I-BUS

    Подробности читаем здесь

    Цитата Сообщение от efimomax Посмотреть сообщение
    Как и обещал код для ARDUINO читающий I-BUS шину (только команды с кнопок руля - начинающиеся с байта 50)

    Както так....

    Библиотеку NewSoftSerial.h
    (положить в папку hardware\libraries)

    Успехов!

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

    PHP код:
    /*

    Steering Wheels Sequences (from NewSoftSerial arduino library)
    --------------------------------------------------------------
    DESCRIPTION        DATA                KeyID
    --------------------------------------------------------------
     + button press        50 23 3C ED 32 11 FB        1
     - button press        50 23 3C ED 32 10 1E        2

     > BUTTON PRESS        50 23 3C ED 3B 01 06        11
     > BUTTON HOLD        50 23 3C ED 3B 11 B3        12
     > BUTTON RELEASE    50 23 3C ED 3B 21 33        13

     < BUTTON PRESS        50 23 3C ED 3B 08 0F        21    
     < BUTTON HOLD        50 23 3C ED 3B 18 FB        22
     < BUTTON RELEASE    50 23 3C ED 3B 28 7B        23

     VOICE BUTTON PRESS    50 23 3C F9 3B 80 27        31
     VOICE BUTTON HOLD    50 23 3C F9 3B 90 BB        32
     VOICE BUTTON RELEASE    50 23 3C F9 3B A0 3B        33

     R/T BUTTON PRESS    50 1B 38 F9 01 9A FF        40
     
    */


    #include <NewSoftSerial.h>  // use NewSoftSerial library for serial connection to BMW I-BUS



    // I-BUS
    NewSoftSerial IBUS(78);  //set pin for BMW I_BUS serial connection 
    int IBUSreceiveByte 0;          // byte reading from I-BUS
    byte IBUSbyte[8] = {0,0,0,0,0,0,0,0}; // key byte sequence
    int Delay 10//delay in millisec
    int ButtonPressed 0//boolean value set 1 if key press detected
    int KeyID 0// key press number (for easy select case routine)

    //hold keys flags
    int N_HOLD_F 0//next track hold flag
    int P_HOLD_F 0//prev track hold flag 
    int V_HOLD_F 0// r/t key hold flag

    byte CHECK_DOWN[8] = {00x500x080x430xDB0x860xEC0xF0}; // check press button
    byte CHECK1_DOWN[8] = {00x500x080x430xDB0x160xCC0xE0}; // check press button

    byte PLUS_DOWN[8] = {00x500x230x3C0xED0x320x110xFB}; // + press button
    byte MINUS_DOWN[8] = {00x500x230x3C0xED0x320x100x1E}; // - press button

    byte NEXT_DOWN[8] = {00x500x230x3C0xED0x3B0x010x06}; // > press button
    byte NEXT_HOLD[8] = {00x500x230x3C0xED0x3B0x110xB3}; // > hold button
    byte NEXT_REL[8] = {00x500x230x3C0xED0x3B0x210x33}; // > release button

    byte PREV_DOWN[8] = {00x500x230x3C0xED0x3B0x080x0F}; // < press button
    byte PREV_HOLD[8] = {00x500x230x3C0xED0x3B0x180xFB}; // < hold button
    byte PREV_REL[8] = {00x500x230x3C0xED0x3B0x280x7B}; // < release button

    byte VOICE_DOWN[8] = {00x500x230x3C0xF90x3B0x800x27}; // voice press button
    byte VOICE_HOLD[8] = {00x500x230x3C0xF90x3B0x900xBB}; // voice hold button
    byte VOICE_REL[8] = {00x500x230x3C0xF90x3B0xA00x3B}; // voice release button

    byte RT_DOWN[8] = {00x500x1B0x380xF90x010x9A0xFF}; // voice release button

    int incomingByte 0;      // byte reading from serial port




    void setup()
    {
      
    Serial.begin(9600);           // открываем порт на скорости 9600 для передачи в ПК
       
      // set the data rate for the NewSoftSerial port (I-BUS)
      
    IBUS.begin(9600);
    }


    void loop()
    {
      if (
    IBUS.available() && ButtonPressed==0){
        
    TryReadIBUSmsg();
      }
      
      
      if (
    ButtonPressed==1){
        
    Serial.print(millis());
        
    Serial.println(" ----------------------------------------------- ");
        
        switch (
    KeyID){
          case 
    100:  //Если клавиша не  опознана или кокоието ошибки в шине при чтении
            
    Serial.print("UNKNOWN KEY: ");
            
    SerialPrintKey();
            break;
            
          case 
    40:
            
    Serial.print("R/T KEY: ");
            
    SerialPrintKey();
            break;  
            
          case 
    1:
            
    Serial.print("VOL + key: ");
            
    SerialPrintKey();
            break;        
          case 
    2:
            
    Serial.print("VOL - key: ");
            
    SerialPrintKey();
            break; 
            
          case 
    11:
            
    //Serial.print("NEXT FLAG HOLD=0: ");
            //SerialPrintKey();
            
    N_HOLD_F=0;
            break; 
          case 
    12:
            
    //Serial.print("NEXT FLAG HOLD=1: ");
            //SerialPrintKey();
            
    N_HOLD_F=1;
            break; 
          case 
    13:
            if (
    N_HOLD_F==0){
              
    Serial.print("NEXT TRACK key: ");
              
    SerialPrintKey();
            } 
            else {
              
    Serial.print("NEXT FOLDER key: ");
              
    SerialPrintKey();
            }
            break; 
            
          case 
    21:
            
    Serial.print("PREV FLAG HOLD=0: ");
            
    SerialPrintKey();
            
    P_HOLD_F=0;
            break; 
          case 
    22:
            
    Serial.print("PREV FLAG HOLD=1: ");
            
    SerialPrintKey();
            
    P_HOLD_F=1;
            break; 
          case 
    23:
            if (
    P_HOLD_F==0){
              
    Serial.print("PREV TRACK key: ");
              
    SerialPrintKey();
            } 
            else {
              
    Serial.print("PREV FOLDER key: ");
              
    SerialPrintKey();
            }
            break;  
            
          case 
    31:
            
    //Serial.print("VOICE FLAG HOLD=0: ");
            //SerialPrintKey();
            
    V_HOLD_F=0;
            break; 
          case 
    32:
            
    //Serial.print("VOICE FLAG HOLD=1: ");
            //SerialPrintKey();
            
    V_HOLD_F=1;
            break; 
          case 
    33:
            if (
    V_HOLD_F==0){
              
    Serial.print("VOICE key press: ");
              
    SerialPrintKey();
            } 
            else {
              
    Serial.print("Voice key hold: ");
              
    SerialPrintKey();
            }
            break;  
        } 
        
        
    //SerialPrintKey();
        
    ButtonPressed 0;
        
    IBUS.flush();
      }





    void TryReadIBUSmsg()
    {
          
    IBUSreceiveByte IBUS.read();    //read 1-st byte Если 50 то начала посылки от рулевых кнопок
          
    if (IBUSreceiveByte==0x50)
          {
            
    IBUSbyte[1]=0x50;
            for (
    int i=2<= 7i++){  
              
    //IBUSreceiveByte = IBUS.read();  
              
    IBUSbyte[i] = IBUS.read();    //read  2,3,4,5,6,7 bytes of data   -  читаем следующие байты
              
    delay(Delay);
            }
            
    KeyID=100//Устанавливаем по умолчанию что клавиша не опознана
            
            // и меняем если опознана на соответствующий код
            
    if(memcmp(IBUSbyteCHECK_DOWN8) == ){KeyID=50;}
            if(
    memcmp(IBUSbyteCHECK1_DOWN8) == ){KeyID=51;}
            
            if(
    memcmp(IBUSbytePLUS_DOWN8) == ){KeyID=1;}
            if(
    memcmp(IBUSbyteMINUS_DOWN8) == ){KeyID=2;}
            
            if(
    memcmp(IBUSbyteNEXT_DOWN8) == ){KeyID=11;}
            if(
    memcmp(IBUSbyteNEXT_HOLD8) == ){KeyID=12;}
            if(
    memcmp(IBUSbyteNEXT_REL8) == ){KeyID=13;}
            
            if(
    memcmp(IBUSbytePREV_DOWN8) == ){KeyID=21;}
            if(
    memcmp(IBUSbytePREV_HOLD8) == ){KeyID=22;}
            if(
    memcmp(IBUSbytePREV_REL8) == ){KeyID=23;}
            
            if(
    memcmp(IBUSbyteVOICE_DOWN8) == ){KeyID=31;}
            if(
    memcmp(IBUSbyteVOICE_HOLD8) == ){KeyID=32;}
            if(
    memcmp(IBUSbyteVOICE_REL8) == ){KeyID=33;}
            
            if(
    memcmp(IBUSbyteRT_DOWN8) == ){KeyID=40;}
            
            
    ButtonPressed=1;
          }
          else
          {
            
    ButtonPressed=0;
          }
          
    IBUS.flush();
    }

    void SerialPrintKey()  //красивая печать в ком порт посылки из I-BUS
    {
        for (
    int x=1<= 7x++){  
                
    Serial.print(IBUSbyte[x], HEX);
                
    Serial.print(" ");
            }
        
    Serial.println();

    Последний раз редактировалось Chip; 03.11.2009 в 14:27.

  2. #2
    Модератор Аватар для XsanderS
    Регистрация
    05.05.2008
    Возраст
    41
    Сообщений
    829
    Вес репутации
    389

    По умолчанию Re: arduino и I-BUS

    Подключение штатных кнопок на руле и не только, по IBUS. перед прошивкой положить библиотеку MsTimer2 в arduino-0017\hardware\libraries

    код для Arduino Mega.

    PHP код:
    #include <MsTimer2.h>

    byte IBUSbyte[6] = {0,0,0,0,0,0}; // массив сообещний
    bool MafonPin false//true - данные идут в комп; false - управляют пинами ардио

    void setup()                    
    {
      
    MsTimer2::set(100ResetPinButton); // Таймер для установки выходов IBUS
      
    Serial.begin(115200);           // открываем порт для передачи в ПК 
      
    Serial1.begin(9600);    // настройка порта IBUS
      
    pinMode(7INPUT); // Вход мафон
      
    pinMode(8OUTPUT); // Громкость +
      
    pinMode(9OUTPUT); // Громкость -
      
    pinMode(10OUTPUT); // Кнопка Next
      
    pinMode(11OUTPUT); // Кнопка Previous
      
    pinMode(12OUTPUT); // Кнопка Dial
      
    pinMode(13OUTPUT); // Кнопка R/T
      
    digitalWrite(8LOW);
      
    digitalWrite(9LOW);
      
    digitalWrite(10LOW);
      
    digitalWrite(11LOW);
      
    digitalWrite(12LOW);
      
    digitalWrite(13LOW);
    }

    void loop()
    {
      
    ReadIBUSmsg();
      
    ReadMAfonPin();
    }

    boolean ReadIBUSmsg()
    {
      while( 
    Serial1.available() > )
      {
        for( 
    int i=1i<6i++ )
          
    IBUSbyte[i-1] = IBUSbyte[i];
        
    IBUSbyte[5] = Serial1.read();
        if( 
    IBUSbyte[0] == 0x50 && IBUSbyte[(IBUSbyte[1]+1)] == CalcXOR(IBUSbyte) )
        {
          if( 
    MafonPin )
            
    Serial.write(IBUSbyte6);
          else
          {
            if( 
    IBUSbyte[3] == 0x32 && IBUSbyte[4] == 0x11 digitalWrite(8HIGH); // Нажал +
            
    else if( IBUSbyte[3] == 0x32 && IBUSbyte[4] == 0x10 digitalWrite(9HIGH); // Нажал -
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x01 || IBUSbyte[4] == 0x11 ) ) digitalWrite(10HIGH); // Нажата next
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0x21 digitalWrite(10LOW); // Отпустил next
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x08 || IBUSbyte[4] == 0x18 ) ) digitalWrite(11HIGH); // Нажата previous
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0x28 digitalWrite(11LOW); // Отпустил previous
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x80 || IBUSbyte[4] == 0x90 ) ) digitalWrite(12HIGH); // Нажата dial
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0xA0 digitalWrite(12LOW); // Отпустил dial
          
    }
          if( 
    IBUSbyte[2] == 0xC8 && IBUSbyte[3] == 0x01 digitalWrite(13HIGH); // Нажата R/T
          
    MsTimer2::start();
          return 
    true;
        }
      }
      return 
    false;
    }

    byte CalcXORbyte IBUSbyte[6] )
    {
      
    byte i;
      
    byte checksum 0;
      
    byte length;
      
    length IBUSbyte[1] + 1;
      for(
    0lengthi++)
      {
        
    checksum ^= IBUSbyte[i];
      }
      return 
    checksum;
    }
    void ResetPinButton()
    {
      
    digitalWrite(8LOW);
      
    digitalWrite(9LOW);
      
    digitalWrite(13LOW);
      
    MsTimer2::stop();
    }

    void ReadMAfonPin()
    {
      if( 
    digitalRead(7) == HIGH )
      {
        
    delay(2);
        if( 
    digitalRead(7) == HIGH MafonPin true;
      }
      else 
    MafonPin false;

    Код предназначен для управления внешним устройством (например не штатная магнитола) и компом одновременно.

    Подключение: сигнал RX c IBUS подключается в Serial1 пины на борту 18tx,19rx (внимание только для Ard Mega для других версий нужно использовать софтовый Serial см ниже)

    Работает след образом: D7 настроен на вход, когда на D7 уровень сигнала LOW то кнопки управляют пинами D8-D13 и данные о нажатиях в комп не идут. когда на D7 HIGH то пины молчат и данные о нажатиях отправляются в ПК (как настроить на эти сигналы на нажатия кнопок клавы см в конце поста)

    примечание: кнопка R/T управляет D13 не зависимо от сигнала на D7, можно использовать для переключения режимов (например на магнитоле CD/AUX/FM)




    Так как многим такие сложности не нужны и большинство использует более компактные версии arduino то решил нарисовать еще один прошивку с использованием библиотеки NewSoftSerial для arduino не имеющих дополнительных Serial портов.

    перед прошивкой положить библиотеку NewSoftSerial в arduino-0017\hardware\libraries

    PHP код:
    #include <NewSoftSerial.h>          // програмный Serial для подключения BMW I-BUS

    // I-BUS
    NewSoftSerial IBUS(78);           // пины для подкл I-BUS (7rx,8tx)
    int IBUSreceiveByte 0;            // считываем байт с I-BUS
    byte IBUSbyte[6] = {0,0,0,0,0,0};   // массив сообещний
    void setup()                    
    {
      
    Serial.begin(115200);               // открываем порт для передачи в ПК 
      
    IBUS.begin(9600);                 // настройка порта IBUS
    }

    void loop()
    {
      
    ReadIBUSmsg();
    }

    boolean ReadIBUSmsg()
    {
      while( 
    IBUS.available() > )
      {
        for( 
    int i=1i<6i++ )
          
    IBUSbyte[i-1] = IBUSbyte[i];
        
    IBUSbyte[5] = IBUS.read();
        if( 
    IBUSbyte[0] == 0x50 && IBUSbyte[(IBUSbyte[1]+1)] == CalcXOR(IBUSbyte) )
        {

            
    Serial.write(IBUSbyte6);  
          {
            if( 
    IBUSbyte[3] == 0x32 && IBUSbyte[4] == 0x11 ); // Нажал +
            
    else if( IBUSbyte[3] == 0x32 && IBUSbyte[4] == 0x10 ) ; // Нажал -
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x01 || IBUSbyte[4] == 0x11 ) ) ; // Нажата next
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0x21 ) ; // Отпустил next
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x08 || IBUSbyte[4] == 0x18 ) ) ; // Нажата previous
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0x28 ) ; // Отпустил previous
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x80 || IBUSbyte[4] == 0x90 ) ) ; // Нажата dial
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0xA0 ) ; // Отпустил dial
            
    else if( IBUSbyte[2] == 0xC8 && IBUSbyte[3] == 0x01 ) ; // Нажата R/T
          
    }
        }
      }
    }
    byte CalcXORbyte IBUSbyte[6] )
    {
      
    byte i;
      
    byte checksum 0;
      
    byte length;
      
    length IBUSbyte[1] + 1;
      for(
    0lengthi++)
      {
        
    checksum ^= IBUSbyte[i];
      }
      return 
    checksum;

    Подключение: к D7rx D8tx (сигнал RX с шины подключается к D7)
    Работает след образом: При нажатии кнопок данные отправляются в ПК (как настроить на эти сигналы на нажатия кнопок клавы см в конце поста)




    Код симулятор посылок с шины дабы не бегать с 5го этажа по морозу на парковку 6 раз чтоб узнать что перепутал Tx и Rx но нужен второй Arduino который будет играть роль шины. D10 настроен на вход, когда на нем уровень HIGH то шлется симулированный сигнал нажатия кнопки руля.

    PHP код:
    byte PLUS_DOWN[8] = {00x500x040x680x320x110x1F}; // + press button
    byte MINUS_DOWN[8] = {00x500x040x680x320x100x1E}; // - press button

    byte NEXT_DOWN[8] = {00x500x040x680x3B0x010x06}; // > press button
    byte NEXT_HOLD[8] = {00x500x040x680x3B0x110x16}; // > hold button
    byte NEXT_REL[8] = {00x500x040x680x3B0x210x26}; // > release button

    byte PREV_DOWN[8] = {00x500x040x680x3B0x080x0F}; // < press button
    byte PREV_HOLD[8] = {00x500x040x680x3B0x180x1F}; // < hold button
    byte PREV_REL[8] = {00x500x040x680x3B0x280x2F}; // < release button

    byte VOICE_DOWN[8] = {00x500x040xC80x3B0x800x27}; // voice press button
    byte VOICE_HOLD[8] = {00x500x040xC80x3B0x900x37}; // voice hold button
    byte VOICE_REL[8] = {00x500x040xC80x3B0xA00x07}; // voice release button

    byte RT_DOWN[8] = {00x500x030xC80x010x9A0x80}; // voice release button

    int ButtonPin 10//кнопка на 10 ноге



    void setup()
    {
      
    Serial.begin(9600);           // открываем порт на скорости 115200 для передачи наружу
      
    pinMode(ButtonPinINPUT);    // Устанавливем 10 пин на вход 
     
    }


    void loop()
    {
      
      if (
    digitalRead(ButtonPin)==1) {
         
        
    //Вывод в стандартный порт байты посылки команды VOL+
        
    for (int i=1<= 6i++){ Serial.write(PLUS_DOWN[i]); } 

        
    //Задержка 1000 милисекунд 1000 м.с. = 1 секунда
        
    delay(1000);
      }

    Подключение: 1пин Tx (стандартный порт на всех моделях) работает соответственно на выход и симулирует Rx сигнал от IBUS.

    для выбора какую команду слать, в этой строке

    for (int i=1; i <= 6; i++){ Serial.write(PLUS_DOWN[i]); }

    PLUS_DOWN

    меняем на то что нужно послать. Например NEXT_DOWN

    byte PLUS_DOWN[8] = {0, 0x50, 0x04, 0x68, 0x32, 0x11, 0x1F}; // + press button
    byte MINUS_DOWN[8] = {0, 0x50, 0x04, 0x68, 0x32, 0x10, 0x1E}; // - press button

    byte NEXT_DOWN[8] = {0, 0x50, 0x04, 0x68, 0x3B, 0x01, 0x06}; // > press button
    byte NEXT_HOLD[8] = {0, 0x50, 0x04, 0x68, 0x3B, 0x11, 0x16}; // > hold button
    byte NEXT_REL[8] = {0, 0x50, 0x04, 0x68, 0x3B, 0x21, 0x26}; // > release button

    byte PREV_DOWN[8] = {0, 0x50, 0x04, 0x68, 0x3B, 0x08, 0x0F}; // < press button
    byte PREV_HOLD[8] = {0, 0x50, 0x04, 0x68, 0x3B, 0x18, 0x1F}; // < hold button
    byte PREV_REL[8] = {0, 0x50, 0x04, 0x68, 0x3B, 0x28, 0x2F}; // < release button

    byte VOICE_DOWN[8] = {0, 0x50, 0x04, 0xC8, 0x3B, 0x80, 0x27}; // voice press button
    byte VOICE_HOLD[8] = {0, 0x50, 0x04, 0xC8, 0x3B, 0x90, 0x37}; // voice hold button
    byte VOICE_REL[8] = {0, 0x50, 0x04, 0xC8, 0x3B, 0xA0, 0x07}; // voice release button

    byte RT_DOWN[8] = {0, 0x50, 0x03, 0xC8, 0x01, 0x9A, 0x80}; // voice

    Для сканирования порта (посмотреть что приходит в ПК) используем Terminal.exe данные должны приходить в таком виде

    next____________________________

    DOWN 50 04 68 3B 01 06

    HOLD 50 04 68 3B 11 16

    RELISE 50 04 68 3B 21 26

    plus____________________________

    50 04 68 32 11 1F

    minus___________________________

    50 04 68 32 10 1E

    prev_____________________________

    DOWN 50 04 68 3B 08 0F

    HOLD 50 04 68 3B 18 1F

    RELISE 50 04 68 3B 28 2F

    R/T______________________________

    50 03 C8 01 9A 80

    Voice____________________________

    DOWN 50 04 C8 3B 80 27

    HOLD 50 04 C8 3B 90 37

    RELISE 50 04 C8 3B A0 07

    Теперь назначаем на принятый сигнал комбинации клавиатуры. сделать это можно с помощью программы IR Kay написанной Chip`ом для проекта "управление любым IR Пультом"

    единственное что файл Config нужно править руками но это не составит труда.

    выглядит он внутри примерно так:

    <50046832111F>Key1=49 />
    <50046832101E>Key1=50 />

    прописываем в ручную коды приходящие от нажатий кнопок руля и код нажатия кнопки.

    PS: Благодарим kostya740 за помощь в написании прошивки для Mega, Также efimomax за очень полезные советы и примеры, Chip за софт и не человеческое терпение
    Вложения Вложения
    Последний раз редактировалось Chip; 08.03.2017 в 03:46.
    хороший модем должен качать пиво!
    Мой проект

  3. #3
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Carduino и I-BUS

    Про конфиг забыл , сегодня подправлю и выложу

  4. #4
    Модератор Аватар для XsanderS
    Регистрация
    05.05.2008
    Возраст
    41
    Сообщений
    829
    Вес репутации
    389

    По умолчанию Re: Carduino и I-BUS

    Цитата Сообщение от Chip Посмотреть сообщение
    Про конфиг забыл , сегодня подправлю и выложу
    Кстати, та версия что ты мне в проекте выложил сегодня почему то не запустилась, верней не нашла девайс. Скачал оригинал IR Kay прописал коды в Config и тоже заработало.
    хороший модем должен качать пиво!
    Мой проект

  5. #5
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Carduino и I-BUS

    Новая версия отслеживает число подключенных девайсов FTDI к компьютеру, если их число больше одного то открывает по дескриптору.
    Так что вариантов два , отключить второго кардуино или прошить дескриптор.
    В будущем можно будет прописать свой дескриптор в файле конфиг
    Последний раз редактировалось Chip; 05.12.2009 в 18:22.

  6. #6
    Модератор Аватар для XsanderS
    Регистрация
    05.05.2008
    Возраст
    41
    Сообщений
    829
    Вес репутации
    389

    По умолчанию Re: Carduino и I-BUS

    PHP код:
    #include <MsTimer2.h>
    #include <CapSense.h>
    #include <Spi.h>

    CapSense   Sensor1 CapSense(2,3); // пин для сенсорной кнопки

    byte MyBuff[20]; // SPI 
    byte IBUSbyte[6] = {0,0,0,0,0,0}; // массив сообещний
    bool MafonPin false//true - данные идут в комп; false - управляют пинами ардио

    void setup()                    
    {
      
    MsTimer2::set(100ResetPinButton); // Таймер для установки выходов IBUS
      
    Serial.begin(115200);  // открываем порт для передачи в ПК
      
    Spi.mode((<< SPI2X) | (<< CPOL) | (<< CPHA));  //mode 3, clock/4 
      
    Serial1.begin(9600);     // настройка порта IBUS
      
    pinMode(7INPUT);      // Вход мафон
      
    pinMode(8OUTPUT);   // Громкость +
      
    pinMode(9OUTPUT);   // Громкость -
      
    pinMode(10OUTPUT); // Кнопка Next
      
    pinMode(11OUTPUT); // Кнопка Previous
      
    pinMode(12OUTPUT); // Кнопка Dial
      
    pinMode(13OUTPUT); // Кнопка R/T
      
    digitalWrite(8LOW);
      
    digitalWrite(9LOW);
      
    digitalWrite(10LOW);
      
    digitalWrite(11LOW);
      
    digitalWrite(12LOW);
      
    digitalWrite(13LOW);
    }

    void loop()
    {  
    IBUS();
    sensor();
    SPI();


    //*******************I-BUS Шина*********************** 

    void IBUS()
    {
      
    ReadIBUSmsg();
      
    ReadMAfonPin();
    }

    boolean ReadIBUSmsg()
    {
      while( 
    Serial1.available() > )
      {
        for( 
    int i=1i<6i++ )
          
    IBUSbyte[i-1] = IBUSbyte[i];
        
    IBUSbyte[5] = Serial1.read();
        if( 
    IBUSbyte[0] == 0x50 && IBUSbyte[(IBUSbyte[1]+1)] == CalcXOR(IBUSbyte) )
        {
          if( 
    MafonPin )
            
    Serial.write(IBUSbyte6);
          else
          {
            if( 
    IBUSbyte[3] == 0x32 && IBUSbyte[4] == 0x11 digitalWrite(8HIGH); // Нажал +
            
    else if( IBUSbyte[3] == 0x32 && IBUSbyte[4] == 0x10 digitalWrite(9HIGH); // Нажал -
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x01 || IBUSbyte[4] == 0x11 ) ) digitalWrite(10HIGH); // Нажата next
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0x21 digitalWrite(10LOW); // Отпустил next
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x08 || IBUSbyte[4] == 0x18 ) ) digitalWrite(11HIGH); // Нажата previous
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0x28 digitalWrite(11LOW); // Отпустил previous
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x80 || IBUSbyte[4] == 0x90 ) ) digitalWrite(12HIGH); // Нажата dial
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0xA0 digitalWrite(12LOW); // Отпустил dial
          
    }
          if( 
    IBUSbyte[2] == 0xC8 && IBUSbyte[3] == 0x01 digitalWrite(13HIGH); // Нажата R/T
          
    MsTimer2::start();
          return 
    true;
        }
      }
      return 
    false;
    }

    byte CalcXORbyte IBUSbyte[6] )
    {
      
    byte i;
      
    byte checksum 0;
      
    byte length;
      
    length IBUSbyte[1] + 1;
      for(
    0lengthi++)
      {
        
    checksum ^= IBUSbyte[i];
      }
      return 
    checksum;
    }
    void ResetPinButton()
    {
      
    digitalWrite(8LOW);
      
    digitalWrite(9LOW);
      
    digitalWrite(13LOW);
      
    MsTimer2::stop();
    }

    void ReadMAfonPin()
    {
      if( 
    digitalRead(7) == HIGH )
      {
        
    delay(2);
        if( 
    digitalRead(7) == HIGH MafonPin true;
      }
      else 
    MafonPin false;
    }

    //*******************Sensor Kay*********************** 

    void sensor()

         
    long temp1 =  Sensor1.capSense(30); // измерить емкость и сохранить 

    if (temp1 60)
              { 
    digitalWrite(13HIGH);   }    // включить светодиод 
      
    else { digitalWrite(13LOW); } // выключить светодиод]   


    //*******************SPI Шина*********************** 

    void SPI()
    {  
      for (
    int i=0;  <= 19i++) 
      { 
        
    MyBuff[i] = Spi.read();  
      }   
        
    Serial.write(MyBuff20); 

    Добавил в прошивку сенсорные кнопки и передачу данных по SPI с дисплея магнитолы в комп.

    1. Программа IR Kay видит все посылки SPI и очень быстро пытаеться среагировать на все это добро, ввиду чего не успевает рассмотреть 6 байт от IBus. Или на фоне SPI данных IR Kay видит 6 байт от IBus по другому . Не знаю что и делать, все клониться к тому что нужен еще один Arduino. Черт как не хотелось бы еще один цеплять. специально для этого брал модель MEGA чтоб реализовать все на одном.

    может кто чего подскажет посоветует?

    ps: если кто увидит в прошивке что я не вижу, просьба ткнуть пальцем.
    Последний раз редактировалось XsanderS; 17.12.2009 в 18:01.
    хороший модем должен качать пиво!
    Мой проект

  7. #7
    Модератор Аватар для XsanderS
    Регистрация
    05.05.2008
    Возраст
    41
    Сообщений
    829
    Вес репутации
    389

    По умолчанию Re: Carduino и I-BUS

    Ни у кого никаких мыслей? может добавить между посылками SPI пакетов задержку? Но думаю что тогда картинка магнитолы будет отставать.
    хороший модем должен качать пиво!
    Мой проект

  8. #8
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Carduino и I-BUS

    Цитата Сообщение от XsanderS Посмотреть сообщение
    Ни у кого никаких мыслей? может добавить между посылками SPI пакетов задержку? Но думаю что тогда картинка магнитолы будет отставать.
    Отставать не будет так как скорость передачи данных очень большая , и даже потеря некоторых пакетов не изменят каринки
    Нудно подумать как сделать приоретет на i-BUS

  9. #9
    Модератор Аватар для XsanderS
    Регистрация
    05.05.2008
    Возраст
    41
    Сообщений
    829
    Вес репутации
    389

    По умолчанию Re: Carduino и I-BUS

    Добавил между посылками пакетов с SPI задержку в 2 мс, IR Kay реагирует нормально.
    Последний раз редактировалось XsanderS; 20.12.2009 в 15:00.
    хороший модем должен качать пиво!
    Мой проект

  10. #10
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Carduino и I-BUS

    Данные приходят потому что они в буфере

Страница 1 из 6 123456 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •