Matrice de LED 3D
Présentation
Le but de ce projet est de concevoir une matrice 3D composée de 512 leds (8x8x8) et d'y faire afficher dans un premier temps des formes géométriques (par exemple à partir de formules mathématiques) et dans un second temps de réaliser un jeu de type Snake, pilotable grâce à une manette de Wii. Le tout sera présenté lors des journées Portes Ouvertes de l'école afin de promouvoir le département IMA.
Matériel requis
- 512 leds et des fils pour les connecter entre elles
- un Arduino
- des composants permettant de commander les 64 entrées et 8 sorties de la matrice avec beaucoup moins de sorties disponibles sur l'Arduino
- (x1) SN74HCT138 - 3-line to 8-line Decoder (pour les etages)
- (x8) 74HCT595 - 8-bit Serial-in/serial or parallel-out shift register with output latches 3-state
- (x8) 74HCT244 - 8-bit buffer/line driver with 3-state outputs (attention : courant max trop faible ??)
http://www.zem.fr/decouverte-du-composant-74hc595-8-bit-shift-register/
- 2e solution :
- 74HC154 decoder 4-16
- (x8) ULN2804 buffer 8 bit (500 mA -> ok pour les leds)
- 2e solution :
- de quoi alimenter les leds (alimentation de 1A à 1.5A)
- une manette de Wii
Avancement du projet
Lundi 4 Février
Cette première séance a été mise à profit afin de mieux cerner le projet, en discutant avec les enseignants et en commançant les recherches sur la manière de réaliser la matrice.
Jeudi 7 Février
Traçage de plans de montage, remise en question quant au moyen de commander les 64 colonnes de leds (le multiplexage semblait le plus évident mais d'autres possibilités comme des registres à décalage pourraient également convenir).
Lundi 11 Février
Définition des moyens en composants pour créer le circuit de commande. Création du patron du guide qui servira à aligner les leds et les souder facilement.
Ce patron a été transmis à la personne qui se chargera de fabriquer le support par commande numérique.
Jeudi 14 Février
Séance mise à profit pour compter et tester les 512 leds (en y ajoutant quelques pièces en cas de souci au montage).
Lundi 25 Février
Recherche à propos du moyen de connecter un nunchuck en filaire ou une Wiimote en bluetooth. La Wiimote requiert un type de connexion non offert par les cartes Arduino. Création de PCB pour la carte qui supportera les composants et redéfinition des composants nécessaires (les ULN2803 seront utilisés à la place des 74HCT244 dans la première solution).
Mercredi 27 Février
Le travail de création du PCB est bien avancé, il a été retardé car il fallait recréer des librairies de composants utilisés dans le montage.
Un petit inconvénient est survenu, il semble que les ULN2803 ne soient pas parfaitement adaptés, en effet il nous faudrait plutôt des montages de transistors capables de fournir de la puissance vers les LEDs. À première vue il faudrait utiliser des composants de type "Source type darlington transistor array" (comme le M54564P).
Le nunchuck est connecté sur Arduino Uno dans un premier temps (problèmes de drivers pour un Mega sur Windows), nous reconsidérons l'utilité de prendre un Mega pour ce projet. Une Uno semble suffire du point de vue matériel.
Le nunchuck utilise I2C, nous savons récupérer les différentes informations provenant de celui-ci (accéléromètre X,Y,Z, joystick X,Y, boutons Z et C). Pour le connecter sur Arduino nous avons utilisé un adaptateur "wiichuck" mais nus avons également pensé fabriquer cet adaptateur par nous-mêmes au vu de la simplicité du montage.
Point à travailler : savoir quels seuils de l'accéléromètre sont exploitables pour l'utilisation envisagée (choix des modes de jeu, etc...), ceux-ci sont différents en focntion de la vitesse à laquelle le nunchuck est déplacé.
Jeudi 28 Février
Après quelques recherches il semble que nos doutes soient fondés, il faut remplacer les ULN2803 initialement prévus par des TD62783 APG/AFG/AFWG. En effet les ULN2804 sont des "sink drivers" alors qu'il nous faut des "source drivers" comme les TD62783.
Au niveau de l'Arduino, l'acquisition des données provenant du Nunchuck est à présent fonctionnelle, on peut donc passer au traitement de ces données.
Lundi 4 Mars
Nous contrôlons des LEDs grâce au nunchuck. On peut remarquer que les axes X,Y et Z de l'accéléromètre ne réagissent pas de la même manière et ne sont pas réellement indépendants. Ceci pose un problème de choix de l'axe à utiliser pour telle ou telle fonction : les axes Y et Z réagissent quasiment de la même manière à un mouvement vers le haut.
De plus les broches 0 et 1 numériques servent à la liaison série (RX TX), ce qui pose problème pour l'instant car nous avons besoin de toutes les broches numériques et si on initialise le port série dans le code( Serial.begin), ces 2 broches deviennent uniquement utilisées pour la liaison série. Cependant les broches analogiques non utilisées semblent pouvoir être utilisées en tant que sorties numériques.
Mercredi 6 Mars
Test du jour : gérer l'allumage d'une ligne de leds, une par une et dans les 2 sens, grâce au nunchuck (accéléromètre X), choix de la vitesse de défilement avec le joystick.
Réflexion quant à l'algorithme du jeu Snake, et à l'implémentation sur l'arduino.
La structure du code se déroule ainsi :
- setup : initialisation du nunchuck, calibrage des valeurs des accéléromètes, joystick et boutons
- loop :
- demande et réception des données du nunchuck et décodage de ces données
- partie traitement des données : calcul des ordres à donner à la matrice
- affichage sur la matrice
Lundi 11 Mars
Voici l'avancement du PCB de la carte qui commandera les 512 LED (partie Hardware) :
Il reste quelques pistes à relier sur le PCB suite à quoi nous pourrons commencer les tests sur plaquette grâce aux composants reçus.
Niveau informatique : détermination des seuils de perception d'allumage des LEDs, c'est à dire quelle est la durée maximale qui permet de voir les LEDs (allumées l'une après l'autre) comme si elles étaient allumées en même temps.
On obtient pour 6 LEDs de test un temps de pause maximal de 4 ms par LED, soit une boucle de 24 ms max (rafraichissement de 42 Hz minimum).
Mercredi 13 Mars
Réception d'un nouveau Nunchuck. Un peu de temps perdu à devoir retester et recalibrer les valeurs, car les accéléromètres réagissent différemment du Nunchuck que nous avions emprunté.
D'un autre côté, nous avons commencé à écrire un algorithme de jeu Snake en utilisant une matrice 2D 8x8 Sparkfun en attendant la vraie matrice 3D. Cette matrice de développement a l'avantage de représenter une méthode de transfert qui ressemble en partie à la solution que nous avons adoptée pour la matrice 3D, c'est à dire que l'on envoie les informations bit par bit en série.
Une fois l'algorithme opérationnel en 2D, ajouter une troisième dimension devrait être assez aisée.
Mercredi 20 Mars
Nous avons maintenant un Snake totalement fonctionnel en 2D sur matrice 8x8, pilotable par le nunchuck. La troisième dimension est codée, il ne restera qu'à la tester une fois en possession de la matrice 3D.
Cependant il faut revoir le moyen de stocker les valeurs du serpent en mémoire. Un tableau[8][8][8] est le plus simple mais pas le plus efficace pour envoyer les données à la matrice. Un tableau de 8 octets est mieux adapté mais plus compliqué à mettre en oeuvre.
Explications techniques
Le jeu Snake
Le but du jeu est de tenir le plus longtemps possible en mangeant des "fruits" qui apparaissent sur la matrice. Il faut diriger le serpent vers ces fruits, une fois mangés la queue du serpent s'allonge d'une unité. Si le serpent arrive en bord de la matrice, il réapparait par la face opposée. Le joueur perd lorsque le serpent rencontre sa propre queue.
Protocole I2C
I2C (Inter Integrated Circuit) est la norme à utiliser pour dialoguer avec le nunchuck. Celle-ci utilise 2 fils (data et clock), les 2 autres fils étant l'alimentation et la masse. L'utilisation de cette norme impose d'utiliser les broches A4 et A5 sur un Arduino Uno car seules celles-ci sont utilisables pour ce protocole. En utilisant un adaptateur comme le wiichuck, on se retrouve à devoir envoyer VCC sur A3 et GND sur A2 :
#define pwrpin PORTC3 #define gndpin PORTC2 DDRC |= _BV(pwrpin) | _BV(gndpin); PORTC &=~ _BV(gndpin); PORTC |= _BV(pwrpin);
_BV sert à assigner une sortie particulière plutôt que de devoir assigner tout le port comme en assignation explicite.
Commande de la matrice
La matrice est accessible par les 64 colonnes et les 8 étages. Ceci signifie qu'il faudrait, si l'on souhaitait connecter toutes ces entrées / sorties directement sur les sorties d'un Arduino, utiliser 72 broches, ce qui n'est pas possible. Il faut donc réduire le nombre de broches à commander grâce à du multiplexage et des registres à décalage.
Pour commmander les sorties, on peut soit faire une boucle qui assigne la bonne valeur à chaque broche, soit écrire directement dans le port qui gère ces sorties, ce qui semble être plus rapide et évite de devoir utiliser les Digital.Write().