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

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   BMW e39 ibus управление фарами (http://pccar.ru/showthread.php?t=25873)

Dubel 05.05.2017 09:51

BMW e39 ibus управление фарами
 
Сделал управление по шине ibus управление всеми фарами автомобиля BMW E39 рестайлинг. Сделано на Arduino + mcz33290. Управление морганием фар с кнопок руля R/T , Dial и открытие , закрытие. Если будет интерес выложу полный исходник.

Проблема в том что необходимо использовать скорость 9600 и проверку четности 8E1. В некоторых arduino есть хардварные порты и они поддерживают это. Но я использовал arduino nano и софтварный порт. Поэтому пришлось искать выход из ситуации. В результате поиска нашел библиотеку CustomSoftwareSerial которая поддерживала нужный функционал.

Код:

Инициализация порта:
#include
CustomSoftwareSerial* IBusSerial;

  Serial.begin(9600);
  IBusSerial = new CustomSoftwareSerial(8, 9);
  IBusSerial->begin(9600,CSERIAL_8E1);

iBus mcz33290 подключена к 8 и 9 pin (Rx,Tx).

Далее отправляем полный пакет
  {0x3F, 0x0F, 0xD0, 0x0C,0x00, 0x00, 0x00, 0x00}; //первая чаcть пакета

byte lowBeamRight[5] =          {0x00, 0x20, 0x00, 0x00, 0x00}; //Фара ближнего света правая

  {0xC8, 0xFF, 0x00}; //последняя часть пакета

Ну и отправляем пакет в шину:

void sendMessage(byte message_data[], byte messageLength)
{
    byte message_cksum = gen_cksum(message_data,messageLength);

      for (int k = 0; k < messageLength; k++)
      {
        IBusSerial->write(message_data[k]);
      }
    IBusSerial->write(message_cksum);
}

byte gen_cksum(byte _PacketData[], int PacketLength)
{
  byte _CheckSumByte = 0x00;
    for (int i = 0; i < PacketLength; i++)
      _CheckSumByte ^= _PacketData[i];
  return _CheckSumByte;
}

Пакет который гасит все фары:
byte AllOff2[16] =              {0x3F, 0x0F, 0xD0, 0x0C,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0xC8, 0xFF, 0x00};

В общем между включением фары и выключение можно ставить необходимую задержку.

Пакеты для всех фар (мне не жалко,:bye:  все было слоггированно своей прогой):

byte AllOff[5] =                {0x00, 0x00, 0x00, 0x00, 0x00}; //выключить все фары
byte lowBeamRight[5] =          {0x00, 0x20, 0x00, 0x00, 0x00}; //Фара ближнего света правая
byte lowBeamLeft[5] =            {0x00, 0x10, 0x00, 0x00, 0x00}; //Фара ближнего света левая 
byte highBeamLeft[5] =          {0x40, 0x00, 0x00, 0x00, 0x00}; //фара дальнего света левый
byte highBeamRight[5] =          {0x20, 0x00, 0x00, 0x00, 0x00}; //фара дальнего света  правый 
byte backTurnLeft[5] =          {0x00, 0x00, 0x80, 0x00, 0x00}; //Указатель поворота задний левый + боковой
byte backTurnRight[5] =          {0x00, 0x00, 0x00, 0x02, 0x00}; //Указатель поворота задний правый + боковой
byte frontTurnLeft[5] =          {0x00, 0x00, 0x00, 0x40, 0x00}; //Указатель поворота передний левый 
byte frontTurnRight[5] =        {0x00, 0x00, 0x40, 0x00, 0x00}; //Указатель поворота передний правый
byte StopLeft[5] =              {0x08, 0x00, 0x00, 0x00, 0x00}; //Стоп-сигнал левый
byte StopRight[5] =              {0x10, 0x00, 0x00, 0x00, 0x00}; //Стоп-сигнал правый
byte StopCenter[5] =            {0x00, 0x00, 0x10, 0x00, 0x00}; //Стоп-сигнал средний
byte fogLeft[5] =                {0x00, 0x04, 0x00, 0x00, 0x00}; //Противотуманные фара левая передняя 
byte fogRight[5] =              {0x00, 0x40, 0x00, 0x00, 0x00}; //Противотуманные фара правая передняя
byte fogLeftBack[5] =            {0x00, 0x00, 0x00, 0x04, 0x00}; //Противотуманные фара левая задняя
byte fogRightBack[5] =          {0x00, 0x80, 0x00, 0x00, 0x00}; //Противотуманные фара правая задняя
byte parkingBackLeft[5] =        {0x00, 0x00, 0x08, 0x00, 0x00}; //задний габаритный фонарь левый
byte parkingBackRight[5] =      {0x00, 0x00, 0x00, 0x10, 0x00}; //задний габаритный фонарь правый
byte parkingLeft[5] =            {0x00, 0x01, 0x00, 0x00, 0x00}; //передний габаритный фонарь левый +  (глазки левые)
byte parkingRight[5] =          {0x00, 0x00, 0x20, 0x00, 0x00}; //передний габаритный фонарь правый + (глазки правые)
byte reverseLeft[5] =            {0x00, 0x08, 0x00, 0x00, 0x00}; //задний ход левый 
byte reversRight[5] =            {0x00, 0x00, 0x00, 0x80, 0x00}; //задний ход правый
byte backlightLeft[5] =          {0x00, 0x00, 0x04, 0x00, 0x00}; //подсветка номера
byte backlightRight[5] =        {0x00, 0x00, 0x00, 0x00, 0x04}; //подсветка номера

Как то так :pleasantry:

Dubel 05.05.2017 09:55

Это аналог modlight или elight bmw. Типа того.(Сделал сам). Видео не мое. Надо,сниму :)
https://www.youtube.com/watch?v=RjrwodjuqLU

