terça-feira, maio 19, 2015

Cubo de LEDs 4x4x4 Bicolor - Parte 4

Terminada a montagem, é hora de fazer um teste e pra isto precisamos de um software.



O ATmega328 deste projeto pode ser programado através da IDE do Arduino, bastando conectar um adaptador serial USB TTL (o ATmega precisa ter o bootloader do Arduino).

Lembrando, a ligação do cubo de LEDs ao ATmega é composta de duas partes:
  • "Plano": um dos terminais dos LEDs de cada um dos quatro planos (ou níveis) estão interligados entre si e a um pino do ATmega
  • "LED": o outro terminal dos LEDs é interligado na vertical e a um pino do ATmega
Neste teste vamos querer acender um LED por vez de cada plano, primeiro na cor vermelha e depois na cor verde. Para facilitar a conferência vamos deixar o LED aceso por um segundo.

Para isto precisamos acionar um plano de cada vez. O pino ligado a este plano será configurado como saída, para acender vermelho colocamos o pino em HIGH e para acender verde colocamos o pino em LOW Os pinos ligados aos demais planos serão configurados como entrada, para ficarem em alta impedância.

Em seguida é preciso colocar a tensão correta no outro terminal do LED. Quando estamos acendendo um LED vermelho, o pino correspondente a ele precisa estar em nível HIGH e os demais em nível LOW. Para acender na cor verde é preciso inverter isto: o pino correspondente ao LED aceso fica me nível LOW e os apagados em nível HIGH.

Entendido isto, bastam duas matrizes com as listas de pinos dos planos e LEDs e alguns laços:

int nivel[] = { 4, 5, 6, 7 };
int led[] = { 
  0, A4, A2, 10,
  A5, A0, 3, 9,
  A3, 1, 13, 8,
  A1, 2, 12, 11
};

void setup()
{
  for (int i = 0; i < 4; i++)
  {
    pinMode (nivel[i], INPUT);
    digitalWrite (nivel[i], LOW);
  }
  for (int i = 0; i < 16; i++)
  {
    pinMode (led[i], OUTPUT);
    digitalWrite (led[i], LOW);
  }
  
}

void loop()
{
  for (int iNiv = 0; iNiv < 4; iNiv++)
  {
    pinMode (nivel[iNiv], OUTPUT);
    digitalWrite (nivel[iNiv], HIGH);
    for (int iLed = 0; iLed < 16; iLed++)
    {
      digitalWrite (led[iLed], LOW);
    }
    for (int iLed = 0; iLed < 16; iLed++)
    {
      digitalWrite (led[iLed], HIGH);
      delay (1000);
      digitalWrite (led[iLed], LOW);
    }
    digitalWrite (nivel[iNiv], LOW);
    for (int iLed = 0; iLed < 16; iLed++)
    {
      digitalWrite (led[iLed], HIGH);
    }
    for (int iLed = 0; iLed < 16; iLed++)
    {
      digitalWrite (led[iLed], LOW);
      delay (1000);
      digitalWrite (led[iLed], HIGH);
    }
    pinMode (nivel[iNiv], INPUT);
  }
}

O vídeo abaixo mostra o resultado.



No próximo post vamos ver uma demonstração mais sofisticada do cubo.

Nenhum comentário: