Projet: maison de noel

Salut à vous bidouilleurs et bidouilleuse. Depuis un certains temps je m’étais procurer 5 circuits de matrices 8×8 DEL sur dx.com (http://www.dx.com/p/diy-max7219-dot-matrix-display-module-for-arduino-green-151840#.WkATdt_ibD4) pour mon projet Projet PAG: Fantôme lumineux interactif avant la naissance de mes enfants 4 ans de cela et maintenant qu’ils ont 4 ans et peuvent me laisser programmer tranquillement plus de 2 minutes j’ai mit à exécution mon plan de réutiliser ces circuits avec une touche plus simple et amusante.

Mon plan était d’utiliser ces cinq petits circuits de DEL pour afficher des images qui s’animerait de manière cyclique. Dans mon projet précédent je m’étais mis à faire trop de programmation pour simplement arriver à quelque chose d’utile. Cette fois je me suis dit que j’irais avec ce qu’il y a de facilement disponible. J’ai donc opté pour un Arduino Uno, microcontrôleur basé sur un atmega328p ayant 32kB de mémoire flash et de 2Kb de ram avec une vitesse de 16MIPS (c’est quoi des MIPS, c’est en claire Mega Instructions Per Seconds, pour un développeur de micro ça me parle). Sur arduino.cc il existe tout ce qu’il faut pour savoir programmer le Uno. Il existe une grosse communauté pour vous aider et des fabriquant tierce qui font aussi ce circuit à très bas prix.

Je me suis procuré mon Uno via Amazon dans un kit de débutant comprenant 24 projets d’électroniques et un Uno R3 avec adaptateur mural pour l’alimentation. Au moment de mon achat le kit se détaillait 25$ canadiens mais son prix régulier est d’environ 40$ mais il existe plusieurs fournisseur et c’est quand même moins dispendieux que le Arduino Uno d’Italie.

Pour la programmation j’ai utiliser l’IDE de arduino.cc télécharger sur le site et non celui dans le marché de Windows qui ne fonctionne pas si bien. J’ai repéré aussi une librairie pour mes afficheurs (controllés par un max7219) directement sur arduino.cc sous le nom de LedControl. J’ai eu un peu de difficulté avec cette librairie sur la manière qu’elle fonctionnait. J’ai réussi à faire fonctionner celle-ci mais pour être plus efficaces j’ai dut effectuer certains ajouts au Header et au code .cpp pour contrôler et rafraîchir efficacement mes animations.

Voici les ajouts:

LedControl.h
/*
 * Set a display data value to prepare refresh
 * Params:
 * addr address of the display *
 * data byte array[8]
 */ 
void setMatrixData(int addr, byte data[]); 
/*
 * Refresh 1 display
 * Params:
 * addr address of the display
 */ 
void refreshMatrix(int addr);

 /*
 * Refresh all display at once
 *
 */
 void refreshAll(void);
LedControl.cpp
void LedControl::setMatrixData(int addr, byte data[])
{
 int offset;
 int row;
 offset=addr*8;
 for(row =0; row < 8; row++)
 {
     if(addr<0 || addr>=maxDevices) return; status[offset+row]=data[row];
 }
}

void LedControl::refreshMatrix(int addr)
{
 int offset; 
 int row;
 offset = addr*8;
 for(row = 0; row < 8; row ++)
 {
    spiTransfer(addr, row+1,status[offset+row]);
 }
}

void LedControl::refreshAll(void)
{
 int i;
 for(i=0; i<maxDevices; i++)
 refreshMatrix(i);
}

Pour ce qui est de mes animations j’ai trouvé sur Android une petite application let’s art 8bit pour créer mes images 8 par 8 pixels en noir et blanc. Après, j’ai exporté mes images en png et transformé en code c à travers le site https://manytools.org/hacker-tools/image-to-byte-array/

Mes images d’origines sont celles-ci:

Et mon code arduino final a l’air de cela:

#include <LedControl.h>

/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 ***** Please set the number of devices you have *****
 But the maximum default of 8 MAX72XX wil also work.
 */
LedControl lc1=LedControl(12,11,10,5);
int frame = 0;

void setup() {
 // put your setup code here, to run once:
 int devices=lc1.getDeviceCount();
 for(int address=0;address<devices;address++) {
 /*The MAX72XX is in power-saving mode on startup*/
 lc1.shutdown(address,false);
 /* Set the brightness to a medium values */
 lc1.setIntensity(address,8);
 /* and clear the display */
 lc1.clearDisplay(address);
 }
}

byte sourire[8] = {0x38, 0x7c, 0xd6, 0xfe, 0xba, 0xc6, 0x7c, 0x38};
byte flocon01[8] = {0xa0, 0x44, 0xaa, 0x4, 0x0, 0x10, 0x38, 0x10};
byte flocon02[8] = {0x40, 0xea, 0x40, 0xa, 0x0, 0x10, 0x28, 0x10};
byte flocon03[8] = {0x4, 0x4a, 0xf1, 0x4a, 0x4, 0x28, 0x10, 0x28};
byte fetepetard01[8] = {0x3, 0x3, 0x7, 0x13, 0x29, 0x1b, 0x7, 0x3};
byte fetepetard02[8] = {0x3, 0x3, 0x27, 0x53, 0x21, 0xb, 0x7, 0x3};
byte fetepetard03[8] = {0x3, 0x53, 0x7, 0x83, 0x1, 0x2b, 0x7, 0x3};
byte perenoelchemine01[8] = {0x76, 0x3e, 0x36, 0x76, 0x7f, 0xff, 0x81, 0x7e};
byte perenoelchemine02[8] = {0x0, 0xe6, 0x6c, 0x6c, 0x3c, 0x7c, 0x7e, 0x81};
byte perenoelchemine03[8] = {0x0, 0x0, 0x0, 0xc, 0xe6, 0x6c, 0x3c, 0x7e};
byte perenoelchemine04[8] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};


