Diese simple Methode erlaubt es, ohne zusätzliche Hardware, einen S0-Impuls Zähler über einen RS232-Port auszuwerten. Viele Computer und embedded Systeme besitzen einen RS232-Port. Alternativ kann auch ein RS232-zu-USB Adapter benutzt werden.
Ziel ist es den Abstand aufeinanderfolgender Impulse zu messen, die bis max. 1 mal pro Sekunde kommen und ca. ~100 ms lang sind. Das erinnert an das DCF77 Funkuhr-Signal (1 Impuls pro Sekunde, 100 oder 200 ms lang == 0 bzw. 1).
Und seit 2 Jahrzehnten ist es gängig, dieses DCF77-Signal einfach über eine serielle Schnittstelle mit 50 Baud auszuwerten (Link). Der Start des Impulses ist die Startflanke des „Startbit“ bei der asynchronen seriellen Übertragung, und je nach dem ob kurzer oder langer Impuls sind mehr oder weniger Bits gesetzt und man es ist sogar dabei möglich die Pulslänge zu messen.
Die Länge des S0-Impulses sind hier nicht von Interesse. So muss man nur die S0-Ausgänge an eine serielle Schnittstelle zwischen Rx und z.b. RTS hängen. (Irgend eine Steuerleitung, die man dann auf 0 (aktiv) ziehen muss). Dann muss man nur noch warten bis der S0-Impuls als „Startbit“ ein Zeichen auslöst. Und dieses dann einlesen und den Timestamp merken/ausgeben – Fertig!
Bei der Verkabelung ist auf die Polarität des S0-Anschlusses zu achten. Viele S0-Zähler realisieren diesen über einen Optokoppler und nicht über einen Schaltkontakt!
Also muss
verbunden werden. Die restliche Verkabelung auf 'Primärseite' des Zählers bleibt wie gehabt.
Mac Gyver Variante der Schaltung. Für den produktiven Einsatz nicht empfohlen ;)
Alternativ kann man auch die Reste einer seriellen Maus endlich zu was Vernünftigem verwenden und damit die Verkabelung an den Zähler realisieren:
Beim Raspberry Pi ist ein interne UART als /dev/ttyAMA0
vorhanden, der hierfuer verwendet werden koennte.
Die Pinbelegung ist GPIO 15 für RXD (P1-10).
Achtung! Das funktioniert nicht in Verbindung mit Udos RPi-Erweiterungen, da dort diese Pins schon belegt sind.
Da es sich um 3,3V-Pegel handelt, wird die RTS-Leitung nicht benoetigt, GND und/oder Vcc reichen aus.
(RTS GPIO 17 für RTS (P1-11), siehe http://elinux.org/RPi_Low-level_peripherals.
Allerdings ist die RTS Funktion standardmäßig deaktiviert. Zum aktivieren muss der Pin erst in Alternate Function 3 versetzt werden. Das kann z.B. mit diesem Tool erfolgen: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=39138&p=322253 gpio_alt -p 17 -f 3
.)
Die Auswertung der seriellen Schnittstelle wird dabei von vzlogger übernommen. Dafür wird das vzlogger-Protokoll s0
benutzt. Ein Beispiel ist in der Standardkonfiguration im Wiki zu sehen.
Harald König hat bei der Entwicklung dieser Methode Standardtools von Linux verwendet. Seine Skripte sind im git verfügbar: bash, lua.
Serielle Schnittstelle richtig konfigurieren (50 Baud, jedes Zeichen sofort ausgeben, …):
stty time 1 min 1 -icanon < /dev/ttyUSB0
Zeichen einlesen und Timestamp erzeugen:
strace -ttt -e read cat < /dev/ttyUSB0 > /dev/null
Etwas mehr Test-Code um das ganze besser beurteilen zu können:
( strace -ttt -e read cat < /dev/ttyUSB0 > /dev/null ) 2>&1 | awk 'NR==1{t0=$1;next}{t=$1; print 3600e3 /(t-t1)/2000 , t-t0,t-t1,$0;t1=t}'
Spalte 1 liefert dann die Leistung in Watt, 2 die laufende Zeit in Sekunden, 3 die zeit seit dem letzten Impuls, und dann noch den gesamten strace-output mit original Timestamp.