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.
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); }
Aún no hay trackbacks.



25 agosto, 2011 - 21:50
Si, probablemente lo sea