KubuntuBlog

If brute force isn't solving your problem, you're not using enough.

Aller au contenu | Aller au menu | Aller à la recherche

mercredi 17 octobre 2012

Embarquer une image dans un script bash

Quand je programmais en perl, une fonctionnalité de ce langage me plaisait beaucoup. Il est en effet possible d'embarquer des données dans un script après le mot clef __END__. Ces données sont alors facilement accessible dans celui-ci à l'aide du descripteur <main::DATA> Cela donne quelque chose comme cela :

#!/usr/bin/perl

while (<main::DATA>)
{
  print $_;
}

__END__
1ère ligne
2ème ligne

Il m'est venu l'envie d'avoir la même chose en bash pour pouvoir embarquer une image à modifier dans un script[1]. Si bash ne propose pas une telle fonction par défaut, il est très facile de l'émuler avec les outils standard d'unix. Sans plus attendre, voila ce que ça donne :

#!/bin/bash

END_LINE=$( awk '/^__END__/{print NR + 1}' $0)
tail -n +$END_LINE $0 | base64 -di | display

exit 0
__END__
iVBORw0KGgoAAAANSUhEUgAAAQgAAADAAQMAAADC9G/RAAAABlBMVEX///8AAABVwtN+AAAAVUlE
QVRYhe3TwQ2AQAhFQfpvGhNNDCxSgfNu+5nrRtxlZvTOhSCIZfo4EwRRphlBEFO873priCCIjLpu
EQRRxfZrnp0giCmiRxDEFHWqvytmBPF3cQGgZ+PFvE0lDQAAAABJRU5ErkJggg==

Les explications : grâce à awk, on récupère le numéro de ligne suivant le patern __END__. Puis tail nous permet de récupérer les données à partir de cette ligne que l'on passe à base64 en mode décodage. L'image ainsi obtenue est envoyée simplement à display[2]. Libre à vous d'en faire ce que vous voulez.On n'oubliera pas le exit avant les données, sinon bash va essayer de les interpréter comme du code.

Pour intégrer l'image, on utilisera par exemple :

$> base64 si.png >> img.sh

On peut aussi pour gagner de la place garder l'image en binaire (et éviter ainsi l'encodage/décodage base64) mais comme certains éditeurs ont parfois du mal avec les fichiers contenants du binaire, je préfère le base64. Il est facile de remplacer l'image par n'importe quoi, comme par exemple un tgz pour faire un script auto-extractible.

Voila une astuce simple mais diablement utile !

Notes

[1] pour les curieux, afin d'avoir les données de ma station météo en fond d'écran

[2] d'imagemagick

lundi 7 mai 2012

Une table de défonceuse d'établi

Une défonceuse est un outil génial[1] mais qui a ses limitations. En particulier, dès que l'on veut travailler sur de petites pièces ou réaliser des tâches en série, la mise en place devient très vite galère et répétitive. C'est pour cela qu'en général, dès que l'on à une défonceuse portative, on cherche à la mettre sous table. Ceci consiste à la fixer sous un plateau, la fraise dépassant alors vers le haut. On ne bouge plus la défonceuse, mais la pièce de bois à travailler. Comme tout le monde j'ai donc voulu faire ça :)

Il existe une quantité incroyable de plans, de discussions et de méthodes pour faire une table de défonceuse. Dans mon cas, mon cahier des charges tenait en quelques points :

  • à poser sur un établi plutôt qu'un meuble à part entière (portative donc)
  • relativement simple à réaliser
  • le moins de perte de hauteur possible (évidement)
  • utiliser un peu du bois qui traîne et encombre mon atelier, garage, étagères, armoires ...

J'ai donc retenu ces quelques solutions :

  • un morceau de plan de travail de cuisine (de l'aglo mélaminé épais, cela restera rigide et plat dans le temps)
  • un piètement en contreplaqué de 22 qui me reste des étagères de la cuisine
  • une plaque support pour perdre un minimum de hauteur en garantissant la rigidité (le seul achat)
  • un guide simple en CP basé sur le même principe que pour ma perceuse à colonne

On commence donc par tracer la plaque support sur le plan de travail puis réaliser une rainure ayant comme profondeur l'épaisseur de la plaque. Comme la précision est importante à ce point, l'aide d'un gabarit droit est très utile[2]. Il suffit ensuite de découper le surplus intérieur à l'aide d'une scie sauteuse.

Étape suivante, le piètement. Facile, 3 morceaux de CP et 3 bouts de tasseaux. Un montage à blanc pour tester, un petit chanfrein pour le plaisir et voila. Reste une opération importante, percer deux[3] trous dans la plaque support pour fixer la semelle de la défonceuse dessous. C'est la partie la plus critique. Il ne faut pas que les vis de fixation dépassent de la plaque et la défonceuse doit être bien maintenue.

On pourrait s'arrêter la. Un tasseau bien droit et 2 serre-joints pour le guide et ça marche ! Mais bon, pourquoi bouder son plaisir ? Allons un peu plus loin !

Comme les tables de défonceuses, les guides pour celles-çi sont multiples. Du simple tasseau (dégauchi) évoqué ci-dessus jusqu'au guide à réglage micrométrique. Restons simples[4] : deux morceaux de CP tenus en angle droit avec des équerres, une découpe pour passer la fraise et une cage avec un trou derrière pour l'aspiration. Sitôt dit (presque)sitôt fait. On s'appliquera bien pour que le guide soit d'équerre par rapport au plan de travail et bien poncé pour que les pièces glissent bien dessus[5]. Pour le régler, très simple: un point de pivot d'un coté[6] et une pince de l'autre.

Tant qu'on est lancés, on va faire une petite boîte pour stocker les fraises et autres petits trucs. Quitte à avoir une défonceuse, autant l'utiliser, donc rainures et feuillures[7] nous donnent un boîte qui ne se défera pas de sitôt :)

Enfin, on termine par les très importants poussoirs qui éloigneront les mains de cet engin somme toute très dangereux. La encore, on fait dans la récup, morceau de parquet et vieux bout de tasseaux. L'anti-dérapant est coupé dans un tapis acheté il y a des années au bricotruc du coin.

Et voila, enfin, je peux rendre fixe ma défonceuse mobile :)

Blague à part, je ne regrette pas le temps passé, c'est super pratique. Le temps de montage/démontage est très raisonnable (quelques minutes), le réglage est assez facile (je sort la défonceuse de sous la table).

Edit: Comme je n'ai pas été très clair à propos de l'utilisation du guide, voici quelques précisions. Tout d'abord, un plan :

On voit qu'il y a une rainure traversante découpée dans la base du guide. Positionnée en face d'un trou dans la table, elle permet à l'aide d'un boulon de faire un point de pivot. L'autre coté peut ainsi bouger d'avant en arrière pour régler la distance entre le guide et la fraise. Le guide n'a pas besoin d'être parallèle au bords de la table[8] Le pivot est un simple trou dans la table, mais doit (dans mon cas) être une rainure dans le guide. Cela permet de déplacer le guide dans l'autre sens (de droite à gauche) pour aligner la lumière d'aspiration avec la fraise (et aussi garder le coté proche du bord de la table pour coincer avec ma pince).

Notes

[1] Je renvoi ceux qui ne connaissent pas vers Wikipedia

[2] On pensera aussi à préparer des butées pour éviter de dépasser des traits comme moi.

[3] ou trois selon votre défonceuse

[4] mais pas trop :)

[5] j'envisage aussi de le cirer

[6] un boulon qui traverse la table et le guide

[7] on peut même les faire avec la table nouvellement réalisée \o/

[8] ou à l'outil, contrairement à un guide pour scie circulaire par exemple

jeudi 8 décembre 2011

Fabrication d'un établi

le 1er accessoire indispensable dans un atelier est l'établi. Jusqu'à présent je me suis contenté d'un plan de travail de cuisine posé sur des tréteaux. Comme en prévision du bricolage de cet hiver je réorganise mon atelier, j'ai trouvé que c'était le moment parfait pour réaliser un vrai établi. Le plan de travail sus-cité et du bois d'ouvrage récupéré sur le chantier[1] m'ont fournit la matière première.

Si l'on cherche sur le grand ternet, on trouve de nombreux plans et idées allant du plus simple au plus perfectionné q(ui aurait plus sa place dans le salon tellement il est beau). Comme exemple, je vous en ai sélectionné 3, tous en vidéos :

De mon côté, comme je ne voulais rien acheter[3], j'étais limité dans mes dimensions et ma structure par le bois disponible. En plus, c'était l'occasion rêvée de s'entraîner sur des techniques pas trop maîtrisées. Les ratages ne sont pas très graves cachés au fond de l'atelier :) J'ai donc fait mes plans en choisissant un assemblage à mis-bois, plus solide que de simples vis mais facile à réaliser quand même.

Bien entendu, je commence par réaliser l'établi en virtuel avec Google sketchup. Les dimensions principales sont fixées par le plan de travail dont je dispose déjà. C'est l'occasion d'essayer différents assemblages en ayant une idée rapide du rendu. Ensuite cela me permet de voir les pièces à découper et leurs dimensions. J'ai poussé le vice jusqu'à représenter fidèlement toutes les liaisons entre les montants mais on peut se contenter de représenter juste le principal. De toutes façons les dimensions finales sont mesurées et marquées lors des multiples assemblages à sec réalisés au fur et à mesure de la construction. L'éclaté est réalisé simplement à l'aide de l'excellent script Eclate_deplace

plan éclaté

Puis, je prépare le bois de récup' à l'aide de ma nouvelle rabau-dégau[4]. J'en suis très content, c'est un vrai bonheur de travailler avec du bois bien plan et d'équerre. J'ai quand même un peu galéré pour les pièces de 150cm de long. Une machine d'entrée de gamme ne vaut pas celles à plus de 1000€. Rien que de très normal. Pour la longueur, une 1ère coupe large suivie d'une coupe ajustée après. Cela permet d'assurer des longueurs équivalentes et des coupes bien droites. Bien sur, protection des yeux et des oreilles indispensables !

bois brut dégauchir

Viens ensuite les découpes des assemblages à mis-bois. J'ai réalisé la majorité avec la scie circulaire installée sous table. On règle la hauteur de la lame suivant la profondeur de l'entaille[5] et à l'aide de multiples passages on enlève le superflu. Il ne reste plus qu'a nettoyer le fond au rabot et au ciseau à bois. J'en ai aussi fait certaines juste à la scie à main[6]. J'envisage depuis d'investir dans une scie spéciale pour le bois de bout, c'est dur[7] avec une scie égoïne standard. Enfin d'autres entailles ont été réalisées avec plusieurs trais de scie à main et le ciseau. (photo ci-dessous) L'expérience étant irremplaçable, mes derniers ajustements sont bien meilleurs que les 1er. Ayant un peu honte de ceux-ci, je ne vous met la photo que d'un des derniers :) Tout au long du processus, on marque bien toutes les pièces et on réalise de fréquents assemblages à blanc.

entaille manuelle mis-bois

Enfin, lorsque toutes les pièces sont prêtes, je réalise un dernier assemblage à blanc puis je colle/visse tout cela. Vu le nombre conséquent d'imbrications j'ai fait en plusieurs étapes. En premier les cotés. J'en ai profité pour chanfreiner tous les coins accessibles à la défonceuse et au rabot. Cela permet d'éviter de se blesser ou de prendre des échardes. En plus ça donne un look beaucoup plus fini à l'ensemble.

