Aus Raspberry Pi Geek 06/2018

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

Da der ACS712 für eine bidirektionale Strommessung konzipiert wurde, lassen sich sowohl Gleich- als auch Wechselströme messen. Anhand der Wandlerkennlinie (Abbildung 7) ergibt sich eine Viout von +2,5 Volt bei 0 Ampere Stromfluss durch die Anschlüsse +Ip und -Ip. Wird der Strom positiver, steigt Viout (bei 5 Ampere ergibt das eine Vioutmax von 2,5V + 5*0,185V = 3,425V), wird er negativer, fällt die Ausgangsspannung.

Abbildung 7: Die Wandler-Kennlinie des Hall-Sensors ACS712-05. (Bild: Datenblatt Allegro ACS712)

Abbildung 7: Die Wandler-Kennlinie des Hall-Sensors ACS712-05. (Bild: Datenblatt Allegro ACS712)

Damit wir an Viout Spannungen über 3,3 Volt ohne Pegelanpassstufe messen können, betreiben wir das Modul in negativer Stromflussrichtung also mit +I vom Schaltnetzteil SNT an -Ip und -I von +Ip in Richtung Last. Durch diesen Schaltungstrick, eine Verpolung, erreichen wir, dass die gemessene Hall-Spannung des Wandlers von der Mittenspannung (2,5 Volt) abgezogen wird: Viout = 2,5V – 5V * 0,185V = 1,575V fällt also mit steigendem Strom.

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.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben