Raspberry mit S0 und Interrupts

Ein Auslöser mich überhaupt mit der Thematik um den RasPi zu beschäftigen war der Einbau von Stromzählern bei Net at Work, die eine S0-Schnittstelle haben, d.h. die für jede Wattstunde einmal einen Kontakt verbinden. Sicher gibt es diverse kommerzielle Anbieter von S0-Zählern, die die Schaltungen aufaddieren und irgendwie verfügbar machen.

Kommerzielle Zähler mit Ethernet

Wer also nicht selbst bauen will, kann hier schon mal schauen.

Die meisten dieser Geräte werden auf die Hutschiene moniert und brauchen ggfls. noch eine Stromversorgung und natürlich ein LAN-Kabel.

Selbstbau ist Trumpf

Sie haben aber auch schon gesehen, dass ein RasPi viele Eingänge hat und samt Netzteil und Gehäuse und WLAN-Adapter günstiger ist als alle kommerziellen Geräte. Allerdings müssen Sie dann selbst bauen, programmieren und anschließen.

Beachten Sie, dass die Arbeiten an Starkstrom nur Fachpersonal durchführen darf. Selbst wenn sie "nur" an den S0-Anschluss eines Zwischenzählers gehen, sollten sie kein Laie sein.

Der RasPi hat, wie ich auf GPIO beschrieben habe, sehr viele digitalen Eingänge, die einfach die Impulse lesen könnten. Und da die meisten S0-Eingänge von Zählen per Optokoppler schon galvanisch getrennt sind, könnte man einfach einen Widerstand und etwas Draht nehmen.

Basically the S0 interface is really only an open collector switch that switches a number of times pr kwh. connect it to one of the Pi's GPIO pins and add a pull up resistor to 3V3. If you use GPIO 0 or 1 this already has a pull up resistor fitted. You also need to connect the ground of your meter to the ground of the Pi
Quelle: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=9415

Weiterhin müsste ein Programm ja auf eine PegelÄnderung reagieren oder regelmäßig die GPIO-Pins abpollen und hoffen keinen Takt zu übersehen

Each GPIO can interrupt, high/low/rise/fall/change.[5][6] There is currently no support für GPIO interrupts in the official kernel, however a patch exists, requiring compilation of modified source tree.[7] The 'Raspbian "wheezy"' [8] version that is currently recommended für starters already includes GPIO interrupts.
Quelle: http://elinux.org/Rpi_Low-level_peripherals#GPIO_hardware_hacking

Allerdings ist diese Aussage mit Interrupts wohl schon obsolet, wie ich auf Raspberry - GPIO gezeigt habe.

Aber das direkte Lesen hat natürlich die Einschränkung, dass die Impulse nur gezählt werden, wenn das Programm auch aktiv ist und der "Stand" müsste ja auch irgendwo gespeichert werden. Eine SD-Karte ist zwar vorhanden aber auch nur für eine gewisse Menge von Schreiboperationen geeignet. Jede einzelne Wattstunde würde ich nicht als Datei auf eine SD-Karte schreiben wollen.

Vorverarbeitung

Daher ist es aus vielerlei Hinsicht interessant, die Zählimpulse vorher zu verarbeiten: So kann ein 1-Wire Zählerbaustein oder andere PICs mit viel weniger Strom arbeiten, die Zählerstände aufaddieren und diese über eine leistungsfähigere Schnittstelle zur Verfügung stellen. Zudem sollten Sie schon eine elektrische Anpassung (Schutz und Entprellung) vorsehen. Aber auch hier gibt es schon fertige Module für die RasPi-Plattform:

Interessant ist insbesondere der 1Wire Sensor, der auf dem Zählerbaustein DS2423 (http://www.maximintegrated.com/datasheet/index.mvp/id/2912) aufsetzt. Leider wird genau der Baustein nicht mehr hergestellt und Restbestände sind entsprechend teuer! Aber dafür gibt es andere findige Bastler, die das mit einem AVRTiny mal schnell nachbauen: (http://forum.fhem.de/index.php?t=msg&goto=63018&rid=0#msg_63018)

SMS-Guard: 1wire-USB-Master

Von der Firma SMS-Guard gibt es mittlerweile eine USB-Lösung die mit einem RasPI-Projekt von zwei Stromzählern S0-Eingänge abfragen kann und zudem eine 1-Wire-Schnittstelle anbietet.

Der Vorteil dieser Lösung gegenüber einer direkten Nutzung der GPIO-Pins ist, dass der verwendete Prozessor und die S0-Zählung unabhängig vom RasPI selbst ist. Laut Hersteller "zählt" das Modul auch, wenn einfach nur eine Stromversorgung vorhanden ist. Damit ist die Zählung deutlich zuverlässiger als die Verarbeitung von Interrupt. Über den 1-Wire-Bus können sogar noch bis zu 64 weitere Sensoren (Zähler, Temperatur, Feuchtigkeit) etc. angeschlossen werden. Das ganze ist für einen Listenpreis von unter 25€ eine durchaus interessante Option

Übrigens gibt es mit dem "IPswitch-S0-mini ISG" für ca. 80€ eine Box, die 3-S0-zählt aber per Ethernet angeschlossen wird und SNMP spricht. Damit lässt sich dann natürlich die Messwert-Erfassung im Schaltschrank durchführen, während der RasPI oder ein anderes System woanders steht. Zudem hat man so eine weitere galvanische Trennung durch den Switch.

Busware SD0

Interessant ist natürlich, wenn jemand ein fertiges Modul verkauft, welches sogar schon die Vorverarbeitung macht. Das SD0 (http://www.busware.de/tiki-index.php?page=SD0 ) von BusWare kommt dem recht nahe, da es 4 elektrisch gesicherte SO-Eingänge hat, die aber nicht auf den RasPi auflaufen, sondern von einem kleinen ATmega 1284c  abgefragt werden.

Das kleine Board liest aber nicht nur S0 aus, sondern hat optional noch eine RTC und der GoldCAP stützt als Überbrückung (ca. 12h) mit, damit der Zähler weiter läuft. Die erforderliche Firmware für den "Volkszähler dazu gibt es kostenfrei. Allerdings ist diese relativ "dumm" und gibt wohl nur die Impulse weiter.

Achtung
Der GPIO-Stecker links auf dem Bild muss "rückseitig" aufgesteckt werden. Der Stecker vom RaspI kommt dann von unten durch die Platine nach oben. Die Platine hat entsprechende löcher und dann gehen die Anschlüsse auch wirklich aus dem RasPi-Gehäuse raus.

Firmware für SD0
http://busware.googlecode.com/svn/trunk/SD0/Firmware_VZ/vzfeeder/main.hex

Auf http://www.s0control.de/ gibt es sogar eine passende Software für das Auslesen und Visualisierung mit dem Raspi. Aber mit ein bisschen Geschick schaffen Sie das auch allein mit folgenden Schritten:

  • WinAVR von http://winavr.sourceforge.net herunterladen und installieren
    Das Default Setup addiert das Programmverzeichnis im Pfad, so dass Sie den "Make" später einfach starten können. Wenn Sie aber andere EntwicklungsUmgebungen mit "make.exe" nutzen, kann das stören.
  • Tortoise Client (optional)
    Wenn Sie nicht alle Dateien aus der Quelle manuell herunterladen wollen, dann ist ein lokal installierter SVN-Client eine einfache Möglichkeiten die aktuelle Version auszuchecken.
  • Source herunterladen
    Auf http://code.google.com/p/busware/source/browse/trunk/SD0#SD0%2FFirmware_common die aktuelle Version aller Dateien in ein eigens angelegtes Verzeichnis (z.B. C:\SD0) herunterladen
  • Datei Kompilieren
    Dazu öffnen Sie eine CMD-Box, wechseln nach C:\SD0, und geben dann einfach "MAKE" ein. Über den Suchpfad findet Windows die WinAVR-Programme, kompiliert die C-Dateien und erstellt ein HEX-File "main.hex"

Diese HEX-Datei können Sie nun auf den SD0 brennen lassen.

Die Firmware bleibt auch nach dem Ausschalten erhalten. Aber sie müssen erst die GPIO17/27-Pins richtig schalten, damit der Atmel auch "bootet"

Die Kommunikation zwischen dem RasPi und dem SD0 erfolgt über den seriellen Anschluss und entsprechende Steuerbefehle. Die lassen sich aus der ebenfalls als Source vorliegenden Datei (http://code.google.com/p/busware/source/browse/trunk/SD0/Firmware_VZ/serial.c) auslesen. Der kleine Atmel liest den seriellen Port byteweise aus, bis ein CHR(13) auftaucht. Das erste Zeichen im Buffer gibt die Aktion vor

  • .  (Punkt)
    Ausgabe der Eingabe, quasi ein "Echo"
  • v oder V
    Ausgabe der Version
  • l oder L
    Ausgabe des Status von PinB
  • x oder X
    Reboot des Atmel
  • ?
    Rückgabe des "unverstandenen" Zeichens

Erst die "Firmware_common" aus http://code.google.com/p/busware/source/browse/trunk/SD0/?r=72#SD0%2FFirmware_common erlaubt folgende weitere Funktionen

  • a oder A
    Liefert alle vier Kanäle
  • c
    Liefert die Uhrzeit
  • C
    Vergangene Zeit in ms
  • t oder T gefolgt von einer Ziffer 0-3
    Liefert den Count des angegebenen Kanals
  • p oder P gefolgt von einer Ziffer 0-3
    Liefert die Periode des angegebenen Kanals
  • r oder R gefolgt von einer Ziffer 0-3 oder Buchstabe a-d
    Liefert den kompletten Datensatz dieses Kanals mit Counter, Mittelwerte, Min, Max etc.
    Ein "R" setzt die Statistiken der gemessenen Periode zurück aber nur, wenn seit der letzten Messung und dem aktuellen Aufruf keine weiteren Ereignisse aufgelaufen ist.

Die genaue Funktion können Sie im Sourcefile auf http://busware.googlecode.com/svn/trunk/SD0/Firmware_common/serial.c selbst nachschauen. Diese Firmware liegt aber nicht als HEX-File vor und muss von ihnen also selbst kompiliert werden. Dazu müssen Sie aber nur die Quellen herunterladen und z.B. mit WinAVR (http://sourceforge.net/projects/winavr/files/) kompilieren

Achtung:
Wenn Sie die Dateien von code.google.com herunter laden, sollten Sie das "Raw"-File rechts wählen oder gleich z.B. per Tortoise aus dem Subversion Repository laden.

Projekte

Ich denke ich werde nicht mehr selbst hier aktiv. Es gibt schon entsprechende Projekte

Weitere Links