tous les morceaux ça sèche

Pour finir un peu d'huile pour parquet étalée au pinceau sur toute la structure (ça protège le bois) et on colle/visse le plateau dessus. Pour l'étagère, j'ai retaillé de vielles étagères en pin dont les montants sont inutilisables. La aussi colle et vis offriront une résistance maximale. Voila donc un établi solide qui ne bougera plus comme mes tréteaux dès que je veux scier ou donner des coups de marteaux.

ayé

Notes

[1] et patiemment stocké au grand dam de madame

[2] un nom prédestiné s'il en est !

[3] un petit challenge perso

[4] cadeau de Noël en avance

[5] un poil moins en fait

[6] au bout des montants

[7] et donc peu précis

dimanche 13 novembre 2011

Aménagement d'atelier : French Cleats

En prévision du bricolage que je vais avoir à faire dans les mois qui viennent[1], j'ai commencé à ranger/organiser mon atelier. Il est bien plus facile de travailler quand chaque chose est à sa place et est donc rapidement accessible. Parmi les actions entreprises, je voulais accrocher mes outils au mur. n'ayant pas de mur dispo, j'en ai créé un avec une plaque de fermacel reposant sur mon plan de travail. restait alors à choisir comment agencer tout cela.

Quand il s'agit de ranger des outils, la première recherche renvoi vers les pegboard et équivalents. mais cela revient très vite très cher et il manque toujours le petit accessoire dont on a besoin tout de suite. Celle qu'on trouve en promo sont généralement de piètre qualité et je ne leur confierai pas forcément tous mes outils. Par contre l'énorme avantage sur un agencement maison est la modularité. Du coup comment garder une forte modularité combiné à un agencement fait main et donc parfaitement adapté/adaptable à ses propres outils ?

Je n'ai pas trouvé la solution tout seul, mes lectures du moment m'ont amené sur le site TheWoodWhisperer[2] et en particulier son épisode 106 – French Cleat Storage System ou il décrit sa méthode pour ranger ses outils. Le terme étant alors connu on trouve de multiples références dénotant de la très large utilisation de cette technique. À noter qu'on l'appelle aussi parfois Split Batten. Si quelqu'un connait l'appellation française, je suis preneur, je n'ai pas réussit à trouver.

Le principe est très simple, on découpe un morceau de bois avec un angle à 45° dans le sens de la longueur. Une scie circulaire placée sous table est parfaite pour cela. on obtient deux parties: une qui sera fixée au mur, et une autre sur l'accessoire porte-outil. On a alors un système modulaire facile à personnaliser. nous ne sommes plus limités que par notre imagination pour fixer n'importe quoi au mur.

Par exemple, voici le support pour les ciseaux à bois et les rapes :

On distingue en dessous les deux parties avec la coup à 45°. Le reste est constitué de morceaux de contreplaqué qui traînaient dans le coin[3]

Il est très facile de se confectionner des supports parfaitement adaptés et déplacables à volonté.

Ici, une petite tablette parfaite pour le mètre/gomme/taille-crayon et son support à crayon en véritable gaine électrique !

Et voila, en quelques heures de travail me voici avec un magnifique système de rangement évolutif, parfaitement adapté à mes outils et qui ne m'a rien coûté[4]

Notes

[1] j'y reviendrais

[2] Attention cliquer sur ce lien peut provoquer des heures de visionnage de vidéo sur le travail du bois

[3] toutes les chutes précieusement conservées depuis des années qui servent enfin à quelque chose ;)

[4] enfin si mon temps ne coûte rien

dimanche 11 septembre 2011

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 :(

samedi 9 juillet 2011

Utiliser un arduino comme programmeur ISP

L'arduino est devenu le microcontroleur[1](µC) à tout faire. De part sa communauté, de nombreuses bibliothèques et programmes sont proposés et disponibles pour nombre d'utilisations. Nous allons aujourd'hui en découvrir une un peu particulière. Nous allons apprendre à (re)programmer un autre microcontroleur à l'aide d'un arduino.

Charger un programme dans un arduino est très simple, cela grâce au bootloader chargé dans l'ATmega. Basiquement, ce petit programme exécuté au démarrage de votre arduino récupère le code via la liaison usb et programme l'ATmega de la carte[2]. Si rien ne lui est envoyé, alors il démarre le programme déjà présent dans la mémoire flash. Le bootloader ou le programme à exécuter sont stockés dans 2 zones mémoires différentes.

Seulement il peut arriver que ce bootloader soit cassé[3] ou ne soit pas présent[4]. De plus, un certain nombre de µC ne peuvent pas héberger de bootloader. Dans ce cas, il faut les programmer autrement. On utilise alors un programmeur qui se charge de cette tâche.

Les µC d'atmel disposent en général d'une fonction très utile : l'ISP (In-System Programming). Celle-ci permet de les reprogrammer à l'aide de 4 fils, alors qu'ils sont déjà dans un montage. Nous allons utiliser cette fonction pour reprogrammer notre arduino.

Exemple avec un ATtiny45

Commençons par programmer un simple petit ATtiny45 (cible) à l'aide d'un arduino Duemilanove (programmeur).

Il nous faut d'abord utiliser le sketch ArduinoISP présent dans les exemples fournis avec l'IDE de l'arduino. Vous pouvez aussi le télécharger sur le site mega-isp. Compilez le et chargez le dans l'arduino.

Note: par défaut la vitesse utilisée lors de la (future) programmation de la cible est de 19200bps, vous pouvez changer cela dans le code, mais il faudra alors penser à reporter cette valeur dans les commandes de programmation.

Depuis la version Diecimila les arduino intègrent une fonction d'auto-reset qui permet de redémarrer la carte (et donc lancer le bootloader) quand une communication série débute[5]. C'est très utile pour programmer l'arduino, mais cela va nous poser problème ici. Nous devons donc le désactiver. Pour notre version Duemilanove, le plus simple et le moins intrusif est de relier le reset au +5V par une résistance de 120ohms, ce qui maintiendra le reset à l'état haut[6]. Je vous laisse voir le site officiel pour les autres méthodes.

Ensuite, nous relions les différentes pattes nécessaires pour la programmation ISP :

Arduino     ATTiny45  Fonction
  10           1       reset 
  11           5       MOSI
  12           6       MISO
  13           7       SCK

Référez vous à la datasheet de votre µC pour connaitre les pattes à relier.

Enfin, le sketch ArduinoISP utilise 3 leds d'état que vous relierez à la masse via une résistance adéquate[7].

Arduino    led (anode)
   7       jaune: programation en cours
   8       rouge: erreur
   9       vert : heartbeat

Voici le schéma du montage sur plaque à essai :

montage montage

Vous pouvez ignorer la led verte de gauche, elle ne sert qu'a tester le programme chargé.

Enfin, vient le moment tant attendu, vous pouvez connecter l'arduino à l'USB et programmer votre ATtiny en utilisant avrdude :

avrdude -V -p t45 -c avrisp  -b 19200 -P /dev/ttyUSB0 -U flash:w:led.hex

Quelques mots sur les options (voyez la doc pour les détails) :

  • -p t45 : pour dire que l'on programme un ATtiny45
  • -c avrisp : le type de programmeur utilisé
  • -b 19200 : la vitesse de la liaison (à changer éventuellement en fonction du code de ArduinoISP)
  • -P /dev/ttyUSB0 : le port sur lequel est connecté votre arduino
  • -U flash:w:led.hex : on écrit (w) dans la flash le programme compilé led.hex

Et voila, selon votre programme de test, la led devrait commencer à clignoter.

Programmer un arduino à partir d'un arduino

Attention: Pour pouvoir programmer plus de 256 octets (ce qui va être nécessaire pour la suite), il vous faut utiliser ArduinoISP de l'IDE version 22 minimum, ou utiliser les sources prises sur mega-isp vues ci-dessus. C'est un bug connu de l'IDE 21

Nous allons reprogrammer le bootloader de l'arduino. On peut avoir de nombreuses raisons de faire cela: pour le réparer, pour préparer un nouveau µC, pour le remplacer par une version plus efficace. Dans mon cas, c'est cette dernière opération que je veux réaliser. Le bootloader du Duemilanove, empêche l'utilisation du watchdog dans les programmes. On trouve la correction dans des bootloader alternatifs[8] ou dans celui de l'arduino UNO (optiboot). Ce dernier étant compatible avec la majorité des versions précédentes, nous allons donc l'utiliser. Ceci impliquera de choisir Arduino Uno dans le menu Board de l'IDE lors des prochaines programmation, puisque le bootloader sera celui de l'Uno. Je vous conseille d'y coller une étiquette pour ne pas l'oublier.

Notre arduino programmeur sera préparé de la même manière que ci-dessus, c'est-à-dire qu'on lui chargera le sketch ArduinoISP. On le connecte alors vers les pattes ISP de notre arduino cible. On peut utiliser soit le connecteur ICSP soit relier directement aux connecteurs femelle sur lesquels on branche habituellement les shields.

Note: On peut aussi se contenter d'un seul arduino (programmeur) et utiliser une plaque à essai pour simuler le 2ème. Dans ce cas, les différentes options sont décrites sur le site officiel.

Voyez ci-dessous les connexions à établir.

arduino isp to arduino montage

La cible doit être alimentée. Vous pouvez faire cela via l'USB, mais je le déconseille ainsi, vous n'aurez qu'un seul /dev/ttyUSBx et c'est un risque d'erreur en moins. Utilisez plutôt l'entrée VIN de l'arduino à programmer.

Il ne nous reste plus qu'à utiliser l'IDE pour flasher la cible.

  • choisir ce que vous allez programmer dans le menu Tools / Board :
    • UNO pour avoir l'optiboot
    • ou bien duamilanove avec atmega328
    • ou autre chose suivant votre modèle d'arduino
  • puis Tools / Burn Bootloader / w/Arduino as ISP

Note: Si vous avez changé la vitesse dans le sketch ArduinoISP, il vous faudra mettre à jour le paramètre arduinoisp.speed présent dans le fichiers programmers.txt[9], soit directement, soit en le surchargeant via votre fichier preferences.txt[10]

Nous pouvons aussi utiliser avrdude pour faire cela à l'ancienne. il suffit d'enchainer les 3 commandes suivantes, voir de les regrouper en une seule[11]

Vous trouverez les valeurs de fuses et les fichiers de bootloader dans le fichier texte boards.txt de votre installation[12]. Les différents fichiers hex du bootloader sont dans un sous répertoire bootloaders[13]. Rappelons que les commandes suivantes s'appliquent pour programmer un optiboot sur un arduino Duemilanove.

La 1ère action est de débloquer l'accès au bootloader :

avrdude -p m328p -P /dev/ttyUSB0 -c avrisp -b 19200 -e -U lock:w:0x3F:m

Ensuite, il faut flasher le bootloader :

avrdude -p m328p -P /dev/ttyUSB0 -c avrisp -b 19200 -D -U flash:w:optiboot_atmega328.hex

notons que vous pouvez relire le fichier flashé ainsi :

avrdude -p m328p -P /dev/ttyUSB0 -c avrisp -b 19200 -D -U flash:r:read.hex:i

et enfin rebloquer l'accès au bootloader :

avrdude -p m328p -P /dev/ttyUSB0 -c avrisp -b 19200 -U lock:w:0x0F:m

Programmer directement un arduino (Bitbang FT232)

Note: Je n'ai pas personnellement utilisé cette technique, ce que vous vous apprêtez à lire n'est donc que ma compréhension résultant de mes lectures. Cela-dit de nombreux témoignages existent sur sa viabilité et elle est visiblement beaucoup utilisée.

Une autre méthode pour reprogrammer le bootloader de votre arduino est la technique dite BitBang. Elle utilise un mode particulier du chipset FTDI présent sur les arduino. Ce mode permet de jouer directement avec les pattes de sorties du chipset et ainsi de l'utiliser pour simuler un programmeur ISP.

Le principe est donc de relier les pattes du FTDI au connecteur ICSP de l'arduino. pour cela il vous faudra souder une barette sur les trous 1 à 4 nommés X3 sur votre arduino. Puis d'établir les connexions nécessaires avec le connecteur ICSP dont nous avons déjà parlé.

La deuxième étape est de patcher avrdude pour lui ajouter un nouveau programmeur[14]. Et enfin de reprogrammer celui-ci avec avrdude en lui donnant le bon fichier .hex à manger.

L'énorme avantage de cette méthode est bien entendu que vous n'avez besoin que d'un seul arduino, et qu'il peut donc se reprogrammer lui-même. Les inconvénients sont que vous devez souder sur votre arduino et utiliser un autre avrdude que celui fournit avec l'environnement de programmation standard.

Pour plus de détails, je vous renvoi vers les liens suivants :

Un vrai programmeur

Pour autant que ces techniques soient amusantes leur mise en place et utilisation devient vite assez lourde. Cela est très bien pour un besoin ponctuel, mais pour une utilisation régulière, je ne saurais trop vous conseiller d'acheter un vrai programmeur de µC. Pas besoin de dépenser des centaines d'€ pour cela. On trouve facilement des programmeur ISP pour pas cher. Notons en particulier le USBtinyISP de LadyAda[15]. Une simple recherche avec stk500 ou avrisp vous renverra aussi une foultitude de résultats sur un site d'enchères bien connu.

Ainsi, vous économiserez un arduino et vous vous simplifierez la vie. Plus rapides, plus sur et plus transportables, ils ont tout pour plaire. Il ne vous reste alors qu'à prévoir un connecteur ISP sur vos montages et hop. On peut aussi réaliser un petit adaptateur comme ci-dessous pour l'utiliser facilement sur une plaque à essais.

montage

Voila, félicitations aux courageux qui sont arrivés jusqu'ici, et si vous avez des questions ou des remarques, les commentaires sont ouverts[16].

Notes

[1] oui, je sais c'est plus qu'un µC (régulateur, liaison usb ...)

[2] ie: charge le code dans la mémoire fash

[3] par une fausse manip

[4] cas d'un atmega neuf

[5] basé sur le passage de DTR au niveau bas

[6] il est actif à l'état bas, vous l'aurez compris

[7] 330ohms pour mes leds

[8] tel celui de ladyAda

[9] dans /usr/share/arduino/hardware/arduino/ chez moi

[10] dans ~/.arduino

[11] en gardant le même ordre pour les options -U

[12] chez moi dans /usr/share/arduino/hardware/arduino/

[13] soit /usr/share/arduino/hardware/arduino/bootloaders/ chez moi

[14] à utiliser via l'option -c

[15] je vous jure, que je n'ai pas d'actions chez AdaFruit !

[16] Je ne pouvais pas finir sans une dernière note de bas de page :)

