Digitale Multimeter messen nicht nur Strom und Spannung, sondern auch Kapazität und Temperatur. Es gibt sogar in der 50-Euro-Preisklasse einige, die mit der seriellen Schnittstelle eines PC reden. Mit einfachen Perl-Skripten lassen sich hier die Daten auslesen und grafisch aufbereiten.
Beim Blättern im Katalog eines Elektronikversandhändlers fielen mir neulich preiswerte digitale Multimeter mit RS-232-Schnittstelle auf. Bei Ebay fand ich schließlich das Modell MAS-345 der Firma Mastech zum günstigen Preis von 35 Dollar und drückte ruck, zuck! auf den Buy-it-now-Button.
Windows? Nein danke!
Als das Gerät ins Haus kam, lag natürlich nur eine Windows-CD bei, aber eine kurze Suche im Netz förderte das Marsh-Projekt [2] zutage, das mit etwas C-Code unter anderem das Mastech MAS-345 ansteuert. Das Protokoll auf der seriellen Leitung ist nicht weiter kompliziert: Nach einigen einleitenden Signalen zur Leitungsklärung schickt der PC ein Newline-Zeichen an das Messgerät. Es antwortet mit einem 14 Byte langen String, der den auf der LCD-Anzeige des Multimeters dargestellen Wert enthält.
Optional sendet es zusätzlich auch noch die eingestellte Maßeinheit. Steht im zurückgelieferten String zum Beispiel »V -120.3 mV«, befindet sich das Multimeter im Modus für die Spannungsmessung und zeigt -120,3 Millivolt an. Die Kommunikation mit dem Multimeter dauert etwa eine Sekunde, sodass der Computer maximal einen Messwert pro Sekunde abholen kann.
Objektorientiertes RS-232
Listing 1 zeigt ein Testskript, das einen Wert vom Multimeter holt. Das CPAN-Modul Device::SerialPort bietet eine objektorientierte Schnittstelle, um mit einem seriellen Port des Rechners zu kommunizieren. Der wiederum spricht per RS-232-Protokoll mit dem Multimeter am anderen Ende der Leitung.
|
Listing 1: |
|---|
01 #!/usr/bin/perl -w
02 use strict;
03 use Device::SerialPort;
04
05 my $serial = Device::SerialPort->new(
06 "/dev/ttyS0");
07
08 $serial->baudrate(600);
09 $serial->databits(7);
10 $serial->purge_all();
11 $serial->rts_active(0);
12 $serial->dtr_active(1);
13
14 # Send request
15 $serial->write("n");
16 # Wait one second
17 select(undef, undef, undef, 1);
18
19 # Read response
20 my($count, $data) = $serial->read(14);
21 print "$datan";
|
Das in Listing 1 vorgestellte »mmread« verbindet sich zunächst mit dem ersten seriellen Port, dessen Device-Eintrag »/dev/ttyS0« ist. Damit das Skript auch unter normalen User-Accounts läuft, sollte Root vorher der Allgemeinheit für diesen Port mit »chmod a+rw /dev/ttyS0« Schreib- und Leserechte einräumen. Wessen neumodischer Computer keine serielle Schnittstelle mehr hat, kann sie mit einer PCI-Karte für etwa zehn Euro nachrüsten.
Zunächst stellt das Skript die Baudrate auf 600 und die Anzahl der Datenbits auf 7 ein. Die danach aufgerufene Methode »purge_all()« nutzt intern die Unix-Funktion »tcflush(2)« mit dem Flag »TCIOFLUSH« und löscht damit etwa noch herumgeisternde Daten. Das anschließende Klären der RTS- und Setzen der DTS-Leitung leitet die Kommunikation mit dem Multimeter ein. Die Methode »write()« schickt jetzt ein Newline-Zeichen an das Multimeter, das nach kurzer Verzögerung mit den Daten antwortet, die sein Display darstellt.
Das Skript wartet deswegen erst einmal eine Sekunde, bevor es die Daten abholt. Das könnte ich einfach mit »sleep(1)« machen, aber »select()« unterstützt auch Sekundenbruchteile. Während der Skriptentwicklung habe ich verschiedene Werte probiert, bin aber bei einer Sekunde als zuverlässiger Lösung hängen geblieben. Die Funktion »read()« liest genau die 14 Zeichen, die das Multimeter schickt. Die Ausgabe mit »print« in Zeile 21 bestätigt, dass ein korrekt formatierter Datenstring angekommen ist.
Einer für alle
Statt ständig mit diesen Einstellungen herumzupfriemeln, habe ich das Ganze in ein Modul verpackt und unter »Device::MAS345« aufs CPAN gespielt. So können auch andere MAS-345-Enthusiasten ihre Multimeter auslesen, ohne sich mit den technischen Details herumschlagen zu müssen. Ein weiterer Vorteil von CPAN-Modulen ist, dass sie überall verfügbar und mit [search.cpan.org] leicht aufzustöbern sind.
Device::MAS345 bietet eine objektorientierte Schnittstelle auf höherem Abstraktionsniveau. Das Skript »mmloop« in Listing 2 zeigt, wie man in einer Endlosschleife Daten vom Multimeter abholt und mit den Unix-Sekunden des Messzeitpunkts zeilenweise in einer Textdatei ablegt. Device::MAS345 schnappt nicht nur den rohen String des Multimeters auf, sondern liefert gleich Zahlenwert (»$value«), Einheit (»$unit«) und Modus (»$mode«) getrennt zurück.
|
Listing 2: |
|---|
01 #!/usr/bin/perl
02 use strict;
03 use warnings;
04 use Device::MAS345;
05 use Log::Log4perl qw(:easy);
06 Log::Log4perl->easy_init($DEBUG);
07
08 my $mas = Device::MAS345->new(
09 port => "/dev/ttyS0");
10
11 open FILE, ">>values.txt" or die;
12
13 # Autoflush
14 select FILE;
15 $| = 1;
16
17 while(1) {
18 my($val, $unit, $mode) = $mas->read();
19 die $mas->error() unless $mode;
20 print FILE time(), " ", "$valn";
21 sleep 10;
22 }
|
Vor Beginn der Endlosschleife schaltet das Skript die Pufferung mit »$|=1« ab, damit auch jede Zeile sofort in der Ausgabedatei erscheint. So lässt sich das Ergebnis ruckelfrei mit »tail -f« verfolgen, wenn etwa alle 10 Sekunden ein neuer Wert abgelegt wird.
Vorsicht, Spannung!
Schon lange beschäftigt mich, wie viel Strom mein Tag und Nacht laufender Computer zieht und wie der zeitliche Verlauf aussieht. Schaltet er die Stromaufnahme bei Nichtbenutzung runter? Ein Gerät wie das Kill-A-Watt [3] kann zwar den Gesamtverbrauch ausrechnen, aber schließlich will ich wissen, was der Rechner in der Nacht um vier treibt, wenn keiner hinsieht. Das MAS-345 kann nicht nur Strom bis 10 Ampere messen, sondern auch noch Wechselstrom, was bei billigen Multimetern keineswegs selbstverständlich ist.
Wer den Strom aus der Steckdose mit einem Multimeter (Abbildung 1) misst, sollte innerlich auf Alarmstufe Rot schalten und höchste Vorsicht walten lassen. Hier in Amerika kommen zwar nur etwa 110 Volt an, aber auch die reichen unter Umständen, um einen unvorsichtigen Experimentierer schwer zu verletzen. Unisolierte Bananenstecker wie bei Niederspannungs-Experimenten üblich haben hier nichts verloren.

