Club robotique de Sophia-Antipolis

Accueil > Projets, études > Nos réalisations > Projets spéciaux > RaspberryPi, Python, LEGO, CNC, récup et lumière

RaspberryPi, Python, LEGO, CNC, récup et lumière

jeudi 12 juin 2014, par Eric P.

Plusieurs démonstrateurs pédagogiques ont été développés pour illustrer des techniques de détection d’objets, de couleur,... en utilisant des capteurs de lumière simples. Ils permettent de montrer concrètement la mise en application de cours de physique vus dans les classes de lycée.

Cet article en montre le développement, illustrant au passage quelques aspects pratiques concernant leur fabrication.

RaspberryPi, Python, LEGO, CNC, récup et lumière

Il ne manque plus que le raton-laveur et l’horloge normande, et nous pourrons faire directement concurrence à M. Jacques Prévert.

Il est en fait question ici d’un petit projet visant à réaliser des démonstrateurs pédagogiques simples pour illustrer certaines propriétés de la lumière que nous utilisons couramment avec les capteurs de nos robots.

Ces outils sont utilisés lors de conférences que nous donnons à l’occasion de la Fête de la Science ou d’opérations comme les stages organisés localement par l’INRIA Sopha-Antipolis dans le cadre du projet MathC2+.

A quoi veut-on en venir ?

Une fois n’est pas coutume, on va vous montrer le résultat final dès le début de l’article. Ca aide à comprendre de quoi on parle.

Il s’agit de trois démonstrateurs simples qui illustrent les principes physiques suivants :

  • opacité d’un corps : transmission de la lumière par la matière
  • réflectance d’une matière : absorption de la lumière par les matières sombres
  • perception de la couleur : absorption sélective de certaines longueurs d’ondes par la matière

Nos trois démonstrateurs sont donc respectivement :

  • une barrière optique pouvant détecter un objet sans contact avec lui
  • un détecteur capable de distinguer un objet clair d’un objet sombre
  • un détecteur capable de distinguer des objets de couleurs différentes

Il faut savoir que pour les éditions précédentes, j’avais déjà réalisé ces démonstrateurs à l’aide d’un kit LEGO Mindstorms NXT. Mais nos jeunes adhérents étant de plus en plus nombreux, il a fallu le démonter pour leur mettre à disposition un kit NXT supplémentaire.

Le cahier des charges général

En premier lieu, refaire quelque chose d’aussi pédagogique que la version précédente, mais plus visuel. Pour permettre à l’ensemble de l’auditoire de voir la manip, il était auparavant nécessaire de mettre en place un système de caméra dont l’image était envoyée sur le vidéo-projecteur, en alternance avec les slides.

Ca marche, mais c’est lourd, et l’afficheur LCD du NXT est peu lisible de cette manière.

On décide cependant de conserver le système de caméra pour montrer le dispositif physique, mais l’interface homme-machine ne sera plus le NXT (de toute manière on ne l’a plus) mais une application graphique animée.

Autre élément important du cahier des charges : se faire plaisir, en l’occurrence en allant un peu plus loin dans l’utilisation de la RasPi, de Python et des outils Web dont on dispose dans cet environnement.

Dernier point : comme d’habitude, on récupère à fond, comme nous le verrons plus loin.

La barrière optique

Comme on peut le voir sur la photo, ce n’est pas vraiment digne de figurer dans l’Encyclopédie Diderot [1]. Mais c’est simple et fonctionnel :

  • d’un côté une LED blanche 3mm haute luminosité montée dans une optique de récupération
  • en face une simple LDR enfouie au fond d’un petit tube pour la protéger de la lumière ambiante
  • le tout assemblé par une structure en LEGO, avec l’aide de quelques pièces faites sur mesure avec notre CNC pour adapter les éléments non LEGO avec les pièces LEGO

Pour illustrer notre saine habitude de tout récupérer, intéressons-nous à la fabrication du bloc optique de la source lumineuse. L’élément de base est tiré d’une façade de spot à LEDs récupérée à mon labo.

Après en avoir extrait grossièrement un des éléments à la scie, on le détoure à la CNC pour lui donner une forme circulaire. Le plus difficile a été de centrer la pièce brute pour que le bord extérieur de la pièce terminée soit concentrique à la lentille et à la parabole. Avec un compas dans l’oeil et une certaine tolérance dans le centrage résultant on y arrive assez rapidement.

Pour monter cette optique sur une structure LEGO, on confectionne une pièce d’adaptation au cotes des éléments LEGO (trous de 4.7 mm de diamètre, dont les centres sont distants d’un multiple de 8 mm [2]).

La fixation est simplement faite à la Patafix, largement suffisante en termes de solidité ici. Elle a de plus l’avantage d’être démontable à l’infini et de ne pas attaquer le matériau de la pièce, qui s’apparente à une variété de polystyrène très dense (récupération de panneaux de présentation de type poster, utilisés pour des salons).

Reste à s’occuper de la LED elle-même. On confectionne pour elle un petit bout de PCB pastille pour y câbler la résistance de limitation du courant calculée pour une alimentation en 5V, et une pièce d’adaptation LEGO comme précédemment.

Et voici le tout monté sur des poutres LEGO pour valider la méthode :

Concernant la LDR, on procède de même, l’ingrédient de base étant un tube (vide) de granulés homéopathiques. Ce type de tube est un objet de choix, idéal également pour y stocker mèches et fraises miniatures. On voit dans cette photo les différentes étapes de la fabrication de cette partie du démonstrateur.

N’oubliez pas de copieusement noircir l’intérieur du tube (au feutre indélébile par exemple, plus pratique que la peinture), sinon vous vous demanderez ensuite comme moi pourquoi votre capteur montre une sensibilité aussi marquée pour le vert (ou le rouge, ou tout simplement... la couleur de votre tube). Tant que vous y êtes, tapissez aussi l’extérieur de scotch noir afin de rendre tout cela le plus imperméable possible aux lumières parasites.

Voilà, il n’y a rien de plus à dire, et la LDR sera relié à un des ADC de la carte ADC Pi de nos amis d’AB electronics. Nous avons déjà parlé dans d’autres articles de ce fournisseur d’extensions pour RaspberryPi [3], et très sincèrement, leurs produits sont très bons, l’équipe est très compétente et à l’écoute de leurs clients, et ils ont un sens commercial peu commun [4].

Le détecteur noir/blanc

Il utilise exactement les mêmes ingrédients, seule la disposition étant différente.

Son objectif est de montrer comment fonctionnent les capteurs utilisés pour le suivi de ligne par exemple, mais aussi les capteurs suivant le cheminement du papier dans les imprimantes et photocopieurs. On explique alors le phénomène de réflexion lumineuse et de l’incidence du matériau de la surface sur l’intensité de la lumière réfléchie.

Le détecteur de couleur

Il ressemble fort au précédent, seule la source lumineuse étant différente, puisqu’il s’agit ici d’une LED RGB et non plus d’une LED blanche.

L’objectif de ce démonstrateur est d’illustrer comment on peut analyser la couleur d’une surface au moyen d’un unique capteur, et non pas d’un trio comme dans le cas des photo-sites des capteurs d’image des appareils photos numériques par exemple. La méthode consiste ici à éclairer la surface à analyser successivement avec les trois couleurs primaires [5] et à mesurer l’intensité réfléchie dans chaque cas.

Notre LED RGB est une BlinkM qui présente l’avantage d’intégrer le driver de puissance de la LED et la logique de commande via bus I2C. Nous en sous-utilisons clairement les possibilités [6], mais cela simplifie grandement le dispositif et le logiciel de contrôle. Ce produit a déjà fait l’objet de quelques articles sur notre site.

Toujours dans la même philosophie, nous lui confectionnons une monture compatible LEGO :

Et ça donne ceci, vu en contre-plongée pour montrer les deux éléments principaux du démonstrateur :

Interface avec la Raspberry

Les trois LDR de nos démonstrateurs seront reliées aux ADC de la carte d’extension, via un classique montage en pont diviseur. Les LEDs blanches sont elles pilotées par un transistor, les GPIOs de la Raspberry ne pouvant fournir suffisamment de courant.

Pour simplifier tout cette connectique, un petit PCB en plaque proto est constitué, avec les connecteurs détrompés correspondant aux démonstrateurs et un HE10 10 points pour la liaison avec les ADCs, l’I2C et les GPIO de la Raspberry.

Les résistances de pont (10 kOhm) pour les LDRs sont également intégrées au PCB. Celles des LEDs n’y sont pas car directement sur les démonstrateurs.

On en profite pour y installer au passage un bouton d’arrêt du système, déjà présenté dans cet article.

Ci-dessous le schéma complet correspondant :

Ca donne ceci une fois assemblé :

