lundi 12 septembre 2011

Generic Mapping Tools (GMT) pour tracer des cartes sous Ubuntu

GMT (Generic Mapping Tools) est une collection d'outils libres et multi-plateformes permettant la génération de cartes et de diagrammes. Regroupant de l'ordre de 60 programmes en ligne de commande elle offre de nombreuses possibilités telles la création de cartes selon différentes projections, la représentation de données géographiques, la génération de graphiques et même la représentation en 3D.

Pour avoir un aperçu des possibilités, je vous renvoi vers les exemples, et en particulier celui-la ou cet autre ou encore ce dernier

Je vais me contenter dans cet article d'aborder les fonctions de base pour la génération de cartes. Pour les autres la documentation offcielle est très fournie. Vous y trouverez un manuel de référence, un tutoriel très bien fait et les nombreuses pages de man.

Avant de rentrer dans le vif du sujet, voici ce que vous devriez être capable de produire à  la fin : Manche

Installation & configuration

GMT étant présent dans les dépots, il vous suffit d'installer les paquets gmt, gmt-coastline-data, gmt-doc, gmt-examples et gmt-tutorial ces 3 derniers ne sont pas nécessaires, mais je vous les recommande tant la doc est importante.

Il vous faut aussi créer quelques variables d'environnement. Ajoutez ces lignes à  votre ~/.bashrc

# gmt variables
export NETCDFHOME=/usr/lib
export GMTHOME=/usr/lib/gmt
export PATH=$PATH:$GMTHOME/bin

Les étapes suivantes sont facultatives mais nécessaires pour suivre ce petit tutoriel.

GMT permet plusieurs niveaux de détails pour la représentation des côtes (crude, low, intermediate, high, full). Ubuntu fournit les 3 premiers via le paquet gmt-coast-low. Nous allons installer en plus le niveau full. Vous trouverez les différents miroirs la

wget ftp://gd.tuwien.ac.at/pub/gmt/4/GMT4.2_full.tar.bz2
cd /usr/share/gmt/
sudo tar xvjf /chemin/vers/GMT4.2_full.tar.bz2

Pour avoir une idée du niveau de détails, voici la carte de la manche avec les différents niveaux[1].

crude low intermediate full

Nous aurons aussi besoin de données topographiques, c'est à  dire des données d'altitude et de profondeur. Il existe plusieurs sources dont vous trouverez les liens à  la fin. Nous utiliserons les données ETOPO2v2 fournies par la NOAA[2]. Elles ont l'avantage d'être précises à  2 minutes d'arc prêt et de combiner les terres et mers. Vous pouvez télécharger les données mondiales (Attention le fichier fait 97Mo) ou alors ne récupérer que celles qui vous seront utiles (procédure plus bas).

# Pour télécharger et installer toutes les données :
wget http://www.ngdc.noaa.gov/mgg/global/relief/ETOPO2/ETOPO2v2-2006/ETOPO2v2g/netCDF/ETOPO2v2g_f4_netCDF.zip
sudo unzip ETOPO2v2g_f4_netCDF.zip -d /usr/share/gmt/dbase/

Enfin, fixons quelques paramètres par défaut[3].

gmtset -G$HOME/.gmtdefaults4 BASEMAP_TYPE fancy+ PLOT_DEGREE_FORMAT ddd:mmF
  • BASEMAP_TYPE pour l'affichage des axes comme sur la carte ci-dessus (noir et blanc, coins arrondis)
  • PLOT_DEGREE_FORMAT pour afficher les coordonnées du type 48°23'N

voir le manuel de référence pour plus de détails.

Cartographier

Ma première carte

Maintenant lançons nous et générons notre première carte, la commande peut faire peur, mais nous allons détailler :

pscoast -R-7/2/47.5/51.5 -JM10c -P -Ggreen -Sblue -W -Df -Ir -B1g1 > gmt_manche_01.ps