https://www.youtube.com/watch?v=UETog7W-0N4

Senya87 13.05.2017 11:24

Привет! а мог бы ты как то реализовать несколько функций? Необходимо получить из шины ibus сигнал о состоянии открытых дверей, багажника. и падать сигнал в шину чтобы закрывать и открывать двери?

Dubel 15.05.2017 12:22

Ну можно

PHP код:

#include <CustomSoftwareSerial.h>
CustomSoftwareSerialIBusSerial;

boolean read_byte false;
byte readbuffer[64];


int i;
int buffer_index 0;
int buffer_max 64;
int cksum;
long lastrx;
long lasttx

void ReadIBUSmsg() 
{

  
  
lasttx millis();
    

    if ((
millis() - lastrx) > 15
    {
        
memset(readbuffer0sizeof(readbuffer));
        
buffer_index 0;
        
read_byte false;
        
buffer_max 64;
        
lastrx millis();
    } 
    

    if (
IBusSerial->available()) 
    {
        
readbuffer[buffer_index] = IBusSerial->read();
        
read_byte true;
    } 
    
   
    if (
read_byte)
    {
        if (
buffer_index == 1){
            
buffer_max readbuffer[buffer_index] + 2// readbuffer [1] + 2(source + length) = длина сообщения
            
cksum readbuffer[0] ^ readbuffer[1];
        } else if ((
buffer_index ) && (buffer_index buffer_max-1)){ // не включаем CRC который пришел
            
cksum cksum readbuffer[buffer_index];
        }
    } 
    

    if (
buffer_index == buffer_max-1
    {
      
      if ((
cksum == readbuffer[buffer_index]) && (cksum != 0))
      {
        
       if (
readbuffer[0] == 0x00 && readbuffer[2] == 0xBF && readbuffer[4] == 0x12)  // Lock readbuffer[4] = XX ; 1X - Lock button pressed; 2X - Unlock button pressed ; 4X - Boot open button pressed; X1 - Key Battery low ; X2 - Key Battery OK
        
{
         
// Serial.println("Lock"); //закрыли
        //здесь код если закрыли
        
}
        else if (
readbuffer[0] == 0x00 && readbuffer[2] == 0xBF && readbuffer[4] == 0x22//Unlock
        
{
          
//Serial.println("Unlock"); //открыли
         //здесь код если открыли
        
}
        
      } 
      
        
memset(readbuffer0sizeof(readbuffer));
        
buffer_index 0;
        
read_byte false;
        
lastrx millis();
    }

    if (
read_byte == true){
        
read_byte false;
        
buffer_index++;
        
lastrx millis();
    }
    
}


void loop()
{   
  
ReadIBUSmsg ();



Gasnar 21.07.2017 19:27

Цитата:

Сообщение от Dubel (Сообщение 387209)
Сделал управление по шине ibus управление всеми фарами автомобиля BMW E39 рестайлинг. Сделано на Arduino + mcz33290. Управление морганием фар с кнопок руля R/T , Dial и открытие , закрытие. Если будет интерес выложу полный исходник.

Проблема в том что необходимо использовать скорость 9600 и проверку четности 8E1. В некоторых arduino есть хардварные порты и они поддерживают это. Но я использовал arduino nano и софтварный порт. Поэтому пришлось искать выход из ситуации. В результате поиска нашел библиотеку CustomSoftwareSerial которая поддерживала нужный функционал.

Как то так :pleasantry:

Привет. Не могли бы вы скинуть схему подключения BMW(+12,ibus,gnd) - mcz33290 - ардуино нано?.

Хочу сделать адаптер мультируля для нештатной магнитолы E39, но уже неделю не могу прочитать машину и разобраться где ошибка(чип не так подключён/бракованный или косяк в коде ардуино).


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

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