Raspberry als Datenlogger – Teil.3 Arduino nano als I²C Converter

DSC_4790
Raspberry PI als Datenlogger
 

Im letzten Teil des Projektes „Raspberry Pi als Datenlogger“ habe ich einen Raspberry Pi als Datenlogger für unterschiedliche Sensoren konfiguriert. Als Schnittstelle dient der I²C Bus und die RS232 Leitungen, an denen die Sensoren angeschlossen sind. Die Sensoren waren ein HYT939 (Luftfeuchtigkeit und Temperatur), ein BME280 (Luftdruck, Luftfeuchte und Temperatur) sowie ein Ultimate GPS Board an der seriellen Schnittstelle. Der Raspberry Pi ist dabei in eine Box eingebaut, wird mit einer Powerbank, die sich ebenfalls in der Box befindet, versorgt und stellt als Schnittstelle eine 8 polige RJ45 Buchse mit I²C und RS232 nach aussen zur Verfügung. An diese Buchse können dann die Sensoren angeschlossen werden.   Will man die Sensorik nun änderen, bzw. erweitern, so können einfach weitere I²C Bus – Sensoren angeschlossen werden. Es muß lediglich noch die Software (in diesem Fall Pythonscripten) angepasst werden und schon können die Daten des neuen Sensors empfangen und aufgezeichnet werden. Wie aber geht das System um, wenn der Sensor nicht über I²C spricht? Wenn zum Beispiel ein analoger Wert eingelesen werden soll? Ganz einfach: Soll die Hardware des Datenloggers nun nicht mehr modifiziert werden, so muß man einfach dafür sorgen, dass der neue Sensor, der beispielsweise analoge Spannungen ausgibt, diese an eine, nennen wir sie BlackBox weitergibt, die wiederum an ihrem Ausgang ein I²C Bussignal bereit stellt. Das kann dann wieder in das bestehende System integriert werden.

dsc_2872
Arduino Nano als I²C Converter

 

Und genau diese Aufgabe erfüllt ein Microcontroller. Praktischer Weise habe ich diesmal einen Arduino Nano dazu verwendet. Der Arduino Nano mit dem Atmega 328 besitzt ja mehrere analoge und Digitale Eingänge, sowie zwei Interrupts. Über entsprechende Libraries ist einfach das I²C Bus Protokoll zu realisieren. Somit ist das geeignete Black-Box Gerät gefunden.

 

Der folgende Arduino Code stellt einen einfachen I²C Bus Slave dar. Die Busadresse soll beispielsweise 0x08 sein, von einer Messung haben wir den Messwert 1.3321 erhalten. Dieser Wert soll bei Anfrage an diese Busadresse gesendet werden. Das Beispiel sieht wie folgt aus:


// I2C Slave
#include
int address = 8;           //i2c busaddresse
float wert = 1.3321;       // testwert .... kommt zb aus sensorberechnung

char tmp[6];
void setup() {

Wire.begin(address);           // i2c adresse 0x08
Wire.onRequest(requestEvent);  // register event
}

void loop() {}

void requestEvent() {
dtostrf(wert,1,3,tmp);      // float "wert" in char array umwandeln
Wire.write(tmp);            // char array senden
}

Im script ist eine Funktion „dtostrf“ zu sehen. Sie  wandelt den Inhalt einer Variable des Datentyps „floating point“ in ein charakter Array um. Infos sind hier zu sehen. Im Python Interpretor des Raspberry können wir nun überprüfen, ob die Daten ankommen. Doch zuvor soll der gesamte Aufbau einmal schematisch dargestellt werden.

blockschaltbild
Schematische Darstellung des Systems

Sind alle Sensoren inklusive des Arduino angeschlossen, so kann das folgende Python-Script aus der Linux Konsole des Raspberry aufgerufen werden:

 

# Reading data from arduino as sensor slave
# V0.1 by bihlo 09/2016

import smbus, time

bus = smbus.SMBus(1)    # Raspberry Rev. 2
address = 0x08          # Fixed default address of Arduino

# Initialize sensor to acquire measurements
#def MeasurementRequest():
# void = bus.write_quick(address)
#time.sleep(0.1)

# Read from bus
def ReadMeasurement():
void= bus.write_quick(address)

time.sleep(0.1)
# Acquire 6 byte from sensor
Readout = bus.read_i2c_block_data(address,0,6)

out=''.join(chr(i) for i in Readout) #byte array von ascii in string wandeln

print "Antwort vom Arduino: ", Readout, " ."
print "Antwort als String:  ", out

ReadMeasurement()

Wenn der Python Interpretor jetzt keinen Fehler meldet und der Inhalt der Variable „wert“ des Arduino in Ascii und im Klartext dargestellt wird, dann kann jetzt mit einem „richtigen“ Messwert eines Sensors weiter gearbeitet werden.

dsc_2873
Partikeldetektor

Als Sensor soll an an den Arduino ein DSM501 Dust Sensor Module angeschlossen werden. Der DSM501A ist ein Staubsensor, der mit 5V bei einer Stromaufnahme von 90mA betrieben wird. Er erkennt Partikel ab einer durchschnittlichen Größe von 1µm bei einer Konzentration von 0 bis ca. 1.4mg pro Kubikmeter Raumluft. Laut Datenblatt und Herstellerinformationen wird die Luft im Bereich der Messkammer erhitzt, sodass eine Luftzirkulation entsteht. Die sich ständig bewegende Luft wird mit einem getakteten Lichtstrahl beleuchtet. Ein in einem Winkel zur Lichtquelle angebrachter Fotodetektor empfängt nun, im Falle dass sich Partikel im Licht befinden, dessen Streulicht. Die Intensität des Streulichtes ist von der Anzahl und Größe der Partikel abhängig und kann so erfasst werden. Als Ausgangssignal erzeugt der Sensor ein Puls/Pausensignal mit einer Periode von 100ms. Das Verhältnis von High- zu Lowtime stellt nun die Grundlage für die Berechnung der Partikelanzahl bzw. -dichte dar. Über einen Countereingang des Arduino werden die Impulse gemessen und der korrespondierende Partikelwert errechnet. Dieser Wert wird nun wie oben beschrieben als Busdatum für den I2C Bus herangezogen und bei Auslösen des Bus Events übertragen. Somit hat der Arduino die Aufgabe eines einfachen Protokollkonverters übernommen. Mit dieser Methode lassen sich alle möglichen Messwerte so aufbereiten, dass der Raspberry mit einer Schnittstelle damit umgehen kann.

Wie das im Detail funktioniert und wie der Code dazu aussieht, werde ich vielleicht später einmal posten.

3 Gedanken zu „Raspberry als Datenlogger – Teil.3 Arduino nano als I²C Converter“

  1. Hallo Ingmar,

    ich versuche ein relativ ähnliches Projekt umzusetzen und würde mich freuen noch ein paar Schlagwörter von dir auf zu greifen, worauf ich noch schauen sollte:

    Ich habe den Auftrag in unserem „Lernlabor“ ein RFID geführtes Auftragstracking einzuführen.

    Es gibt 7 Station, welche alle verbunden werden wollen. Die Reader sollen auf den Pufferflächen vor jeder Station (Bohren, Biegen, Kleben etc.) installiert werden, sodass man genau weiß, wo die Box (Bzw. der Auftrag) derzeit ist. (Weitere Vorteile: Messung Anlagenstillstand, Messung Taktzeit etc.)

    Ich würde mich über Input von folgender Idee freuen:

    1. RDM6300 Reader installieren (7x)
    (Kann auch ein Anderer sein)
    2. Verbinden mit einem PL2303 USB to RS232 Converter (7x)
    3. Alles in einem USB-Hub zusammenführen (1x)
    4. USB-Hub mit Raspberry Pi verbinden (1x)
    5. Über /dev/ttyUSB[xyz] ansteuern?!

    Das Problem bei dieser Lösung ist, dass ich nicht weiß, ob ich die einzelnen Reader über den USB Hub auf dem Pi unterscheiden kann. Daher kam nun die Idee den RFID Reader mit einem Arduino Nano zu verbinden und das dann über den USB Hub auszulesen. (Wo muss ich hier drauf achten, was googeln?) Nach dem auslesen dann mit udev arbeiten ?

    Additional:
    Kann ich die Daten dann in „Echtzeit“ abgreifen und zB. in eine Excel weiter verarbeiten ? (Z.B. visuell als Dashboard weiter darstellen?) Auch wäre das Abgreifen der Tags zB nach Schichtende auch okay, um eine Auswertung zu fahren. Aber hier bin ich noch nicht im Thema…

    Ich brauche unbedingt eine Sicherheit, dass das auch alles geht, bevor ich anfangen und am letzten Punkt scheiter – Ich bin auf deinen Ansatz gespannt. Mir reichen wie gesagt auch Stichpunkte als Hilfestellung, um mich weiter ein zu lesen.
    Vielen lieben Dank vorab!

    1. die Idee, an einem Raspberry über einen Hub 7 ftdi232 zu betreiben habe ich noch nie ausprobiert, sollte aber zumindest technisch funktionieren.
      Ein Problem wird die automatische Enumerierung der devices sein, die nach jedem Einschalten anders sein wird.
      Dann stellt sich noch die Frage wie die Tag-Reader arbeiten bzw wie schnell die einzelnen Reader gepollt werden müssen. Ich denke mal dass alle 200-500ms gepollt werden muß.

      Ein anderer Ansatz wäre vielleicht, die 7 Reader über einen Multiplexer an einen Microcontroller zu schalten. Das könnte so gehen, dass die TX/RX lines über gesteuerte Schalter (Fets, oder IC´s die mehrere Switches beinhalten) an einen Controller gehen (z.b. Adruino) der Controller würde dann die Schalter ansteuern und die Daten sammeln und dann in einem seriellen Wort schön aufbereitet über die USB Schnittstelle an den Raspi senden. Und die Geschwindigkleit könnte man dann schön anpassen, dass nix verloren geht….

      1. Hallo Ingmar,

        vielen lieben Dank für deine Antwort!
        Ich habe nun tatsächlich einen Microcontroller verwendet .
        Ich habe ein Wifi-Modul (ESP8266) programmierbar über die Arduino IDE mit einem RC522 RFID Reader verbunden und mit einem MQTT Protokoll an Thingspeak geschickt . Klappt wunderbar. Jetzt versuche ich die Daten noch zu analysieren und fertig 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.