pscoast va vous permettre de dessiner les terres, mers, côtes et rivières. Les options sont :

  • -R-7/2/47.5/51.5 : les limites de la carte à  réaliser. Ici, un rectangle dont les coordonnées sont 7° de longitude Est, 2° de longitude Ouest, 47,5° de Latitude Nord et 51,5° de Latitude Nord.
  • -JM10c : projection Mercator, la carte fera 10cm de large
  • -P : créer une page en mode portrait
  • -Ggreen : couleur des terres
  • -Sblue : couleur des mers
  • -W : dessine le trait de côte (en noir par défaut)
  • -Df : utiliser la base de côte full (c, l ou i pour les autres bases disponibles)
  • -Ir : affiche les rivières permanentes
  • -B1g1 : créer les axes avec une unité tous les degrés

Un fichier postcript est alors produit. Vous pouvez le convertir en png à  l'aide de la commande ps2raster (qui nécessite ghostcript)

ps2raster -Tg -A gmt_manche_01.ps
  • -Tg : format de sortie PNG (-Tj pour Jpeg et -Tf pour PDF)
  • -A : pour ne conserver que la partie utile

Capture

Ajoutons un peu de relief

Il faut tout d'abord créer un fichier .grd lisible par GMT avec les données topographiques. Si vous avez installé l'ensemble des données, créez le ainsi[4] :

grdreformat /usr/share/gmt/dbase/ETOPO2v2g_f4.nc gmt_manche_02.grd -R

Sinon, allez sur le site Geodas pour récupérer un fichier .xyz. Remplissez ainsi :

Capture

et téléchargez le fichier xyz. Vous pouvez alors générer le grd avec cette commande :

xyz2grd -Ggmt_manche_02.grd -I2m -R manche02_1630.xyz

Pour afficher les détails sur le nouveau fichier :

grdinfo gmt_manche_02.grd

/!\ Vous avez peut-être noté que je n'ai pas donné les paramètres à  l'option -R. C'est normal, GMT conserve les derniers paramètres utilisés dans le fichier .gmtcommands4 du repertoire courant. Cela vous permet de simplifier l'écriture mais est parfois source d'incompréhension :)

Nous allons maintenant ajouter les lignes de niveaux à  notre carte :

pscoast -R -JM20c -Ggreen -Sblue -W -Df -B -K  > gmt_manche_02.ps
grdcontour gmt_manche_02b.grd -J -S4 -C20 -O >> gmt_manche_02.ps

Dans les nouvelles options, notons :

  • -K : pour dire que l'on va encore ajouter des données au fichier
  • -O : pour dire que l'on ajoute des données au fichier (notez aussi le >>)
  • -C20 : pour dire à  grdcontour de tracer les lignes tous les 20m[5]
  • -S4 : pour lisser les lignes

Capture

Colorisons un peu plus

Les couleurs plates, c'est bien joli, mais ça manque un peu de ... relief :) Voyons comment arranger cela.

D'abord, il faut créer une palette de couleur à  partir de celles par défaut mais mise à  l'échelle de nos valeurs :

makecpt -Crelief -T-450/450/20 -Z > gmt_manche_03.cpt
psscale -Cgmt_manche_03.cpt -D10c/2c/20c/1ch -Ba100 > gmt_manche_03_cpt.ps
  • -Crelief, -Cgmt_manche_03.cpt : palette utilisée
  • -T-450/450/20 : translation à  appliquer à  la palette de -450m à  450m par pas de 20m, on trouve les extrêmes grà¢ce à  la commande grdinfo vue ci-dessus
  • -Z : palette continue (dégradé de couleurs)[6]

La commande psscale permet de générer une échelle. Je vous laisse lire la documentation pour les détails. Vous pouvez aussi l'utiliser pour ajouter l'échelle sur votre carte Palette

Créons maintenant la carte topographique à  l'aide de grdimage

