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:

  1. int nivel[] = { 4, 5, 6, 7 };  
  2. int led[] = {   
  3.   0, A4, A2, 10,  
  4.   A5, A0, 3, 9,  
  5.   A3, 1, 13, 8,  
  6.   A1, 2, 12, 11  
  7. };  
  8.   
  9. void setup()  
  10. {  
  11.   for (int i = 0; i < 4; i++)  
  12.   {  
  13.     pinMode (nivel[i], INPUT);  
  14.     digitalWrite (nivel[i], LOW);  
  15.   }  
  16.   for (int i = 0; i < 16; i++)  
  17.   {  
  18.     pinMode (led[i], OUTPUT);  
  19.     digitalWrite (led[i], LOW);  
  20.   }  
  21.     
  22. }  
  23.   
  24. void loop()  
  25. {  
  26.   for (int iNiv = 0; iNiv < 4; iNiv++)  
  27.   {  
  28.     pinMode (nivel[iNiv], OUTPUT);  
  29.     digitalWrite (nivel[iNiv], HIGH);  
  30.     for (int iLed = 0; iLed < 16; iLed++)  
  31.     {  
  32.       digitalWrite (led[iLed], LOW);  
  33.     }  
  34.     for (int iLed = 0; iLed < 16; iLed++)  
  35.     {  
  36.       digitalWrite (led[iLed], HIGH);  
  37.       delay (1000);  
  38.       digitalWrite (led[iLed], LOW);  
  39.     }  
  40.     digitalWrite (nivel[iNiv], LOW);  
  41.     for (int iLed = 0; iLed < 16; iLed++)  
  42.     {  
  43.       digitalWrite (led[iLed], HIGH);  
  44.     }  
  45.     for (int iLed = 0; iLed < 16; iLed++)  
  46.     {  
  47.       digitalWrite (led[iLed], LOW);  
  48.       delay (1000);  
  49.       digitalWrite (led[iLed], HIGH);  
  50.     }  
  51.     pinMode (nivel[iNiv], INPUT);  
  52.   }  
  53. }  

O vídeo abaixo mostra o resultado.



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

Nenhum comentário: