bleugafoto

Des photos, et des restes. le blog de ecaheti.

[Raspberry Pi] Thermostat pour radiateur Pass Program

Tuesday 25 November 2014 à 15:47

J’ai laissé un peu de côté mon p’tit robot RPi-kee pour m’atteler à un autre projet, un peu plus terre à terre, et nettement plus utile pour l’humanité. Sous cette introduction un peu pompeuse, se cache sauvegarde de la planète, économie d’énergie et tout le bullshit marketing qui va avec.

Depuis maintenant plus d’un an, j’ai l’honneur d’avoir dans mon salon un Raspberry Pi avec une sonde DS18xxx et un système logiciel pour récupérer cette température et la coller dans une base de données. Si vous me demandez quelle était la température le 4 juin 2014 à 11h dans mon appartement, je suis capable de vous répondre ! C’est beau la technologie. Mais pas très utile.

Avec l’hiver qui vient (TM de la famille Stark), nous avons remis en route un radiateur sur les 5 disponibles chez nous. J’ai beau avec un appartement neuf (refait en 2008), il a été construit avec des jolis convecteurs peuvent être un gouffre financier. Nous avons donc pris l’habitude de le mettre en route le matin au réveil, de le couper en partant, de le relancer le soir en rentrant et finalement de l’éteindre au coucher.

Et si on automatisait tout ça ?

J’ai donc commencé par regarder de plus près mes radiateurs. Il s’agit de modèle F18 de chez Atlantic (mais si, la pub radio avec Charlotte de Turkeim…), qui ne sont pas vraiment haut de gamme, bien au contraire. Néanmoins, ils ont l’avantage d’être “programmable”. Ils disposent de base de 2 thermostats (un “jour” et un “nuit”) ainsi qu’un mode hors gel, et off. On peut donc avec un curseur passé de jour à nuit, à off et à hors gel. Mais alors, programmable, ça veut dire quoi ?
Ça veut dire qu’ils sont connectés à mon réseau électrique par 3 fils : Phase (fil marron, 220V alternatif), Neutre (fil bleu), et le p’tit dernier, le Pilote (fil noir). J’ai donc enquêté un peu, et j’ai regardé comment était câblé tout ça en démontant le cache dans le mur où vont (les putes, TM Tywin Lannister) les fils du radiateur. Comme je le disais plus haut, mon appartement est à peu près neuf, et donc l’électricité est bien faite. Je suis descendu voir mon tableau électrique, et que vois-je : 5 fils noirs qui ne sont connectés à rien, et un fil marron. J’ai pris l’initiative de penser que tout ça est un pré câblage pour un boitier de contrôle.

En regardant la documentation du radiateur, j’ai appris que le fil pilote permet de mettre le radiateur dans des modes de fonctionnement particuliers en fonction du signal envoyé sur le fil pilote. Les différents signaux sont les suivants :

  • Rien : mode jour
  • 220V double alternance : mode nuit
  • 220V alternance positive : mode arrêt délestage
  • 220V alternance négative : mode hors gel
  • 220V double alternance un peu déphasée: mode jour -1°C
  • 220V double alternance un peu plus déphasée: mode jour -2°C

Au final, chaque mode est une transformation du signal 220V plus ou moins compliqué. Quand on regarde la doc toujours, on voit qu’il est possible d’installer (ou de faire installer) un boitier dans le tableau électrique pour réaliser ses opérations. Après, il existe plusieurs options genre thermostat sans fil à placer dans le salon, programmateur plus ou moins complexe, et tout ça, pour faire des sous ! Pour vous donner une idée, le programmateur simple pour UN radiateur coûte entre 50 et 100 euros, et je ne vous parle même pas du thermostat central, et j’évite le sujet du prix de l’intervention de l’installateur agréé.

Le truc quand même bien fait, c’est que le pilotage entre le mode jour et le mode nuit est super simple : soit on déconnecte le fil pilote, soit on y colle 220V.

Voilà, l’objectif est défini, faire un interrupteur commandé par une électronique, le Raspberry Pi en l’occurrence. Et coup de bol, celui qui trône dans mon salon est à 2m du radiateur (caché derrière un meuble, parce que le côté esthétique est important aussi).

