PDA

Просмотр полной версии : BMW e39 ibus управление фарами


Dubel
05.05.2017, 09:51
Сделал управление по шине ibus управление всеми фарами автомобиля BMW E39 рестайлинг. Сделано на Arduino (https://duino.ru/arduino.html) + mcz33290. Управление морганием фар с кнопок руля R/T , Dial и открытие , закрытие. Если будет интерес выложу полный исходник.

Проблема в том что необходимо использовать скорость 9600 и проверку четности 8E1. В некоторых arduino есть хардварные порты и они поддерживают это. Но я использовал arduino nano (https://duino.ru/arduino-nano-v30-ch340-usb.html) и софтварный порт. Поэтому пришлось искать выход из ситуации. В результате поиска нашел библиотеку 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}; //подсветка номера

Как то так :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
Ну можно


#include <CustomSoftwareSerial.h>
CustomSoftwareSerial* IBusSerial;

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(readbuffer, 0, sizeof(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 > 1 ) && (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(readbuffer, 0, sizeof(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
Сделал управление по шине ibus управление всеми фарами автомобиля BMW E39 рестайлинг. Сделано на Arduino (https://duino.ru/arduino.html) + mcz33290. Управление морганием фар с кнопок руля R/T , Dial и открытие , закрытие. Если будет интерес выложу полный исходник.

Проблема в том что необходимо использовать скорость 9600 и проверку четности 8E1. В некоторых arduino есть хардварные порты и они поддерживают это. Но я использовал arduino nano (https://duino.ru/arduino-nano-v30-ch340-usb.html) и софтварный порт. Поэтому пришлось искать выход из ситуации. В результате поиска нашел библиотеку CustomSoftwareSerial которая поддерживала нужный функционал.

Как то так :pleasantry:

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

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