Les plus observateurs d’entre vous auront remarqué que le bouton rouge n’est pas visible sur la photo d’ouverture de l’article. C’est normal, je l’ai ajouté après coup (il me restait un fil libre sur la nappe multicolore ;).

Et sous le capot

Les principaux points techniques de ce projet concernant plus le contexte robotique sont l’interfaçage de puissance des GPIO de la RaspberryPi et la mise en oeuvre de la carte ADC Pi. Rien de bien compliqué, voire innovant pour certains d’entre vous, mais cela peut intéresser les nouveaux arrivants qui découvriraient le domaine via cet article.

Interface matérielle des GPIO

Comme vous le savez les GPIO de la RaspberryPi ne peuvent fournir qu’un très faible courant, et je suis paniqué lorsque je vois moult montages sur breadboard qui connectent des LEDs directement sur les GPIO (avec la résistance de limitation de courant quand même). Cela vaut pour les LEDs très basse consommation (3mA par exemple), mais essayez avec une 20mA et adieu la GPIO.

Dans le système des balises goniométriques référencé précédemment, j’avais utilisé un ULN2803 comme driver de puissance, qui n’est autre qu’une batterie de 8 transistors montés en Darlington. J’aurais pu en faire de même ici, mais je n’avais besoin ni des 100aines de mA que peut fournit de chip, ni des 8 canaux (seulement deux LEDs à contrôler ici). Un simple transistor NPN d’usage courant a été utilisé (genre BC537 ou équivalent). Il est monté en classique émetteur commun et collecteur ouvert, la LED et sa résistance étant donc dans le circuit collecteur. La base est reliée par une résistance de 10kOhm à la GPIO afin de réduire le courant demandé à la valeur la plus faible possible.

Calcul de la résistance de limitation de la LED

Si vous connaissez le modèle exact de LED et que vous avez sa datasheet, c’est très simple, car vous avez alors sa tension directe et son courant nominal. Une simple application de la loi d’Ohm en considérant la tension Vce du transistor en mode commutation (donnée dans sa datasheet) permet de trouver la valeur de la résistance. Prenez la valeur normalisée immédiatement supérieure de manière à conserver une marge de sécurité.

Le plus souvent (comme ici) la LED a été trouvée dans un vrac de récupération, ou bien a été mélangée avec un tas d’autres composants, et faute de marquage, impossible d’en trouver la datasheet. Ce n’est pas dramatique car une méthode expérimentale très simple ne nécessitant qu’une alimentation réglable et un multi-mètre permet de retrouver les caractéristiques essentielles.

Il faut savoir qu’en fonction de leur couleur, les LEDs standard [7] ont des tensions directes (c’est à dire la tension à leurs bornes lorsqu’elles sont en fonctionnement nominal) bien connues. On trouve cela avec un coup de Google, et par exemple une LED blanche 3mm comme les nôtres a une tension directe d’environ 3V.

On réalise donc un petit montage de mesure avec notre LED en série avec le multi-mètre en mode milli-Ampère, le tout connecté en direct sur la sortie de l’alimentation, préalablement réglée à sa tension de sortie minimale.

TRES IMPORTANT : certaines alimentations ont une tension minimale assez élevée, par exemple 2 ou 3V. Elles ne sont pas utilisable ici, et il faut un modèle capable de descendre à 0V.

Monter alors progressivement la tension jusqu’à arriver au voisinage de la tension directe supposée, tout en surveillant la luminosité et la température de la LED au cas où elle aurait des caractéristiques un peu hors du commun. Une fois trouvé le point de fonctionnement idéal (c’est à dire avec la luminosité recherchée et une absence d’élévation de température après plusieurs minutes de fonctionnement continu), on obtient la tension de service à retenir et le courant direct nominal. En introduisant ces valeurs dans le calcul évoqué précédemment on en déduit la valeur de la résistance de limitation de courant.

Les GPIO avec la RaspberryPi et Python

C’est trivial en utilisant par exemple le module Rpi.GPIO.

Pour s’en convaincre, il suffit d’étudier les exemples fournis sur le site du module, ou bien les sources de cette application (voir en fin d’article) ou encore l’article sur le bouton d’arrêt sécurisé.

Des modules tels que WiringPi conviennent aussi pour ceux qui sont habitués aux bibliothèques Arduino, car ils reprennent les mêmes API, et par conséquent on retrouve assez rapidement ses marques. Je préfère personnellement GPIO.RPi car je ne suis qu’un Arduiniste occasionnel et par conséquent la similitude d’API ne m’est pas très utile. D’autre part l’implémentation de WiringPi est plus volumineuse car elle fait beaucoup de choses en plus des GPIO. Mais c’est purement une affaire de goût et non un jugement de valeur.

