Hola a toda la comunidad, que tal? Quiero compartir con ustedes este proyecto que encontré sumamente interesante. El concepto original fué elaborado por Matías Nahuel Heredia, el cual modifiqué para guardar la información en una tarjeta Micro SD.
Me encuentro con un inconveniente en la etapa final, ojalá puedan ayudarme y demás está decir que esta información es totalmente libre y pueden utilizarla como prefieran.
El circuito receptor DTMF para monitorear los tonos que se transmiten por la línea telefónica es el siguiente:
La conexión de los pines de salida del HT9170B/D a la placa Arduino UNO es la siguiente:
HT9170B/D --> Arduino UNO
D0(Pin 11) --> Arduino UNO (Pin 2)
D1(Pin 12) --> Arduino UNO (Pin 3)
D2(Pin 13) --> Arduino UNO (Pin 4)
D3(Pin 14) --> Arduino UNO (Pin 5)
El terminal con la etiqueta "Tone" se conecta directamente a un terminal de la línea telefónica y el otro terminal de la línea telefónica se conecta a GND.
La alimentación para este circuito se obtiene directamente de la placa Arduino UNO. Existe en dicha placa un terminal que provee 5V.
Ver Receptor DTMF
El circuito para conectar una tarjeta Micro SD a la placa Arduino UNO es el siguiente:
Los pines 10, 11, 12 y 13 corresponden a los pines de la placa Arduino UNO.
La alimentación para este circuito se obtiene directamente de la placa Arduino UNO. Existe en dicha placa un terminal que provee 3.3V.
Este circuito lo construí sobre un adaptador Micro SD a SD como se puede observar en la siguiente imagen.
Ver Adaptador SD a Arduino UNO
Con ambos circuitos armados procedemos a interconectar las tres placas como se observa en la siguiente imagen.
Ver Arduino UNO + Receptor DTMF + Adaptador SD
Habiendo interconectado exitosamente las tres placas procedemos a escribir el programa cuya función será leer el estado de las 4 entradas (Pin 2 a Pin 5) y almacenar el valor obtenido a un archivo de texto en la tarjeta Micro SD.
Antes de continuar la lectura recomiendo ver la Tabla de Códigos DTMF
Ahora se presenta el siguiente inconveniente:
Cuando el circuito integrado HT9170B/D recibe un tono DTMF, el mismo persiste indefinidamente en las salidas (D0 - D3), por lo tanto el programa siempre obtiene un valor de las entradas (Pin 2 - Pin 5) y continúa escribiendo este valor indefinidamente en el archivo de texto. Por ejemplo:
Si marcamos en el teclado del teléfono los números: 0351 (el último numero, 1 en este ejemplo, se almacena indefinidamente).
Un intento por solucionar este problema, fué conectar el pin 15 del HT9170B/D al pin 10 del mismo (es la línea de puntos en el circuito receptor).
Pin 15: DV (Data Valid). Mantiene un nivel lógico alto cuando se detecta un tono válido y matiene su nivel lógico alto mientras se encuentre presente el tono, caso contrario mantiene un nivel lógico bajo.
Pin 10: OE (Output Enable). Controla la habilitación o alta impedancia de las compuertas tri-state de las salidas (D0 - D3). Con un nivel lógico alto se habilitan las compuertas y con un nivel lógico bajo se mantienen en estado de alta impedancia.
Lógicamente, si conectamos el pin 10 al pin 15 debería solucionarse el problema de la persistencia del tono en las salidas (D0 - D3), pero lamentablemente con las salidas en estado de alta impedancia la placa Arduino UNO, por razones que todavía desconozco, interpreta el estado de alta impedancia como si fuera un nivel lógico alto y, en consecuencia se obtiene una lectura errónea. Si analizamos el código fuente, con todas las entradas en nivel lógico alto, veremos que se cumplen todas las condiciones IF, obteniendo como resultado final 15 (1+2+4+8)...y la pregunta es: ¿Como podría solucionarse este inconveniente?
Exceptuando este inconveniente el proyecto es completamente funcional y el código fuente se encuentra libre de errores.
Muchas Gracias.
Saludos cordiales.
Me encuentro con un inconveniente en la etapa final, ojalá puedan ayudarme y demás está decir que esta información es totalmente libre y pueden utilizarla como prefieran.
El circuito receptor DTMF para monitorear los tonos que se transmiten por la línea telefónica es el siguiente:
HT9170B/D --> Arduino UNO
D0(Pin 11) --> Arduino UNO (Pin 2)
D1(Pin 12) --> Arduino UNO (Pin 3)
D2(Pin 13) --> Arduino UNO (Pin 4)
D3(Pin 14) --> Arduino UNO (Pin 5)
El terminal con la etiqueta "Tone" se conecta directamente a un terminal de la línea telefónica y el otro terminal de la línea telefónica se conecta a GND.
La alimentación para este circuito se obtiene directamente de la placa Arduino UNO. Existe en dicha placa un terminal que provee 5V.
Ver Receptor DTMF
El circuito para conectar una tarjeta Micro SD a la placa Arduino UNO es el siguiente:
La alimentación para este circuito se obtiene directamente de la placa Arduino UNO. Existe en dicha placa un terminal que provee 3.3V.
Este circuito lo construí sobre un adaptador Micro SD a SD como se puede observar en la siguiente imagen.
Ver Adaptador SD a Arduino UNO
Con ambos circuitos armados procedemos a interconectar las tres placas como se observa en la siguiente imagen.
Ver Arduino UNO + Receptor DTMF + Adaptador SD
Habiendo interconectado exitosamente las tres placas procedemos a escribir el programa cuya función será leer el estado de las 4 entradas (Pin 2 a Pin 5) y almacenar el valor obtenido a un archivo de texto en la tarjeta Micro SD.
Antes de continuar la lectura recomiendo ver la Tabla de Códigos DTMF
Código:
#include <SD.h>
File myFile;
byte digit;
void setup()
{
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(10, OUTPUT);
digit = 0;
if (!SD.begin(10))
{
return;
}
}
void loop()
{
if (digitalRead(2) == HIGH)
{
digit = digit + 1;
}
if (digitalRead(3) == HIGH)
{
digit = digit + 2;
}
if (digitalRead(4) == HIGH)
{
digit = digit + 4;
}
if (digitalRead(5) == HIGH)
{
digit = digit + 8;
}
if(digit > 0)
{
myFile = SD.open("log.txt", FILE_WRITE);
if(myFile)
{
myFile.print(digit);
myFile.print("-");
myFile.close();
}
digit = 0;
}
delay(50);
}
Ahora se presenta el siguiente inconveniente:
Cuando el circuito integrado HT9170B/D recibe un tono DTMF, el mismo persiste indefinidamente en las salidas (D0 - D3), por lo tanto el programa siempre obtiene un valor de las entradas (Pin 2 - Pin 5) y continúa escribiendo este valor indefinidamente en el archivo de texto. Por ejemplo:
Si marcamos en el teclado del teléfono los números: 0351 (el último numero, 1 en este ejemplo, se almacena indefinidamente).
Un intento por solucionar este problema, fué conectar el pin 15 del HT9170B/D al pin 10 del mismo (es la línea de puntos en el circuito receptor).
Pin 15: DV (Data Valid). Mantiene un nivel lógico alto cuando se detecta un tono válido y matiene su nivel lógico alto mientras se encuentre presente el tono, caso contrario mantiene un nivel lógico bajo.
Pin 10: OE (Output Enable). Controla la habilitación o alta impedancia de las compuertas tri-state de las salidas (D0 - D3). Con un nivel lógico alto se habilitan las compuertas y con un nivel lógico bajo se mantienen en estado de alta impedancia.
Lógicamente, si conectamos el pin 10 al pin 15 debería solucionarse el problema de la persistencia del tono en las salidas (D0 - D3), pero lamentablemente con las salidas en estado de alta impedancia la placa Arduino UNO, por razones que todavía desconozco, interpreta el estado de alta impedancia como si fuera un nivel lógico alto y, en consecuencia se obtiene una lectura errónea. Si analizamos el código fuente, con todas las entradas en nivel lógico alto, veremos que se cumplen todas las condiciones IF, obteniendo como resultado final 15 (1+2+4+8)...y la pregunta es: ¿Como podría solucionarse este inconveniente?
Exceptuando este inconveniente el proyecto es completamente funcional y el código fuente se encuentra libre de errores.
Muchas Gracias.
Saludos cordiales.