Tuto : Comment faire un cube de led RGB

Votre appartement manque de décoration et de couleur ? Nous allons régler votre problème en “seulement” 100 heures ! Incroyable, non ?

Si vous êtes un peu bricoleur et que vous avez bien suivi vos cours de langage C et d’électronique, ce sera du gâteau… Ou pas.

Pour la présentation, on va créer un cube de 5*5*5 leds, mais n’hésiter pas à faire plus grand si vous vous sentez assez courageux (et que vous avez beaucoup, beaucoup de temps devant vous).

Matériel :

  • Un paquet de 125 leds RGB (prévoyez un peu plus, on n’est jamais à l’abri de dégâts)
  • Beaucoup de fils conducteurs (préférez des fils rigides pour que la structure soit solide), et des fils plus souples pour câbler les composant entre eux)
  • Un fer à souder
  • Des plaques de cuivre pour faire les cartes électroniques
  • Logiciel Eagle (pour la conception des cartes électroniques)
  • Une alimentation de 5V
  • 3 registres à décalage (74HC595)
  • 1 transistor darlington (ULQ2003)
  • 75 résistances de 360 ohms (attention, le calcul de résistance change si vous faites un cube plus petit ou plus grand)
  • 31 connecteurs à 5 pins
  • De quoi faire un socle assez grand pour accueillir les 5 cartes électroniques, l’Arduino et les fils, dans notre nous avons une impression 3D et des plaques de plexiglas
  • Une machine pour faire les routages des cartes électroniques
  • Arduino

Etape 1 : les cartes électroniques

Commencez par installer le logiciel Eagle sur votre PC. Votre Schéma doit être conçu comme ceci :

Et le board ainsi :

ATTENTION : les chemins rouges sont sur le dessus de la carte et les chemins bleus sur le dessous. Pensez bien à retourner vos cartes électroniques à la fin de l’impression.

Etape 2 : la soudure des cartes électroniques

C’est un travail qui demande un peu de rigueur, privilégiez un étain fin pour avoir de belles soudures. Assurez-vous que tous vos composants sont bien soudés pour éviter de rencontrer des problèmes plus tard. Au bout de la cinquième carte, vous devriez avoir le coup de main !

Etape 4 : Réalisation du cube

Cette étape est Quasiment composé que de soudure. Le but est d’avoir une structure jolie mais surtout solide. On ne veut pas un cube qui ressemble aux antennes de Tchernobyl comme ci-dessous…

…mais plutôt comme celui-ci

Nos petites astuces :

  • Torsader les fils
On ne voit pas grand chose mais l’idée est là
  • Aide au pliage des leds

  • Aide pour faire les colonnes
  • Aide pour faire les panneaux

Une fois les 5 panneaux fait, il ne vous reste qu’à les assembler

Etape 5 : Réalisation du socle

On vous conseille de faire une conception assistée par ordinateur si vous avez une imprimante 3D. Sinon, un socle que vous confectionnez vous-même fera tout aussi bien l’affaire.

Prévoyez un socle assez profond pour pouvoir stocker toutes les cartes électroniques et les fils (pas comme nous …).

Etape 6 : Assemblage

Vous allez maintenant faire quelque chose de tout nouveau… SOUDER !

On va relier nos cartes électroniques à notre cube de leds donc il va falloir souder nos connecteurs aux anodes et aux cathodes. 

Un connecteur n’est relié qu’à la même couleur, un connecteur par panneau pour les anodes rouges, un par panneau pour les vertes et un par panneau pour les rouges.

Il faut aussi que vous reliiez toutes les cathodes d’un même étage entre elles puis les souder au connecteur pour l’ULQ.

Pour finir, il faut passer à la connectique, il faut faire tous les branchements nécessaires entre les cartes électroniques, le cube de leds, l’Arduino et l’alimentation, de façon à mettre en série les registres à décalage et relier les masses.

Dans notre cas, cela donne ceci :

Etape 7 : Programmation

Nous vous donnons un programme qui vous permettra d’allumer le cube comme vous le souhaitez.

#define latch_pin 2
#define data_pin 11
#define clock_pin 13
//1er panneau
#define etage1 3
#define etage2 5
#define etage3 6
#define etage4 7
#define etage5 8

#define Rouge 2 
#define Vert 1 
#define Bleu 4 


