Ferraris-Drehstromzähler mit Raspberry auswerten

  • Ferraris-Drehstromzähler auswerten


    Im diesem HowTo wird beschrieben, wie die Daten eines analogen Drehstromzählers (Ferraris-Zähler) per Reflexlichtschranke erfasst und im RPI verarbeitet werden können. Ich habe anstelle des direkten Einlesens des Zählersignals an einem GPOI-Port absichtlich etwas mehr Hardware inkl. des Zählers PCF8583 eingesetzt. Somit es möglich, die Zählwerte mit geringer Rechenleistung des RPI nur einmal die Minute oder Stunde über eine i2c-Abfrage auszulesen.


    Blockschaltbild


    • Signal der „Drehscheibe“ am Drehstromzähler mit Reflexlichtschranke und Verstärker erfassen. Ein Puls je Umdrehung bei roter Markierung.
    • Siganl am RPi mit Monoflop aufbereiten, da die Lichtschranke kein sauberes Signal liefert („prellen“).
    • Ereigniszähler PCF 8583 ansteuern
    • Zähler per i2c-Bus einlesen. Zyklus dabei frei wählbar: einmal die Minute, Stunde oder Tag.


    Datenerfassung am Drehstromzähler


    Zur Schaltung:


    • Roter Bereich der „Drehscheibe“ am Wechselstromzähler per Reflexlichtschranke CNY 70 erfassen
    • Verstärkung des Signals per zweifach Operationsverstärker LM393
    • Impuls per LED anzeigen
    • Spannungsversorgung erfolgt durch Platine am RPI
    • Das Ausgangssignal des OP liegt bei 1,0 Volt (Drehscheibe „rot“) und 3,6 Volt (Drehscheibe „silber“).
    • OP-Ausgangssignal wird an einer zweiten Platine RPI weiter verarbeitet


    Einstellung der Lichtschranke



    Die Einstellung der Lichtschranke am Zähler ist eine etwas knifflige Sache. Die Referenzspannung am Ausgang des Potentiometers wird auf ca. 3,5 Volt (bei 5 Volt Betriebsspannung) voreingestellt. Die Platine wird auf eine Plexiglasscheibe von ca. 30 * 98 mm montiert. Diese Plexiglasscheibe sollte genau in die untere Vertiefung des „Zählerfensters“ passen. Die Platine wird auf dem Plexiglas so befestigt, dass sie mittig über der Drehscheibe plaziert wird.
    Die Plexiglasscheibe mit der Platine kann nun sehr einfach horizontal über der Drehscheibe verschoben werden. Das Potentiometer wird dabei dann so justiert, dass bei einer Positionierung über der Drehscheibe die LED aus ist. Bei geringer Verschiebung nach oben oder nach unten geht die LED an. Bei korreter Plazierung und Einstellung des Potis leuchtet die LED wenn die rote Markierung erscheint.


    Signalaufbereitung am RPI


    Optimierung des OP-Ausgangssignals


    Da bei einem Durchlauf der roten Markierung je nach Justierung der OP mehr als einen Impuls liefert, muss das Signal „entprellt“ werden. Dazu wird der NE555-Monoflop angesteuert. Er erzeugt einen Implus von ca. 400 ms (t = R * C + 1,1). Wenn also nun bei der Durchlauf der roten Markierung kurzzeitig nacheinander mehrere Impluse erzeigt werden, „glättet“ der Monoflopp diese zu einem Impuls.
    Der NE555 benötigt ein Low im Bereich von 0-1,6 Volt und ein High an Pin 2 von 3,4 -5 Volt. Die Ausgangsspannung des OP mit 1,0 Volt Low und 3,6 Volt High liefert also genau die passenden Pegel.


    Ansteuerung ein i2c-Zählers PCF8583


    Der PCF8583 ist ein Uhrenbaustein (RTC) der als Ereigniszähler genutzt wird. Anstelle des Uhrenquarzes wird hier am PIN 1 „OSCI“ der Zähltakt aus dem Ausgang des Monoflop eingespeist.


    Datenabfrage des i2c-Ereigniszählers


    Mit jeder Umdrehung des Wechselstromzählers wird nun ein Impuls erzeugt, der von dem Ereigniszähler erfasst wird.


    Die i2c-Tools sind dazu auf dem RPI zu installieren. Beschreibung siehe Internet.


    Nach dem Anschluss der Platine an den i2c-Bus des RPI wird zunächst getestet, ob der PCF8583 an Adresse 0x50 oder 0x51 zu finden ist:

    Code
    i2cdetect -y 1



    Bei korrekter Installation der i2c-Tools und der Zusatzplatine wird der PCF8583 an Adresse 0x50 oder 0x51 im Hexdump angezeigt.


    Der PCF8583 wird nun mit der Funktion „Ereigniszähler“ gesetzt. Dazu wird an Adresse 0x51 in das Funktionsregister an Speicherstelle 0x00 der Wert 0x20 geschrieben:

    Code
    i2cset -y 1 0x51 0x00 0x20


    Im zweiten Schritt wird dann der Speicher des Zählers an Adresse 0x01 / 0x02 und 0x03 auf 0x00 gesetzt (Reset des Zählers) :

    Code
    i2cset -y 1 0x51 0x01 0x00
    i2cset -y 1 0x51 0x02 0x00
    i2cset -y 1 0x51 0x03 0x00


    Die eingehenden Impulse werden nun gezählt.


    Das Auslesen des Zählers erfolgt durch Abfrage der Werte in den 3 Speicherzellen:

    Code
    i2cget -y 1 0x51 0x01
    i2cget -y 1 0x51 0x02
    i2cget -y 1 0x51 0x03



    Die Daten werden in den 8-Bit Speicherzellen im BCD-Code abgelegt. Das je 4-Bit große Lowerbyte und Highbyte enthält je eine Dezimalzahl. Die Speicherzelle 0x01 kann somit Werte von 00-99 zählen, also Einer und Zehner-Stelle. Speicher 0x02 : Hunderter und Tausender.


    Zähler anhalten / Pause:

    Code
    i2cset -y 1 0x51 0x00 0xA0



    Weitere Verarbeitung der Daten


    Zähler beim booten des RPi aktivieren


    Beim booten des RPI wird über die Datei /etc/init.d/rc.local die Ereigniszählerfunktion gesetzt und der Zähler zurück gesetzt. Dazu werden folgende Shell-Befehle am Ende der Datei „rc.local“ ergänzt:

    Code
    # pcf8383 als Ereigniszähler setzen. Baustein befindet sich an Adresse 51. Das Funktionsregister an Adresse 0x00 wird dazu mit dem Wert 0x20 beschrieben.
    i2cset -y 1 0x51 0x00 0x20
    # Zähler reset. Ram an Adresse 0x01 /0x02 /0x03 wird dazu auf 0x00 gesetzt
    i2cset -y 1 0x51 0x01 0x00
    i2cset -y 1 0x51 0x02 0x00
    i2cset -y 1 0x51 0x03 0x00


    Die Impulse am Eingang „OSZI“ werden nun gezählt.


    Zähler mit python auslesen



    Dazu ist zunächst smbus zu installieren:


    Code
    apt-get install python-smbus


    Python-Programm Auszug


    Das vollständige Programm befindet sich im Anhang.



    Mit dem im Anhang beigefügten Python-Programm wird der Zähler in einer Endlosschleife abgefragt. Pro Impuls wird dann der Zählerstand, die binären Inhalte des Zählers an 0x01 und 0x02 und die Uhrzeit.
    Da bei jedem Impuls eine Ausgabe erfolgt, wir eine Fehlermeldung ausgegeben, wenn sich der Zählerstand um mehr als +1 erhöht.


    Fehlerhafte Zählung beim "Überlauf" der Speicherzellen


    Wir der Zähler mit Dauerschleife abgefragt, so zeigt sich beim Übertrag von Speicher 0x01 auf 0x02 also Dezimal von 99 auf 100 ein Fehler. Die beiden Speichestellen werden dabei zeitlich nacheinander verändert und nicht zeitgleich. Beim Übergang von 99 auf 100 wird also der Speicher 0x02 wird auf 1 gesetzt und erst danach wird Speicher 0x01 auf 0 gesetzt, so dass kurzzeitig der Zählwert 199 angezeigt wird. Anzeige also 99, 199, 100. Bei Abfrage per Dauerschleife muss dieser Fehler per Software abgefangen werden. Gleiches gilt für den Übertrag von 0x02 auf 0x03.


    Nach Anschluss an den Zähler, sollte man das Programm mal ein paar Tage laufen lassen. Der Zählerstand darf sich jeweils nur um 1 zum vorherigen Stand erhöhen. Falls der Zähler 2 oder mehr erhöht wird, zählt der Fehlerspreicher hoch. Dann ist die Signalabnahme vermutlich unsauber; so eine Art „prellen“.



    Anlage:


    • Schaltplan für die beiden Platinen.
    • Python-Porgramm
    • Bilder der Zählermontage




    i2c_zähler_auslesen.py


    Hoffe die Beschreibung hilft...


    Gruß


    Dieter

    Edited once, last by deejay ().

  • Funktioniert wunderbar. Hab das ganze auf eine Rasterplatine gebracht.


    Rot sind die erforderlichen Brücken.
    Gelb die durchgehenden Leiterbahnen, den Rest mit Unterbrechungen versehen.
    Unter LM393 befindet sich eine Verbindung von Pin 2 -> 7, nicht unterbrechen!
    2x2 Jumper soll den CNY70 darstellen, der auf der Unterseite montiert wird.
    C2 1 µF Kondensator in der Mitte unten.
    Rechts und Links sind Klebeschellen für Kabelbinder zur Befestigung am Zähler.


    Mein Zähler schick mir bald Emails. : )

  • Hallo,


    könnte jemand eine Teileliste zur Verfügung stellen? Habe zwar vieles rauslesen können aus den Schaltplänen, aber als Anfänger wäre es schon wenn mich da jemand unterstüzen könnte, damit ich auch die richtigen Bauteile besorgen.


    Danke euch schon einmal.


    VG bullyx