[LinuxFocus-icon]
Sommaire  |  Carte  |  Index  |  Recherche

Nouvelles | Archives | Liens | A propos
Cet article est disponible en: English  Deutsch  Francais  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Author]
par Ralf Wieland
<rwieland(at)zalf.de>

L´auteur:

J'utilise Linux (depuis la 0.99pl12) pour programmer des simulations environnementales, des réseaux neuronaux et des systèmes aléatoires. Je m'intéresse aussi à l'électronique et j'utilise aussi Linux dans ces domaines.



Traduit en Français par:
Iznogood <iznogood(at)lautre.net>

Sommaire:

 

Mesurer la pression atmosphérique avec Linux

[Illustration]

Résumé:

Si vous achetez des modules de mesure, vous aurez toujours le pilote pour une des variantes de Windows. Les utilisateurs de Linux n'obtiennent habituellement rien. Cela ne devrait pas être le cas puisqu'il est techniquement souvent plus facile d'écrire des pilotes matériels pour Linux que pour Windows. L'argument de quelques fabricants comme quoi il y aurait trop peu d'utilisateurs Linux peut être remis en question car ces derniers sont habituellement les plus actifs et apprécient l'expérimentation. De toutes les manières, la solution consiste souvent à écrire le pilote soi-même. J'ai voulu noter les étapes pour obtenir un pilote fonctionnel. Cela peut aussi être utile pour les autres personnes. Cela ne sera pas un pilote du noyau mais il utilisera le port parallèle.

_________________ _________________ _________________

 

Introduction

Pour le développement d'un système de mesure, vous devez d'abord clarifier ces trois questions suivante :

Ces questions peuvent sembler triviales mais il est important d'y penser à chaque étape du développement.

 

La physique

La pression atmosphérique est intéressante pour plusieurs raisons. Pour les marins et les alpinistes, elle fournit une indication sur les changements météorologiques à venir. Mais cela m'amuse aussi de surveiller la pression atmosphérique chez moi. De nombreuses personnes semblent faire la même chose comme le montrent les stations météo que l'on peut voir dans les salons. Ces stations sont plus des jouets que de véritables instruments de mesure. Si vous voulez faire des mesures sérieuses de la pression atmosphérique, vous devez alors considérer quelques petites choses. La pression atmosphérique peut être mesurée avec précision avec un baromètre tel que celui montré dans l'image-titre. Ceux-ci sont purement mécaniques et très cher. Pour limiter le coût, il est possible d'utiliser un capteur électronique. Motorola produit, par exemple, des capteurs pour des applications diverses. Ces capteurs sont toujours dépendants de la température et de la tension. Vous devez en tenir compte. La pression atmosphérique reste assez facile à mesurer car elle est la même à l'intérieur et à l'extérieur de la maison. Vous n'avez pas besoin de construire un capteur protégé de la pluie pour une utilisation extérieure. Vous pouvez avoir le capteur directement à coté de votre ordinateur. C'est aussi intéressant pour la compensation de température car celle-ci ne change pas autant à l'intérieur qu'à l'extérieur. Toutefois, pour obtenir des résultats précis il vous faut une compensation électronique de température. Le circuit proposé est disponible sous forme de kit chez ELV, un distributeur d'électronique européen. ELV m'a donné la permission de publier le circuit. La compensation de température est alors effectuée logiciellement. Le capteur ne mesure pas seulement la pression mais aussi la température. L'algorithme pour la compensation de température est documenté dans la fiche technique du capteur de pression d'Intersema. La stabilisation en tension est effectuée par un régulateur 3.3V.

La pression atmosphérique n'est pas seulement dépendante du climat, mais aussi de l'altitude par rapport au niveau de la mer. Pour comparer la pression de l'air en différents endroits, vous aurez besoin de normaliser les valeurs en fonction du niveau de la mer. Cela est réalisé internationalement avec la formule suivante :

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

Cette formule ne considère pas seulement la dépendance à l'altitude mais aussi le fait que la température diminue avec l'altitude. La pression atmosphérique mesurée sera alors compensée en altitude par rapport au niveau de la mer. Vous pouvez calculer que les changements de pression se font à raison de 1.2mbar/10m. L'altitude au-dessus du niveau de la mer se trouve dans le programme myclient dans #define HIGH_NN. La question restante concerne la précision. La précision dépend directement du capteur. Vous devez faire la distinction entre la résolution et la précision des résultats. Le capteur possède une précision de +-1.5mbar entre 750..1100mbar à une température de 25°. La résolution est néanmoins beaucoup plus haute : 15Bit+-7Bit qui font 1/2^15 = 3*10^-5 ou 0.03mbar. En d'autres termes, les derniers chiffres n'ont pas de signification. Le programme arrondira donc les résultats à un chiffre après la virgule. Nous devons encore définir la fréquence des mesures. Un intervalle de 5..10min doit être suffisant pour la plupart des applications. Pour filtrer les changements aléatoires, nous ferons des mesures toutes les 10..60s et nous appliquerons alors un filtre passe-bas. La charge CPU générée par les mesures reste négligeable. J'ai utilisé un intervalle de mesure de 10s et les valeurs sont stockées toutes les 2mns. Cela produit 60*24/2=720 valeurs de mesures chaque jour.

 

L'interface entre le capteur et l'ordinateur

[schematic]
Cliquez sur le shéma pour avoir une image agrandie.

J'ai utilisé le port parallèle comme interface. Cela prend tout son sens puisque la plupart des imprimantes modernes utilisent le port USB. L'avantage est que le port parallèle est très facile à programmer et vous n'aurez pas besoin de beaucoup de matériel supplémentaire. Seulement quelques inverseurs pour ajuster les niveaux de tension et générer un signal d'horloge.

Si vous ne voulez pas acheter le kit de ELV, vous pouvez alors aussi souder les composants sur une platine d'expérimentation.

Quelques commentaires sur le circuit :
Les nombres sur la gauche sont les broches du port parallèle. Les broches 18..25 concernent la masse et les 12, 3, 4 sont les lignes de données. La broche 2 est utilisée comme alimentation pour le circuit. Les résistances R1/R2 et R3/R4 sont utilisées pour adapter le 5V du port parallèle au 3.3V. Le 74HC04 et le capteur fonctionnent sous 3.3V.

Le programme a été écrit en C. Il lit les données du capteur et gère le filtre passe-bas de même que la compensation de température. Le code doit être facile à suivre. Vous pouvez le télécharger à la fin de l'article. Pour récupérer les données du capteur, quelques impulsions lui sont envoyées. Le capteur les interprète comme des commandes et y répond. Le protocole est documenté dans la fiche technique du capteur.

 

Utilisation et visualisation des résultats des mesures

Mesurer la pression atmosphérique avec un ordinateur "normal" pendant plusieurs jours peut vous attirer des ennuis avec votre famille car ces machines sont très bruyantes et doivent fonctionner à plein temps. Utiliser un DIL/NetPC est une alternative intéressante. Ces machines n'utilisent que très peu de puissance et ne font pas de bruit. Elles ne sont malheureusement pas bon marché et on ne peut y accéder que par un réseau. Ceci m'a mené à l'idée d'utiliser le serveur Linux au travail dans ce but. Ce serveur fonctionne de toute manière en permanence. Ceux qui n'ont pas accès à un tel serveur peuvent peut-être utiliser un vieux PC et le déposer dans une cave où il ne dérangera pas. Pour récupérer les données, j'ai développé une application client-serveur. L'inconvénient est que le processus serveur doit être lancé avec les droits de root pour accéder directement au port parallèle. Une alternative serait d'utiliser un pilote tel Parapin pour utiliser un port parallèle sans les droits de root. Cela implique toutefois de recompiler le noyau afin d'y ajouter le pilote Parapin. Si vous avez prévu de rendre les données disponibles sur Internet, vous devez alors considérer l'utilisation d'un utilisateur non privilégié. Dans mon cas, cette solution simple était suffisante.
L'application client et le processus du serveur utilisent des "sockets" TCP/IP pour la communication. Le serveur fonctionne dans 2 "threads". Un qui récupère les données du capteur et l'autre qui gère le réseau. Ces processus sont mis en oeuvre grâce à la PThreads-Library. Le client est très simple. Il récupère les données et les corrige en fonction de l'altitude selon la formule vue plus haut. La donnée est simplement affichée sur stdout sur 2 colonnes. La première est l'heure en virgule flottante. Elle représente le compte des heures depuis le début de la mesure. La seconde colonne représente la pression atmosphérique sous forme de nombre en virgule flottante. Elle ressemble à ce qui suit :

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