Hardware requis :

Le mot clé, c’est “relai”. Un relai en électronique, c’est un interrupteur commandé. On met une tension à la borne du relai, il se ferme. On met 0V, il s’ouvre. De l’autre côté du relai, on branche le 220V et le fil pilote, et zou, terminé.
Evidemment, en pratique, il faut rajouter quelques fioritures pour avoir quelques choses d’utilisable. Et par chance (ou bien alors parce que c’est un besoin pas si exceptionnel) j’ai trouvé sur le site mchobby.be un joli pack “Relai 220V“, avec la doc de montage adéquat.

Ce kit est composé d’un relai pilotable en 5V, d’une diode de roue libre (l’entrée d’un relai est une bobine dans lequel le courant est stocké, la diode de roue libre permet au relai de se vider proprement quand vous le déconnecter), d’un couple transistor/résistance pour piloter le relai (en gros, ça fait la conversion entre une GPIO 3,3V du RPi ou du 5V d’un Arduino pour avoir suffisamment de patate pour attaquer le relai), et pour la rigolade d’une LED pour voir quand le relai est fermé (d’ailleurs elle est monté à l’envers sur le schéma de mchobby, pensez à la retourner si vous l’utilisez). Comme support le site conseil une carte permaproto, ce qui est un très bon conseil. Avoir un support solide quand on joue avec le secteur, c’est plutôt sécurisant.
Coût total : moins de 20€ (hors Raspberry Pi que j’avais déjà).

J’ai rajouté un câble pour relier le triplet 5V/Gnd/GPIO au RPi, un câble pour relier le 220V et le fil pilote (pour le coup, je me suis branché directement au domino reliant le radiateur au réseau câblé dans le mur), et voilà pour le hardware.

Côté Soft :

J’utilise la même librairie de pilotage de GPIO que pour RPi-kee, qui dispose pour le test d’un petit utilitaire pour switcher les GPIO à partir du shell de Debian, très pratique pour les premiers tests, permettant de vérifier le concept.
Ensuite, j’ai préparé un petit tableau Excel avec quelques infos pertinentes, comme une température de consigne, et également des plages horaires pendant lesquelles le radiateur doit être en mode jour. Une fois le tableau sauvegardé au format CSV, reste à faire une bout de code en C pour lire le fichier, trouvé la température de consigne, et déterminer si le radiateur doit être en mode jour ou en mode nuit. Condition supplémentaire, si la température de la pièce est supérieure à la consigne, alors on passe forcément en mode nuit.
La seule opération qui reste à faire sur le radiateur est donc de configurer correctement les deux roulettes de puissance. Celle du mode nuit le plus bas possible, est celle du mode jour assez haute pour chauffer la pièce normalement.
Le plus “difficile” pour ce programme, c’est surtout le décodage du fichier texte contenant les données de la sonde de température, et le décodage du fichier de consigne. Oui, piloter une GPIO avec WiringPi, c’est juste tout con.

Le soft final est lancé avec une tâche planifiée (crontab) tous les quarts d’heure, et roulez jeunesse. Ensuite on peut faire un peu tout et n’importe quoi pour rendre le truc plus facile d’accès, comme une interface web pour la configuration du fichier de consigne ou la lecture en live de la sonde de température, histoire que d’autres personnes du foyer puisse modifier le chauffage sans avoir à modifier le CSV via SSH.

Au final j’ai donc un radiateur qui s’allume le matin avant que je me lève, et qui se coupe tout seul quand il fait bon. Mission accomplie, et si je veux utiliser mes autres radiateurs, je n’ai plus qu’à relier les fils pilotes dans mon tableau électrique.

Note de bas de page : quand on touche au 220V, on met le circuit hors tension avec le disjoncteur AVANT ! Si vous mourrez en faisant de la merde dans votre tableau électrique, spa dma faute !

[R-Pi] RPi-kee – Partie 3 : Informatique

Monday 29 September 2014 à 13:47

Et on continue avec la suite de ceci.

Informatique

La partie logicielle est à mes yeux la plus large des trois. En effet, il y a mille et une manière de faire tout et n’importe quoi, et dans l’ensemble on peut faire et défaire tout comme on le souhaite. Entre les OS, les langages, les librairies, les algorithmes, les compétences et les préférences du développeur… Il y a autant de réponse à une question donnée qu’il y a de question !

Le système d’exploitation

Déjà, quel OS pour le Raspberry ? La question est vite réglé, malgré les diverses versions de GNU/Linux disponible : le choix est Raspbian, la version de Debian spécialement adapté au Pi. C’est la version la plus utilisée, et donc celle sur laquelle on a le plus de support. Ensuite, l’avantage de l’OS, c’est le fait de pouvoir lancer des process, rentre certaines taches automatiques simplement, la partie communication avec l’extérieur est simple (par exemple sauvegarder un fichier de log en local puis le synchroniser sur un répertoire partagé sur le réseau, c’est bête comme chou).

Langage de Programmation

Le Pi est, principalement, dédié à être utilisé avec des scripts en python. On trouve à ce titre des dizaines de trucs fait en python pour tout et n’importe quoi : piloter des GPIO, la caméra, faire des sauvegardes ou bien faire une interface console pour l’utilisateur. Mais parce qu’on a un OS Linux, on a aussi moyen d’utiliser n’importe quel langage. Et quand je parlais des préférences du développeur, c’est là que ça joue. Moi, le python… c’est pas trop ma tasse de thé, alors que le C, ça me branche vachement plus. Et je me débrouille mieux avec. Dans la mesure du possible donc, je tente de faire un maximum de chose en C, et d’utiliser d’autres options (script python tout prêt, Shell scripts, …) uniquement quand je n’ai pas le choix. Garder une certaine homogénéité me parait important pour pouvoir maintenir plus facilement l’ensemble du projet.

Accéder aux fonctions “spéciales” du Raspberry Pi

Sans rien autour de lui, le RPi est un ordinateur sous Linux, ni plus ni moins. Mais il dispose d’interface avec le monde extérieur qui nécessite un peu de boulot pour être exploités. La question se pose donc, dois-je développer moi-même mes propres fonctions pour y accéder ou existe-t-il des bibliothèques toutes faites pour me faciliter la vie ? Et ces bibliothèques valent-elles vraiment le coup ?

- GPIO

=> La fondation Raspberry a eu une bonne et une mauvaise idée. La bonne c’est de rapidement mettre à disposition des utilisateurs une librairie pour facilement utiliser toutes les fonctions des GPIO, que ça soit l’utilisation en mode brut (entrée/sortie numérique), ou bien l’utilisation des bus de communication disponible (I2C et SPI). La mauvaise, c’est que c’est en python. C’est là qu’intervient WiringPi, une librairie pour la gestion de GPIO en C. Pile poil ce que je voulais. Son auteur a le bon goût d’avoir rendu sa lib compatible avec le RPi B+ très rapidement.
J’ai procédé rapidement à quelques tests unitaires, pas de problème pour piloter les moteurs (utilisation des GPIOs), ni pour faire récupérer des données sur l’ADC (utilisation du bus SPI).

- Camera

=> Ici les choses se compliquent un peu. Je n’ai pas trouvé de librairies pour piloter la caméra directement. Ma principale expérience pour le moment est la réalisation d’un système de détection de mouvement, avec la caméra montée sur un moteur. Pour faire une simple capture, il faut taper une commande dans la console sous linux, dans laquelle on indique la résolution de sortie, le format, si on pivote l’image, si on applique un filtre, l’ISO, etc. C’est facile, mais la caméra met alors plus seconde pour faire une capture (indépendamment de la vitesse d’obturation). Pas terrible pour faire du suivi rapide d’objet en déplacement. L’astuce est alors lancé la capture en mode daemon (en lui précisant la taille, le format, etc.) et de lui envoyer par la suite un signal pour faire une capture. A ce moment, le cliché est instantané. Bref, c’est presque parfait, sauf que c’est en ligne de commande, et donc ça sent le Shell script. Première entorse à ma sacro-sainte homogénéité.
Capturer une image c’est bien, en faire quelque chose c’est mieux. Quand on parle traitement d’image sous Linux, il y a une bibliothèque qui vient rapidement à l’esprit, c’est OpenCV (Open Computer Vision). Elle dispose d’une myriade d’outils de traitement tout prêt pour faire tout et n’importe quoi avec vos images. Mais pour être honnête, c’est un mastodonte. Quand j’ai commencé mon détecteur de mouvement, j’ai eu envie de faire le traitement moi-même, histoire d’en apprendre un peu plus sur le traitement d’images. Au départ je voulais simplement comparer des images, mais de fils en aiguilles j’ai aussi implémenté la possibilité d’appliquer des filtres matriciels sur les images, calculer et afficher des histogrammes, ainsi que d’autre fonction simple comme de n’afficher que la luminance, ou bien une seul couleur en particulier. Bref, quand j’ai commencé à m’aventurer par-là, j’ai transformé mon soft de détection de mouvement en un sous-produit d’une librairie que j’ai appelé LLIPS (pour Light Library for Image ProcesS). Ça vaudrait un article à elle toute seule, mais je n’ai pas vraiment fini de la faire jolie avec les commentaires et la documentation qui va bien.
Pourquoi s’emmerder à faire une librairie qui existe déjà ? Simplement parce que je n’ai pas besoin de tout, et aussi parce que pour le coup, je peux adapter l’outil très rapidement. Pendant que je travaille sur le code RPi-kee, il m’arrive régulièrement de fignoler Llips, et de commiter à part les modifications.

- Généralité

=> Quand j’ai réalisé les premiers softs sur avec la caméra et le moteur, le cœur principal de mon programme était en Shell script (abordé un peu ici : ). Ce qui est bien avec les scripts c’est de pouvoir lancer des trucs en tache de fond. C’est très pratique car je peux lancer un mouvement moteur et faire autre chose pendant que ça tourne. De même, avec les traitements d’images, que ça soit des redimensionnements (que je faisais avec mogrify, vachement bien), des comparaisons, etc. Par contre j’ai un peu galéré pour la communication entre les différentes tâches. Ne serait-ce que pour lancer un chronomètre, je suis passé par un compteur écrit dans un fichier texte, qu’un programme écrit et qu’un autre relit. Bref, pas terrible.
Pour RPi-kee, j’ai rapidement compris que cette solution ne serait pas terrible, voir carrément à chier. De plus, si je m’amusais à coder un process pour faire des acquisitions, un autre pour les traiter, un autre pour faire du TCP et les transmettre, le coup des fichiers textes pour communiquer serait vraiment pourri. Il me restait donc deux solutions :
- La mémoire partagé entre les process, comme je l’avais fait il y a biiiieeeeeen longtemps à l’IUT
- Plusieurs tâches au sein d’un même process.
La deuxième solution m’attirait beaucoup plus, surtout que j’ai l’habitude d’utiliser un OS temps réel au boulot, et que je suis donc assez familier du sujet. J’ai donc déniché dans un coin la bibliothèque pthread !
Elle est disponible sous Linux nativement, et dispose également d’un port sous Windows, avec quelques restrictions mais qui n’impacte pas les fonctions de base. Ce port me permet donc de bosser également sous Windows. Pthread permet de définir fonction sous forme de thread tourne donc joyeusement en parallèle (dans la mesure du parallélisme tel qu’il existe dans un processeur de PC). Ce n’est pas une émulation ou une astuce du genre, quand on lance plusieurs threads on voit bien dans un gestionnaire de tâches le nombre de threads qu’on a lancé. Cela convient donc très bien à mes fonctions de pilotage moteur qui sont en fait une séquence ordonnée sur 4 GPIOs avec un délai entre chaque pas. Appeler la fonction “avancer” bloque donc ainsi l’exécution du programme. Avec un thread dédié par moteur, je peux donc lancer mes boucles en parallèle et faire autre chose en même temps. La possibilité de faire des threads change d’ailleurs grandement la façon d’implémenter une fonction. Si on prend l’exemple des acquisitions sur l’ADC; avec un seul thread, vous devez d’abord faire votre acquisition, qui vous prendra un temps T1, puis mettre en forme les données reçues, avec par exemple l’utiliser de look-up-table pour transformer la tension des capteurs IR en cm, traitement long d’une durée T2. Votre fonction prendra donc un temps T1+T2. Si vous travaillez maintenant avec des threads, vous synchronisez le début de la tâche “Calcul” avec la fin de votre première tâche “Acquisition”. Ainsi, lorsque la première acquisition sera finie, vous commencerez immédiatement la deuxième acquisition pendant que vous traiterez la première. Si T1 est plus grand que T2, votre fonction d’acquisition ne prendra plus qu’un temps T1. Si c’est T2 qui est plus grand, c’est le contraire (à quelques cas particuliers près qui se gèrent sans trop de difficulté).
S’il y en a deux qui suive au fond, ils n’auront pas manqué de noter que j’ai dit que je travaillais également sur l’OS de Microsoft. Et oui, c’est bien le cas.
Si j’ai réalisé plusieurs tests unitaires directement en développant sur le Raspberry Pi, à grand coup de putty et de WinSCP, quand j’ai commencé à créer le projet, j’ai préféré travailler avec un IDE. De plus, comme je développe ça sur mes heures perdues (dans le train, dans le salon sur mon portable, sur mon PC fixe, parfois même au boulot entre midi et deux), j’ai mis en place une compilation conditionnée à l’OS utilisé. Je fais donc la partie driver/bas niveau sur le Pi en SSH, et tout le haut niveau sur PC Windows. Evidemment je ne récupère pas toutes les valeurs analogiques et je ne peux pas utiliser WiringPi, mais cela me permet de faire les threads, le traitement d’image, la communication TCP et le contrôle commande de façon indépendante. Pour avoir les schémas électriques, les images de test et la doc technique, Google Drive est mon ami, et pour le code j’utilise un dépôt SVN … sous Github. Je leur dois au passage une reconnaissance éternelle d’avoir mis en place l’accès SVN à leurs dépôts ! En effet, je n’aime pas Git.