grdimage gmt_manche_02.grd -J -Cgmt_manche_03.cpt -E50 -K > gmt_manche_03.ps
grdcontour gmt_manche_02.grd -J -S4 -C25 -O >> gmt_manche_03.ps
  • -E50 : permet d'augmenter la résolution en interpolant les données, souvenez-vous, nos données sont par pas de 2 minutes d'arc, si on laisse comme cela, nous aurons des carrés
  • les autres options sont déjà  connues ;)

Capture

Conclusion

Voila, comme l'article est déjà  (très) long, je vais m'arrêter la. Nous n'avons fait qu'effleurer les possibilités de GMT et je vous encourage donc vivement à  suivre le tutoriel officiel, à  lire la doc de référence et à  expérimenter. Vous pouvez aussi télécharger le script regroupant toutes les commandes vues.

Pour réaliser la carte de la manche présentée en début d'article, il ne vous manque que psxy pour afficher des symboles et pstext pour le texte. Leur utilisation est relativement simple et vous trouverez des exemples commentés dans le script qui génère celle-ci. Tout le reste est déjà  expliqué dans cette page.

Enfin, il existe une interface graphique pour GMT : iGMT, mais celle-ci n'étant pas disponible dans les dépots, je ne l'ai pas testé.

Liens

Pour finir les liens utiles :

A ce propos, je ne résiste pas à  citer luckytoyn qui dans ce même sujet disait :

J'ai l'impression que moins un programme est convivial, plus il est puissant.
gmt est très puissant.

Continuons les liens :

Voila, merci et bravo à  ceux qui sont arrivés jusque la ;) A vos cartes !

Notes

[1] vous trouverez le script pour les produire à  cet endroit, ne vous inquiétez pas des options nous allons détailler plus loin

[2] National Oceanic and Atmospheric Administration, une agence Américaine

[3] On peut aussi les donner en ligne à  chaque commande, voir gmtdefaults

[4] il y a surement moyen de ne pas donner le chemin complet grà¢ce au fichier coastline.conf, mais je n'ai pas trop cherché

[5] il prend aussi l'option -A50 pour labéliser les lignes tous les 50 mètres

[6] notez aussi -I pour inverser la palette


Commentaires du post original

Liaison téléinfo : le compteur électrique on the web

Les compteurs électriques récents disposent d'une sortie à  deux fils émettant en temps réel la consommation de votre installation : la liaison téléinfo. Les données étant présentes, il est dommage de ne pas pouvoir en disposer ! Nous allons y remédier. L'idée de base est de récupérer la consommation et de pouvoir la suivre de n'importe ou.
le montage aura 3 étages :
  • l'adaptation du signal pour le rendre facilement exploitable
  • la récupération et l'analyse des données
  • la présentation sur le réseau sous forme de graphiques[1]

Adaptation du signal

On trouve chez edf les spécifications techniques de la sortie téléinfo. Outre le signal, elles décrivent les messages que vous pourrez recevoir (nous y reviendrons). La 1ère étape est de transformer le signal pour le rendre lisible par notre équipement. plutôt que de ré-inventer la roue, une petite recherche sur le web nous remonte nombre de schémas (voir les liens). La source première semble être Bernard Lefrancois, mais ce n'est sans doute pas la seule. Quoi qu'il en soit, le montage est simple :
  • un optocoupleur
  • une/deux NAND
Voici ma version du schéma réalisé avec Kicad : schema teleinfo Voir ci-dessous pour les sources des schémas et le pourquoi de tous ces connecteurs inutiles.

Récupération des données

la 1ère étape est de récupérer tout cela avec un PC pour valider le concept. On s'installe donc au pied du compteur avec son PC portable et sa plaque d'essai[2] 1st Le port série est relié au connecteur Liaison vers un PC du schéma ci-dessus.
Parlons maintenant un peu des données. Elles sont transmises en boucle par votre compteur à  un débit de 1200 Bauds en 7E1[3]. Chaque trame commence par le caractère STX:0x02 et se termine par ETX:0x03. le contenu des trames dépend de votre abonnement. Dans mon cas (monophasé, heures creuses/pleines), on trouve ceci : plaque à  essai pour PC
ADCO XXXXXX088671 K
OPTARIF HC.. <
ISOUSC 60 <
HCHC 005124904 _
HCHP 007483956 =
PTEC HC.. S
IINST 002 Y
IMAX 052 F
PAPP 00400 %
HHPHC D /
MOTDETAT 000000 B
dans la GTL Je ne vais pas vous décrire par le menu les différents champs, tout est très bien détaillé dans le pdf linké précédemment. Sachez cependant que ce qui va nous intéresser le plus est :
  • HCHC : consommation totale en heures creuses
  • HCHP : consommation totale en heures pleines
  • PTEC : période tarifaire en cours (ici heures creuses)
  • IINST : l'intensité instantanée
Une fois ceci connu, il est très simple d'exploiter les données, on lit la trame sur le port série, on converti les caractères en nombre, et voila ! Vous trouverez même chez MicElectroLinGenMet des programmes en C tout fait pour exploiter ces données.
Bon, c'est bien joli de suivre sa consommation pour faire des économies, mais c'est pas en laissant un PC allumé qu'on va améliorer les choses !

On the web

Il me faut donc un moyen de lire et exporter tout cela sur le web à  basse consommation. Mon choix s'est porté sur une plateforme arduino. Pourquoi ? C'est simple :
  • il faut un arduino dans tout projet électronique[4]
  • c'est facile d'accès, tout intégré et avec plein de bibliothèques
  • les extensions[5] sont faciles et existent en grand nombre (en particulier pour l'ethernet)
  • les AVR c'est le bien
Arduino dans la GTLBref, des arguments imparables !
Pour l'ethernet, mon choix s'est porté sur un modèle à  enc28J60 plutôt que l'officiel à  base de Wiznet. Il est plus lourd à  programmer, mais beaucoup moins cher. Ici, une comparaison[6] entre les 2 shields.
Le reste n'est que du C, très simple donc ;)
Le programme est relativement léger. On lit le port série régulièrement, on accumule dans un tableau pour conserver un historique sur 24h et on affiche le tout via l'API Google chart. Vous trouverez les sources ci-dessous.
web
Voila, après quelques mois de fonctionnement sur plaque à  essai, tout va bien. J'avais prévu d'en faire un typon[7] mais au final, je me suis contenté d'une plaque à  trous.
Vous pouvez voir comme je suis fort en soudure et routage[8] :)
coté face coté pile en fonctionnement

Conclusion

Voila, un montage simple et facile qui vous permettra d'attendre le super nouveau compteur d'EDF. Dans les évolutions, on pourrait envisager une intégration Google powermeter[9] ou un historique plus grand[10]
Dans les utilisations réelles[11] je peux citer :
  • le réglage de la pompe à  chaleur pour qu'elle ne déborde plus en heures pleines
  • la découverte de l'oubli du chauffe-eau pendant les vacances[12]
Et pour finir, quelques liens :

Notes

[1] parce que j'aime bien les graphiques !
[2] madame ne vous laissera sans doute pas faire très longtemps ;)
[3] 7 bits de data, parité pair, 1 bit de stop
[4] au milieu, à  gauche
[5] shields
[6] en faveur du wiznet
[7] voir dans les sources kicad ci-dessous
[8] ironie inside
[9] si j'arrive à  faire du SSL?
[10] pour l'instant via un munin hébergé ailleurs
[11] je veux dire autre que le plaisir de voir de jolies couleurs
[12] et envoi de mamie pour l'extinction :)


Commentaires du post original

Programmateur de machine à  laver

Le besoin

