Skip to main content

Eigentlich wollte ich über den Karosserie CAN Bus des Fiat Ducato die Zentralverriegelung steuern. Leider musste ich feststellen, dass das über den CAN Bus nicht möglich ist. Trotzdem findet man auf dem CAN einige spannende Signale, die man für mein Smart-Camper-Projekt gebrauchen kann. In diesem Beispiel integriere ich den Status der Fahrzeugtüren in mein Smart Camper System.

Komfort CAN Bus Grundlagen

Der Komfort CAN Bus des Fiat Ducato ist ein Low-Speed-CAN mit 50kBit/s . Das ist auch schon die erste Schwierigkeit. Während es online unterschiedliche CAN Module (mit CAN Controller und Transceiver) für High-Speed-CAN gibt, findet man keine fertigen Module für Low-Speed-CAN. Der Unterschied liegt in den Pegeln der CAN-H und CAN-L Leitung. Für das reine Testen kann man einen High-Speed-CAN Modul verwenden und nur die CAN-H Leitung verbinden. Die Pegel der CAN-H Leitung von High- und Low-Speed-CAN sind sich ähnlich und so sollte es möglich sein auch mit einem High-Speed-CAN Modul den Low-Speed-CAN des Ducato auszulesen. Folgende Grafik zeigt die Pegel von CAN-H und CAN-L von Low- und High-Speed-CAN.

Low-Speed-CAN mit dem ESP32

Der ESP32 hat einen CAN-Controller integriert. Was jetzt noch fehlt ist ein Low-Speed-CAN Transceiver. Hierfür habe ich einen TJA1055t/3 (da der ESP32 3,3V bevorzugt) bestellt. Außerdem benötigt man noch ein paar Widerstände und optional eine LED, die anzeigt, ob auf dem CAN gerade etwas passiert.

Beschreibung Bezeichnung Anzahl
Microcontroller ESP32 1
CAN-Tansceiver TJA1055T/3 1
Widerstand 4,7kOhm 3
Widerstand 3,3kOhm 2
Widerstand 2,2kOhm 1
LED LED 1
Jumper Jumper x
Steckbrett Steckbrett 1

Die Schaltung ist gemäß dem Datenblatt des TJA1055T/3 aufgebaut. Die beiden Widerstände an CAN-H und CAN-L habe ich maximal gewählt, damit sie im Ducato CAN Bus nicht ins Gewicht fallen. Zusätzlich habe ich den Pin 1 (INH = Wake-Up-Signal) über einen Spannungsteiler mit einem Wakeup-Pin des ESP32 verbunden. Sobald eine Kommunikation auf dem CAN Bus startet, geht der Pin auf „High“ und weckt so den ESP32 auf. D.h. solange auf dem CAN Bus keine Kommunikation stattfindet, braucht das System nur einen ganz kleinen Ruhestrom. Die LED zeigt an, ob gerade über den CAN Bus kommuniziert wird (ON) oder sich das System im Ruhezustand befindet (OFF).

Signale auf dem Fiat Ducato Karosserie CAN

Sobald man eine Tür öffnet, das Fahrzeug verriegelt bzw. entriegelt oder den Motor startet, werden diverse Daten mit unterschiedlichen IDs über den CAN-Bus gesendet. Da ich von Fiat leider keine Information zu diesen Daten bekommen habe, habe ich einfach alle Daten aufgezeichnet und unterschiedliche Aktionen ausgeführt. Anschließend habe ich daraus eine Pivot Tabelle gemacht um zu sehen, welche Signale durch welche Aktionen ausgelöst werden. Damit konnte ich herausfinden, dass es kein Signal zum Verriegeln oder Entriegeln der Zentralverriegelung gibt. Außerdem sind die Türen im ersten Byte der ID 0x06214000 zu finden. Wer sich für die unterschiedlichen Signale interessiert, dem habe ich hier die Pivot Tabelle angehängt. Das Event „Zündung“ habe ich ausgeklammert, da damit viele neue Signale auf dem CAN liegen, die mir die Übersichtlichkeit stark verschlechtern.

Einbindung in mein Smart-Camper-System

