Startseite>Messmodul für Strom und Spannung mit dem Pi Zero
Aus Raspberry Pi Geek 06/2018

Messmodul für Strom und Spannung mit dem Pi Zero (Seite 2)

Die Spannungsmessung an Viout erfolgt direkt, was Pegelkorrekturen überflüssig macht. Allerdings ist es notwendig, aus dem gemessenen Spannungswert den dazugehörigen Stromwert unter Verwendung der oben genannten Formel zu berechnen; das erledigt die Software.

Das LCD

Der Hauptgrund, dieses Projekt anzugehen, war der Wunsch, Messdaten über einen bestimmten Zeitraum aufzuzeichnen. Daneben besitzt aber auch eine Live-Anzeige der Messdaten durchaus einen Informationswert. Wir nutzen dafür ein gängiges LC-Display mit vier Zeilen zu je 20 Zeichen (Abbildung 8), wie es günstig im Online-Handel zu haben ist. Typischerweise gibt die Bezeichnung des Anzeigemoduls Aufschluss über dessen Größe: So hat ein 2004-LC-Display die von uns gesuchte Größe; weitverbreitet und ebenso nutzbar wären 1604- oder 1602-Displays.

Abbildung 8: Das LCD für die Live-Anzeige gibt in vier Zeilen je 20 Zeichen aus.

Abbildung 8: Das LCD für die Live-Anzeige gibt in vier Zeilen je 20 Zeichen aus.

Die LCDs lassen sich parallel oder seriell ansteuern. Im letzterem Fall benötigen Sie neben VCC und Masse nur zwei Pins auf dem RasPi, im Gegenzug aber auch einen Parallel-zu-Seriell-Konverter. Der Handel bietet fertig montierte Displays an, auch mit 3,3 Volt Betriebsspannung, die diesen Wandlerbaustein bereits enthalten. Das im Artikel verwendete LCD arbeitet mit einer Betriebsspannung von 5 Volt, die Speisung kann zum Beispiel aus einem der beiden 5-Volt-Pins des RasPi erfolgen. Lassen Sie bei der Kommunikation mit dem Kleinrechner aber Vorsicht walten, denn er braucht 3,3-Volt-Pegel.

Der von uns verwendete Konverter chinesischen Fabrikats ist für den Arduino konzipiert und arbeitet mit 5 Volt. Weil bei ihm die Pins SDA und SCL über 4,7k-Widerstände an +5V liegen, darf er keinen direkten Kontakt zum I2C-Bus des RasPi aufnehmen. Hier kommt ein zwischengeschalteter Level-Konverter zum Einsatz, der die Spannungspegel umsetzt.

Versierte Löter richten sich die Pegelanpassung gegebenenfalls selbst ein (Abbildung 9): Die beiden Widerstände R8 und R9 müssen weg. Dazu greifen Sie mit einer Pinzette die eine Kappe des Widerstands und halten den heißen Lötkolben mit etwa 400 Grad Celsius für zwei bis drei Sekunden daran. Bei vorsichtigem Ziehen an der Pinzette klappt der Widerstand etwas hoch oder löst sich schon ganz ab. Danach hilft ein Stück Absauglitze für Sauberkeit auf den Lötpads dieser SMD-Bauteile.

Abbildung 9: Frisieren des I»2«C-Konverters: Das Bild zeigt den oben bereits abgelöteten »R8«. Auch »R9« rechts daneben ist auf diesem Bild schon entlötet.

Abbildung 9: Frisieren des I»2«C-Konverters: Das Bild zeigt den oben bereits abgelöteten »R8«. Auch »R9« rechts daneben ist auf diesem Bild schon entlötet.

Nun kontrollieren Sie mit einem Digitalvoltmeter die Spannung. Dazu legen Sie – noch ohne LCD – Masse (GND) und +5V (VCC) an und messen die Pegel an SDA und SCL. Beide Pegel sollten Low sein. Im Erfolgsfall verbinden Sie die beiden Busanschlüsse SDA und SCL mit den gleichnamigen Pins des RasPi-Headers. Eine anschließende Messung ergibt jeweils +3,3 Volt auf diesen Pins, also den High-Pegel im Ruhezustand des Busses. Nach bestandener Kontrolle erfolgt der Anschluss an das LCD unter Berücksichtigung der korrekten Richtung. Pin 1 befindet sich in Höhe der Bus-Anschlussseite GND, Pin 16 auf der Jumperseite LED.

Für den Zugriff auf die LC-Displays gibt es im Internet diverse Bibliotheken für alle denkbaren Programmiersprachen. Für unser in Python realisiertes Projekt haben wir den Code von Captain**Stouf [2] direkt integriert.

Auslesen des ADC

