[R-Pi] RPi-kee – Partie 2 :Electronique

L'ensemble des composants, sans la partie méca, dans la petite boite de transport

Cet article fait suite à celui là : RPi-kee – Partie 1 :Généralité et Mécanique.

Electronique

Voilà une partie un peu plus « sensible ». Faire un montage en Meccanos et le rater, ce n’est pas grave. On démonte et on recommence. En élec, c’est un peu plus touchy. Soit, un mauvais montage peut juste ne pas fonctionner, mais peut aussi cramer des composants, voir le Raspberry Pi lui-même. Je n’ai qu’un seul modèle B+, et je n’ai pas envie d’en racheter un… tout de suite.
Tiens, à propos de composants, voyons voir de quoi a-t-on besoin, par fonction :

– Premier besoin impératif dont je n’avais pas encore parlé : pouvoir tester avec des fils…

=> Oui, dit comme ça c’est pas clair. On le sait tous, le Wifi (de surcroit en USB), c’est de la merde, et les batteries ça se décharge. J’ai donc deux interfaces réseaux sur le Raspberry Pi : une clé wifi et le port Ethernet. Concernant l’alimentation, j’ai la possibilité d’alimenter le Pi soit par son port micro USB avec un chargeur de téléphone portable (pas forcément très généreux en milli Ampère), soit par les GPIO. L’avantage de l’alimentation via les GPIO c’est que l’on peut brancher une grosse source de courant sur l’ensemble des composants, dont le Pi.
Si l’alimentation passe au travers du Pi pour alimenter le reste, le pauvre risque d’avoir chaud. Bref, pour toute la partie mise en place et premier essai, il est plus prudent d’avoir une alimentation externe.

– Piloter l’ensemble, communiquer, contrôler, commander

=> Le Raspberry Pi, bien évidement. Un modèle B+ pour être précis. J’aurai très bien plus prendre un B (voir un A, qui est un B sans port Ethernet, avec un seul port USB et 256 Mo de RAM), mais la quantité de truc que je cherche à interfacer m’a fait dire qu’un B+ et ses multiples GPIO et sa liaison SPI (bus de communication série très utilisé pour l’interfaçage de composants) en rab m’ont fait dire que ça serait plus confortable. Et puis le B+ et le B coute le même prix. Pourquoi se priver ? Et pour les trois fanboys du fond qui me demande pourquoi je ne suis pas partie sur une Beagleboard, un Arduino ou le dernier PC embarqué d’Intel, je répondrais que c’est la communauté et le support autour du Raspberry Pi qui fait la différence. En cas de pépin, c’est sympa de trouver des topic [RESOLU] et [SOLVED] sur les forums adéquat. Pour aller avec, bien évidemment, une blinde de développement logiciel.

– La possibilité de suivre une ligne au sol

=> La Camera Pi. Le RPi possède un port permettant de connecter une caméra de 5mpixel, fabriqué par la fondation Raspberry Pi. Elle est donc parfaitement compatible, de pas mal de doc, et j’ai déjà un peu d’expérience avec.

– Détecter les obstacles à proximité

Bidouille diverses

=> On aurait pu croire que la camera aurait pu servir à cet endroit-ci, mais en fait, bof. En effet, le traitement d’image c’est quand même un peu lourd, et surtout, c’est assez moyen pour la mesure de profondeur. J’ai donc choisi 2 capteurs infra-rouge de mesure de distance. Un permettant la mesure de 20cm à 120cm (GP2Y0A02YK, de Sharp), un autre de 100cm à 550cm (GP2Y0A710K0F, Sharp aussi). Ils seront donc mis sur la face avant du robot pour avoir une info sur ce qui se trouve en face. Il sera probablement possible de faire un scan de l’environnement en faisant tourner le robot sur lui-même. Voir de monter le couple de capteur sur une tourelle. Pour les plus curieux de la technique, je précise que j’ai pris deux capteurs et non pas un de 0cm à 550cm, parce que ça n’existe pas ! En effet, la portée de la mesure dépend de l’écart entre l’émetteur IR et le récepteur. J’ai dimensionné la portée maximale de la mesure par rapport à … ben, la largeur des pièces de mon appartement. Raison simple, non ? A part ça, ce sont des capteurs qui s’alimentent en 5V et qui renvoi une tension inversement proportionnel à la distance, et de surcroit, en fait, de façon pas linéaire du tout. Le Raspberry Pi ne disposant pas d’outils de mesure de tension, j’ai donc également pris un ADC (Analog to Digital Converter, Convertisseur Analogique Numérique en français, soit CAN, mais ce terme est pourri dans le monde de l’embarqué parce que ça confusionne avec le bus CAN de Bosch qu’on trouve dans toutes les bagnoles entre autres). L’ADC est un MCP3008 de chez Microchip, qui s’interface sur un bus SPI, dont dispose le RPi ça tombe trèèès bien.

Le banc de caarctérisation des capteurs IR

– Se balader de façon autonome (même si aléatoire)

=> Le Raspberry Pi intervient dans le pilotage, et pour le côté sans fil, j’ai une clé wifi et une batterie externe de téléphone mobile assez costaude de 12000mAh, capable de délivrer 2A. D’après mon 6ème sens (ouais, un truc de techos, tu peux pas test) ça devrait tenir plusieurs dizaines de minutes sans aucun problème, voir beaucoup plus. Une fois que j’aurai fini le montage complet full option, je ferais un benchmark.

– Avancer

– Reculer

– Tourner

=> Et oui, c’est important ça ! Des moteurs ! Au départ j’ai pris 2 moteurs pas-à-pas unipolaire de 5V. Pourquoi ? Parce que j’avais trouvé un tutoriel pour les connecter au Raspberry. Il faut les connecter au travers d’un ULN2803A qui est un composant se plaçant entre les moteurs et le Raspberry. Un moteur, ça consomme bien plus que ce que Pi est capable de cracher. Après mes premiers essais avec la structure complète, j’ai réalisé qu’ils étaient trop faibles pour la déplacer. J’ai donc investis dans des moteurs équivalents en 12V, unipolaire donc. L’avantage c’est que c’est compatible directement avec le câblage existant (à la tension d’alimentation près), et que ça apporte 66% de couple en plus (pour 140% de tension… mouais, ce n’est pas aussi efficace mais j’m’en fous pour le moment). Tout mon petit bazar étant prévu pour fonctionner avec la batterie 5V. Et là, astuce, le rehausseur de tension U3V50ALV capable de transformer 3V minimum vers 4 à 12V me sauve la mise ! En revanche, ça fait passer la motorisation du robot à la première place potentielle du composant qui suce le plus. Ici encore, il faudra avancer précautionneusement. Quand j’ai testé les moteurs 5V, j’ai alimenté le montage via le RPi. Il bien tenu le coup, mais il faudra sûrement que je ne branche pas la batterie directement sur lui pour le faire fonctionner en continu avec les moteurs 12V.

– Monitorer certaines grandeurs physiques propres (tension d’alimentation, température)

Atelier soudure et instrumentation...

=> Ici également, c’est l’ADC qui fait le taf. A noter que l’ADC ne fait pas une mesure de tension absolu; en fait, il compare un signal par rapport à une entrée de référence (Vref). Donc si vous lui mettez en entrée la tension de la batterie, et que vous mettez en Vref la tension de la batterie … et bien l’ADC vous dirait que l’entrée est en permanence à 100% de Vref. Sauf que votre batterie elle aura son niveau réel qui va gentiment passer de 5V à plus rien, sans que votre ADC le voit. Pour info, le fonctionnement d’une batterie, c’est que ça reste longtemps à 5V, puis en fin de course ça descend d’abord doucement vers 4,9V puis 4,8 , 4,7 et paf, il ne reste plus assez pour votre électronique qui se met à fonctionner bizarrement, jusqu’à ce que votre système s’éteigne peu après. Là encore, il va falloir faire des mesures pour voir comment la batterie se comporte et ainsi pouvoir monitorer efficacement sa tension.

Ah d’accord, mais ça ne résout pas le souci de Vref ! En fait ce n’est pas si compliqué, j’ai résolu la question avec un régulateur de tension, un L7805CV. Un composant qui à la brillante idée de sortir 5V constant pourvu qu’on lui rentre plus que 5V… et moi j’ai du 12V qui traine. L’inconvénient du truc, c’est que ça fait encore une nouvelle source de consommation, mais que même si le 12V subit des variations, le 5V sera constant. Parfait pour mon Vref.

Pas de bol, je ne suis pas sur de garder l'écran...

Au passage, pourquoi ne pas monitorer le 12V également ? Avec 2 résistances on fait un petit montage qui fournira 2/3 de 12V, et qui variera de façon linéaire avec lui. Oui, c’est un pont diviseur de tension, montage que les électroniciens apprennent la plupart du temps avant même de savoir lire.
Les températures mesurables sur le système sont la température du processeur du Pi, et j’ai également dans mon stock une sonde 1-Wire DS18B20. C’est une sonde « numérique » qui se branche sur une GPIO du Raspberry Pi. Le noyau linux de l’OS Raspbian permet de discuter sans soucis avec ce type de sonde. On peut même placer plusieurs sondes sur le même fil et ainsi monitorer plusieurs emplacement. Pourquoi ne pas, donc, mettre une sonde plaquée sur chaque moteur, sur le rehausseur de tension, une autre suffisamment éloigné pour mesurer la température ambiante, et j’en passe. Dans mon cas, c’est du nice to have, et je m’en occuperais plus tard.

– Fonctionner dans le noir

=> La Camera Pi de base dispose comme tous les capteurs photos du monde ou presque un filtre infrarouge, permettant de supprimer les longueurs d’onde infrarouge proche. En effet, les capteurs photos sont sensibles par nature à ce type de rayonnement. Pour rappel, on ne parle pas ici de l’infrarouge lointain, celui qui sert aux caméras thermiques. Pour l’observation nocturne, les p’tits gars de la fondation Raspberry ont également sorti la Camera Pi NoIR (et nous, petit frenchy, pouvons profiter de cet adorable jeu de mot), une Camera Pi strictement identique à la première d’un point de vue électronique et informatique, mais dépourvu de filtre infrarouge. Le meilleur moyen dans profiter pleinement est donc de coupler cette caméra à un projecteur infrarouge. Et comment fait-on cela ? Avec des LED infrarouge, tout simplement. Le seul hic dans l’histoire, c’est que la caméra et les capteurs de distance risque de s’entre perturbé. Il conviendra donc de gérer leur fonctionnement de façon à éviter que les capteurs soient éblouis par le projecteur.

Le plan de câblage prévu, réalisé avec FidoCADj

Petit résumé sans tout le blabla justificatif de design :

– Piloter l’ensemble, communiquer, contrôler, commander
=> Un Raspberry Pi B+

– Détecter les obstacles à proximité
=> Un ADC MCP3008 en SPI, un capteur de distance IR 20cm à 120cm (GP2Y0A02YK, de Sharp), un autre de 100cm à 550cm (GP2Y0A710K0F, Sharp aussi).

– Se balader de façon autonome (même si aléatoire)
=> Un dongle Wi-Fi USB, une batterie 12000mAh

– Avancer
– Reculer
– Tourner

=> Un rehausseur de tension U3V50ALV, un ULN2803A, deux moteurs pas-à-pas 12V unipolaire

– Monitorer certaines grandeurs physiques propres (tension d’alimentation, température)
=> Le même ADC MCP3008 en SPI, un régulateur de tension, un L7805CV, 2 ou 3 résistances, sonde 1-Wire DS18B20

– La possibilité de suivre une ligne au sol
– Fonctionner dans le noir
=> Camera Pi NoIR + LED infrarouge

Savoir cablant en suivant son plan...

– Matériel annexe
=> Une breadboard, des fils pour la breadboard mâle-mâle, des femelle-femelle, un fer à souder, de l’étain, des tournevis, etc.

Au final je n’aurai plus qu’à aborder la partie logicielle, histoire d’avoir fait le tour sur le démarrage du projet ! Au passage, je signale que la plupart des concepts d’électronique ne sont pas bien compliqué, et qu’un débutant motivé avec Google peut faire la même chose, voir mieux sans soucis.

[R-Pi] RPi-kee – Partie 1 :Généralité et Mécanique

J’avais déjà commencé à en parler un peu à droite à gauche, évoquer deux ou trois idées de réalisation, mais voilà, je me suis lancé, j’ai quelque chose qui commence à être montrable, et donc je le montre. L’article faisait une 10 pages, je me permettrais de le publier en 3 fois.

RPi-kee

Un peu d’histoire d’abord, pourquoi RPi-kee ? Il y a bien longtemps, quand j’étais étudiant, j’avais fait mon projet de fin d’étude sur le thème « IHM Innovantes, télé opération d’un robot via un terminal sans-fil ». J’en ai déjà parlé 50 fois ici et , mais pour les retardataires, un bref résumé s’impose.

Le Pekee

Nous sommes en 2006, je viens d’avoir une Nintendo DS Lite, et je souhaite faire un peu plus de chose que poutrer des Aliens dans Metroid et cueillir des noix de coco dans Animal Crossing. Je découvre alors le monde fabuleux des linkers Slot 2 avec leur carte Compact Flash qui déborde de la console, et surtout le développement d’application Homebrews. C’est de là que me vient l’idée d’utiliser la console pour un projet de fin d’étude, et je découvre alors que le département Système Embarqué de mon école dispose d’un « petit » robot, le Pekee. C’est un machin en forme d’aspirateur qui, au moment où je le découvre, possède le fonctionnement suivant : le robot se connecte à un point d’accès wifi, on connecte un PC sous Linux au même réseau et on le pilote avec un petit programme en C++. Je vous passe tout le développement, mais au final on termine avec une DS qui possède six interfaces différentes (boutons physiques, boutons virtuels, cercle de contrôle, accéléromètre, reconnaissance de dessins et reconnaissance vocal low cost) qui dialogue avec le PC, qui transfère les ordres au robot. Ça marche plutôt pas mal, et ça plait, si j’en crois les 270k vues sous YouTube. Pas mal pour l’époque, surtout que toutes les interfaces qu’on propose sont arrivés avant le monde des smartphones (et oui, début 2007, point d’IPhone, si si, rappelez-vous).

Au final si la partie IHM de contrôle est réalisée, toute la partie robot est déjà existante, et surtout, pas à moi. A 6000€ le bestiau, hors de question d’investir mes deniers. A l’époque, je m’étais dit qu’un jour, je ferais le robot qui va avec. Sans trop savoir comment.

Raspberry Time !

Premier montage avec une sonde de température

Après mes études, j’ai continué dans les systèmes embarqués professionnellement parlant. J’ai donc appris plein de chose, découvert des processeurs divers, mais au final ils nécessitent la plupart du temps une carte électronique faite pour et je n’ai pas les moyens ni l’envie de partir dans la réalisation de carte, et pas envie de mettre des sous dans des cartes d’évaluation aux possibilités limitées par des IDE bloqués par des licences hors de prix.

C’est alors que vint le Saint Graal de l’électronique domestique, le Raspberry Pi. Plus versatile et moins complexe à mettre en route que les Arduino, plus puissant, prêt à l’emploi, pas cher, bref, pile poil ce qu’il me fallait. Le nom du projet est donc un mélange de Pekee et Raspberry Pi.

RPi-kee, le cahier des charges

La base que je désirais pour RPi-kee, c’était de faire au moins ce que je faisais faire au Pekee, c’est à dire :

  • Avancer
  • Reculer
  • Tourner
  • Etre compatible d’un point de vue communication avec le « protocole » qu’on utilisait entre la DS et le PC sous linux.

Le truc est un robot mobile, donc tant qu’à faire :

  • Fonctionner sur batterie
  • Etre connecter au réseau en Wi-Fi

Au fur et à mesure que je cherchais comment faire ça, j’ai également découvert pas mal de chose sur le Raspberry Pi, et connaissant ses possibilités, j’ai donc décidé de rajouter quelques fioritures comme :

  • La possibilité de suivre une ligne au sol
  • Détecter les obstacles à proximité
  • Se balader de façon autonome (même si aléatoire)
  • Lancer des frappes nucléaires sur les Etats-Unis
  • Monitorer certaines grandeurs physiques propres (tension d’alimentation, température)
    Fonctionner dans le noir

Organisation du projet

Bien évidemment, c’est un projet personnel qui s’étend sur plusieurs domaines de compétences, que je maitrise plus ou moins. Les trois grands axes sont :

  • Réalisation mécanique : qui dit robot mobile dit structure, roue, moteur, etc.
  • Réalisation électronique : un Raspberry Pi c’est cool, mais seul, il n’est qu’un micro PC. Il faut donc lui trouver les composants qui réalisent les fonctions du cahier des charges, et qui soit facilement intégrables dans la troisième partie …
  • Réalisation informatique : de là où j’en suis, c’est la partie la plus conséquente. Avoir des capteurs, des actionneurs et des idées pour en faire quelques choses, c’est bien. Mais coordonnées tout ce petit monde, c’est une autre paire de manche. En revanche contrairement aux deux axes précédents, c’est mon boulot, donc j’y suis nettement plus à l’aise.

Mécanique

Des robots mobiles (je précise mobile, car je ne parle pas de ce qui font la cuisine, ou de la soudure sur poste), il en existe des tas de type. Avec des roues, des chenilles, des bipèdes, quadrupèdes, hexa ou octo, mixte roues/bras, des nageoires, des hélices et j’en passe. Moi je veux un truc simple à réaliser, et je choisis donc le type « char ». Non, pas comme un caractère en C/C++/C#/Java, mais comme le Pekee, deux roues qui permettent d’avancer, de reculer et de tourner en fonction du sens de rotation. Pour tourner on fera donc tourner une roue dans un sens, et l’autre dans le sens opposé. Ca a pas mal d’avantage, comme le faite de pouvoir faire demi-tour très facilement, et d’être facile à réaliser. Prenez une voiture par exemple, deux roues qui avancent/reculent, une/deux roues qui permettent la direction. Si les roues motrices sont simples, mécaniquement la direction est très chiante à réaliser.

La homemade roue folle

Évidemment, pour une question d’équilibre, il faut au moins trois points d’appui, et j’ai choisis une roue folle (mettez en deux, ça fait un caddie de supermarché). A l’heure où j’écris, j’ai réalisé moi-même la roue folle, mais j’ai également acheté une roue à bille. Il faudra que je teste et compare les deux.

Ensuite vient la structure. Son but, pouvoir attaché les différents composants (moteurs, Raspberry Pi, montage électronique) de façon stable et solide. N’ayant pas envie d’être contraint par une structure toute faite achetée dans le commerce, j’ai décidé de la fabriqué moi-même. De plus, j’ai fabriqué l’ensemble de façon à pouvoir désolidariser facilement les composants de la structure. Ainsi, le Raspberry Pi, la plaquette de prototypage (breadboard), la batterie et la caméra se démonte facilement. C’est surtout pour des raisons de modularité. Faire des tests de déplacement sans la batterie est plus facile, car je gagne 300g sur la balance.

Ah, j’oubliais : parce que je n’ai pas d’imprimante 3D, et parce que c’est très pratique, l’ensemble de la structure est faite avec … des Meccanos. Parce que ça donne une côté « Short Circuit », et parce que j’ai beau avoir passé fraichement la trentaine, faire des Meccanos le dimanche, c’est super cool. Et surtout, c’est parfaitement adapter à un proto. Bien sûr, je n’ai pas de modèle, j’ai donc tout construit, déconstruit et reconstruit pas mal de truc. Au final j’ai atteint mon but, avoir une structure permettant le montage et démontage rapide des composants. En revanche, le hic, c’est que c’est assez lourd. Je pourrais me tourner vers les Lego (Technics), mais je crains pour la solidité de l’ensemble. La vie est une question de compromis…

Première version du chassis
V2 du chassis
V2 du chassis, vu arrière, sans électronique de contrôle
Avec l'électronique, la batterie, bref, quasi full option

La suite dans quelques jours …

[RaspberryPi][dev] GCC, optimisations et benchmarks…

Mon Raspberry Pi, c’est mon petit passe-temps quand j’en ai marre de bosser. Mais tout de même, je me rassure en me disant que quand je fais du développement sur le Pi, ça me fait découvrir des trucs divers et variés.
Pour le coup, je suis encore sur ma détection / suivi de mouvement utilisant la Camera Board. L’algorithme général est pas bien compliqué :

  1. Acquérir l’image n-2 et la convertir
  2. Acquérir l’image n-1 et la convertir
  3. Acquérir l’image n et la convertir
  4. Comparer les images n-2 et n-1
  5. Comparer les images n-1 et n
  6. Déduire des deux étapes précédentes s’il y a eu un mouvement
  7. Centrer la caméra vers le mouvement
  8. Sauvegarder les images pertinentes sur le réseau
  9. Renommer n-1 en n-2 et n en n-1
  10. Boucler à l’étape 3

L’étape 7 est faite avec un script en python, les étapes 4, 5 et 6 faites avec un soft en C, le reste, c’est du bash script. Le script générant des fichiers régulièrement, je le fais tourner dans un ramdisk histoire de ne pas pourrir ma flash.
L’idée, c’est d’optimiser un peu le concept. Première piste que j’ai suivi, c’est de lancer en arrière-plan les différentes copies et renommage de fichier lorsque que ça pouvait être fait (genre l’étape 8, mais pas la neuf). En bash c’est pas bien compliqué, suffit de rajouter un « & » à la fin de la ligne. De même, le lancement du script python pour faire pivoter la caméra, je me fous pas mal d’attendre que le mouvement ce termine.

Puis, je me suis mis en tête de mesurer le temps d’exécution du soft en C, qui pour rappel prends 3 images en entrée, et me sort 3 images en sortie (diff entre n-2 et n-1, diff entre n-2 et le mouvement résultant). J’ai pris le timestamp au démarrage du soft et à la fin, une différence entre les 2, un printf, un boucle réalisant 100 fois l’opération histoire de faire un peu de stat’.

Ayant développé l’appli sur un PC, j’ai donc eu comme première mesure moyenne 99ms pour réaliser l’opération (sur un Core i7 3520M @ 2,9GHz), que j’ai ensuite refait sur le Pi à partir de la flash, et j’ai eu 597ms de moyenne (sur un Raspberry Pi 256Mo @ 700MHz). Alors oui… ça fait beaucoup. Puis test en ramdisk, et j’ai eu la surprise de voir que le temps moyen, 624ms est plus élevé qu’en flash ! Je n’ai pas encore compris pourquoi, il faudra que je vois s’il n’y pas une merde dans ma config de ramdisk.

En étant bête et con, j’ai ensuite overclocké le Pi avec l’outil de config fourni avec (raspi-config) à 1GHz. Résultat en flash : 477ms, et en ramdisk 478ms. Conclusion partielle, avec un overclock de 43%, je gagne 23% de perf. Bon, c’est toujours ça de pris.

Enfin, un peu plus malin, j’ai testé de compiler mon soft avec l’option d’optimisation de GCC (gcc -Ox source.c -o mon_exe), qui propose 5 niveaux de vitesse et une optimisation en taille. J’ai gardé l’overclock par flemme de redémarrer le R-Pi, et j’ai fait tourner l’appli en flash. Les résultats oscillent entre 354ms et 328ms, respectivement pour l’optimisation en taille et l’optimisation de niveau trois (-O3).

Avec un overclock et une option en plus dans GCC, je suis donc passé de 597 à 328ms 45% de temps en moins. L’air de rien, c’est pas si mal et ne m’a demandé aucun effort intellectuel d’optimisation de code.

Résumé des différents essais :

Au final, j’ai surtout tenté d’améliorer le temps d’exécution de la comparaison d’image. Mais il y a d’autres points qui pourraient être abordé :

  • Pouvoir lancer des commandes en fond dans le shell script en étant sur que leurs résultats seront prêts quand j’en aurai besoin
  • La comparaison d’image se fait en comparant les images pixels par pixels et couleur par couleurs (une boucle « for » avec 3 comparaisons dedans). Bien que le Rpi soit mono-coeur, peut être qu’on pourrait tenter de paralléliser ces comparaisons, ou bien de ne faire qu’une seule couleur
  • Vérifier que la partie « conversion d’image » est optimal. Pour le moment, je fais une capture en JPG, convertie ensuite et redimensionner en bmp (avec un rapport x16 entre les deux, permettant de créer la miniature bmp en sous échantillonnant les pixels de l’image capturé)

Et pour terminer, vérifier régulièrement que le truc marche encore après toutes ces bidouilles !

[Voyage][Photo][Vidéo] Scanditrip

Tiens, en cherchant un truc sur mon ordi, je suis retombé sur des souvenirs de mon p’tit voyage vers le lointain en Mai 2013, que je me permet de partager un peu à l’arrache :

Donc, en résumé, en Norvège on trouve en autre :

Des rennes (surtout en Mai en fait):



Le phare de Slettnes (le plus septentrionale du continent européen) :


Et également des routes avec pas grand chose autour :


Et une vidéo, aussi…

[youtube]http://www.youtube.com/watch?v=mQK6lJY80vY[/youtube]

[RaspberryPi] Log de température, communication IP et Camera Board

Hop la, le retour du blog ! Dans les épisodes précédents, j’avais expliqué comment mettre en place un serveur de téléchargement. Depuis j’ai un peu changer/améliorer l’installation, d’abord d’un point de vue hardware :

  • Changement du système de fichier du disque « NAS » (ça a l’air de rien, mais ça a ses petites conséquences) sur le Raspberry Pi (que l’on appellera RpiWeb, qui contient les fonctions évoquer dans l’article précédent, à savoir serveur Web, NAS, Seedbox)
  • Installation d’un deuxième Raspberry Pi (que l’on appellera RpiAcq) contenant notamment deux sondes de températures DS18B20 et une Camera Board)
  • Suite à mon récent déménagement j’ai également changé de box Internet, et l’air de rien ça a des conséquences également.
  • Également sur RpiAcq, j’ai installé tout récemment un moteur pas-à-pas (stepper motor outre-manche)

Travaux sur la box

Bon, l’air de rien, ça fait pas mal de choses nouvelles à gérer. Déjà, la box internet. Avant, je routais sagement le port 80 du Rpi sur le port 80 de la Freebox. Mais ça, c’était avant. Maintenant j’ai une BBox (pas Sensation, mais alors pas du tout) que c’est un peu de la merde, pour 2 choses un peu essentiel. Déjà, quand je route le 80 du Pi vers le 80 de la box, ça m’affiche … le port 80 de la box. Ok, je me retrouve donc avec l’interface de config de la box accessible par le monde entier, super safe, et pas vachement pratique pour auto-héberger son p’tit site. Mais bon, j’ai changé le port externe et j’arrive à accéder à mon site sur un autre port, mais ça fait con, et en plus y a que le port 80 qui passe au boulot. Autre incommodité, impossible de se connecter « de l’intérieur » sur le site via l’adresse externe. Problème que je n’avais pas avec la Freebox. Contournement, un favori « RpiWeb interne » et un « RpiWeb externe ». Typiquement le genre de tracasserie qui en soit n’est pas grave mais qui put l’amateurisme. Mais bon, c’est le prix d’un Youtube réactif….

Travaux sur RpiWeb

Bref, concernant le RpiWeb, j’ai également changé le disque du NAS, par un modèle plus gros de récup et formater en ext au lieu de NTFS. L’installation a grandement gagné en stabilité, et si j’avais parfois le disque NTFS qui se déconnectait/démontait tout seul, plus aucun soucis maintenant… à part qu’il a faut maintenant que je gère précisément les droits d’accès, ce qui est parfois un peu pénible, gérer mon utilisateur moi-même, mon guest pour le partage réseau, et le serveur Web qui écrit des choses à droite à gauche.

J’avais également des déconnexions réseaux/wifi, et j’ai donc dégagé le dongle USB par un boitier CPL, le Netgear XAVT5602, qui a le bon gout d’être vendu par 3, et de disposer de 2 port Ethernet sur chaque boitier. Ceci me permet de simplifier la config Internet du Rpi, et de faire un p’tit hub Ethernet local.
J’ai rajouté pas mal de script shell pour automatiser pas mal de tâche propre à ce serveur, genre :

  • Faire un backup régulier du répertoire home et web
  • Scanner tout le sous réseau local pour afficher ensuite les machines présentes, et loguer les heures de présence
  • En fonction du script précédent, détecter certaines machines particulières (mon téléphone est-il connecté ? Le RpiAcq ?)
  • Vérifier l’adresse externe de la box et uploader sur un site une redirection vers cette adresse (pour ne pas avoir à me souvenir de l’IP externe de la box quand je me connecte à partir d’une machine qui n’est pas à moi). J’avais expliqué dans mon article précédent pourquoi je faisais ça et pourquoi je ne voulais pas passer par noip ou dyndns

Dernier point, depuis le passage en ext, mon script perl permettant de faire du téléchargement direct fonctionne de façon erratique. Je l’ai donc remplacé par une page en PHP de mon cru. Soit, je perds certaines fonctionnalités genre le téléchargement de plusieurs fichiers en parallèle, mais pour ce que je m’en sers ça colle très bien à mon usage.

Capteur de température sur RpiAcq

Bon, on va être honnête, c’est clairement ce qui m’a le plus amusé. Ayant déménagé d’une maison avec une chaudière à gaz avec thermostat à un appartement chauffé au grille-pain électrique, je me suis dit que faire le thermostat moi-même pourrait être chouette. Direction learn.adafruit.com, le site de la bidouille par excellence, bien documenté, avec des liens vers les différents composants dans leur boutique pour que ton côté geek compulsif puisse s’exprimer dans une réalisation électronique facile mais au combien gratifiante. Le site n’est pas le moins cher, mais il est bien foutu, et on trouve tout, tout de suite. J’ai donc acheté une plaquette d’essai, des câbles, un déport de connexion pour le port d’extension du Rpi, et une sonde DS18B20.

Pour info, cette sonde n’est pas un « bête » capteur de température, mais une sonde « intelligente » qui intègre un contrôleur OneWire, un protocole utilisé en domotique pour récupérer facilement les informations des capteurs/actionneurs d’une installation. Ce protocole n’est pas géré en tant que tel sur le Rpi, mais le noyau Linux permet de faire du bit banging imitant le codage/décodage du OneWire. Bon, en gros, une fois le câblage fini, c’est super fastoche à utiliser. Vous chargez 2 modules dans le noyau de l’OS (ça fait style je m’y connais, de dire ça, mais si vous préférez, c’est 2 commandes à recopier dans un terminal), vous faites un cat d’un certain fichier et zou c’est plié, la température du capteur s’affiche en millidegré.

Soyons honnête de suite, d’un point de vue hardware je me suis arrêté là. J’ai acheté 2 capteurs pisse que j’habite un 2 pièces, mais pour le moment ils sont montés l’un à côté de l’autre. Je voulais aussi pouvoir piloter mes radiateurs, mais ils sont alimentés directement par un câble qui sort du mur, donc comme je n’ai pas envie de tenter de détériorer l’installation, je me suis arrêté là… niveau hardware. Parce que pour le soft, c’est autre chose !
Oui, je me suis dit que j’avais un site web sur un Rpi, un relevé de température sur l’autre, il ne me manquait pas grand-chose pour lier les deux. D’un point de vue générale je me suis fixé la contrainte suivante : ne rien stocker sur RpiAcq. J’ai donc développé un bout de soft pour :

  • Faire une requête de température
  • Aller chercher les températures (les deux sondes ainsi que la température du CPU du RpiAcq
  • Stocker la température

Je suis parti sur un modèle UDP avec socket non bloquante afin d’éviter qu’une mesure de température qui part en couille ne bloque le système. Au départ je stockais le résultat dans un fichier texte toutes les heures, mais après quelques centaines de relevés, je me suis orienté vers une base de données sqlite3 pour pouvoir traiter plus facilement l’affichage des données sur le site web. Au final ça marche bien, et c’est cool, même si un peu inutile (enfin si, j’ai pu me rendre compte qu’en coupant complètement le chauffage par grand froid en mon absence, mon appart descendait sous les 12°C).
A faire : J’ai les deux sondes dans mon salon, faudrait que j’en place une dans la chambre histoire que ça serve un peu plus. En théorie en tirant un seul câble c’est jouable, le OneWire étant fait pour. Et aussi tenter de piloter les radiateurs, je ne sais pas trop comment.

CameraPi sur RpiAcq

Quel achat compulsif cette caméra ! C’est fourni comme le Raspberry, un pauvre PCB, et puis c’est tout. J’ai donc acheté en plus de la camera un petit support en plastique permettant en outre de placer la caméra sur un pied photo. L’avantage de la CameraPi, c’est qu’étant la webcam officielle de la fondation Raspberry Pi, son utilisation est super facile et documentée clairement. Le plus « dur » c’est de la brancher, et c’est pas bien compliqué. Moi mon challenge, c’est comme pour les sondes de températures, c’est de récupérer l’image sur RpiWeb !
Qu’à cela ne tienne, je me suis attelé au développement d’un outil pour transférer l’image de RpiAcq vers RpiWeb. Alors vous me direz… mais pourquoi faire un outil quand il existe déjà des trucs pour faire le taf (Samba, FTP, NFS, voir même ssh ou http). Et bien parce que je voulais un truc TRES simple d’utilisation. Et pour la beauté du dev, aussi. Hop, c’est reparti pour un client/server, mais en TCP cette fois. Principe identique à la température, avec en plus de la gestion de fichier :

  • Faire une requête de transfert de fichier
  • Faire une requête de capture d’image
  • Répondre en envoyant la taille de l’image
  • Transférer l’image p’tit bout par p’tit bout (rappel : un trame TCP c’est 1,5ko max…)
  • Reconstruire le fichier côté RpiWeb

Votre vif esprit aura remarqué que je fais d’abord une requête de transfert de fichier, puis d’image. Le client/serveur que j’ai développé permet en plus de prendre une photo de transférer n’importe quel fichier, histoire que je puisse le réutiliser pour récupérer d’autres trucs. Ça peut être utile…
Une fois l’image récupérée, elle est archivé sur le NAS. Via les crontab, la capture se fait tous les quarts d’heures. Et là vous me direz, mais… il finira par passer à poil devant la caméra ! Et bien non, car si mon téléphone est présent sur le réseau, l’archivage est automatiquement désactivé. J’ai donc une liste d’adresse MAC qui, si elles sont détectées sur le réseau, désactive la prise automatique de photos. Niveau utilité, j’ai donc pu constater que les ouvriers qui devaient venir pendant mon absence n’ont pas trop fait de la merde, et je peux prendre des photos du chat qui glande sur le canapé.

Moteur pas-à-pas sur RpiAcq

Dernier raffinement, rendre la camera orientable. Retour sur Adafruit.com pour trouver de quoi faire. J’ai trouvé des exemples de moteur CC, de servo moteur, et donc de pas-à-pas. J’ai choisi ce dernier pour une raison simple, son utilisation reste dans l’enveloppe énergétique du Rpi. En gros, l’alimentation 5v suffit. Comme d’habitude, le tutoriel sur Adafruit est simple comme tout. J’ai acheté le moteur et une plaquette de test plus grand pour pouvoir bosser proprement et garder mes sondes de températures. Au passage j’ai pris un boitier de protection.

Mon seul regret ici, c’est que je n’ai pas réussi à piloter le moteur avec un soft en C. Ah oui, j’oubliais de le dire, dans les contraintes que je me fixe, j’essaie de ne pas m’éparpiller niveau langage de développement. J’évite donc soigneusement le python parce que je n’aime pas ça, et pour le moment, je fais du C, du shell script, du html/PHP et un poil de SQL. Mais ici j’étais si près de finir que j’ai eu la flemme de chercher pourquoi mon soft en C ne fonctionnait pas. Les fonctions de base pour piloter le moteur sont donc en python.

Pour pouvoir piloter le moteur via RpiWeb, j’ai mis à jour le client TCP du transfert d’image pour qu’il soit possible de demander soit un fichier à transférer, soit la prise de photo, soit un mouvement à gauche/droite.
Dernier raffinement, un petit montage avec des Meccano pour fixer la caméra sur l’arbre. Pour que ça soit tip top moumoute faudra rajouter un axe de rotation verticale avec un deuxième moteur, un pointeur laser, une coque blanche ovoïdale et un haut-parleur qui balancerait des « Where are you ? », « Are you still there ? » et autre « I don’t hate you » de façon aléatoire.

Et pour le fun, une petite vidéo :
[youtube]http://www.youtube.com/watch?v=twfIKK8Gu00[/youtube]

Si un sujet vous intéresse, n’hésitez pas à poser des questions, je suis ouvert !

Voyages : qu’est ce que j’ai fait ?

Tiens, et si je faisais un article bloc-note juste parce que j’en ai envi ? Ça me donnera peut-être un coup de pied au cul pour trier toutes les photos que j’ai ramené…
Si on prend le point de départ au moment où je me suis mis à bosser, cela donne la 1 octobre 2008, en prenant en compte tout les déplacements personnels et professionnels.
Alors :

  • 12/08 Belgique : 5/6 jours entre Bruxelles et Bruges
  • 05/09 Martinique : une semaine dans un hôtel
  • 08/09 Croatie : une semaine de croisière sur un bateau d’une quarantaine de place
  • 09/09 Ecosse : 5 jours à Aberdeen pour le boulot
  • 05/10 Islande : 3 semaines pour faire le tour de l’île en voiture
  • 11/10 Brésil : 3 semaines à plusieurs endroits dont Rio, Iguacu, Salvador de Bahia et autre
  • 12/10 Ecosse : 5 jours à Aberdeen pour le boulot, encore !
  • 08/11 Tunisie : une semaine en car, séjour de groupe
  • 10/11 Norvège : 5 jours sur l’île d’Aukra pour le boulot
  • 11/11 Ecosse : 5 jours à Aberdeen pour le boulot, encore et encore !
  • 04/12 USA : 5 jours à York (PA) pour le boulot
  • 05/12 Islande : 1 semaine à Reykjavik
  • 09/12 USA : 3 semaines de balade entre la Californie, le Nevada et l’Utah
  • 05/13 Scandinavie : Roadtrip de la France jusqu’à Mehamn/Gamvik, à l’extrême nord de la Norvège

Et sur tout ça, j’ai … à peine trois dossiers de photos triées… et bien y a du boulot !

Sinon, la semaine prochaine c’est encore vacances !

[Photo de F1] Je l’ai vu en vrai, Excalibur

Oui, je sais, le titre est trompeur, comme d’hab.

Étant de passage dans le bouchonnois (enfin, la Sologne pour être précis), j’ai fait un petit tour dans un musée, le Musée Matra Automobile. Et, l’air de rien, voilà ce qu’on peut voir dans cet endroit pittoresque :

Ouais, une vrai voiture d’homme, qui fait de la piste à 300km/h. J’ai une grande tendresse pour l’espace parce que ma Maman elle avait un Espace 1 deuxième modèle pendant des années, qu’elle a revendu pour un Espace 3 en 1999 et … qu’elle a toujours. On peut cracher sur les voitures français mais les Ren… et non ! Raté ! L’Espace, de son premier proto (assez moche, vraiment dans le style minivan américain dont il s’inspire) …

… à la version 3 dont le dernier modèle sorti des usines (874242) est présent sur le site du musée…

… je disais donc L’Espace est un véhicule conçu par Matra Automobile. Sortie du même cerveau que celui qui accoucha des Djet, Bagheera, Murena et autre Rancho. Dans la tête du clampin de base, ces voitures sont associés à d’autres constructeurs car si Matra avait le loisir de faire des voitures un peu atypique, la distribution grand public nécessitait souvent un appuie avec un gros à côté. Bref, pour en revenir à l’Espace F1, c’est une idée à la con à la base : on prend un Espace de série (modèle 2 à l’époque) et on lui colle un moteur centrale Renault V10 de 10 cylindres, 40 soupapes, 3,5 L, 137kg pour obtenir 820 ch. C’est donc le même moteur qui fut champion du monde en 1994. Le reste va avec au niveau transmission, boite de vitesse et système de freinage. Au final on obtient un machin qui atteint 200km/h en moins de 7 secondes et qui se promènera à 300 km/h sur une ligne droite.

Pour le fun on pourra la qualifier de Formule 1 quatre place. A noter qu’il existe en fait 2 exemplaires de la bête, un qui a servi de démonstrateur (piloté par Alain Prost, pour la rigolade), celui que j’ai vu, et un autre pour la frime, qui se trouve dans la collection Renault, à Flins.

Ce petit tour au musée fut émouvant, témoignage et hommage à une des nombreuses grandes marques de l’auto française qui sortirent des trucs pas commun, beau, ou brute de performance et qui se sont éteintes. En sortant du musée nous fîmes un petit tour dans Romorantin pour voir l’usine où furent produit une grande partie des véhicules de la marque. Avec un grand panneau de travaux publiques « Destruction des batiments des usines Matra Auto de Romorantin ». Sniff, une page se tourne ! Pour être précis, s’est tourné en 2003 quand le groupe Lagardère décida que bon, Matra Auto ça coûte des sous, et l’Avantime était un bide intersidéral.