Verteilter MQTT Subscriber mit Ethernet und CAN

Wieder mal den berüchtigten MQTT Subscriber ….
Diesmal aber als verteiltes System mit Ethernet und CAN Controller. Über Ethernet werden dann die MQTT Werte als Subscriber eingelesen und über CAN Bus weitergegeben z.B. für eine Ausgabe auf einem zweizeiligem Display.

Verteiltes System
Das System ist also ein verteiltes. Vorneweg ein Arduino mit Ethernet und CAN als Empfänger für MQTT Nachrichten, die dann über CAN weitergeleitet werden. Danach ein CAN Empfänger, der die MQTT Werte auf einem I2C Display darstellt.

Die Hardware
Drei Arduino Uno, drei CAN Module mit dem MCP2515 Chip, zwei I2C Displays mit zwei Zeilen und ein Ethernet2 Shield.

Ausgangsbasis für die CAN Übertragung
Ein erstes Experiment nach capnfatz mit D9 als Slave Select verlief schon einmal positiv! Jetzt fehlen noch die Ausgabe auf dem Display und die Verbindung zum MQTT Server über Ethernet. Die Herausforderung hierbei liegt in der SPI Übertragung. Da das Ethernet Shield, sowie das CAN Modul, beide über SPI verbunden werden.

Mehrere Devices am SPI
Die ausgiebige Analyse beider Librarys für CAN und Ethernet haben folgendes ergeben. Die Übertragung über den SPI Port läuft immer folgendermaßen ab: Der Slave select wird aktiviert, die Übertragung über SPI durchgeführt und anschließend der Slave select wieder deaktiviert. So soll es laut SPI Tutorial (siehe unten) für mehrere Devices auch sein. Es muss also nur darauf geachtet werden, das die Abläufe für mehrere Devices zeitlich zueinander passen und keine ständige Aktivität erfordern.

CAN Empfänger mit I2C Display
Die empfangenen Werte stehen als ASCII Werte im Empfangsbuffer. Die ersten zwei ASCII Werte für die Temperatur in Grad Celsius, die zweiten zwei ASCII Werte stehen für die relative Luftfeuchte in Prozent. Die Ausgabe auf das LCD Display geschieht dann wie schon in vorherigen Subscribern auch. Die Software dafür muss kaum geändert werden.

CAN Empfänger mit I2C Display für Statusmeldungen
Die Statusmeldungen stehen als ein Byte Werte zur Verfügung. Die Ausgabe auf das LCD Display geschieht dann als Ausgabetext in Abhängigkeit vom übertragenen Status.

CAN Sender mit Ethernet als Datenempfänger
Hier kann ebenfalls das bereits vorhandene Modul für MQTT verwendet werden, mit kleinen Anpassungen, da nur zwei Topics benötigt werden. Dann nur noch ein umkopieren der Daten und weitersenden über den CANbus. Das funktioniert einwandfrei, da nur jeweils ein Slave am SPI aktiv sein muss.

Der Versuchsaufbau

Verteilter MQTT Subscriber mit Ethernet und CAN

Die Sketche
MQTT und CAN Transmitter
Distributed-MQTT-Subscriber-CAN-Transmitter

CAN Receiver mit LCD für Messwertausgabe
Distributed-MQTT-Subscriber-CAN-Receiver

CAN Receiver mit LCD für Statusmeldungen
Distributed-MQTT-Subscriber-CAN-Receiver-Status

Links

Ausgangsbasis für die CAN Übertragung

Arduino CAN Bus Module 1st Network Tutorial

SPI Tutorial
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

I2C Display mit zwei Zeilen
Digispark mit LCD 2×16 Zeichen

MQTT Subscriber LCD
MQTT Subscriber LCD 4×20

Veröffentlicht von

Jürgen

Ich bin Software Ingenieur und habe meine Schwerpunkte in allen Aktivitäten, die zur Software Entwicklung gehören. Am längsten bin ich als Software Entwickler von Embedded Software in C tätig.