Leer un dial rotatorio con Arduino.

Lo relacionado con la electronica y arduino.
Responder
kurtsik
Mensajes: 124
Registrado: 30 Ene 2015 11:29

Leer un dial rotatorio con Arduino.

Mensaje por kurtsik » 22 Feb 2015 15:43

La idea es transformar un antiguo telefono analogico en movil con un Arduino y un shield GSM/GPRS.
heraldo.jpg
heraldo.jpg (18.06 KiB) Visto 4542 veces

El primer paso que tenemos que dar es entender como se decodifican los pulsos del dial rotativo de este tipo de telefonos en numeros que podamos utilizar.

dial.jpg
dial.jpg (82.98 KiB) Visto 4542 veces

El modelo al que vamos a relizar la modificacion es un Heraldo de Telefonica, el dial con el que cuenta este aparato tiene 5 cables. Desconozco la funcion de los 3 restantes pero los que interesan para el caso son los dos que conectan las pestañas que se remarcan en la captura.

patillas.jpg
patillas.jpg (47.01 KiB) Visto 4542 veces

Siempre estan en contacto por lo que al leer obtendremos un circuito cerrado. Cuando rotamos el dial, dependiendo de que numero queramos codificar, se realizaran un numero determinado de pulsos en forma de aperturas del circuito que podremos contar con el arduino.

La codificacion es dos pulsos multiplicados por el numero seleccionado. Es decir, dos pulsos representaran al 1, cuatro al 2, seis al 3, .... .

Por otra parte y para asegurar una correcta lectura del estado de las pestañas debemos añadir al circuito una resistencia de pull-down tal y como se aprecia en el esquema.

esquemaDial.png
(103.51 KiB) Descargado 425 veces

Por ultimo este es el sketch para arduino que permite contar y mostrar los numeros obtenidos de los pulsos. En cada ciclo de funcionamiento interpreta el digito codificado por una rotacion y lo acumula en un array, cuando completa los 9 digitos los envia por el puerto seria para que podamos verificar si lo ha hecho correctamente.

Código: Seleccionar todo

const bool True = 1;
const bool False = 0;
// Pin del arduino conectado al dial
const int pinContador = 7;
const int retardoDebounce = 35;
const int marcadoFinalizado = 600;
int contador = 0;
unsigned long ultimoCambioEstado = 0;
int lectura = HIGH;
char marcando = False;
int numero[9];
int digitos = 0;

void setup()
{
  pinMode(pinContador, INPUT);
  Serial.begin(9600);
}

void loop()
{
  // Lee los pulsos
  lectura = digitalRead(pinContador);
  if ( lectura == LOW && (millis() - ultimoCambioEstado) > retardoDebounce ) {
    ultimoCambioEstado = millis();
    contador++;
    marcando = True;
  }
  // Cuando establece que ha terminado de rotar el dia decodifica los pulsos
  // y nos entrega un numero
  if ( millis() >= (ultimoCambioEstado + marcadoFinalizado) && marcando ){
    if (digitos <= 8){
      numero[digitos] = codificarPulsos(contador);
      Serial.println(codificarPulsos(contador));
      contador = 0;
      digitos++;
      marcando = False;
    }
    
  }
  // Cuando haya 9 digitos acumulados se muestra el numero
  if (digitos >= 9) {
      for (int i=0;i<=8;i++){
        Serial.print(numero[i]);
      }
      Serial.println("");
      digitos = 0;
      int numero[9];
    }


}

int codificarPulsos(int pulsos){
  switch (pulsos){
    case 2:
      return (1);
    break;
    case 4:
      return (2);
    break;
    case 6:
      return (3);
    break;
    case 8:
      return (4);
    break;
    case 10:
      return (5);
    break;
    case 12:
      return (6);
    break;
    case 14:
      return (7);
    break;
    case 16:
      return (8);
    break;
    case 18:
      return (9);
    break;
    case 20:
      return (0);
    break;   
  }
  return (-1);
}

dmarofer
Mensajes: 57
Registrado: 02 Feb 2015 15:40

Re: Leer un dial rotatorio con Arduino.

Mensaje por dmarofer » 23 Feb 2015 16:45

Muy buena la info Asier. Como nota yo apunto que muchas veces para no tener que conectar una resistencia pulldown (deriva a masa) externa, los Atmel tienen resistenacias de pullup internas (derivan a VCC) que nos valen para no tener que poner una fuera. Yo las suelo usar. En ese caso como es pullup, el dial cerraria el circuito a tierra y leeriamos un 0, y al abrir la resistencia lo tira a VCC y leemos un 1.

Para activar esas resistenacias internas se hace asi (escribiendo un 1 en el pin DESPUES de configurarlo como entrada). Escribiendo un cero se desactiva de nuevo y la entrada queda en alta impedancia:

pinMode(pin, INPUT); // set pin to input
digitalWrite(pin, HIGH); // turn on pullup resistors

kurtsik
Mensajes: 124
Registrado: 30 Ene 2015 11:29

Re: Leer un dial rotatorio con Arduino.

Mensaje por kurtsik » 23 Feb 2015 20:43

Gracias Diego.
Ya sabes que lo mio no es la electronico asi que voy a darle unas vueltas a lo que cuentas a ver si consigo asimilarlo.

JotaCe
Mensajes: 83
Registrado: 30 Ene 2015 13:12

Re: Leer un dial rotatorio con Arduino.

Mensaje por JotaCe » 25 Feb 2015 15:58

Al artilugio le veo la misma utilidad que a una nevera en el polo :D Pero como ejercicio me parece de lo más interesante.
Para darle todo el recorrido, deberías incorporarle una batería. Con eso ya podrías triunfar en determinadas situaciones. Solo por ver la cara de alguien con el que estés en la calle cuando digas eso de "Ya le llamo yo" (mientras te sacas ese peaso teléfono de la mochila) valdría la pena el esfuerzo. O hacer lo mismo delante de un auditorio al que le estás presentando un nuevo motor de agua que (esta vez sí) funciona :P :P

Responder