Der Code ist so geschrieben, dass sich das System eigentlich immer im Deep-Sleep-Modus befindet und nur ganz wenig Strom benötigt. Sobald etwas auf dem CAN Bus passiert, wacht das System auf und liest fleißig mit. Änderungen an den Türen (öffnen schließen) führen zu entsprechenden Signalen auf dem CAN Bus.  Der Microcontroller wertet diese aus und gibt den Status der Türen über den Pegelzustand von 4 GPIOs aus. Ist eine Tür offen, ist der entsprechende Pin „High“ und umgekehrt. Dieser Pegelzustand wird über eine HomeMatic IP 8 Kanal Modulplatine (HmIP MOD-RC8) an das Homematic System weitergegeben und kann zum Auslösen von Ereignissen verwendet werden.

Folgende Abbildung zeigt das fertige System. Da es auch noch verwendet wird um die Alarmanlage und die Daten des Batteriecomputers ins System zu übertragen ist in diesem Gehäuse auch noch die Hardware aus den beiden letzten Artikeln zusammengefasst.

Anzeige in der Cloudmatic App

Den Status der 4 Tür Kanäle zeige ich auch in meiner App an. So weiß ich von überall in der Welt ob eine Tür von meinem Camper gerade offen bzw. nicht richtig verschlossen ist. Gerade ist zum Beispiel die Schiebetür offen.

#include <Arduino.h>
#include <ESP32CAN.h>
#include <CAN_config.h>
#include <driver/rtc_io.h>


//CAN Low Speed Variablen
CAN_device_t CAN_cfg;
RTC_DATA_ATTR CAN_frame_t rx_frame;
gpio_num_t GPIO_ESP_CANWake = GPIO_NUM_35; //CAN Modul Weckt den ESP
#define BUTTON_PIN_BITMASK 0x800000000 // 2^35 in hex
gpio_num_t GPIO_CAN_Wake = GPIO_NUM_21; //ESP aktiviert CAN Modul
gpio_num_t GPIO_CAN_TX = GPIO_NUM_23; //GPIO_NUM_5
gpio_num_t GPIO_CAN_RX = GPIO_NUM_22; //GPIO_NUM_4
RTC_DATA_ATTR byte ZV_Byte_1, Status_FT, Status_BFT, Status_HT, Status_ST;
#define IS_SET(byte,bit) (((byte) & (1UL << (bit))) >> (bit))

//Setup
RTC_DATA_ATTR unsigned long currentMillis, previousMillis;


///////////////////////////////////////////////////////////////////////////////////
/////////////////////////            SETUP          ///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////

//GPIOs konfigurieren
void Setup_GPIO(){
 
      // Pins sind mit dem Homematic 8-Kanal-Empfangsmodul verbunden
      pinMode(GPIO_NUM_33, INPUT_PULLUP);
      pinMode(GPIO_NUM_25, INPUT_PULLUP);
      pinMode(GPIO_NUM_26, INPUT_PULLUP);
      pinMode(GPIO_NUM_27, INPUT_PULLUP);
      pinMode(GPIO_NUM_14, INPUT_PULLUP);
      pinMode(GPIO_NUM_12, INPUT_PULLUP);
      pinMode(GPIO_NUM_13, INPUT_PULLUP);
      //STB_N vom TJA1055T (GPIO_NUM_21)
      pinMode(GPIO_CAN_Wake, OUTPUT);
    
      // Pins sind mit dem Homematic IP 8-Kanal-Sendemodul verbunden
      pinMode(GPIO_NUM_15, OUTPUT);
      pinMode(GPIO_NUM_2, OUTPUT);
      pinMode(GPIO_NUM_0, OUTPUT);
      pinMode(GPIO_NUM_4, OUTPUT);
      pinMode(GPIO_NUM_16, OUTPUT);
      pinMode(GPIO_NUM_17, OUTPUT);
      pinMode(GPIO_NUM_5, OUTPUT);
      pinMode(GPIO_NUM_18, OUTPUT);
          
      //WakeupPin TJA1055T
      pinMode(GPIO_ESP_CANWake, INPUT_PULLDOWN);
      digitalWrite(GPIO_CAN_Wake, HIGH);
      //esp_sleep_enable_ext0_wakeup(GPIO_ESP_CANWake, HIGH);
      esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);
    
      //WakeupPin Homematic
      pinMode(GPIO_NUM_32, INPUT_PULLUP);
      esp_sleep_enable_ext0_wakeup(GPIO_NUM_32, LOW);
      rtc_gpio_pullup_en(GPIO_NUM_32);    
}


