Skyduino:~#
Articles
C/C++, programmation, projet

[EPIC FAIL] Cadre XY infrarouge

Bonjour tout le monde !

En fin d’année dernière, j’ai commencé un projet perso assez balaise : faire un cadre XY infrarouge.
Le principe de base de ce projet est le même que pour les cadres interactifs qu’on posent sur certains écrans plats, en particulier dans les écoles, pour faire des écrans géants tactiles les jours des portes ouvertes.

L’idée de base est ultra simple : des leds infrarouges d’un côté, des photodiodes infrarouges de l’autre, le tout montait sur un cadre.
Dans le principe : on envoi une impulsion infrarouge d’un côté, on mesure le niveau d’infrarouge reçu de l’autre et on en déduit l’emplacement et la taille du (ou des) objet(s) se trouvant dans la zone de mesure grâce à l’ombre de l’objet.
L’avantage de ce genre de système est qu’il marche avec n’importe quoi : stylo, feutre, doigt, ou autre. Tant que l’objet est opaque et non réflectif, c’est bon.

Mon projet est de faire la même chose, mais en miniature. Enfin était, comme vous le verrez plus bas, les choses ne se sont pas vraiment passées comme prévu.

DSCF3084

J’ai donc réalisé un premier prototype contenant un microcontrôleur ATmega328p, 8 leds infrarouges, 8 photodiodes infrarouges, un driver de puissance ULN2803 et quelques bricoles pour que tout fonctionne (quartz, résistances, condensateurs, etc.).

Après un rapide test, je n’ai vu aucun problème. Les leds infrarouges fonctionnaient correctement, la mesure de l’autre côté était correcte, aucun souci à l’horizon.
J’ai donc continué mes tests en vérifiant que le système de RESET fonctionne, que la communication via le bus SPI était elle aussi fonctionnelle, bref j’ai tous testé … ou presque.

Comme le projet requière 16 modules SPI indépendants, j’avais besoin d’une quelconque forme d’adressage. Je ne pouvais pas me permettre d’avoir 16 lignes de sélection pour chaque module au niveau de la carte maître qui récupère les données des modules.

J’ai donc ressorti mon livre de datasheet, cherché un CI logique de la série 74HCTxx qui pourrait faire l’affaire et j’ai finalement trouvé mon bonheur : le 74HCT85D, un comparateur d’adresse 4 bits.
4 bits = 16 adresses possibles, parfait !

Simple oubli de ma part ou interruption lors des tests pour une quelconque raison, allez savoir pourquoi, mais je n’ai pas testé le bon fonctionnement de l’adressage.
Prototype validé (… la boulette).

DSCF3039DSCF3043

Je vous passe les détails du cadre en lui même. Il est constitué de bandes de MDF collé, rien de bien intéressant 😉

DSCF3048

J’ai donc commandé le nécessaire pour réaliser mes 16 modules (en deux parties, soit 32 cartes à assembler).
Budget total : ~120€ (de mémoire ça remonte à début janvier tout ça 😉 ).

DSCF3056DSCF3051DSCF3053

Côté cartes, pas de soucis, Seeedstudio a encore fait des miracles.
Deux lots de 20 cartes pour moins de 30$, frais de port compris, vive la Chine 🙂
J’ai même eu du rab gratuit ! Il devait rester un peu de place sur le panneau lors de la mise en lot.

DSCF3058DSCF3063DSCF3067DSCF3120

Après des heures à faire l’aller-retour entre mon atelier stencil pour la pâte à souder et mon mini four pour la soudure, et après quelques heures en plus à souder les 128 leds infrarouges et les 128 photodiodes … le cadre est fini.

DSCF3151DSCF3856DSCF3858DSCF3854

Gros plans sur les cartes assemblées pour les curieux :

DSCF3077DSCF3079DSCF3082

Et sur les stencils de soudure pour ceux qui ceux demandent à quoi ils ressemblent :

DSCF3074DSCF3073

Débute donc les tests finaux et le développement du code source final.
Et là … problème, mais alors gros problème.

Après avoir testé toutes les cartes assemblées (marquée d’un point blanc sur les photos), j’ai eu un moment de doute.
Dans le code de test, j’utilise systématiquement l’adresse 0x00. Seul le module #0 aurait donc dû répondre, mais pas les autres !
Sentant la grosse boulette arriver, j’ai repris le schéma et … aie.

Capture

D’après le datasheet, les broches > (supérieur), < (inférieur) et = (égale) doivent être mises à des niveaux logiques bien précis quand on n'utilise pas la mise en cascade (normalement utilisé pour comparer des adresses de plus de 4 bits).
La broche égale devrait donc être fixée à "1", soit +5v, pas à "0" ! Oups.

Bon pas de panique, un coup de cutter et un petit jumper sur chaque carte peut rapidement résoudre le problème.
Oui, mais …

En refaisant le schéma au propre (avec son nouveau routage), je remarque un truc bizarre.
Je suis habitué à faire de la logique inversée, dans l’énorme majorité de mes cartes "1" = 0v et "0" = 5v.
Cela permet de régler pas mal de soucis techniques avec une simple résistance de tirage et d'utiliser pleinement les ressources logicielles et matérielles des microcontrôleurs 8 bits que j'utilise.

Sauf qu'ici on parle d'un comparateur d'adresse … pas d'un microcontrôleur. Le comparateur lui fonctionne en logique classique "1" = 5v, "0" = 0v.
Un signal actif à l'état haut d'un côté, un signal actif à l'état bas de l'autre, un comparateur dans un état illégal (à cause des trois broches à GND) …
Tous les prérequis d'un bon plantage sont réunis.

Le comparateur étant dans un état illégal, il génère un signal de sortie parfaitement illogique (en l’occurrence ici, avec <, < et = à GND il sort un signal constant à "0").
La logique entre le comparateur et le microcontrôleur étant inversé, le "0" en sortie du comparateur devient un "1" logique pour l'activation du bus SPI.

Dans les faits, qu'importe l'adresse sur le bus, la communication SPI est toujours active. FAIL.
Et n'ayant pas testé l'adressage avec mon prototype … ce qui devait arriver arriva : une erreur de conception dans une série de 16 cartes assemblées.

Capture2

Bon le correctif n’est pas très compliqué.
La broche = (égale) du comparateur est maintenant reliée à VCC pour que le comparateur fasse son boulot et un inverseur à transistor a été ajouté entre la sortie du comparateur et l’entrée du CS du microcontrôleur pour mettre les niveaux logiques « dans le bon sens ».

Reste maintenant à appliquer la modification sur les 16 cartes déjà assemblées …

DSCF3062

Du coup je ressors ma petite station à air chaud de son placard (Atten 858d+, moins de 60€ sur amazon/ebay, c’est une petite station qui ne paye pas de mine, mais qui rend bien service).

À voir si après modification le système marche … ce n’est pas gagné.

Conclusion : ne jamais faire rapidement les tests fonctionnels, même si c’est pour un projet perso, surtout avant de lancer une série de 16 cartes.
Sinon dans le cas contraire, vous vous retrouverez comme moi avec 16 cartes à patcher à grand coup de cutter, de fils et de circuits dead bug.
« Lesson learned the hard way », comme on dit.

Discussion

Une réflexion sur “[EPIC FAIL] Cadre XY infrarouge

  1. Merci pour ces belles photos et les précieux conseils.

    Publié par fuelk2 | 18 novembre 2015, 10 h 44 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.