mardi 14 juin 2011

Lecture de bandes magnétiques

CML'autre jour dans le train, je lisais Open Silicium #2 et j'ai été effaré de lire que le numéro de carte bancaire se retrouvait sur la bande magnétique des billets SNCF. Ni une, ni deux, uns fois mes pénates retrouvées, j'ai voulu en avoir le cœur net !

Ne voulant pas acheter un lecteur de carte, je me suis intéressé à la méthode Batagllia présentée au paragraphe 2.1 Le principe est simple, on utilise une tête de lecture telle qu'on en trouve dans les lecteurs de K7 audio, sur laquelle on soude une prise jack elle-même branchée sur l'entrée micro d'une carte son. Un logiciel se charge alors d'interpréter le signal reçu en données intelligibles. L'auto-radio que j'avais au fond de mes cartons étant un CD, je me suis tourné vers la fausse K7 que j'utilise pour brancher mon lecteur MP3 dans la voiture.

Je ne vais pas détailler le processus entier, je vous renvoi plutôt vers une série de liens en fin d'article, outre bien sur Open Scilicium déjà cité. Vous pouvez aussi regarder la vidéo suivante.

Côté résultats, la lecture de cartes marche plutôt bien. J'ai réussit à lire des données sur toutes celles que j'ai essayés : carte bancaire, tickets de parking, cartes de fidélité, cartes d'accès etc... Il faut quand même attraper le coup de main pour passer la tête de lecture à la bonne vitesse.

CMQuand aux billets de train, j'ai eu plus de mal, plusieurs lectures donnant parfois des résultats différents. J'ai tout de même réussit à voir pas mal d'informations telles que les gares de départ et d'arrivée, le prix, le numéro de train etc...

Par contre, pas de numéro de carte bleue ! Bonne nouvelle ! Soit les données sont déjà perdues (bande LoCo), soit elles ne sont pas présentes sur tous les type de billets. Ceux de mes tests ayant été acheté via internet et livrés à la maison.