Ceci peut être exploité directement par un programme de traçage comme gnuplot ou Plotutils. J'ai utilisé Plotutils à cause de sa meilleure qualité visuelle. Pour comparer deux impressions, il est important d'utiliser la même échelle les deux fois. Je préfère donc l'ajustement absolu sur l'axe :

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

Le programme client « myclient » se connecte au serveur « modell1 » pour récupérer les données et les fournir à Plotutils (le programme de traçage) par le biais du "pipe". L'étalonnage de la pression atmosphérique se fait entre 950mbar..1040mbar. L'unité de temps est de 24 heures. Si vous changez l'option -T X à -T ps, un fichier postscript sera généré. Il est alors facile de l'imprimer sur papier.

[graph]

Le diagramme montre la fin d'une période de beau temps et l'arrivée de la pluie.

 

Installation

L'installation est très facile. Contrôlez une dernière fois le circuit et connectez-le au port parallèle. Le logiciel peut être décompressé par tar -zxvf druck-0.1.tar.gz. Positionnez-vous ensuite dans le répertoire du source et modifiez myclient.c en fonction de votre altitude (HIGH_NN). Compilez-le avec « make ». Avant d'utiliser le module, vous devez ajouter le numéro de port dans /etc/services pour le "socket" de communication. Ajoutez la ligne suivante :

socktest       7123/tcp    # Capteur de pression atmosphérique
Après ceci, vous pouvez lancer le processus serveur en tant que root par ./druck LPT1 (ou LPT2). Si tout fonctionne correctement, le serveur affichera les données brutes de pression et de température toutes les 10 secondes ainsi que l'heure. L'application cliente peut maintenant être démarrée à partir de n'importe où sur le réseau (ou sur la même machine). Le script druck.sh visualise les données par l'intermédiaire du programme Plotutils. Vous devez éditer le script pour définir le nom du serveur. L'entrée dans /etc/services doit être ajoutée sur la machine exécutant le processus serveur et sur la machine où le client est actif.  

Ultimes remarques

Il est dommage que les fabricants ne fournissent que peu de pilotes pour Linux. Cela m'a néanmoins donné l'opportunité intéressante de développer la solution que je viens de présenter ici. Seule l'application client/serveur réseau a donné une solution satisfaisante dans la mesure où il est possible de récupérer les données de différentes machines. Il reste encore des choses à faire. Comment ces valeurs peuvent-elles être proposées sur Internet ? Si plusieurs personnes construisent une station météo avec peut-être la température, la pression atmosphérique, l'humidité et la vitesse du vent (la vitesse du vent n'est pas facile à mesurer), comment les données peuvent-elles être échangées ? Quel format de données doit être utilisé ? Quelqu'un a peut-être une idée qui pourra être présentée dans un autre article.

 

Références

 

Discussion sur cet article

Chaque article possède sa page de discussion. Vous pouvez y soumettre un commentaire ou lire ceux d´autres lecteurs:
 page de discussion 

Site Web maintenu par l´équipe d´édition LinuxFocus
© Ralf Wieland, FDL
LinuxFocus.org
Translation information:
de --> -- : Ralf Wieland <rwieland(at)zalf.de>
de --> en: Guido Socher <guido(at)linuxfocus.org>
en --> fr: Iznogood <iznogood(at)lautre.net>

2003-03-02, generated by lfparser version 2.31