void Setup_CAN_LS(){
    Serial.println("Setup_CAN_LS");
    CAN_cfg.speed=CAN_SPEED_50KBPS;
    CAN_cfg.tx_pin_id = GPIO_CAN_TX;
    CAN_cfg.rx_pin_id = GPIO_CAN_RX;
    CAN_cfg.rx_queue = xQueueCreate(100,sizeof(CAN_frame_t));
    ESP32Can.CANInit();
    delay(100);
}

void setup() {
  Serial.begin(115200);
  Setup_GPIO();
  Setup_CAN_LS();
  previousMillis = millis();
}

void loop()
{
  if(digitalRead(GPIO_NUM_32)==0){
        Serial.println("HomeMatic Weckruf");
       //Votronic auslesen
        if(digitalRead(GPIO_NUM_33)==0){
        }
        //Unlock Zentralverriegelung
        if(digitalRead(GPIO_NUM_25)==0){
        }
        //Lock Zentralverriegelung
        if(digitalRead(GPIO_NUM_26)==0){
        }
        //Status der Thitronik auf PIN darstellen
        if(digitalRead(GPIO_NUM_27)==0){
        }
        //Aktuell Unbenutzt
        if(digitalRead(GPIO_NUM_14)==0){Serial.println("GPIO_NUM_14");}
        if(digitalRead(GPIO_NUM_12)==0){Serial.println("GPIO_NUM_12");}
        if(digitalRead(GPIO_NUM_13)==0){Serial.println("GPIO_NUM_13");}
  }
  //Solange der CAN-Transceiver nicht schläft, werden Nachrichten gelesen
  CAN_Nachricht_empfangen();
  if (digitalRead(GPIO_ESP_CANWake)!= HIGH){
          //Schlafenszeit bis GPIO32 == LOW (Homematic) oder GPIO_35 == HIGH (CAN transceiver)
          Serial.println("ich gehen schlafen!!");
          ESP32Can.CANStop();
          gpio_deep_sleep_hold_en(); //Hold GPIO Status
          esp_deep_sleep_start();
  }
}


///////////////////////////////////////////////////////////////////////////////////
/////////////////////////             CAN           ///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////

void CAN_Nachricht_empfangen() {
    //receive next CAN frame from queue
    if(xQueueReceive(CAN_cfg.rx_queue,&rx_frame, 3*portTICK_PERIOD_MS)==pdTRUE){
      digitalWrite(GPIO_CAN_Wake, HIGH);
      if(rx_frame.MsgID==0x06214000){
          if( ZV_Byte_1 != rx_frame.data.u8[1]){
              ZV_Byte_1 = rx_frame.data.u8[1];
              Status_FT = IS_SET(ZV_Byte_1,2);
              Status_BFT = IS_SET(ZV_Byte_1,3);
              Status_ST = IS_SET(ZV_Byte_1,4)|IS_SET(ZV_Byte_1,5);
              Status_HT = IS_SET(ZV_Byte_1,6);   
              printf("FT: %d, BFT: %d, HT: %d, ST: %d, \n",Status_FT, Status_BFT , Status_HT, Status_ST);   
              Set_And_Hold_GPIO(GPIO_NUM_15, Status_FT);//MH-IP_1
              Set_And_Hold_GPIO(GPIO_NUM_2, Status_BFT);//MH-IP_2
              Set_And_Hold_GPIO(GPIO_NUM_0, Status_ST);//MH-IP_3
              Set_And_Hold_GPIO(GPIO_NUM_4, Status_HT);//MH-IP_4
              //Noch nicht belegt
              //Set_And_Hold_GPIO(GPIO_NUM_16, 1);//MH-IP_5 (Nur Taster/ immer Low im Schlaf)
              //Set_And_Hold_GPIO(GPIO_NUM_17, 1);//MH-IP_6 (Nur Taster/ immer Low im Schlaf)
              //Set_And_Hold_GPIO(GPIO_NUM_18, 0);//MH-IP_8
          }
      }
      previousMillis = millis();
    }
    else{
      currentMillis = millis();
      //erst nach 1s Funkstille den Transceiver deaktivieren
      if((currentMillis - previousMillis) > 1000) {
        digitalWrite(GPIO_CAN_Wake, LOW);
      }
    }
}

void Set_And_Hold_GPIO(gpio_num_t gpio_num,byte GPIO_status){
    gpio_hold_dis(gpio_num);
    digitalWrite(gpio_num, GPIO_status);
    gpio_hold_en(gpio_num);
    printf("GPIO: %d set to %d \n", gpio_num , GPIO_status);
}

Danke, dass ihr unseren Blogartikel gelesen habt! Wir freuen uns auf eure Kommentare und euer Feedback.

Unten geht es weiter mit ähnlichen Blogartikeln, außerdem findet ihr die Möglichkeit, euch zu unserem Newsletter anzumelden sowie den Verweis zu unseren Produkten in unserem Webshop.

Dankeschön und Happy Camping,

Sonja & Matthias

Hier könnt ihr euch zu unserem Newsletter anmelden.

Wir schreiben unser Community in unregelmäßigen Abständen, sobald wir neue, spannende Blogartikel posten.
Außerdem schicken wir euch exklusive Rabatte für unseren Webshop. Wir freuen uns, mit euch in Kontakt zu bleiben!

Ihr wollt keine spannenden Artikel verpassen?

* indicates required

Besucht unseren Webshop

Gadgets von Campern für Camper. Unsere eigenen Produkte!

23 Comments

  • Fabian sagt:

    Hi,
    An welcher Stelle greifst du den Komfort CAN bus ab?

    • Matthias Harzheim sagt:

      Hallo Fabian,

      an der stelle wo der Sicherungskasten ist, kannst du diesen abschrauben. Am besten geht das, wenn du vorher die Plastikverkleidung mit 3 Schrauben entfernst. Auf der Rückseite befinden sich 2 Stecker. Am linken Stecker auf PIN 26 (Farbe schwarz/orange) und auf PIN 11 (Weiß/Orange) sind CAN-H und CAN-L.

      Anscheinend gibt es aber auch in der B-Säule auf der Beifahrerseite einen Stecker, auf dem dem CAN-H und CAN-L ist. Das habe ich aber noch nicht geprüft )Eventuell PIN 9 und 10 in diesem Stecker.

      Grüße,

      Matthias

  • Fabian sagt:

    Hi,
    Woher hast du den TJA1055t/3 auf einem breakout board? Ich finde den Chip nur einzeln und dann zumeist mit hohen Versandkosten (wenn man nur den einen Chip benötigt)

    Grüße Fabian

  • Gundolf sagt:

    Hallo Matthias,
    erstmal vielen Dank für Deine Beschreibungen. Das ist eigentlich genau das, was ich schon länger suche.
    Ich möchte eine einfache „Alarm“ Anlage für die Vordertüren an meinem Camper haben. Alles kommerzielle ist sauteuer für das, was sie bieten.
    Also habe ich mir die o.g. Komponenten bestellt und hänge nun beim Kompilieren im Arduino IDE fest. Denn ich bekomme eine Fehlermeldung, dass die Konstante „CAN_SPEED_50KBPS“ im Scope nicht definiert wurde.
    Wie gross ist der Wert und wo muss ich ihn definieren?

    Danke für eine kurze Info und mach weiter so.

    Grüße
    Gundolf

    • Matthias Harzheim sagt:

      Hi Gundolf,

      Das muss alles in der CAN_config.h stehen. Schau nochmal nach ob der Wert bei dir fehlt. Kann leider gerade nicht nachschauen. Wenn du das Problem nächste Woche noch hast, schreib mir eine E-Mail.

      Grüße,

      Matthias

  • Tobias sagt:

    Hallo,

    bin zufällig auf deinen Beitrag aufmerksam geworden. Finde es ein interessantes Projekt. Ich habe schon mehrfach mit einem ESP experimentiert, jedoch nicht am Fahrzeug.

    Wie ist das mit dem CAN Bus genau? Hat man dann einen High Speed und Low Speed CAN Bus im Ducato? Mein Ziel ist es eine Wegfahrsperre nachzurüsten. Aber ich möchte dies nicht in der Nähe des Sicherungsverteilers tun. Damit man diese nicht so leicht findet.
    Wie kann ich rausfinden, wo ich den CAN-Bus noch abgreifen kann? Du schreibst B-Säule. Woher weiß man, welcher CAN Bus das ist und ob es er ist?

    Danke!
    Tobias

    • Matthias Harzheim sagt:

      Hallo Tobias,

      leider kenne ich den genauen Aufbau der unterschiedlichen Bussysteme im Ducato auch nicht. Welche Information suchst du denn für deine Wegfahrsperre und wie soll die funktionieren? Ich würde mit einem Oszilloskop bei der Beifahrerseite an der B-Säule Mal nach dem CAN suchen. Ein gutes Indiz ist auch immer ein verdrehtes Adernpaar.

      Grüße,

      Matthias

  • Thomas Erdt sagt:

    Hallo Matthias,

    es hat mich immer schon interessiert, welche Tür mich gerade daran hindert den Ducato abzuschliessen.
    Deine Lösung gefällt mir gut. Ich habe aber keine Homematic um den Zustand darzustellen.
    Rein HW technisch könnte ich mir eine Lösung mit LEDs an den GPIOs vorstellen.
    SW technisch wäre es super wenn man den Status per MQTT an einen Broker senden könnte.
    Schon mal über so etwas nach gedacht ? Ich bin kein Programmierer und kenne mich mit Arduino
    auch nicht aus. Wie siehst du das, kann man das als Laie mit etwas Internet Recherche umsetzen
    oder ist das komplexer oder hat due eine einfache Lösung ?

    Viele Grüße Thomas

  • Wolfgang sagt:

    Hallo,
    sehr Interessant!
    Ich versuche gerade mit einem Pi und einem „WaveShare RS485 CAN HAT for Raspberry Pi“ den Canbus meines Ducato(BJ2019) auszulesen.
    Ist das sicher mit der Bus-Geschwindigkeit von 50000 ?
    Im Netz gibt es leider sehr viele wiedersprüchliche Informationen.

    Grüße
    Wolfgang

  • Sven Zimmermann sagt:

    Hallo zusammen,

    wir haben uns auch gerade ein Fiat Ducato Womo gekauft, Bj. 2019, gibts zu dem Modell schon nähere Informationen den Can Bus betreffend?

    Fange auch gerade erst an mich mit dem Thema Can Bus zu beschäftigen, aber eine Integration des Fahrzeugzustandes ins Smart Home würde ich sehr interessieren

    Danke für Infos und Tip’s

    • Matthias Harzheim sagt:

      Hi Sven,

      BJ 2019 müsste ja noch der alte Ducato sein, also der, den ich hier beschreibe. oder ist es schon das neue Modell?

      Grüße,

      Matthias

      • Sven Zimmermann sagt:

        Ich denke es ist der alte, wir haben den jetzt seit ca 1,5 Wochen zuhause, ist unser erster Camper (also alles neu und frisch)
        haben den gebraucht gekauft, waren begeistert von dem 🙂

        Ich finde es schwierig genaue Modell Informationen zu bekommen 🙂

        Welche Daten bräuchte man genau um das herauszufinden? mit den Angaben aus dem Fahrzeigschein war ich nicht sehr erfolgreich,
        kann es schwer sagen, aber ich glaube Typ 3 / Facelift 3? exaktes Baujahr war 18.04.2019

        Fiat Ducato Malibu Van 600 LE

  • Sven Zimmermann sagt:

    Zurück zum Thema, ich habe aktuell an Hardware einen Pi Zero 2 WH mit Waveshare RS485 CAN HAT hier, die ganze drumherum Hardware natürlich auch (ESP’s usw), aber ich wollte jetzt mal anfangen mit dem Auswerten des Can-Bus (ebenfalls blutiger Anfänger in Sachen Can-Bus, bin auch hier für anfängliche Tips usw offen (Smart Home, Home Assistant, Homematic ist alles vorhanden, Wlan im Womo ist da, nur noch nicht aktiv) 🙂

  • Sven Zimmermann sagt:

    Zurück zum Thema, ich habe aktuell an Hardware einen Pi Zero 2 WH mit Waveshare RS485 CAN HAT hier, die ganze drumherum Hardware natürlich auch (ESP’s usw), aber ich wollte jetzt mal anfangen mit dem Auswerten des Can-Bus (ebenfalls blutiger Anfänger in Sachen Can-Bus, bin auch hier für anfängliche Tips usw offen (Smart Home, Ho

Leave a Reply