A l’heure actuelle, je n’ai pas encore terminé. La partie logicielle va être assez tordu à faire, avec toutes les tâches que j’ai prévu de faire, mais ça devrait m’occuper un bon moment. Il me reste également quelques soucis mécaniques à résoudre, et puis valider que les moteurs 12V peuvent faire leur boulot correctement. Au final, je suis quand même assez près de mon but, et j’espère pouvoir finir par avoir quelques choses de vraiment chouette. Dans les tâches annexes qu’il me reste à côté, j’aimerai également pouvoir utiliser un écran qui se plug directement sur le Raspberry Pi, histoire par exemple d’afficher en temps réel des infos sur le robot. Le problème étant surtout que l’écran utilise la même liaison SPI que l’ADC et qu’il y a de bonne chance qu’ils s’entre perturbent. Dans les à côté également, j’aimerai finir proprement Llips, histoire par exemple de le rendre multithread. Cela me permettrait surement de gagner encore un peu de temps de process, le cœur ARM11 du RPi n’étant un modèle de rapidité. Si j’avais VRAIMENT que ça à faire, il serait même probablement possible d’utiliser le GPU pour faire le boulot. Mais, du temps, c’est pas forcement ce dont je dispose le plus !

Et histoire d’illustrer un peu l’article parce que les images c’est cool, voilà le genre de traitement. On part d’une image avec une ligne (c’est un tapis ikea du meilleur goût), on cherche les zones de contraste, et on définit un certain nombre de point et de segment appartenant à cette zone de contrate.

On se servira ensuite des angles et positions pour définir la trajectoire du robot. Simple, non ?

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

Thursday 25 September 2014 à 10:17

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

Monday 22 September 2014 à 16:23

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 …

Je m’appelle killercool

Tuesday 22 April 2014 à 16:25

Non, je plaisante. Mais j’ai pensé à lui, je sais pas pourquoi, et me suis rappelé qu’il s’était pas mal fait basher, ici bas.
Vous rappelez vous ?