12.08.2013

Wärmebildkamera mit dem RasPi (2): Ansteuerung des Sensors mit Perl

1. Thermographie-Kamera mit dem Raspberry Pi
2. Ansteuerung des Sensors mit Perl (dieser Teil)
3. Ansteuerung der Servos / Auswertung
4. Zusammenfassung, WLAN und  Batteriebetrieb

Schwierigkeiten..

I2C-Bus am Raspberry Pi und repeated start


Der MLX90614 hat eine I2C-Schittstelle, der Raspberry Pi ebenso und außerdem ist I2C in den Linux-Kernel der verwendeten Raspbian-Distribution integriert.

So weit, so gut! Eigentlich sollte also eine Integration ohne Klimmzüge funktionieren. Leider steckt der Teufel im Detail: der MLX90614 benutzt zum Auslesen der Temperatur die Repeated-Start-Condition, die im I2C-Standard definiert ist. Dummerweise kennt der I2C-Kernel-Treiber für den Raspberry Pi genau diesen Befehl nicht! Damit kann man den Sensor nicht per I2C-Kernel-Modul auslesen - eine andere Lösung muss her!

 

Lösung mit Perl-Modul


Glücklicherweise hat Mark Dootson ein Perl-Modul geschrieben, das die repeated-start-Funktion für den I2C-Bus nachrüstet. Auslesen des MLX90614 ist damit  mit einem Perl-Script möglich.

Er beschreibt das in seinem Blog:
I2C-Zugriff und andere Befehle hat er in seinem HiPi-Perl-Modul zusammengefasst. Damit ist der Sensor direkt mit einer Scriptprache auslesbar.

 

HiPi-Modul für Perl installieren


Zunächst muß das Perl-Modul installiert werden. Die nachfolgende Anleitung setzt voraus, daß der Raspberry Pi unter Raspbian läuft. Andere Distributionen sind sicherlich auch geeignet, ich habe das aber nicht getestet.
Dazu muß man in einer Shell auf dem Raspberry Pi eingeloggt sein (per ssh oder direkt) und folgende Befehle auf der Kommandozeile ausführen:
wget http://raspberry.znix.com/hipifiles/hipi-install
perl hipi-install (dauert ca 15 Minuten)
Zusätzlich habe ich noch das HTTP::Server::Simple-Modul per Kommandozeile installiert:
sudo perl -MCPAN -e 'install HTTP::Server::Simple' (Fragen mit yes beantworten)
Nun ist das HiPi-Modul und das HTTP-Server-Modul installiert und man kann direkt aus Perl auf den I2C-Bus und damit auf den Thermo-Sensor zugreifen.

Die vom Sensor gemessenene Temperatur  wird über den I2C-Bus aus zwei Registern abgeholt. Dort befindet sich der Rohwert, der noch nach Grad Celsius (bzw Fahrenheit) umgerechnet werden muß.

Das Codeschnipsel zum Lesen des Rohwertes sieht folgendermassen aus:


do {
         eval {
             @reg_val = $dev->i2c_read_register_rs($register, 0x02);
         };
# an error occured, set reg_val to an invalid value
         if ($@) {
             @reg_val = (255, 255);
         }
         $raw = @reg_val[1] * 256 + @reg_val[0];
         $diff = abs($raw - $last_raw);
         $last_raw = $raw;
    } while(($diff > $max_diff) or ($raw > 32000));

In der Praxis hat sich gezeigt, daß das Auslesen nicht immer zuverlässig funktioniert, deshalb ist eine Fehlererkennung eingebaut, die bei zu großer Abweichung vom vorhergehenden Messwert (oder einem Hardware-Fehler) die Messung wiederholt (do/while-Schleife).

Das ist schonmal sehr schön, aber ich finde Python besser geeignet, um die gelesenen Daten auszuwerten und darzustellen.

Dazu müssen die gelesenen Temperaturwerte irgendwie vom Perl-Script an ein Python-Script übergeben werden. Die einfachste Methode dazu ist, das per HTTP zu tun.

 

Temperatur per HTTP auslesen


Damit man per HTTP auf die gemessenen Temperaturwerte zugreifen kann, ist ein Web-Server in das Perl-Script integriert. Das geht ganz einfach mit dem Perl-Modul HTTP::Server::Simple::CGI. Es hört auf verschiedene URLs, die den gelesenen Wert in Celsius, Fahrenheit und als Rohwert ausgeben. Das ermöglicht auch das Auslesen der Temperatur per Browser! Sehr schön zum Testen. Eine weitere URL liefert die Werte als JSON, ideal falls man den Sensor per Javascript befragen will.


Das Script liegt auf GitHub:

https://github.com/hermann-kurz/thermography-raspberrypi/blob/master/perl-sensor/mlx.pl

Gestartet wird es (als root) mit

perl mlx.pl

und läuft dann als Dämon auf Port 8080.

Wenn das Script läuft, kann man direkt im Browser den Sensor per URL aufrufen

http://ADRESSE-DES-RASPBERRY-PI:8080/c



Als JSON sieht das so aus:




und hat die Temperatur im Browser, die der Sensor gerade vor sich sieht!


Was wurde bis jetzt erreicht: Zusammenfassung

  • Zugriff auf den MLX90614-Sensor via Perl
  • Ein in Perl geschriebener HTTP-Server, der die gemessene Temperatur liefert
  • Der Messwert kann in Celsius, Fahrenheit oder als Rohwert angezeigt werden
  • Alle Werte zusammen gibt es als JSON

Nächste Schritte: Servoansteuerung, Auswertung der Messwerte in Python


Links:




1. Thermographie-Kamera mit dem Raspberry Pi
2. Ansteuerung des Sensors mit Perl (dieser Teil)
3. Ansteuerung der Servos / Auswertung
4. Zusammenfassung, WLAN und  Batteriebetrieb

Keine Kommentare:

Kommentar posten