Manual

do

Maker

.

com

Conversor para matriz de LEDs do Arduino UNO R4

Conversor para matriz de LEDs do Arduino UNO R4

Vimos no artigo Manipulação da matriz de LEDs do UNO R4 como converter um array de unsigned long para o formato de matriz bi-dimensional 8x12. Como citei no artigo, a razão de fazê-lo diretamente no Arduino é, além de prazer e conhecimento, a praticidade de poder fazê-lo a partir de um sketch da sua coleção. Nesse artigo veremos o processo contrário; um conversor para matriz de LEDs que converte um array bi-dimensional para um array de unsigned long.

Não é mais fácil desenhar na matriz bi-dimensional?

De fato, ter uma matriz bi-dimensional formatada no código é humanamente legível. Porém, ainda que sendo um array de unsigned char, é maior do que um array de unsigned long. Vejamos:

Unsigned char

Um uint8_t (ou "unsigned char") equivale a 1 byte. Para uma matriz bi-dimensional, temos um array de 12*8, totalizando 96 bytes.

Unsigned long

Um long tem 4 bytes. Com 12 bytes temos os 96 bits (12 * 8, porque 1 byte equivale a 8 bits). Ou seja, um long tendo 4 bytes, precisamos de apenas 3 long.

Além da enorme economia de recursos, se formos fazer uma animação, é mais apropriado ter grupos de código com 3 linhas na declaração do que ter uma matriz de 8 linhas. Claro, podemos sempre criar um arquivo de header para guardar exclusivamente a animação, mas ainda assim seria um desperdício de recurso e uma chateação para rolar o código.

Sketch do conversor para matriz de LEDs

Então, ganhamos por um lado e perdemos pelo outro, já que utilizar uma matriz bi-dimensional nos permite visualizar minimamente o resultado final, enquanto um array de long faz com que isso seja impossível. O que fazer? - Simples.

Desenhe seus frames em um header ou em um arquivo de texto, Coloque-o no sketch e passe como parâmetro para a função bits2long.

Aqui está um sketch com o coração, como exemplo:

uint8_t heart_byte[8][12] = {
{0,0,1,1,0,0,0,1,1,0,0,0},
{0,1,0,0,1,0,1,0,0,1,0,0},
{0,1,0,0,0,1,0,0,0,1,0,0},
{0,0,1,0,0,0,0,0,1,0,0,0},
{0,0,0,1,0,0,0,1,0,0,0,0},
{0,0,0,0,1,0,1,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0}
};

void bits2long(uint8_t target[8][12]){
  unsigned long frame[3] = {0};

  uint8_t shift_pos      = 31;
  uint8_t array_pos      = 0;
  for (uint8_t i=0;i<8;i++){
    for (uint8_t j=0;j<12;j++){
      frame[array_pos] += (target[i][j])<<shift_pos;

      array_pos = shift_pos == 0 ? array_pos+1 : array_pos;
      shift_pos = shift_pos == 0 ? 31 : shift_pos-1;
    }
  }
  Serial.println("unsigned long frame[] = {");
  for (uint8_t i=0;i<3;i++){
    Serial.print("    0x" + String(frame[i],HEX));
    Serial.println(",");
  }
  Serial.println("};");
}

void setup() {
  Serial.begin(9600);
  bits2long(heart_byte);
}

void loop() {
  // put your main code here, to run repeatedly:
}

O resultado desse sketch será esse:

uno-r4-bits2long.png

Agora basta copiar a saída do terminal e ir salvando os quadros de sua animação em um arquivo. Não se esqueça de identificá-los com outro nome ou colocá-los em um novo array.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.