User Tools

Site Tools


electronique:cube3x3x3:accueil

Cube 3x3x3

Voici, si vous le voulez, une petite vidéo du cube en pleine action: http://www.youtube.com/watch?v=67nwo82gblM

Il n'y a pas encore beaucoup d'animations, ca viendra (ou pas ^^).

Réalisation

La réalisation du cube en soi est une vraie chiantise. Vous devez en premier créer trois matrices de 3×3. Après, il faut unir ces trois matrices ensemble. Comme j'allais utiliser un 74LS138 pour le démultiplexage, j'ai choisi de, pour chaque étage, grouper les leds par leurs anodes (+). On a donc, pour chaque étage, 9 pins qui sont les cathodes (-) des leds ainsi qu'un pin qui sert d'alimentation à celles-ci. Ensuite, quand vous unissez les étages ensemble, vous devez unir chaque cathode de chaque led à celle d'en dessous. Vous avez au final un cube qui comporte 9 cathodes ainsi que 3 anodes.

Les cathodes représentent la maille au plan horizontal et les anodes l'auteur de la led (plan vertical donc). Pour éviter d'utiliser 9 I/O pour les cathodes, je vais utiliser un 74LS138 qui va permettre, à partir de 3 entrés, de fournir 8 sorties. Comme vous l'avez remarqué, 8 < 9, une led sera donc directement raccordée au µC (dans ce cas ci un Attiny2313).

Voici une photo du cube (vous noterez que le dernier étage est vraiment tordu, je me suis un peu loupé ^^, la photo est aussi retournée):

Connectique

Le plan de nommage des leds sur le plan horizontal est le suivant:
761
852
943
Et sur le plan vertical:
3
2
1

Nous allons connecter les cathodes au 74LS138. Pour cela, par le biais d'une résistance, on connecte la led 1 à l'entrée 0 (pin 15 du 74LS138), la led 2 à l'entrée 1 (pin 14), etc…
Vous remarquerez qu'il n'y a pas assez de pins pour connecter la led 9. On va la brancher au pin 15 de l'attiny2313.
Les entrées A1(pin 1), A2,(pin 2) et A3(pin3) vont respectivement aux sorties 12, 13, 14 (PB0, PB1, PB2) de l'attiny. On connecte ensuite E1 et E2 à la terre ainsi qu'E3 au pin 15 de l'attiny2313: cela permettra d'“éteindre” le 74LS138 quand la led 9 est allumée.
Il ne reste plus qu'à brancher les masses de chaque étage au µC. Pour cela, on branche l'étage du bas au pin 16 de l'attiny, l'étage du milieu au pin 17 et l'étage du haut au pin 18.

Programme

Tous les branchements sont normalement faits, il ne reste plus qu'à coder le programme (en C). Voici un petit exemple qui fait faire une jolie apparition des leds une par une:

/*
 * ----------------------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * <frank[ASCII:64]villaro-dixon.eu> wrote this file. As long as you retain this
 * notice, you can do whatever you want with this stuff. If we meet some day,
 * and you think this stuff is worth it, you can buy me a beer in return.
 * Frank Villaro-Dixon
 * ----------------------------------------------------------------------------
 */
 
/*
 *Cube 3x3x3
 *Voir ici: http://wiki.villaro-dixon.eu/doku.php?id=electronique:cube3x3x3:accueil
 */
 
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
 
 
//2
//1
//0
 
//761
//852
//943
 
 
 
int LED[4][10] = {
    {0,0,0,0,0,0,0,0,0,0}, //On s'en fout
    {1,0b0011000,0b0011001,0b0011010,0b0011011,0b0011100,0b0011101,0b0011110,0b0011111,0b0010000}, //Bas
    {1,0b0101000,0b0101001,0b0101010,0b0101011,0b0101100,0b0101101,0b0101110,0b0101111,0b0100000}, //Milieu
    {1,0b1001000,0b1001001,0b1001010,0b1001011,0b1001100,0b1001101,0b1001110,0b1001111,0b1000000} //Haut
 
    };
 
 
//Le premier bit est inversé car il ne passe pas par le 74LS138.
#define DELAY 200
 
 
int main(void)
{
 
    DDRB = 0xFF;
    PORTB = 0x00;
 
    /*int pause = 50;
    int i = 0;*/
    int a = 1, b = 1, aContinue = 1, bContinue = 1, i = 1, j = 1;
    while(1)
    {
 
        while(aContinue)
        {
            while(bContinue)
            {
                PORTB = LED[a][b];
                _delay_ms(DELAY);
                if(j == 1)b++;
                else b--;
                if(b == 0 || b == 10)bContinue = 0;
            }
            //b = 1;
            bContinue = 1;
 
            if(j == 1)j = 0;
            else j = 1;
 
            if(i == 1)a++;
            else a--;
            if(a == 1 || a == 3)aContinue = 0;
        }
        aContinue = 1;
        if(i == 1)i = 0;
        else i = 1;
 
 
    }
 
 
 
    return 0;
}

Discussion

Enter your comment. Wiki syntax is allowed:
OHLXU
 
electronique/cube3x3x3/accueil.txt · Last modified: 2011/12/26 20:51 (external edit)