L’ADC Pi avec la RaspberryPi et Python

Ca aussi c’est du très simple de chez très simple. Pour s’en convaincre il suffit de jeter un oeil aux quelques lignes de code nécessaire au dialogue avec la carte.

- import de la classe fournie par le module disponible chez ABElectronics

from ABElectronics_ADCPi import ADCPi

- initialisation d’un objet représentant la carte ADC Pi dans __init__

 self._adc = ADCPi(
            self._system_cfg.adc1_addr,
            self._system_cfg.adc2_addr,
            self._system_cfg.adc_bits
        )

- lecture d’un canal

v = self._adc.readVoltage(self._color_detector_adc)

L’interface utilisateur

Comme déjà mentionné, elle est réalisée sous forme d’une application Web, dont le serveur tourne sur la Raspberry. Celle-ci est équipé d’un dongle Wifi, l’interface réseau correspondante étant configurée en access point, comme déjà décrit dans cet article.

Les différents écrans sont reproduits ci-dessous :

 accueil :

 barrière lumineuse :

Les différents boutons permettent de contrôler manuellement la source de lumière, de déclencher une mesure du courant et de l’afficher, et de faire fonctionner le dispositif en mode automatique. Dans ce mode, le courant est mesuré périodiquement et un objet (un ballon) est affiché selon qu’on détecte quelque chose ou non, par la comparaison de l’intensité mesurée avec un seuil.

A noter que ce seuil est évalué automatiquement lors de la procédure de calibration, de manière à s’adapter aux conditions de luminosité ambiante du moment.

 détecteur noir/blanc :

L’interface de commande est très similaire à la précédente, le mode opération étant identique sur le plan de la mesure et de son traitement. En mode automatique, un objet noir ou blanc est affiché selon le résultat de l’analyse de la mesure, basé sur la comparaison par rapport à un seuil évalué ici également lors de la procédure de calibration.

 détecteur de couleur :

L’interface utilisateur permet de commander manuellement l’allumage de la LED selon l’une des 3 couleurs primaires et d’afficher la mesure de courant correspondantes.

En mode analyse de couleur, les 3 mesures sont enchaînées automatiquement, et la couleur de l’objet est classifiée en fonction des proportions respectives des 3 couleurs, telles que traduites par les mesures. Les critères d’analyse sont ici également déterminés par les mesures effectuées lors de la procédure de calibration.

Remarque importante : les plus observateurs d’entre vous vont se demander s’il n’y a pas un problème de cohérence entre les pourcentages de chaque couleur et les intensités mesurées correspondantes. Par exemple l’intensité sous éclairage rouge est la plus forte, et pourtant on considère que le rouge est présent à 0%. C’est bien vu :) En fait, ces copies d’écran ont été faites en faisant tourner l’application en mode simulation, les valeurs des intensités étant générées de manière aléatoire autour d’une valeur moyenne (0.42 mA, allez savoir pourquoi ;)), y compris lors de la phase de calibrage des capteurs. Il n’y a donc pas vraiment de cohérence physique.

 outil de calibrage :

Cet outil permet d’effectuer les différentes mesures nécessaires à l’évaluation des seuils et critères utilisés par les démonstrateurs.

Sous le capot

Les ingrédients utilisés pour développer cette application côté Raspberry sont :

- serveur et framework Web Tornado

J’aime beaucoup Tornado, car bien que léger il tient très bien la performance du fait de son architecture asynchrone (par opposition aux serveurs utilisant un pool de tâches pour servir les requêtes).

Il intègre de plus un moteur de template très puissant, supportant aussi bien le paradigme d’héritage entre templates, que de composition grâce au mécanisme de ui modules. Ces ui modules permettent de se constituer une bibliothèque de modules de composition de page, assemblés ensuite comme des briques de LEGO, permettant une très grande réutilisation entre applications différentes.

La localisation est également supportée au travers de Babel et TornadoBabel, votre serviteur ayant d’ailleurs contribué à y corriger quelques bugs.

Si vous développez beaucoup d’applications Web dans le monde Python, et que vous n’avez pas besoin d’artillerie lourde MVC du genre Django, Pyramide et consorts, jetez un oeil à Tornado. Je l’utilise à titre professionnel pour la console d’administration de nos smart gateways pour réseaux de capteurs et actionneurs (cf la section "Out of the box components" de cette page de présentation) et je n’ai pas été déçu jusqu’ici.