Neben seinen Eingängen (Referenzspannung, Eingangskanäle) besitzt ein ADC auch Ausgänge, die am SPI-Interface des RasPi hängen. Er muss hier aktiv in einer Schleife die Werte abfragen. Listing 2 zeigt die (leicht vereinfachten) Zeilen des Python-Codes.

In einer Endlosschleife (ab Zeile 25) liest das Programm jeweils den ersten Kanal (Spannung) und den zweiten Kanal (Ausgang des Hall-Sensors) aus, konvertiert die Rohwerte und speichert die Daten in der RRD-Datenbank. Die genauen Bitfolgen für die Abfrage des ADCs (Zeile 3 und Zeile 11) sind dabei ADC-spezifisch. Zu schnell darf der RasPi nicht pollen, denn der ADC braucht zwischen zwei Messungen etwa 10 Millisekunden Erholzeit. Da die RRD-Tools aber per se nur eine minimale Auflösung von 1 Sekunde aufweisen, spielt das Limit hier keine Rolle.

Listing 2

 

import spidev
ADC_BYTES  = [[0,104,0],[0,120,0]] # MCP3002
U_REF      = 3.3                   # Referenzspannung
U_FAC      = 5.0/3.0               # abhängig von der Schaltung
U_RES      = U_REF/1024            # MCP3002 hat 10 Bit Auflösung
U_CC       = 5.0                   # Spannung Hall-Sensor
CONV_VALUE =   0.185               # V/A des Hall-Sensors
def read_spi(channel):
  data = spi.xfer(ADC_BYTES[channel])
  return ((data[1] & 3) << 8) + data[2]
def convert_data(u_raw,ui_raw):
  u = u_raw*U_RES*U_FAC
  i = (U_CC/2 -- ui_raw*U_RES)/CONV_VALUE
  p = u*i
[... weiterer Code ...]
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 50000
while True:
  u_raw  = read_spi(0)
  ui_raw = read_spi(1)
  (u,i,p) = convert_data(u_raw,ui_raw)
  rrdtool.update(...)
  time.sleep(1.0)

Nachdem der RasPi die Rohwerte gelesen hat, rechnet er sie gemäß den bereits beschriebenen Formeln um. Anschließend erfolgt das Speichern in einer sogenannten Round-Robin-Datenbank (RRD). Deren Prinzip ist einfach: Es gibt eine begrenzte Anzahl Slots; laufen sie voll, dann überschreibt die nächste Messung die Werte der ersten und so weiter. Damit enthält die Datenbank gleitend immer die letzten Messungen.

Als Quasi-Standard für RRDs dienen die RRD-Tools [3]. An sich eine Sammlung von Kommandozeilenprogrammen, bietet das Paket für fast jede Programmiersprache eine Schnittstelle, auch für das im Projekt verwendete Python. Das Besondere an dieser RRD-Implementation ist die Ausrichtung auf Messdaten auf der Zeitachse – das RRD-Tools-Projekt diente ursprünglich zum Monitoring von Netzwerkkomponenten.

Einmal angelegt, aggregiert die RRD Daten auf der Zeitachse: Das Projekt hält beispielsweise Sekundendaten für eine Stunde vor, was 3600 Datenslots entspricht. Für zusammengefasste Minutenwerte reserviert die RRD Slots für einen ganzen Tag (also 24 mal 60 Werte), Stundenwerte speichert die Datenbank einen Monat lang, Tageswerte für zwölf Monate. Die Gesamtgröße der Datenbankdatei liegt also beim Erstellen fest und ändert sich nicht mehr. Der Informationsverlust durch die Aggregation stellt kein Problem dar: Je weiter man in die Vergangenheit blickt, umso weniger interessieren Details.

Einen Fallstrick gibt es im RasPi-Umfeld allerdings bei den mit den RRD-Tools erstellten Datenbanken: Sie sind architekturabhängig und lassen sich entsprechend nur auf 32-Bit-Plattformen wie dem RasPi öffnen, nicht jedoch auf 64-Bit-Plattformen. Aus diesem Grund erledigt die Messsoftware auf dem RasPi sowohl das Aufzeichnen als auch das Auswerten.

Erste Messung

Im Prinzip gibt es drei Möglichkeiten, eine Messung anzustoßen: über die Kommandozeile, per Taster oder per Webinterface. Die beiden letzten Methoden greifen intern auch auf das Kommandozeilenprogramm vameter.py zu, weshalb wir kurz einen Blick darauf werfen.

Listing 3 zeigt einige Möglichkeiten des Programms. Wie üblich erhalten Sie eine Kurzhilfe mit dem Parameter -h (Zeile 1). Die zweite Zeile startet eine Aufzeichnung und speichert die gewonnenen Daten in der Datei meinpi.rrd. Sie beenden die Aufzeichnung mittels [Strg]+[C]. Die dritte Zeile wertet die Daten aus und erstellt mit der Option -g IUP drei Grafiken für den Stromverbrauch, die Spannung und die aufgenommene Leistung.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland