Luftdruckmessung unter Linux

ArticleCategory: [Es gibt verschiedene Artikel Kategorien, do not translate]

Hardware

AuthorImage:[Ein Bild von Dir]

[Photo of the Author]

TranslationInfo:[Autor und �bersetzer, do not translate]

original in deRalf Wieland

de to en name of translator

AboutTheAuthor:[Eine kleine Biographie �ber den Autor]

Ich besch�ftige mich mit Umweltsimulation, neuronalen Netzen und Fuzzy-Systemen, indem ich sie programmiere. Letzteres vollzieht sich immer unter Linux (seit 0.99pl12). Weiterhin bin ich an Elektronik und Hardware interessiert und versuche das mit Linux zu verbinden.

Abstract:[Hier sollte eine kleine Zusammenfassung stehen]

Kauft man heute ein Messmodul, so bekommt man immer einen irgendwie funktionierenden Treiber f�r eine Windows-Variante mitgeliefert. Der Linux-Nutzer geht in der Regel leer aus. Das muss nicht sein, da die Ankopplung von Hardware unter Linux einfacher ist, als unter Windows. Auch das Argument vieler Hersteller, dass es zu wenig Linux-Nutzer gibt, ist fragw�rdig, da gerade Linux-Nutzer als besonders experimentierfreudig gelten. Wie dem auch sei, man muss selbst Hand anlegen. Die dazu notwendigen Schritte wollte ich einmal notieren, vielleicht sind sie auch anderen von Nutzen.

ArticleIllustration:[Das Titelbild des Artikels, do not translate]

[Illustration]

ArticleBody:[Der eigentliche Artikel. �berschriften innerhalb des Artikels sollten h2 oder h3 sein.]

Einleitung

F�r die Entwicklung eines jeden Messsystems sind folgende drei Fragen zu kl�ren:

Obwohl die Fragen trivial klingen, sollte man sich vor einer Eigenentwicklung jeden Schritt genau �berlegen.

Physikalisches Messprinzip

Der Luftdruck ist eine interessante Messgr��e. F�r Segler oder Bergsteiger gibt er Hinweise auf bevorstehende Wetter�nderungen. Aber auch mir, als Gro�stadtbewohner macht die Beobachtung des Luftdrucks Spass. Dass das auch anderen so geht, sieht man in den vielen Wetterstationen, die die Wohnzimmer schm�cken. Oft sind diese Ger�te aber mehr Spielzeuge als ernsthafte Messger�te. Will man ernsthaft den Luftdruck messen, so sind eine Reihe von Randbedingungen zu beachten.
Der Luftdruck kann mit dem oben gezeigten Barographen recht genau ermittelt werden. So ein Ger�t auf rein mechanischer Basis sieht nicht nur sch�n aus, es kostet auch recht viel. Um diese hohen Kosten zu umgehen, misst man heute den Luftdruck mit Halbleitersensoren. So fertigt z.B. Motorola eine ganze Serie von Drucksensoren f�r unterschiedliche Einsatzgebiete. Halbleitersensoren sind aber immer temperatur- und spannungsabh�ngig. Um diese Charakteristik muss man sich k�mmern. Der Luftdruck ist vergleichsweise einfach zu ermitteln, da er im ganzen Haus als konstant angesehen werden kann. Damit braucht der Sensor nicht im Freien angebracht, sondern kann direkt am Rechner platziert werden. Das kommt einer Temperaturkompensation sehr zu Gute, da ja davon ausgegangen werden kann, dass die Temperatur am Rechner sich nicht sehr �ndert. Trotzdem ist bei hoher Aufl�sung eine Temperaturkompensation unumg�nglich. Bei dem vorgeschlagenen Sensor, der von ELV , einem renommierten europ�ischen Elekronikversender als Bausatz angeboten wird (und der auch freundlicherweise die Genehmigung zum Nachdruck der Schaltung gab), wird die Temperaturkompensation in der Software durchgef�hrt. Dazu misst der Sensor nicht nur den Druck, sondern auch die Temperatur. Der Algorithmus zur Temperaturkompensation kann dem Datenblatt von Intersema, dem Hersteller des Sensors, entnommen werden. Die Spannungskompensation �bernimmt ein integrierter Spannungsregler. Damit ist die Frage der Sensorwahl und des Aufstellungsortes gekl�rt.
Der Luftdruck ist nicht nur vom Wettergeschehen abh�ngig, sondern auch von der H�he �ber dem Meeresspiegel (NN). Will man den Luftdruck vergleichen, so ist er auf NN zu beziehen. Das kann mit der internationalen H�henformel:

