Ponteduino Arduino Power in Pontevedra.

20jul/101

Control de un joystick con Arduino

Hace tiempo di por muerto un mando de la PlayStation... pero me quede con alguna que otra cosa por si las moscas...

Pues bien, el otro día me acordé... y sucede que los Dualshock son dos potenciometros y un pulsador, lo que lo hace bastante interesante para un futuro uso con el Arduino.

El joystick

Otra toma

Tenia unos cuantos leds en casa, y me hice una matriz de 3x3, con 6 pines controlo 9 pins. Esto ya puede considerarse un ahorro significativo ya que nos quedan otras 6 libres (sin contar las de Tx y Rx).

A lo que iba... con la matriz de 3x3 y el joystick, monté un "señalador" que solo indica la dirección que marca el joystick.

Aquí dejo un vídeo con una muestra:

El código del programa es el que sigue:

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

// 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};

void setup (){
  
  for (int i=0; i < 3; i++){     // Por comodidad...
    pinMode (aLed [0] [i], OUTPUT);
    pinMode (aLed [1] [i], OUTPUT);
  }
  
  // Encendemos el led central
  digitalWrite (aLed [0] [1], HIGH);
  digitalWrite (aLed [1] [1], HIGH);
}

void OnLed (int *iLed){
  
  // Apagamos todos los leds para encender el que
  // el que toca. Solo conseguimos no estar pendiente
  // del led que está encendido.
  for (int i=0; i<3; i++){

    digitalWrite (aLed [0] [i], LOW);
    digitalWrite (aLed [1] [i], LOW);
  }
 
  // Encendemos el que toca...
  digitalWrite (aLed [0][iLed[0]], HIGH);
  digitalWrite (aLed [1][iLed[1]], HIGH);
}
  
void loop (){
  
  int iVal[2];
  int iLed[2];
  
  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++){

    // Los valores que están escritos funcionan más
    // o menos bien...

    // Podemos poner valores altos (100 y 900) para
    // no tener que preocuparnos por las diagonales
    
    // En caso de necesitar más precisión se puede
    // separar los valores de un potenciómetro con
    // los del otro... esto se consigue con un
    // if (i) {
    //   poteciómetro 1
    // }
    // else {
    //   potenciómetro 2
    // }
    
    if (iVal [i] > 700)
      iLed [i] = 2;
    else if (iVal [i] > 300)
      iLed [i] = 1;
    else iLed [i] = 0;
  }
  
  OnLed (iLed);
  
  delay (100);
}
Comentarios (1) Trackbacks (0)

Leave a comment

(required)

Aún no hay trackbacks.