Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

segunda-feira, 19 de janeiro de 2015

Automação no Parque, 17/01/15

Nesse sabadão apareceu por lá o Carlos, um frequentador jovem ainda a mais tempo que eu. Ele trouxe um kit que ganhou de presente em uma palestra de Arduino, muito legal por sinal. Nesse kit havia um shield com uma matriz de LEDs. Melhor mostrar o bicho funcionando do que descrevê-lo, nénão?


Essa "espiral de DNA" é um programa exemplo que vem com a plaquinha. Uma coisa interessante que dá para ver é dá inclusive para controlar a intensidade dos LEDs, repare em que uma das "pernas" da dupla hélice brilha menos que a outra.

O shield chama-se LOLShield, sabe-se lá porque... tem um site muito legal feito pelo povo que faz o bicho, que vc encontra aqui. Ele é baseado num esquema de multiplexação chamado Charlieplexing, que a Wikipedia explica direitinho. A biblioteca tem funções de texto, schroll, tudo muito bem feito e razoavelmente bem documentado (é só olhar os exemplos e a coisa anda bem).

O dono da bola (Carlos, claro) propôs o desafio de construirmos uma aplicação que mostrasse uma seta em movimento de maneira a indicar uma determinada direção, ou seja, uma espécie de "seta cuticuti" para veículos. Assim foi feito, abaixo o código, no fim a coisa funcionando.

#include "Charliplexing.h"
#include "Font.h"

// Dimensões da matriz
#define rows 10
#define cols 14

// Diagrama da seta
byte seta[rows][cols] =
{{0 ,0 ,0 ,0 ,1 ,1 ,0 ,0 ,0 ,0 ,0, 0, 0, 0},
 {0 ,0 ,0 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,0, 0, 0, 0},
 {0 ,0 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0, 0, 0, 0},
 {0 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1, 1, 1, 1},
 {1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1, 1, 1, 1},
 {0 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1, 1, 1, 1},
 {0 ,0 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0, 0, 0, 0},
 {0 ,0 ,0 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,0, 0, 0, 0},
 {0 ,0 ,0 ,0 ,1 ,1 ,0 ,0 ,0 ,0 ,0, 0, 0, 0}
};

void drawArray(byte inicio, byte array[rows][cols])
{
  for(int i=0;i<rows;i++)
    for(int j=0;j<cols;j++)
    {
      int c=j+inicio;
      if(c < cols)
        LedSign::Set(c,i,array[i][j]);
    }
}

void schrollArray(byte time,byte array[rows][cols])
{
  for(int i=0;i<cols;i++)
  {
     drawArray(cols-i-1,seta);
     delay(time);
  }
}

void setup()
{
  LedSign::Init();
  LedSign::Clear();
}

void loop()  
{
  schrollArray(25,seta);
}


As falhas que aparecem no painel, como vc provavelmente adivinhou, são LEDs queimados... :(

That´s it!