Ponteduino Arduino Power in Pontevedra.

22jul/100

Arduino y un joystick II. Moverse en una matriz.

Aumentamos el numero de leds, la matriz es de 4x4, pero casi todo es igual al anterior (ahora hay mas leds, un transistor mas... y 2 cables ;) ).

Lo que hace este sketch es mover el led encendido en la matriz, podemos seleccionar el led que queremos esté encendido.

Aqui teneis el video:

Aquí os pongo el codigo:

// Declaramos los puertos que corresponden a filas y
// columnas como una matriz
int aLed[2][4]={{2, 3, 4, 5}, {9, 8, 7, 6}};

// Declaramos los potenciometros que controlan los
// 2 ejes del joystick en el puerto analogico que
// corresponda. el formato del array es
//           {fila, columna}
int anPot[] = {1, 0};

// Creamos una variable para guardar la posición del
// led encendido
int iLedOn [] = {0, 0};

void setup (){

  Serial.begin (9600);

  for (int i=0; i < 4; i++){     // Por comodidad...
    pinMode (aLed [0] [i], OUTPUT);
    pinMode (aLed [1] [i], OUTPUT);
  }

  // Encendemos el primer led de la matriz
  digitalWrite (aLed [0] [0], HIGH);
  digitalWrite (aLed [1] [0], HIGH);
}

void OnLed (int *iLed){

  // Ahora sabemos que led está encendido...
  // ya no necesitamos el for, pero nos quedamos
  // con el para hacer mas cosas: 
  // apagamos la entrada, encendemos la nueva y 
  // la guardamos en la variable iLedOn

  for (int i=0; i < 2; i++){

    // este if es solo para no hacer nada, cuando 
    // no hay que hacer nada...
    if (iLed [i] < 4){

      // Apagamos la entrada vieja...
      digitalWrite (aLed [i] [iLedOn [i]], LOW);

      // Encendemos la nueva...
      digitalWrite (aLed [i] [iLed [i]], HIGH);

      // y guardamos.
      iLedOn [i] = iLed [i];
    }
  }
}

void loop (){

  int iVal[2];
  int iLed[2]= {0, 0};

  iVal [0] = analogRead (anPot [0]);
  iVal [1] = analogRead (anPot [1]);

  // Toca transformar los 10 bits a columnas y filas.
  for (int i=0; i < 2; i++){

    // Vamos a poner valores altos (100 y 900) para
    // no tener que preocuparnos por las diagonales

    // El joystick nos va a permitir movernos por la
    // matriz, así que solo nos va a interesar los
    // valores extremos arriba, abajo, derecha
    // e izquierda
    if (iVal [i] > 700){

      // Aumentamos la posicion, salvo que este
      // en el extremo (iLedOn[i]=3)
      // Si no pongo este else hace el bucle,
      // que no es lo que busco.
      if ( iLedOn [i] != 3)
        iLed [i] = iLedOn [i] + 1;
      else iLed [i] = 4;
    }
    else if (iVal [i] < 300){

      // Lo mismo pero ahora restamos y no hacemos
      // nada para iLedOn=0      
      if ( iLedOn [i] != 0)
        iLed [i] = iLedOn [i] - 1;
      else iLed [i] = 4;
    }
    else iLed [i] = 4;

    Serial.println (iLedOn [i]);
  }

  OnLed (iLed);

  // este delay es para poder manejar el joystic
  // sin problemas
  delay (175);
}
Comentarios (0) Trackbacks (0)

Aún no hay comentarios.


Leave a comment

(required)

Aún no hay trackbacks.