Abbildung 1: Das Multimeter misst den Strom, der durch die Steckdose fließt, und gibt den gemessenen Wert anschließend per RS-232 an den Rechner weiter.
Vor vielen Jahren brachte seine Schusseligkeit einen meiner Physiklehrer tatsächlich ins Krankenhaus, nachdem er einen Bananenstecker angefasst hatte, auf dem 220 Volt anlagen! Neue Messkabel für Multimeter haben gottlob schon isolierte Bananenstecker und ich habe mir zusätzlich einfach noch ein Paar gekauft, um sie an eine Vielfachsteckdose anzuschließen.
Das Amperemeter ist dabei in Reihe zum Verbraucher zu schalten. Abbildung 2 zeigt das Schaltbild, Abbildung 3 die reale Verkabelung einer Billig-Vielfachsteckdose. Im Ampere-Modus ist der interne Widerstand des Multimeters fast gleich null, deswegen wäre es fatal, es parallel zur Steckdose anzuschließen. In diesem Fall fliegen die Sicherungen in der Wohnung und im Multimeter (falls vorhanden) um die Wette raus oder das Gerät explodiert. Also Vorsicht!

Abbildung 3: Eine modifizierte Vielfachsteckdose mit isolierten Bananensteckern für den Anschluss eines digitalen Amperemeters.
Die Lötstellen der Made-in-China-Vielfachsteckdose waren übrigens erstaunlich hart. Ich musste mir extra einen 60-Watt-Lötkolben kaufen (der bislang dritte in meiner Sammlung), denn meine bisherigen waren eher zum Herumzischen in kleinen elektronischen Geräten ausgelegt.
Nach doppelter Prüfung der Hardware konnte ich vorsichtig einstöpseln und die Messungen starten. Das Perlmeister-Labor maß den Stromverbrauch eines Linux-PC und des an einer Docking-Station angeschlossenen Laptops.
Eine Textdatei mit Zahlenkolonnen holt heutzutage keinen Hund mehr hinter dem Ofen hervor. Um die Daten auch grafisch aufzubereiten, liest sie das Skript »mm2rrd« in Listing 3 zeilenweise aus und trennt den Zeitstempel von dem Messwert. Mit »rrdtool« lassen sich daraus ohne viel Aufwand schöne Grafiken erstellen.
|
Listing 3: |
|---|
01 #!/usr/bin/perl -w
02 use strict;
03 use RRDTool::OO;
04 use Sysadm::Install qw(:all);
05
06 my @points;
07
08 plough sub {
09 chomp;
10 my($time, $value) = split / /, $_;
11 push @points, [$time, $value];
12 }, "values.txt";
13
14 # Constructor
15 my $rrd = RRDTool::OO->new(
16 file => "mmdata.rrd" );
17
18 # Create a round-robin database
19 $rrd->create(
20 step => 30,
21 start => $points[0]->[0] - 1,
22 data_source => { name => "amps",
23 type => "GAUGE" },
24 archive => { rows => 10_000 });
25
26 for(@points) {
27 $rrd->update(time => $_->[0],
28 value => $_->[1]);
29 }
30
31 $rrd->graph(
32 width => 600,
33 height => 400,
34 image => "mmdata.png",
35 vertical_label => "Amperes",
36 start => $points[0]->[0],
37 end => $points[-1]->[0],
38 draw => {
39 type => "line",
40 color => "0000FF",
41 legend => "Laptop Power",
42 }
43 );
|
Grafisch auswerten
Zur zeilenweisen Bearbeitung kommt die Methode »plough« (pflügen) aus dem CPAN-Modul Sysadm::Install zum Einsatz. Sie nimmt eine Subroutinen-Referenz und eine Datei entgegen. Sie öffnet die Datei, iteriert über die Zeilen und springt für jede die angegebene Funktion an, wobei sie die Variable »$_« auf den Inhalt der aktuellen Zeile setzt. Das Skript »mm2rrd« extrahiert dort den Zeitstempel und den Messwert und schiebt beide als Arrayreferenz ans Ende des Array »@points«.
Die Ansteuerung von »rrdtool« ist etwas kryptisch, aber das Modul RRDTool::OO vom CPAN bietet eine übersichtliche Schnittstelle und übersetzt die Eingaben intern in »rrdtool«-Kommandos. Das Kommando »create()« erzeugt eine Round-Robin-Datenbank namens »mmdata.rrd« mit 10000 so genannten Primary Data Points (PDP), die alle 30 Sekunden (Wert für »step«) fällig sind. Das Mess-Skript hat die Messwerte im 10-Sekunden-Abstand geliefert, also mittelt »rrdtool« die Werte automatisch, um die PDPs zu erhalten.
Das »rrdtool« reagiert empfindlich, wenn man Werte einspeist, die vor dem Anfangszeitpunkt der RRD-Datenbank liegen. Darum setzt das Skript den Parameter »$start« für die »create«-Methode einfach auf eine Sekunde vor dem ersten Messwert. Der Zeitraum des Grafen, für den die Methode »graph« eine PNG-Datei erzeugt, lässt sich ähnlich festgelegen, nur dass der Endpunkt mit »$points[-1]->[0]« auf den Zeitstempel des letzten Messpunkts im Array »@points« fällt.
Abbildung 4 zeigt den Stromverbrauch des Linux-PC über Nacht. Da das System auch gleichzeitig das Mess-Skript steuerte, trat keine Ruhe ein, aber auffällig ist, dass der ab zwei Uhr nachts einsetzende Backup- und Indizierungsprozess die drei eingebauten Festplatten forderte und den Stromverbrauch entsprechend in die Höhe trieb. Kurz vor 7:00 Uhr in der Frühe war schließlich Schicht im Schacht und der Stromverbrauch ging zurück auf den Ausgangswert.

