Показано с 1 по 10 из 59

Тема: Arduino и I-BUS

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    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.

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

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

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

Ваши права

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