void setup() {

  pinMode(latch_pin, OUTPUT);
  pinMode(data_pin, OUTPUT);
  pinMode(clock_pin, OUTPUT);

  pinMode(etage1, OUTPUT);
  pinMode(etage2, OUTPUT);
  pinMode(etage3, OUTPUT);
  pinMode(etage4, OUTPUT);
  pinMode(etage5, OUTPUT);

  Serial.begin(115200);

  digitalWrite(clock_pin, LOW);
  digitalWrite(latch_pin, LOW);

  digitalWrite(etage1, LOW);
  digitalWrite(etage2, LOW);
  digitalWrite(etage3, LOW);
  digitalWrite(etage4, LOW);
  digitalWrite(etage5, LOW);

  for (int i = 0; i < 24; i++) {
    digitalWrite(data_pin, 0);

    digitalWrite(clock_pin, HIGH);
    digitalWrite(latch_pin, HIGH);

    digitalWrite(clock_pin, LOW);
    digitalWrite(latch_pin, LOW);

  }
}

void loop() {



  long int data = 0x000000;
  // 1er etage, vu du haut du cube
  
  int tabcouleur1[25] = 
  {Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu};
  
  // 2e etage
  int tabcouleur2[25]=
  {Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Rouge, Rouge, Rouge, Vert+Bleu,
   Vert+Bleu, Rouge, Rouge, Rouge, Vert+Bleu,
   Vert+Bleu, Rouge, Rouge, Rouge, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu};

  // 3e etage
  int tabcouleur3[25]=
  {Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Rouge, Rouge, Rouge, Vert+Bleu,
   Vert+Bleu, Rouge, Rouge, Rouge, Vert+Bleu,
   Vert+Bleu, Rouge, Rouge, Rouge, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu};

  // 4e etage
  int tabcouleur4[25]=
  {Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Rouge, Rouge, Rouge, Vert+Bleu,
   Vert+Bleu, Rouge, Rouge, Rouge, Vert+Bleu,
   Vert+Bleu, Rouge, Rouge, Rouge, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu};

  // 5e etage 
  int tabcouleur5[25]=
  {Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu,
   Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu, Vert+Bleu};

  pushetage(tabcouleur1,etage1,5,5);
  pushetage(tabcouleur2,etage2,5,5);
  pushetage(tabcouleur3,etage3,5,5);
  pushetage(tabcouleur4,etage4,5,5);
  pushetage(tabcouleur5,etage5,5,5);
}

long int ligne (const int*couleur, int nb) // couleur : la 1ère ligne de tabcouleur
                                           // nb : le nombre d'élement d'une ligne de tabcouleur
{
  long int data_l = 0; // variable où sera stocké le mot
  for (int i = 0; i < nb; i++) // on parcourt couleur
  {
    
    for (int j = 0 ; j < 3; j++)
    {
      
      if (couleur [i] & (1 << j))
      {
        data_l = data_l  | (1 << (nb - i -1 + j * nb));
       
      }
    }
  }
  return data_l; // retourne le mot pour l'utiliser dans la loop avec la fonction push
}



void push(long int data, int datalen) // data : le mot envoyé
                                      // n : la ligne à allumé
                                      // datalen : le nb de led par ligne 
{
  datalen = datalen * 3  ; // taille de notre mot envoyé 5*3
  for (int i = 0; i < datalen; i++)  //0<i<4 : bleu, 6<i<10 : vert,12<i<16 :rouge 
  { 
    digitalWrite(data_pin, (data & 0x01)); //écrit la valeur data dans la sortie data_pin
    
    digitalWrite(clock_pin, HIGH);
    digitalWrite(latch_pin, HIGH);
    digitalWrite(clock_pin, LOW); //on fait alterner la clock et le latch entre 0 et 5V
    digitalWrite(latch_pin, LOW); 
    data = data >> 1; // à chaque coup d'horloge le mot data se décale de 1 
  }
}

void pushetage(const int*tabcouleur, int etage, int range, int nbledparrange){ // etage : l'étage à allumer
                                                                               // range : le numéro de rangé/ligne de couleur dans le tableau
                                                                               // nbledparrange : le nombre de led sur chaque rangé
  long int data;
  for (int i = 0; i < range; i++) //on parcourt chaque rangé
  {
    data = ligne(tabcouleur+nbledparrange*i, nbledparrange); //...+nbledparrange*i pour prendre la bonne rangé
                                                             // transforme la ligne de tabcouleur en data
    push(data,nbledparrange); //envoie de data dans un étage
  }
  digitalWrite(etage, HIGH); 
  delay(1);
  digitalWrite(etage, LOW);
}

Il vous suffit de changer les matrices de couleurs pour correspondre à vos envies ! Et surtout, vous pouvez, vous amusez à changer le programme pour des designs plus complexe.

Au final nous avons ce magnifique cube !

Bonne chance pour votre création !