Voila, un petit hack simple et facile, mais il est toujours amusant de regarder ce que l'on n'est pas censés voir ;)

Liens

vendredi 29 octobre 2010

Décoration rétro-geek

Au fond d'un carton, j'ai retrouvé une pile de vieilles disquettes. D'une utilité douteuse, elle me faisaient quand même de l'œil. Il me reste bien un PC avec le lecteur adéquat mais il faut le rebrancher. Et puis, 1.44Mo, à l'heure ou la moindre petite clef USB fait 4Go ...

disquettes

Mais tout de même, à une époque elles ont tenues une grosse place dans mon univers informatique. Que d'heures passées à faire des copies bercé par le doux son du lecteur. Que de montées d'adrénaline en reconnaissant le bruit caractéristique du secteur illisible ... Ma nostalgie m'empêche de les jeter ! Je leur doit de les recycler.

Et puis elles me sont apparues telle qu'elles sont, des carrés tous identiques, de couleurs variées. Mais bien sur, ce sont des pixels ! Et vu leur taille la résolution ne doit pas être bien élevée. Des gros pixels, une faible résolution, la nostalgie ... elles se sont évadées d'une borne d'arcade ! Mais pas n'importe laquelle : Space Invader !

Une fois la révélation faite, le reste est simple, quelques étiquettes décollées pour leur rendre leur pureté originelle, un peu de double-face et les voila enfin de retour à leur état naturel.

disquettes

Avouez qu'il a de la gueule mon crabe :)

disquettes

vendredi 22 octobre 2010

De l'utilisation de Sketchup pour l'aménagement intérieur

En voyant l'article de Nicolas sur le planet made-in-fr, je me suis rappelé un article en cours depuis quelques mois. Voici donc l'occasion de le finir :)

Background: notre cuisine est plutôt petite et ouverte sur la pièce de vie principale. Ce qui veut dire, peu de rangements et un besoin d'organisation pour que le bordel ne se voit pas. Pour cela nous avons prévu une petite arrière-cuisine qui se doit d'être aménagée au mieux avec des étagères. Seulement cette pièce est très torturée possède un vélux, deux sous-pentes perpendiculaires et héberge le four. Exit donc les aménagements tout fait ou les étagères Ikea. Nous allons devoir faire du sur-mesure.

Sketchup

Jusqu'à présent, j'ai toujours commencé par des représentations en 3D à main levée suivis de plans à l'échelle, le tout sur papier (par exemple pour la cuisine). Jusqu'à ce que je découvre Sketchup. Pour ceux qui ne connaissent pas :

Google SketchUp est un logiciel de modélisation 3D, d'animation et de cartographie orienté vers l'architecture. Initialement édité par la société @Last Software (racheté par Google depuis lors), ce logiciel se caractérise par des outils simples (rotation, extrusion, déplacement, etc.), qui en font un logiciel de 3D très différent des modeleurs 3D classiques.
source: Wikipédia

Après une courte phase d'apprentissage[1] on se retrouve très rapidement capable de modéliser des pièces, des meubles à l'échelle. Vous pouvez positionner facilement les cotes, faire différents essais, voir votre mise en place sous tous les angles, gérer les alignements ...

100 fois sur le métier, remettez votre ouvrage, n'a jamais été aussi facile :)

Une fois la modélisation faite, le maitre d'ouvrage[2], peut étudier la proposition sous tous les angles. on est donc sur que cela conviendra parfaitement aux besoins avant de commencer quoi que ce soit. Et ça n'a pas de prix :)

Un autre énorme avantage dans mon cas : le calcul automatique des cotes. J'ai commencé par modéliser ma pièce biscornue. une fois fait, j'ai positionné chaque étagère à sa hauteur (en fonction de ce que l'on voulait mettre dessus) sans me préoccuper de leur taille[3]. Enfin il m'a suffit de positionner les cotes pour avoir directement la taille de chaque morceau de bois ! Au final, lors de la découpe, je n'ai pas eu plus d'un cm de décalage par rapport aux plans.

Dernier point, l'optimisation des découpes. C'est toujours la galère de calculer combien de planche de CP il va falloir pour minimiser les pertes. On peut découper à l'échelle les étagères en papier et les positionner sur d'autres plus grandes. On peut aussi sortir la calculette et attraper un mal de tête. Avec Sketchup, on fait pareil mais plus facilement et sans papier ni aspirine :) Et hop, un plan de découpe !

Réalisation

Malheureusement, je n'ai pas de photos de la construction. Voici quand même quelques détails sur celle-çi.

Les étagères sont en contre-plaqué de 20mm. La portée étant très grande (2.44m au plus) et le poids prévu aussi (conserves, four, bouteilles d'eau), le CP apporte une rigidité bien venue. Pour les plus grandes, j'ai même ajouté une cornière en acier sur l'avant histoire de renforcer encore cela.

Elles reposent, pour toute la longueur, sur des tasseaux fixés au mur. Ces tasseaux sont biseautés[4] pour s'adapter à l'angle de la sous-pente. Les cotés des étagères sont biseautés de la même manière.

Une série de "poteaux" placés entre chaque étagère limitent la portée sur l'avant. Ainsi l'accès est maximisé et la surface est très peu compartimentée. La tranche de chaque étagère est embellie d'une baguette simplement clouée pour cacher la feuillure du CP et arrondir les angles.

Au final, c'est très logeable et très solide[5] et le maitre d'ouvrage est satisfait.

Notes

[1] les tutos vidéo sont super

[2] comprendre madame

[3] alignement automatique !

[4] merci la scie circulaire sous table

[5] je monte dessus sans que ça bouge

dimanche 26 septembre 2010

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 :)

lundi 31 mai 2010

Ralentir enfants

panneau

un beau FAIL pendant une balade à vélo

jeudi 27 mai 2010

Un peu de mécanique

tableauPoint de moteurs ou d'arbre à cames ici, ce qu'on appelle mécanique dans le monde du hardware concerne toutes les pièces qui ne sont pas électroniques. Par exemple les boitiers, la face avant d'une carte, le châssis ... Et dans notre cas, une baie 19' fait maison.

Quand j'ai fait l'électricité dans notre maison, j'ai décidé de faire en même temps un câblage basse tension complet. Il peut servir à tout ce que je veux, ethernet bien sur, mais aussi téléphone, capteurs déportés, liaisons séries etc... L'idée était donc de banaliser tout cela en câble ethernet et prises RJ45, le tout revenant vers la GTL en une armoire de brassage. Celle-ci doit regrouper les platines de brassage, un switch ethernet, le répartiteur téléphonique et les équipements communicants. On peut alors affecter une prise à une fonction simplement en la brassant vers l'équipement adéquat.

Au vu de la quantité de prises prévues[1] le mieux était de s'orienter vers du matériel professionnel en 19'[2]. Mais une baie 19' prend beaucoup trop de place et coute 1 bras. J'ai donc décidé de faire cela sur mesure.

Le matériau de base se trouve partout : des cornières perforées prévues pour monter des étagères métalliques. On choisira le modèle avec des trous larges permettant de s'adapter facilement à l'entraxe des équipements 19'. Dans mon cas, deux cornières furent suffisantes. Il suffit alors de découper aux dimensions voulues, ici du 4U : 2 platines 1U, un switch 1U et un dernier U pour des équipements actifs.

Un petit montage à blanc :

montage à blanc

et on peut passer à l'installation. Chaque morceau en contact avec le mur est solidement fixé. Il ne s'agit pas que tout tombe[3] ! Les cornières sont reliées par des boulons et les coins sont renforcés par des équerres métalliques prévues pour. le cadre est bien entendu relié à la barrette de terre.

Emplacement prévu On fixe bien au mur Ecrous/boulons plus renforts de coin Et hop avec les platines RJ45

Si la construction de la baie n'a durée qu'une nuit, le câblage des platines s'est déroulé sur plusieurs mois au fur et à mesure des besoins. Sur la photo finish on retrouve tous les composants du schéma ci-dessus :

  • platines de brassage à gauche
  • switch netgear en bleu
  • répartiteurs téléphone fixe et adsl en haut
  • box adsl[4]
  • le DTI (beige tout en haut)

et scotché sur la porte les plans qui permettent de retrouver toutes les prises :)

pas fini mais déjà en service état actuel

Voila, et pour le fun, une dernière photo de la GTL avant câblage :)

Notes

[1] 33

[2] pas trop cher sur ebay

[3] et comme tout bon bricoleur du dimanche, je blinde!

[4] je vous laisse deviner le FAI :)

jeudi 13 mai 2010

Liaison série : RS232 vs TTL

Un petit article pour rappeler quelques bases, ça ne fait jamais de mal. Outre les niveaux de voltage tension, il existe une autre différence de taille entre le RS232 et le TTL, la représentation des 0 et des 1 ! Tout le monde le sait[1]. Mais habitués que nous sommes à utiliser des MAX232 & co[2], quand il s'agit de manipuler les signaux, il arrive qu'on mette du temps à s'en souvenir[3]. Vous l'aurez compris, cela m'est arrivé récemment :) Donc petit rappel.

La liaison série RS232 utilise pour représenter le 1 un niveau compris entre -3V et -25V et pour le 0 entre +3V et +25V. Généralement en sortie de nos PC on trouve -12V et +12V.

En TTL par contre le 0 est représenté par une tension entre 0 et 0.7V alors que le 1 est entre 2.2V et 5V.

La conversion ne se borne donc pas à ramener les -12/+12 vers 0V et 5V, il faut aussi inverser les signaux[4] !

Preuve par l'exemple, voici un port série de PC branché sur un MAX3235 le tout relié à un oscillo.

montage

En rouge, channel 1, une sonde x10 sur le fil 3 de la DB9, Tx du RS232 donc. En bleu, channel 2, une sonde x10 sur la patte 1 du max3235 soit Rx en TTL. Du PC, on envoi 2 caractères C en 9600-8N1. Nous sortons à l'oscillo la jolie trace suivante : trace

  • En Idle la ligne est à 1, -10V en RS232 et +5V en TTL
  • le bit de start S passe à 0
  • les 8 bits de données pour C, caractère ascii 0x43 soit b01000011, sachant que le LSB est transmit en 1er
  • le bit de stop S' à 1
  • le caractère suivant ...

Voila, voila, du très simple, la base, mais si cela permet à quelqu'un d'éviter de perdre autant de temps que moi, c'est déjà cela de gagné :)

Aller et pour essayer de donner un peu de contenu à cet article, j'ai trouvé des vidéos sur l'utilisation de l'oscilloscope très bien faites. C'est chez BTCinstrumentation.

Notes

[1] ou au moins l'a su

[2] on préfèrera les nouveaux modèles sans capa externes !

[3] surtout la nuit

[4] youhou, coucou la NAND

mardi 9 février 2010

Don de livres

