Leer un dial rotatorio con Arduino.

La idea es transformar un antiguo telefono analogico en movil con un Arduino y un shield GSM/GPRS.

heraldo

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

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

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

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.

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

 

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.