p0=p/(1-6.5*h/288000)^5.255

geschehen. Sie ber�cksichtigt neben der H�henabh�ngigkeit des Luftdrucks auch die Abnahme der Temperatur mit der H�he und erweitert damit die bekannte barometrische H�henformel. Der gemessene Luftdruck p wird mit der H�he h �ber NN korrigiert. Grob gesch�tzt kann man mit Druckverminderung von 1.2mbar/10m rechnen. Die H�he �ber NN ist im Programm myclient als #define HIGH_NN einzugeben. Die Druckdifferenz wird dort nach der internationalen H�henformel ermittelt. Mit Ber�cksichtigung der H�he ist man noch nicht fertig. Es bleibt noch die Frage, wie genau will man messen und wie oft muss man messen. Die Genauigkeit h�ngt direkt vom verwendeten Sensor ab. Dabei ist zwischen Genauigkeit, also der Verl�sslichkeit des Messwertes und der Aufl�sung, also wieviele Stellen angezeigt werden, zu unterscheiden. Der verwendete Wandler hat eine Genauigkeit von +- 1.5mbar �ber einen Bereich von 750..1100mbar bei 25°. Die Aufl�sung betr�gt aber 15Bit+-7Bit, d.h 1/2^15 = 3*10^-5 oder 0.03mbar. Vergleicht man die Aufl�sung mit der Genauigkeit, so wird die Unsinnigkeit einer derart hohen Anzeigegenauigkeit offensichtlich. Im Programm wird daher auf eine Stelle hinter dem Komma gerundet. (Und das auch nur, damit die Anzeige nicht unsinnig springt.) Als Letztes ist noch zu kl�ren, wie oft gemessen werden sollte. Der Luftdruck �ndert sich nicht gerade sprunghaft. Erfasst man den Luftdruck alle 5..10min, so sollte das f�r alle in der Praxis auftretenden F�lle ausreichend sein. Um ein zuf�lliges Schwanken der Messwerte auszugleichen, mit anderen Worten um Rauschen auszufiltern, wird der Messwert alle 10..60s abgefragt und einer digitalen Tiefpassfilterung unterzogen werden. Das ist zwar nicht unbedingt n�tig, schadet aber auch nicht. Die Belastung des Rechners ist dabei noch vernachl�ssigbar. Im konkreten Beispiel f�hrt das letztlich dazu, dass alle 10s gemessen, aber nur alle 2min die Messwerte gespeichert werden. Damit fallen t�glich 60*24/2=720 Messwerte an, die dann einer Anzeige zuzuf�hren sind. F�r eine Darstellung der Druckentwicklung stehen somit 720 Werte zur Verf�gung, was eine sehr detailreiche Darstellung erm�glicht.

Interface Sensor/PC

[schematic]
F�r eine gr��ere Ansicht auf den Schaltplan klicken.

Als Interface wurde die parallele Schnittstelle des PC gew�hlt. Das ergibt einigen Sinn, nachdem die neueren Drucker den USB-Port nutzen. Au�erdem ist die parallele Schnittstelle recht einfach zu programmieren, so dass die Aufgabe ohne zus�tzliche Hardware l�sbar war. Au�er den Gattern, die zur Pegelanpassung und zur Erzeugung des von dem Sensor ben�tigten Taktes notwendig waren, wurde nur noch die Spannungsstabilisierung integriert. Falls man nicht auf den Bausatz zur�ckgreifen m�chte, lassen sich die wenigen Bauteile auch bequem auf eine Universalleiterplatte l�ten. Die Entwicklung einer speziellen Leiterplatte d�rfte nur in den seltensten F�llen lohnen.
Kurz zur Schaltung:
Die Zahlen am linken Rand bezeichnen die Anschl�sse an der parallelen Schnittstelle. Die Anschl�sse 18..25 bilden die Masseleitungen, die Anschl�sse 12,3 und 4 sind Dataleitungen, also Outputs auf den Sensor. Der Anschluss 12 ist der sogenannte Paper-Error, der einen Fehler im Drucker signalisiert und als Input in den Rechner fungiert. �ber die Widerst�nde R1/R2 bzw. R3/R4 wird die Spannung von 5V auf einen Wert unter 3.3V reduziert. Sie dienen somit zur Pegelanpassung. Erw�hnenswert ist noch der Taktgenerator f�r den Sensor, der schaltungstechnisch aber keine Besonderheiten aufweist. Mit der Stromversorgung von 5V auf stabile 3.3V ist die kleine Schaltung auch schon komplett.

Es wurde ein Programm entworfen und in C implementiert, das den Sensor abfragt, die Temperaturkompensation durchf�hrt, die Werte einer digitalen Filterung unterzieht und die Werte letztlich speichert. Das Ganze ist recht �bersichtlich und kann leicht nachvollzogen werden. Zur Abfrage des Sensors wird eine Folge von Impulsen an den Sensor gesendet. Der Sensor interpretiert diese Folge als Befehl und antwortet seinerseits mit einem als Impulsfolge kodierten Messwert. Dieses Handshake ist im Datenblatt sehr gut dokumentiert und kann anhand des Programmtextes leicht nachvollzogen werden.

Nutzung und Visualisierung der Messwerte

Eine Aufnahme und Speicherung der Messwerte ist nur ein Teil der Aufgabe bei der Entwicklung eines Messsystems. Die sehr wichtige Frage nach der Visualisierung ist zu kl�ren. Es stellte sich n�mlich heraus, dass eine Visualisierung von Druckentwicklungen w�hrend eines Tages bzw. einer Woche nicht unbedingt auf Gegenliebe von Familienmitgliedern sto�en. Der Rechner macht L�rm und verbraucht Energie. Um diesem Problem aus dem Wege zu gehen, kann man einen DIL/NetPC einsetzen. So ein Teil ist v�llig lautlos und verbraucht auch wenig Energie. Leider sind diese Dinger nicht gerade billig. Au�erdem haben DIL/NetPC keine eigene Auswerteeinheit, sondern m�ssen via Netzwerk abgefragt werden. Die Kopplung via Netzwerk schien interessant. Letzteres brachte mich auf die Idee, einen Linux-Server auf Arbeit f�r die Druckmessung zu missbrauchen. Wir setzen Linux-Server f�r vielf�ltige Aufgaben ein, da macht eine gelegentliche Abfrage des Sensors nicht viel aus. Wer nicht �ber so einen Luxus verf�gt, kann vielleicht einen ausgedienten PC irgendwo im Keller platzieren, wo er kaum auff�llt. (Strom verbraucht er aber trotzdem ;-) Wie dem auch sei, eine Abfrage via Netzwerk musste her. Die Idee bestand darin, einen Server zur Datenerfassung und Speicherung aufzubauen, der dann bei Bedarf vom Client abgefragt werden kann. Damit ist eine multiple Nutzung im Netzwerk gesichert. Auch meine Kollegen kommen nun in den Genuss der Luftdruckmessung. Eine Einschr�nkung sei hier allerdings gemacht, der Server l�uft in der jetzigen Form mit Rootrechten. Das ist erforderlich, da die Schnittstelle direkt angesprochen wird. Ein Treiber, wie Parapin, kann genutzt werden, um die Schnittstelle auch als nichtprivilegierter Nutzer anzusprechen. Das setzt aber in den meisten F�llen die Rekompilation des Kernels voraus und ist nicht jedermanns Sache. Bei einer Verbindung zum Internet sollte aus Sicherheitsgr�nden diese M�he auf sich genommen werden. F�r meine Anwendung reichte die einfache Variante aus.
Es wurden also zwei Programme entwickelt. Einen Server, der die Daten erfasst und speichert und einen Client, der die Daten vom Server anfordert. Beide sind mittels einer Socket-Schnittstelle via Ethernet verbunden. F�r den Server ergab sich dabei noch, dass hier zwei unabh�ngige Prozesse laufen. Einer, der die Daten vom Sensor abfragt und einer, der die Netzwerkverbindung abwickelt. Beide schlie�en sich gegenseitig aus, d.h. wenn die Schnittstelle abgefragt wird, muss der Netzwerkprozess warten und umgekehrt, wenn der Netzwerkprozess gerade die Werte �bermittelt, darf der Abfrageprozess keinen neuen Wert bereitstellen.
Diese Prozesse wurden leichtgewichtig mittels Threads realisiert. Dazu kam die PThreads-Library zum Einsatz, die aber in jeder Linux-Distribution enthalten sein sollte.
Der Client wurde bewusst einfach gehalten. Hier werden im wesentlichen nur die Daten empfangen und die H�henkorrektur durchgef�hrt. Ausgegeben werden die Daten via stdout. Es werden ausgegeben:
die Zeit ab Messbeginn in Stunden als float
die Messwerte als float
gefolgt von einem nl.
Eine Ausgabe sieht dann beispielsweise wie folgt aus:

     0.000000 1008.2
     0.033333 1008.1
     0.066667 1008.2
     0.100000 1008.0
     0.133333 1008.1
     ...
    