Il y a quelques temps, j'ai récupéré dans une poubelle au boulot des livres techniques (comment peut-on jeter des livres !!!) Malheureusement le besoin de place se fait cruellement sentir sur mes étagères et il faut donc m'en débarrasser :(

Ce sont principalement des manuels de référence hardware pour i386, i486, PowerPC divers ... La liste complète. Voir aussi le thread sur fr.comp.ordinosaures

A prendre en main propre dans le 22, ou par la poste contre FdP. J'ai mis le poids approximatif à côté de chaque livre pour pouvoir estimer les frais.

Je peux scanner les tables des matières à la demande.

A vot' bon cœur

Éditer des fichiers XML en ligne de commande : xmlstarlet

Présentation

XML!!!!

De nos jours, nous sommes cernés de fichiers XML. Ils sont présents partout que ce soit pour les préférences des applications (gconf pour Gnome) les fichiers en rapport avec les GPS (GPX, KML), les descriptions d'interface graphiques (Qt UI, GTK Glade, Mozilla XUL), les documents (OpenOffice ODF Microsoft OOXML) etc... La liste serait sans fin.

Je ne rentrerai pas ici dans les considérations polémiques sur le bien fondé de ces choix, mais les faits sont la : nous devons faire avec. Il est relativement facile d'écrire une application capable de travailler avec ces fichiers, les langages de haut niveau proposent tous des API dédiées plus ou moins simples. Même en C la libxml2 rend cela relativement facile.

Mais la complication vient lorsque l'on veux travailler en shell. La ou des fichiers à plat étaient faciles à utiliser avec sed/grep/awk et quelques regex bien senties, le XML est une horreur sans nom. Sortir le Python ou le Perl n'est pas toujours possible (disponibilité sur la plateforme, versions datant de Mathusalem ...). Dans ces moments, on se rabat souvent sur bash[1]. Et c'est la que xmlstarlet va vous venir en aide. Il s'agit d'un programme en ligne de commande qui va se charger du parsing XML et vous permettre de lire et modifier facilement[2] vos fichiers.

Installation

xmlstarlet devrait être disponible dans toutes les bonnes crémeries[3].

Par exemple pour ArchLinux, il est dans AUR

yaourt -S xmlstarlet

Ou bien pour debian et dérivées

aptitude install xmlstarlet

Sinon, il est fourni dans une version portable compilée statiquement avec la libxml2 et la libxslt. Téléchargez le rpm xmlstarlet-1.0.1-1.i586.rpm sur SourceForge. Il suffit alors de le décompresser dans un répertoire temporaire avec la commande[4] :

rpm2cpio xmlstarlet-1.0.1-1.i586.rpm | cpio -idmv

et de récupérer le binaire présent dans ./usr/bin/xml

Utilisation

hello

Nous allons nous contenter de lire et de modifier des valeurs et des attributs. Pour une utilisation plus avancée, allez lire la documentation.

Comme exemple, nous allons utiliser un fichier UI de Qt très simple. Une boîte de dialogue avec un bouton sans layout ni rien.

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="text">
    <string>Hello</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Lecture

Commençons par regarder la structure :

$ xml el hello.ui
ui
ui/class
ui/widget
ui/widget/property
ui/widget/property/string
ui/widget/widget
ui/widget/widget/property
ui/widget/widget/property/string
ui/resources
ui/connections

Nous retrouvons ici tous les champs de notre fichier XML. Ce sont ces chaines de caractères qui vont nous permettre d'accéder aux valeurs à lire et modifier.

On peut aussi regarder les paramètres '-a' et '-v' qui donnent plus d'infos sur la structure. (attributs et valeurs). Par exemple pour le bouton :

$ xml el -v hello.ui
...
ui/widget/widget[@class='QPushButton' and @name='pushButton']
ui/widget/widget/property[@name='text']
ui/widget/widget/property/string

Maintenant, si nous voulons voir le texte du bouton, on va utiliser la commande 'sel' :

$ xml sel -t -v "/ui/widget/widget/property/string" hello.ui
Hello
  • sel: pour selectionner un chemin (xpath)
  • -t: requête dans le document
  • -v: on veux la valeur
  • /ui/widget/widget/property/string : c'est le chemin que nous cherchons.

Alors bien sur ici, nous n'avons qu'un seul bouton. Mais il faut pouvoir caractériser plus finement a chaine recherchée. C'est à dire la property text du widget dont le nom est pushButton. Cela donne donc :

$ xml sel -t -v "/ui/widget/widget[@name='pushButton']/property[@name='text']/string" hello.ui
Hello
  • widget[@name='pushButton'] nous permet de dire que l'on cherche le widget dont l'attribut name est pushButton
  • idem pour property[@name='text']

On peut aussi chercher les valeurs des attributs. Quelle est la classe de ma fenêtre principale ?

$ xml sel -t -v "/ui/widget/@class" hello.ui
QDialog
  • @class: nous cherchons l'attribut class de widget

Modification

Maintenant, nous allons utiliser la commande 'ed' pour modifier notre fichier XML.

$ xml ed -u "/ui/widget/widget[@name='pushButton']/property[@name='text']/string" -v GoodBye hello.ui
...
      <property name="text">
        <string>GoodBye</string>
      </property>
...
  • -u: update
  • -v: nouvelle valeur

De même pour changer un attribut, par exemple, le nom de notre bouton :

$ xml ed -u "/ui/widget/widget[@name='pushButton']/@name" -v btn hello.ui
...
    <widget class="QPushButton" name="btn">

Voyez aussi les options :

  • -i: pour insérer un élément
  • -d: pour effacer un élément
  • ...

Voila, avec ces quelques commandes simple, on peut déjà sortir quelque chose de ces fichiers XML à partir d'un petit scrip shell. xmlstarlet permet d'en faire beaucoup plus, je vous renvoi donc une nouvelle fois vers la documentation

Notes

[1] ou pire csh :(

[2] enfin, relativement, on parle quand même d'XML la !

[3] votre gestionnaire de paquet favoris

[4] Sous ArchLinux, il existe un script rpmextract.sh qui fait le boulot

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 >