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

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Общение с машиной

Ответ
 
Опции темы
Старый 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 вне форума   Ответить с цитированием
Старый 05.05.2017, 09:55   #2
Dubel
Новый Пользователь
 
Регистрация: 29.08.2012
Регион: Беларусь
Машина: BMW E39
Сообщений: 16
Dubel has a spectacular aura aboutDubel has a spectacular aura about
По умолчанию

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

https://www.youtube.com/watch?v=UETog7W-0N4
Dubel вне форума   Ответить с цитированием
Старый 13.05.2017, 11:24   #3
Senya87
Новый Пользователь
 
Регистрация: 21.10.2010
Возраст: 31
Регион: 63, 163
Сообщений: 12
Senya87 is on a distinguished road
По умолчанию

Привет! а мог бы ты как то реализовать несколько функций? Необходимо получить из шины ibus сигнал о состоянии открытых дверей, багажника. и падать сигнал в шину чтобы закрывать и открывать двери?
Senya87 вне форума   Ответить с цитированием
Старый 15.05.2017, 12:22   #4
Dubel
Новый Пользователь
 
Регистрация: 29.08.2012
Регион: Беларусь
Машина: BMW E39
Сообщений: 16
Dubel has a spectacular aura aboutDubel has a spectacular aura about
По умолчанию

Ну можно

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 ();

Dubel вне форума   Ответить с цитированием
Старый 21.07.2017, 19:27   #5
Gasnar
Новый Пользователь
 
Регистрация: 21.07.2017
Регион: 40
Сообщений: 1
Gasnar is on a distinguished road
По умолчанию

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

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

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

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


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



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


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