sábado, 28 de abril de 2012

Librería gráfica: MatrixController

Durante todo el desarrollo, hemos ido creando funciones para abstraer el funcionamiento de los canales PWM de la matriz en pos de programar basado en pixeles y colores RGB. Hace poco, hemos cogido todos estas funciones y las hemos reunido en una librería de Arduino que es la que maneja directamente nuestra librería Tlc5940Mux modificada.

La librería se puede descargar aquí: MatrixController 1.0.

Esta librería se usas creando una instancia con  
MatrixController matrix;

Se inicializa con:
matrix.init(0);

Y dispone de una serie de métodos, bastante autodescriptivos, aunque están documentados en la propia librería:

matrix.setPixel(1,2,4095,4095,0);
Pone el tercel píxel de la segunda columna (1,2) a una mezcla de rojo y verde.

matrix.setRow(0,0,0,4095);
Pone la fila superior a azul.

Los rangos de fila y columna son de 0 a 8, y los de cada canal RGB de color de 0 a 4095 (12 bits por canal, color de 36 bits).

La lista de funciones completas es:
  • init
  • setPixel
  • setRow
  • setCol
  • setMatrix
  • getPixelR
  • getPixelG
  • getPixelB
  • shiftFila
  • shiftRowData
Requiere de escribir el código de la ISR en el propio sketch que la use, aunque este es el siguiente:
/** It's 0 if there is no multiplex operation taking place currently, and different if yes.
    If everything's fine, it shouldn't be neccesary...
    */

volatile uint8_t isShifting;
/** Stores the actual row that is being excitated in the RGB display.
    */
uint8_t shiftRow;
/** Excitates the desired row. The power stage is active low.
    \param row, The index of the row that should be activated. */
inline void setRow(int row) {
  PORTC = row;
}
/** Interrupt subrutine for Timer1, called after each PWM cycle.
    It switchs the row and shifts the new colour data.
    */
ISR(TIMER1_OVF_vect)
{
  if (!isShifting++) {
   
    digitalWrite(BLANK, HIGH);  // turn off the outputs. It's the first thing to avoid row interference
    __asm__("nop\n\t");  // small delay after sending the data before transfering it to the registers
    // set the registers
    digitalWrite(XLAT, HIGH);             
    __asm__("nop\n\t");      
    digitalWrite(XLAT, LOW);     
    __asm__("nop\n\t");  // delay before turning on the outputs
    setRow(shiftRow);          // set the new row
    digitalWrite(BLANK, LOW);      // turn on the outputs 
    if (++shiftRow == NUM_ROWS){  // update the row variable
      shiftRow = 0;
    }
    matrix.shiftRowData(shiftRow);  // shifts the data of the next row, it only will take place in the following row change
    isShifting = 0;
  }
}


Este código se encarga de realizar los cambios de fila.

Para comprender el funcionamiento y uso, ver el sketch de ejemplo incluido en la carpeta examples de la librería de Arduino.

2 comentarios:

  1. He intentado obtener el código.. y Dropbox me dice que el código ha sido movido o modificado, alguna otra forma de obtener tu librería..Saludos

    ResponderEliminar