Abbildung 4: Stromverbrauch eines PC über Nacht: Ab zwei Uhr setzt ein Cronjob ein, der um 7:00 beendet ist.
In Abbildung 5 ist der Stromverbrauch des an die Docking-Station angekoppelten Laptops kurz vor und einige Minuten nach dem Einschalten zu sehen. Interessant ist, dass die Docking-Station auch im ausgeschalteten Zustand noch rund 40 mA verursacht. Das ergibt unter amerikanischen Bedingungen (110 Volt) immerhin 4 Watt, die für nichts und wieder nichts vergeudet werden! Nach dem Einschalten schnellt der Verbrauch erwartungsgemäß in die Höhe, denn die Festplatte muss auf Touren kommen und das Betriebssystem erst starten. Nach einigen Minuten geht der Wert auf etwa 130 mA zurück, der Laptop verbraucht also etwa 15 Watt, etwas mehr als ein Zehntel des PC.

Abbildung 5: Stromverbrauch eines Laptops kurz vor und nach dem Einschalten. Auch ausgeschaltet sind noch 40 mA zu messen.
Weil das Multimeter neben Strom und Spannung auch noch die Temperatur und oder die Kapazität messen kann und sich außerdem im einschlägigen Fachhandel allerlei Sensoren finden, die ihre Messwerte in Form einer Ausgangsspannung weitergeben können, kommen kreative Bastler ganz bestimmt noch auf zahlreiche weitere interessante Einsatzmöglichkeiten. (jcb)
|
Der Autor |
|---|
|
|
|
Infos |
|---|
|
[1] Listings zu diesem Artikel:[ftp://www.linux-magazin.de/pub/listings/magazin/2007/08/Perl] [2] Marsh-Projekt: [http://savannah.nongnu.org/projects/marsh] [3] Stromverbrauch-Messgerät Kill-A-Watt: [http://www.p3international.com/products/special/P4400/P4400-CE.html] |