Damit k�nnen Visualisierungsprogramme wie gnuplot oder die Plotutils einfach genutzt werden. Ich habe wegen der guten Darstellungsqualit�t die Plotutils gew�hlt. Auch wenn die Darstellung als Diagramm mit den erw�hnten Hilfsmitteln ziemlich leicht zu realisieren ist, sollte man sich doch ein paar Gedanken bez�glich vergleichbarer Darstellungen machen. Was n�tzen sch�ne formatf�llende Diagramme, die aber jeden Tag mit einer anderen Skalierung aufwarten? Man m�chte schlie�lich einen Tag mit den vorhergehenden vergleichen und sich nicht immer mit anderen Skalierungen herum�rgern. Deshalb bevorzuge ich eine absolute Skalierung.:

 ./myclient modell1 | graph -T X -C -g 3 -L "air pressure" \
     -X "t from start of messurement in h" -Y "mbar" --x-limits 0 24\
     --y-limits 950 1040
 

Der Client "myclient" ruft vom Rechner "modell1" die Daten ab und gibt sie via Pipe den Plotutils zur Darstellung. Die Skalierung des Luftdrucks liegt zwischen 950mbar..1040mbar. Als Zeiteinheit werden 24 Stunden verwendet. Tauscht man in den Befehlszeilen die Option -T X in -T ps, so wird eine Postscriptbefehlsfolge erzeugt, die sich wunderbar drucken oder in eigene Dokumente einbinden l�sst. Das nur als Hinweis, f�r jemanden der die Plotutils noch nicht ausgiebig nutzt.

[graph]

Das Diagramm zeigt das Ende einer Sch�nwetterperiode und Einsetzen von Niederschlag.

Installation

Die Installation ist ziemlich einfach. Nachdem das Modul aufgebaut wurde, und auf Fehler (Br�cken, kalte L�tstellen etc.) kontrolliert wurde, kann es an die parallele Schnittstelle angeschlossen werden. Die Software wird wie �blich mittels tar -zxvf druck-0.1.tgz entpackt und danach wechselt man ins Verzeichnis druck-0.1 und kann nach Eintragen der H�he �ber NN in die Datei myclient.c durch ein einfaches make die �bersetzung starten. Alles sollte problemlos laufen. Bevor das Modul aber genutzt werden kann, muss in der /etc/services der Port f�r die Socketschnittstelle eingetragen werden. Ich verwendete hierzu:

  socktest       7123/tcp    # Air pressure sensor
den bei mir freien Port 7123 als socktest. Ist das geschehen, kann unter Root das Programm ./druck LPT1 (oder LPT2) gestartet werden. Ging alles klar, so meldet sich der Server und gibt alle 10 Sekunden die rohen Werte f�r Druck, Temperatur und die aktuelle Zeit aus. Damit ist gleichzeitig eine Kontrolle des Sensors gegeben. Der Client kann nun auf dem gleichem oder sinnvollerweise auf einem anderen Rechner gestartet werden. Dazu ist ebenfalls auf dem Client-Rechner der Port socktest in die /etc/services einzutragen. Um die Visualisierung etwas zu vereinfachen, wurde ein Shellskript druck.sh entwickelt. Dort ist der Servername durch den aktuellen Servernamen zu ersetzen und alles sollte laufen.

Schlussbemerkung

Aus dem �rger, dass es fast nie einen Treiber f�r Linux bei dem Anschluss von Sensoren gibt, sollten die Schritte zur Entwicklung einer Schnittstelle einmal nachvollziehbar gestaltet werden. Es war interessant, dass bei einer scheinbar so einfachen Sache, wie dem Anschluss eines Luftdruckmoduls, doch eine Reihe von Dingen zu beachten sind, bis alles vern�nftig l�uft. Erst durch Einbeziehung der Netzwerkschnittstelle konnte eine befriedigende L�sung erzielt werden. Trotzdem bleiben noch eine Reihe von Dingen ungekl�rt. Wenn auch die Nutzung der parallelen Schnittstelle mittels Parapin die leidigen Rootrechte verhindern kann, so ist eine weitergehende Nutzung dieser Werte via Internet noch v�llig offen. Gesetzt den Fall, es wollen sich mehrere Leute Wetterstationen aufbauen, indem sie vielleicht noch Temperatur- und Luftfeuchtef�hler integrieren (eine Windmessung ist recht kompliziert und durch den Laien nicht ohne weiteres durchf�hrbar). Dann bleibt die Frage, in welcher Form sie ihre Daten austauschen. Vielleicht hat jemand eine Idee und kann diese Frage in einem gesonderten Beitrag er�rtern?

Referenzen