|
|
Cet article est disponible en: English Deutsch Francais Turkce |
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: |
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.
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 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.
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.
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.
Le diagramme montre la fin d'une période de beau temps et l'arrivée de la pluie.
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ériqueAprè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.
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.
|
Site Web maintenu par l´équipe d´édition LinuxFocus
© Ralf Wieland, FDL LinuxFocus.org |
Translation information:
|
2003-03-02, generated by lfparser version 2.31