Notre machine à  laver, un peu ancienne, ne dispose pas de fonction retardateur. Il est donc impossible de la programmer pour qu'elle démarre en heures creuses. De plus le bouton de démarrage n'est pas "à  état". C'est à  dire que chaque pression démarre ou arrête la machine mais qu'il revient dans son état initial après. Impossible de mettre l'alimentation sur programmateur et d'enclencher le démarrage en avance.
L'idée qui germe alors dans mon cerveau geek est de construire un doigt robotisé qui appui sur le bouton au moment opportun ! Bien sur, il est possible de caler le bouton enfoncé avec un bout de carton et d'utiliser le programmateur sus-cité, mais alors ou est le fun[1] ? De même d'aucun objecterons qu'un relais soudé sur les contacts internes du bouton peuvent mieux simuler une pression qu'une action mécanique moins fiable. J'objecterai alors, à  mon tour, que souder des trucs dans un appareil qui fonctionne très bien est à  mon goà»t plus risqué que d'appuyer sur un bouton[2]. Je n'ai pas l'intention de changer une machine qui marche très bien.
Ceci étant posé, je me suis lancé dans la construction d'un "doigt" qui appuiera sur le bouton après un temps choisit.

La réalisation

Posons les bases :
  • pour le "doigt" un simple servo fait l'affaire, un angle au repos et un angle pour l'appui sur le bouton. Il ne doit pas empêcher d'appuyer manuellement.
  • il faut aussi un écran pour régler le temps d'attente avant le déclenchement du lave-linge
  • pour le servo cerveau, un arduino, simple et facile même si sur-dimensionné

Écran LCD : Nokia

Pour l'écran, je me suis vite orienté vers les quelques Nokia 5110 qui traà®nent dans un tiroir depuis quelques années. Je les ai gardés justement pour ce genre d'utilisation car leur écran LCD est très facilement réutilisable à  partir d'un µC. Il existe foultitude sites et de bibliothèques pour les utiliser. Il suffit donc de suivre les instructions et de souder une petite nappe. à€ ce moment, la force de l'arduino entre en jeu, les bibliothèques ! J'ai utilisé celle de NuElectronics légèrement modifiée par mes soins. Et hop :
photo

Commande

Pour l'affichage, c'est bon. Pour la commande, il n'est pas besoin de grand chose, il nous faut juste régler la temporisation et la lancer. Soit 3 boutons : up, down et ok.
Les fonctions offertes sont, elles aussi, simples :
  • réglage du minuteur
  • réglage des angles repos/travail du servo (avec enregistrement en eeprom)
  • test
On se reportera au schéma suivant pour les menus et les interactions de l'interface.
photo photo photo
Le concept est validé et fonctionnel.

Finalisation

Il ne reste plus qu'à  améliorer le WAF[3] de l'ensemble si l'on veut que l'objet soit utilisé.
on commence donc par rendre tout cela un peu plus transportable en en faisant un shield[4] facile à  enficher sur notre arduino.
photo photo photo
Ensuite on agence tout ceci dans un belle boà®te de vis qui avait le malheur de traà®ner dans mes pattes. Quelques coups de dremel, de perceuse et le tour est joué.
photo photo photo
Pour finir, il ne reste qu'à  fixer notre doigt au-dessus du bouton. Pour une fois, j'ai choisit de rester simple: un morceau de scotch double-face[5].
photo photo
Voila, cela fait quelques mois que ce montage est en fonction et il donne entièrement satisfaction. Nous gagnons des € tous les soir grà¢ce aux heures creuses et dans 10 ans je pense que nous aurons économisé suffisamment pour rembourser le temps que j'y ai passé ;)
Ah oui, si quelqu'un a envie de se lancer dans la même chose, le code est bien sur disponible en GPL dans mon dépot : programmation de machine à  laver

Notes

[1] bande de rabat-joie
[2] puisque je vous dis que je veux un robot!!
[3] pas le plus amusant, mais le plus important
[4] si on peut appeler ça un shield !
[5] trop simple :(


Commentaires du post original