void loop() {
 // put your main code here, to run repeatedly:
 delay(1000);
 lc1.setMatrixData(0,sourire);
 lc1.setMatrixData(2,sourire);
 if(frame == 0)
 {
 frame++;
 lc1.setMatrixData(1,flocon01);
 lc1.setMatrixData(4,perenoelchemine01);
 lc1.setMatrixData(3,fetepetard01);
 }
 else if(frame == 1)
 {
 frame ++;
 lc1.setMatrixData(1,flocon02);
 lc1.setMatrixData(4,perenoelchemine02);
 lc1.setMatrixData(3,fetepetard02);
 }
 else if(frame == 2 )
 {
 frame++;\\\\\\\\\\\\\\\\\
 lc1.setMatrixData(1,flocon03);
 lc1.setMatrixData(4,perenoelchemine03);
 lc1.setMatrixData(3,fetepetard03);
 }
 else if(frame == 3)
 {
 frame = 0;
 lc1.setMatrixData(4,perenoelchemine04);
 }
 lc1.refreshAll(); 
 delay(1000);
}

 

Pour finir mon circuit est simplement en ligne pour les cinq matrices. J’ai découpé une boite après avoir dessiné de manière sommaire mes carrés correspondant sur le carton.

IMG_20171210_171354.jpgDécouper le carton et vérifier les ouvertures des matrices DEL.

Ensuite j’ai fait le contour de mes maisons sur une feuille avec les fenêtres aux bonnes places. J’ai fait confiance à mes fils et les ai laissé faire des dessins sur cette feuille. Quand le tout fut fini, j’ai testé le circuit une dernière fois et lorsque satisfait collé celle-ci sur le carton. Et voilà, nous avons une maison de noël avec une animation personnalisée.

Publicités

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 )

Photo Google+

Vous commentez à l'aide de votre compte Google+. 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 )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.