23 oct. 2010

Tutorial : Matriz led con arduino

Hola, hoy os traigo un tutorial en el cual hago funcionar una matriz led de catodo común con un arduino duemilanove y un joystick sacado de un mando de ps2 , el objetivo de este tutorial , además de familiarizarse con las matrices leds, es mover un punto (un led) por la matriz gracias al joystick compuesto por 2 potenciometros







Bueno pues como veis en la imagen he utilizado un potenciometro con una placa de baquelita atacada por mi mismo , con el objetivo de utilizar de forma mas comoda el joystick en una protoboard






una vez fabricada la placa para conectarla adecuadamente a la protoboard busque información para conectarla a arduino, y me encontré con estas 2 imágenes:











Bien, probé a conectarla tal y como aparece en la tabla de arriba , pero vi que no funcionaba , por lo que cogí mi fuente y la regule para que proporcionara una tensión de 2 v, después de unos 15 minutos di con el patillaje de la matriz y entendí su funcionamiento





por lo que llegué a la conclusión de que la numeración de pines que tenia que usar para que me funcionará la matriz con el código que pondré a continuación es el  de la imagen de arriba, como veis tengo una matriz de 8x8 bicolor , la cual compré en bricogeek , junto el resto material que he usado en este tutorial, en este tutorial simplemente he usado el color rojo para mostrar el punto en la matriz, si quisiera usar el verde simplemente cambiaría las conexiones que aparecen en la imagen de abajo a arriba , bueno una vez descifrado el conexionado de la matriz la conectaremos a arduino de la siguiente forma:






quedando físicamente una cosa similar:



como código , he usado uno que trae de ejemplo arduino cuando bajamos el entorno de programación, que encontraremos en : File > Examples > Display > Rowcolumnscanning ,una vez dicho todo os dejo el video y el código (por si alguien programa arduino sin el propio entorno de arduino)






codigo:

/*
  Row-Column Scanning an 8x8 LED matrix with X-Y input
 
 This example controls an 8x8 LED matrix using two analog inputs
 
 created 27 May 2009
 modified 29 Jun 2009
 by Tom Igoe
 
 This example works for the Lumex  LDM-24488NI Matrix. See 
 http://sigma.octopart.com/140413/datasheet/Lumex-LDM-24488NI.pdf
 for the pin connections
 
 For other LED cathode column matrixes, you should only need to change 
 the pin numbers in the row[] and column[] arrays
 
 rows are the anodes
 cols are the cathodes
 ---------
 
 Pin numbers:
 Matrix:
 * Digital pins 2 through 13,
 * analog pins 2 through 5 used as digital 16 through 19
 Potentiometers:
 * center pins are attached to analog pins 0 and 1, respectively
 * side pins attached to +5V and ground, respectively.
 
 http://www.arduino.cc/en/Tutorial/RowColumnScanning
 
 see also http://www.tigoe.net/pcomp/code/category/arduinowiring/514 for more
 */


// 2-dimensional array of row pin numbers:
const int row[8] = {
  2,7,19,5,13,18,12,16 };

// 2-dimensional array of column pin numbers:
const int col[8] = {
  6,11,10,3,17,4,8,9  };

// 2-dimensional array of pixels:
int pixels[8][8];           

// cursor position:
int x = 5;
int y = 5;

void setup() {
  Serial.begin(9600);
  // initialize the I/O pins as outputs:

  // iterate over the pins:
  for (int thisPin = 0; thisPin < 8; thisPin++) {
    // initialize the output pins:
    pinMode(col[thisPin], OUTPUT); 
    pinMode(row[thisPin], OUTPUT);  
    // take the col pins (i.e. the cathodes) high to ensure that
    // the LEDS are off: 
    digitalWrite(col[thisPin], HIGH);    
  }

  // initialize the pixel matrix:
  for (int x = 0; x < 8; x++) {
    for (int y = 0; y < 8; y++) {
      pixels[x][y] = HIGH;
    }
  }
}

void loop() {
  // read input:
  readSensors();

  // draw the screen:
  refreshScreen();
}

void readSensors() {
  // turn off the last position:
  pixels[x][y] = HIGH;
  // read the sensors for X and Y values:
  x = 7 - map(analogRead(0), 0, 1023, 0, 7);
  y = map(analogRead(1), 0, 1023, 0, 7);
  // set the new pixel position low so that the LED will turn on
  // in the next screen refresh:
  pixels[x][y] = LOW;

}

void refreshScreen() {
  // iterate over the rows (anodes):
  for (int thisRow = 0; thisRow < 8; thisRow++) {
    // take the row pin (anode) high:
    digitalWrite(row[thisRow], HIGH);
    // iterate over the cols (cathodes):
    for (int thisCol = 0; thisCol < 8; thisCol++) {
      // get the state of the current pixel;
      int thisPixel = pixels[thisRow][thisCol];
      // when the row is HIGH and the col is LOW,
      // the LED where they meet turns on:
      digitalWrite(col[thisCol], thisPixel);
      // turn the pixel off:
      if (thisPixel == LOW) {
        digitalWrite(col[thisCol], HIGH);
      }
    }
    // take the row pin low to turn off the whole row:
    digitalWrite(row[thisRow], LOW);
  }
}



4 comentarios:

Anónimo dijo...

Me encargaron lo mismo pero sin el arduino.

Anónimo dijo...

Me encargaron lo mismo pero sin el arduino, si se te ocurre alguna idea...

Mister_mst dijo...

puedes usar un pic, o solo el atmel del arduino

Anónimo dijo...

hola en la mayoria de proyectos que he visto son de anodo comun, este es de catodo yo tengo de ccatodo pero quiero poner mas de una matriz como se hhace????

ir arriba