- jQuery pour le Javascript

Je ne conçois plus le développement Javascript sans jQuery, qui m’a réconcilié avec ce langage, que j’avais fini par classer dans la catégorie des calamités qu’on ne peut malheureusement pas ignorer.

- Bootstrap pour le look

Je sais, ce n’est pas original et les détracteurs lui reprochent que tous les sites Web se ressemblent maintenant.

En fait ce n’est pas vrai, car il existe pléthore de skins basés sur Bootstrap, tel que Slate du site Bootswatch que j’ai utilisé ici.

Et je ne suis pas graphiste, alors je préfère que mes interfaces soient propres, esthétiques et de bon goût, même si elles ne sont du coup pas 100% uniques. A chacun son métier, cela évitera de voir tout et n’importe quoi... et surtout n’importe quoi.

Et pour finir...

Le tout (RaspberryPi, alimentation, démonstrateurs, accessoires,...) tient pile poil dans un jeu de boites plastique Cerrefour à 2 euros :

Quant au code source, il est intégralement disponible sur notre GitHub.

Saison 2

[16/08/2014]

A la fin de la saison 1, nous avons laissé notre montage dans un état certes fonctionnel, et ça a même très bien fonctionné lors des diverses démonstrations effectuées, mais c’est un peu du ni-fait-ni-à-faire [8]. Deux cartes qui se baladent et reliées par des fils, ça ne fait pas pro... et surtout ça ne demande qu’à créer des problèmes.

Histoire de finir ce projet par un résultat qui me convienne [9], un petit détour par Galaad et notre CNC préférée pour tailler deux plaques support dans une chute de Forex. Une fois tout assemblé ça donne ceci

Le rez de chaussée sans la mezzanine montée permet de voir les coulisses, la moitié inférieure du boitier de la Raspberry étant fixée à la plaque de base par deux boulons.

Un petit mot sur les entretoises

Elles sont de fabrication maison, par tournage dans du rond d’aluminium Casto. Je commence à maîtriser assez bien la technique pour les perçages et filetages des trous de fixation, et sous condition de disposer d’un tour [10], c’est une alternative très pratique et économique aux entretoises hexagonales toutes faites. Promis, je détaillerai cela dans un article spécifique.

La plaque de la mezzanine est usinée de manière à ce que le PCB s’y encastre, tout en laissant le vide nécessaire pour le débord des soudures. Ce PCB avait été taillé au plus juste, et il n’y a donc pas d’espace pour y ajouter des trous pour des vis de fixation. De toute manière c’est mieux ainsi car cela permet de réduire la hauteur hors tout. Le PCB est solidarisé avec sa plaque avec 4 plots de Patafix au niveau des coins (d’où la forme curieuse de la découpe).

Et pour que tout soit net même en-dessous, les écrous et têtes de boulons sont encastrés dans la plaque de base.

Le plus observateurs auront remarqué l’erreur de dimension des logements des écrous : j’ai pris la mesure sur un mauvais exemplaire :/

Et voilà, cette fois-ci je pense pouvoir considérer le projet comme achevé.


[1si vous ne savez pas ce que c’est, un petit coup de Google vous permettant d’étendre votre culture scientifique

[2dimensions mesurées sur des pièces originales, mais qu’on retrouve sans difficulté sur le Grand Ternet

[3et pour Arduino également

[4ils m’ont à deux reprises renvoyé à leur frais des commandes complètes, que je pensais perdues ou volées du fait de retards totalement inexplicables de notre Poste nationale à qui je délivre un magistral carton rouge : plus d’un mois pour acheminer un colis petit format depuis la Grande Bretagne, avec en prime la mention "erreur de tri" dessus alors que l’adresse était parfaitement claire et identique à celle apposée sur un colis livré précédemment sans délai anormal. Et cela sans parler des multiples colis Amazon, reçus abîmés "par accident", mais toujours de telle manière qu’on puisse comme par hasard en inspecter le contenu...

[5rouge, vert et bleu

[6penchez-vous sur sa doc technique pour le comprendre

[7on ne parle pas ici des modèles CMS très haute luminosité genre Luxeon et similaires, dont vous avez obligatoirement les références et donc la datasheet

[8selon mes critères

[9oui,je sais, je suis du genre trop perfectionniste parfois, mais je suis trop vieux pour changer

[10ou d’avoir un pote qui en a un, ou de fréquenter un FabLab

Vos commentaires

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.