viernes, 2 de diciembre de 2011

Keypad para Arduino

Estrujando la cabeza se me ocurrió de aprovechar las entradas análogicas del Arduino, y en vez de conectar un potenciometro de 10 kOhms, pensé "porque no monto divisores de tensión fijos", asi mediante el uso de resistencias podré "multiplexar" las entradas analogicas de una manera un poco "guarras" (a menos a la vista! cabe recordar que estoy limitado en conocimientos de electrónica, pero esto es de electricidad...jeje!).

AlexRVD me dijo "¿Por que no te curras un keypad?" y  a partir de aqui empezó todo. Primero localizar un keypad de desguace (en las chatarrerias/deixalleries siempre se encuentran cosas interesantes).

Una vez abierto.... sorpresaaaaaaaaaa! aparte de la botonera habia una placa electrónica que me sobrava, luego tuve que empezar a cortar pistas con un cutter para asegurarme de evitar señales cruzadas.
Y a partir de aqui todo es manos a la obra: soldador y un puñado de resistencias.


En la versión beta monté divisores de tensión que luego me daban lecturas "falsas" cuando la entrada respecto a positivo era inferior a 5 kOhms por lo que decidí que la resistencia siempre serian a partir de 5 kOhms hacia arriba a excepción de una combinación en que no uso ninguna resistencia (derivando todo a GND).

Os dejo un ejemplo gráfico de como es, luego sólo hay que múltiplicar el circuito por tantas veces como queramos (en mi caso x 4 veces). Otra opción seria montar más divisores de tensión intermedios pero en mi caso preferia asegurar las lecturas.
Aproximadamente los valores que utilizé fueron R1 y R8 = 10 kOhms, R2 = 6k8 , R3 = 3k3, R4 = 8k , R5 = 2k2, R6 = 6k2 y R7= 4k2.

Por si no os acordais de los colores de las resistencias, aqui teneis una tabla:
Luego ya todo es programación pura y dura. Yo lo hice a base de leer los datos del AnalogRead(x) y luego mediante instrucciones if provocar que ejecute una acción , por ejemplo Serial.print(tecla).

Y aqui la programación. Los valores que hay dentro de las comparativas if son susceptibles que se tengan de ir modificando o depurando, pero eso ya es cosa de que cada uno se lo optimize a su gusto.

El delay(200) es importante si no queremos que nuestro teclado se convierta en una metralleta de datos.

/*
  Keypad para Arduino
(G) CopyGuay by XavierGP 2011

 */
int sensorValue0 = 0;  // variable to store the value coming from the sensor
int sensorValue1 = 0;  // variable to store the value coming from the sensor
int sensorValue2 = 0;  // variable to store the value coming from the sensor
int sensorValue3 = 0;  // variable to store the value coming from the sensor
void setup() {
  
 Serial.begin(9600);
}
void loop() {
  // read the value from the sensor:
 
  sensorValue0 = analogRead(A0);   
  sensorValue1 = analogRead(A1);
  sensorValue2 = analogRead(A2);
  sensorValue3 = analogRead(A3);
 
 
   if(sensorValue0<2){
  Serial.println("Esc");
  }
   if(sensorValue0>329 && sensorValue0<334){
  Serial.println("Del");
  }
   if(sensorValue0>393 && sensorValue0<397){
  Serial.println("7");
  }
    if(sensorValue0>182 && sensorValue0<185){
  Serial.println("4");
  }
  if(sensorValue0>1020){
  Serial.println("1");
  }
 
 
 
   if(sensorValue1<2){
  Serial.println("Ctrl");
  }
   if(sensorValue1>330 && sensorValue1<333){
  Serial.println("/");
  }
    if(sensorValue1>395 && sensorValue1<399){
  Serial.println("8");
  }
    if(sensorValue1>182 && sensorValue1<185){
  Serial.println("5");
  }
  if(sensorValue1>1020){
  Serial.println("2");
  }
 
 
   if(sensorValue2<2){
  Serial.println("Alt");
  }
   if(sensorValue2>332 && sensorValue2<335){
  Serial.println("*");
  }
    if(sensorValue2>398 && sensorValue2<401){
  Serial.println("9");
  }
    if(sensorValue2>179 && sensorValue2<182){
  Serial.println("6");
  }
    if(sensorValue2>1020){
  Serial.println("3");
  }
 
 
  if(sensorValue3<2){
  Serial.println("<-");
  }
   if(sensorValue3>328 && sensorValue3<331){
  Serial.println("-");
  }
    if(sensorValue3>393 && sensorValue3<396){
  Serial.println("+");
  }
    if(sensorValue3>178 && sensorValue3<182){
  Serial.println("Enter");
  }
    if(sensorValue3>1020){
  Serial.println("0");
  }
 
  delay(200);         
              
}


4 comentarios:

  1. Yo, cuando alguien me dice que es capaz de multiplexar lo que sea, no puedo por menos que hacerle la ola :D

    ResponderEliminar
  2. Muy interesante lo puesto.
    Me podrias ayudar, me interesan teclas sueltas simples sin led para conectar independientemente a arduino y que estas teclas sean mecánicas. Sabes donde conseguirlas a buen precio?

    Rober glez.
    Gastos.menores@gmail.com

    ResponderEliminar
  3. Muy interesante lo puesto.
    Me podrias ayudar, me interesan teclas sueltas simples sin led para conectar independientemente a arduino y que estas teclas sean mecánicas. Sabes donde conseguirlas a buen precio?

    Rober glez.
    Gastos.menores@gmail.com

    ResponderEliminar
    Respuestas
    1. Buenos dias Rober. Dame más pistas. Si quieres teclas de ordenador no sé dónde puedes encontrarlas. Si quieres pulsadores en rs-amidata hay de muchos tipos.
      Suerte!

      Eliminar