Показать сообщение отдельно
Старый 05.05.2017, 09:51   #1
Dubel
Новый Пользователь
 
Регистрация: 29.08.2012
Регион: Беларусь
Машина: BMW E39
Сообщений: 16
Dubel has a spectacular aura aboutDubel has a spectacular aura about
Smile BMW e39 ibus управление фарами

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

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

Код:
Инициализация порта:
#include <CustomSoftwareSerial.h>
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}; //подсветка номера
Как то так

Последний раз редактировалось admin; 05.05.2017 в 11:15.
Dubel вне форума   Ответить с цитированием