Vamos a programar #8 - Inútil-apps #1 - Max7219 + arduino.

El dia de hoy terminaremos de hacer nuestro proyecto. Ya hicimos la parte del hardware, la parte de windows y ahora solo nos resta la parte del software para Arduino.

¿Que necesitamos?

El dia de hoy solo vamos a usar el arduino IDE, ademas de que el arduino que vayamos a usar, deberá de estar conectado al pc para poder subir el programa.
Adicionalmente usaremos la librería MaxMatrix. Una vez que la descargamos y la extrajimos, debemos de instalarla antes de poder usarla, para eso primero la copiaremos a la carpeta que el IDE de arduino crea para nosotros. Generalmente será "C:\Users\XXX\Documents\Arduino\libraries", en la carpeta "libraries" copiaremos la carpeta "MaxMatrix" ya descomprimida.
Despues en el IDE arduino procedremos a instalarla, para eso haremos clic en el menú "Programa>Incluir Liberia>Gestionar Librerías", nos aparecerá una ventana:
Cuando se va instalar por primera vez, aparecerá un botón que dirá "Instalar", cuando ya esta instalada, solo aparece el nombre de la librería.
Buscaremos el elemento que diga "MaxMatrix Built-In" y haremos clic en instalar.

El código

Ahora veremos el código que hace funcionar las cosas:

#include <MaxMatrix.h>
#include <avr/pgmspace.h>

PROGMEM const unsigned char CH[] = {
  3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
  1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
  3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
  5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
  4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
  5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
  5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
  1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
  3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
  3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
  5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
  5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
  2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
  4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
  2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
  4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
  3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
  4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
  4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
  4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
  4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
  4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
  4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
  4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
  4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
  2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
  2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
  3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
  3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
  3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
  4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
  5, 8, B00111110, B01001001, B01010101, B01011001, B00111110, // @
  4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
  4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
  4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
  4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
  4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
  4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
  4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
  4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
  3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
  4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
  4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
  4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
  5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
  5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
  4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
  4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
  4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
  4, 8, B00100110, B01001001, B01001001, B00110010, B00000000, // S
  5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
  4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
  5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
  5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
  5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
  5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
  4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
  2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
  4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
  2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
  3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
  4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
  2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
  4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
  4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
  4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
  4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
  4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
  3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
  4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
  4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
  3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
  4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
  4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
  3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
  5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
  4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
  4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
  4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
  4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
  4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
  4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
  3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
  4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
  5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
  5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
  5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
  4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
  3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
  3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
  1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
  3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
  4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
  4, 8, B00111110, B01000001, B01000001, B00100010, B00010000, // Ç
};

int DIN = 12;
int CS =  11;
int CLK = 10;
int maxInUse = 1;
int Velocity = 60;
int Bright = 8;
byte buffer[10];
char Texto[64];

MaxMatrix m(DIN, CS, CLK, maxInUse);

void setup() {
  m.init();
  m.setIntensity(Bright);
  Serial.begin(9600);
}

void loop() {
  int i = 0;
  int j = 0;
  delay(500);
  if (Serial.available()) {
    while (Serial.available() > 0) {
      Texto[i] = Serial.read();
      i++;
    }
    Texto[i] = '\0';
  }
  PrintData(Texto);
  Serial.println("Done");
}

void PrintData(char DATA[])
{
  int i = 0;
  int j = 0;
  int X = 0;
  int Z = 0;
  String Texto(DATA);
  if (Texto.startsWith(">SPD")) {
    Velocity = Texto.substring(4).toInt();
    for (j = 0; j < 11; j++) {
      DATA[j] = 0;
    }
    i = 0;
  }
  if (Texto.startsWith(">LUM")) {
    Bright = Texto.substring(4).toInt();
    m.setIntensity(Bright);
    for (j = 0; j < 11; j++) {
      DATA[j] = 0;
    }
    i = 0;
  }
  if (Texto.startsWith(">DEMO")) {
    for (j = 0; j < 11; j++) {
      DATA[j] = 0;
    }
    i = 0;
  }
  else {
    printStringWithShift(DATA, Velocity);
    for (j = 0; j < 11; j++) {
      DATA[j] = 0;
    }
    digitalWrite(13, LOW);
    i = 0;
  }
}

void printCharWithShift(char c, int shift_speed) {
  if (c < 32) return;
  c -= 32;
  memcpy_P(buffer, CH + 7 * c, 7);
  m.writeSprite(maxInUse * 8, 0, buffer);
  m.setColumn(maxInUse * 8 + buffer[0], 0);
  for (int i = 0; i < buffer[0] + 1; i++)
  {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

void printString(char* s) {
  int col = 0;
  while (*s != 0)
  {
    if (*s < 32) continue;
    char c = *s - 32;
    memcpy_P(buffer, CH + 7 * c, 7);
    m.writeSprite(col, 0, buffer);
    m.setColumn(col + buffer[0], 0);
    col += buffer[0] + 1;
    s++;
  }
}

void printStringWithShift(char *s, int shift_speed) {
  while (*s != 0) {
    printCharWithShift(*s, shift_speed);
    s++;
  }
}

Poniendo todo junto.

Una vez que esta compilado y subido el código al arduino, es momento de poner todo junto. Para eso abriremos el programa que hicimos en C#, cuando lo abramos, ITunes también se abrirá

Primero debemos de escoger el puerto en el cual esta conectado el Arduino, en mi caso el puerto es "COM3", la velocidad de la conexión en Baudios, debe de ser la misma que pusimos al momento de iniciar la conexión serial en el código para el arduino, en nuestro caso usamos  9600.

Cómo luce la configuración en mi caso.

Lo mas adecuado es conectar primero el arduino al PC y después iniciar la aplicación, de lo contrario no aparecerá en la lista, pero aun puedes escribir el puerto, por ejemplo: si tu arduino esta conectado al puerto "COM4", pero en la lista no aparece bastara con que escribas COM4
No se ve el puerto "COMX" solo escribelo.
Y listo, ahora te ahorraras el trabajo de andar buscando la ventana de ITunes para ver que es lo que estás escuchando.


Parecido mas no igual.

Al ver el código de seguro dirás: ¿Oye, eso no lo he visto ya?, probablemente el mayor codigo del arduino es similar para mostrar el efecto scroll en la matriz, pero ademas de eso le he agregado funciones para poder cambiar el brillo de la matriz sin tener que cambiar el código en el arduino cada vez, lo mismo para la velocidad del texto, generalmente los ejemplos que vienen de otros sitios, la velocidad del texto y el brillo de la matriz es fijo, si quieres cambiarlo debes de conectar el arduino a su IDE, cambiar el código, subirlo y luego usarlo, en este caso evitamos eso creando funciones para ahorrarnos eso, aquí solo basta un clic y listo, el brillo está cambiado.

Por ahora es todo, si tienes dudas no dudes en preguntar. Si quieres ver todo el proceso, aquí está el primer paso.
Los leo luego.

1 comentario

  1. para cuando el tutorial paralos que solo conseguimos el max72 sin el kit

    ResponderBorrar