Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Decodificador DTMF usando solo Arduino

Componentes y suministros

Arduino UNO
× 1
LED (genérico)
× 10
Breadboard (genérico)
× 1
Cables de puente (genéricos)
× 20

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Mientras revisaba mi lista de proyectos semestrales con las opciones para elegir, vi un automóvil controlado por DTMF que usaba el CM 8870 IC como un decodificador DTMF y los datos binarios codificados se le dieron a Arduino para realizar las operaciones de izquierda a derecha y de avance hacia atrás. La función del decodificador DTMF, la parte principal, usó un IC externo que encontré difícil de integrar y estaba buscando un código o una biblioteca que incluso pudiera reemplazar el IC en el circuito con algún código adicional y no pude encontrar una solución satisfactoria. . Pero una biblioteca basada en el algoritmo de Goertzel (Goertzel.h) que podría decir si una frecuencia específica estaba presente en el tono o no calculando el número de pulsos por unidad de tiempo y su contribución de amplitud en la señal de tono dada.

Usé el código de ejemplo básico como base y escribí un código que puede detectar las frecuencias DTMF dominantes presentes en el tono y puede decodificarlo para darnos el número que se presionó en el otro lado durante la llamada telefónica.

Código

  • Decodificador Arduino Code DTMF
Decodificador DTMF de código Arduino Arduino
compile y cargue el código en Arduino IDE y no olvide agregar la biblioteca primero.
el enlace de la biblioteca es:
https://github.com/jacobrosenthal/Goertzel
/* Este código es una implementación básica de un decodificador DTMF para detectar el código DTMF de 16 caracteres del pin analógico A0 y da la salida decodificada al verificar todos los tonos más bajos en la matriz DTMF y nos da el número correspondiente activando el bit digital correspondiente para los números 0-9 e imprimiendo en serie el resto de los caracteres. Este trabajo se basa en su totalidad en el código de Kevin Banks que se encuentra en http://www.embedded.com/design/embedded/4024443/The-Goertzel-Algorithm, por lo que le damos todo el mérito por su implementación y desglose genéricos. El algoritmo de Goertzel existe desde hace mucho tiempo, así que consulte http://en.wikipedia.org/wiki/Goertzel_algorithm para obtener una descripción completa. A menudo se usa en la detección de tonos DTMF como una alternativa a la Transformada Rápida de Fourier porque es rápida con poca escucha porque solo busca una frecuencia única en lugar de mostrar la ocurrencia de todas las frecuencias. * ESTE CÓDIGO ES Hecho / modificado por "Mian Mohammad Shoaib" y lanzado al dominio público. * para cualquier consulta relacionada con el código, no dude en preguntar en [email protected] * / # include  int sensorPin =A0; const int N =100; // es el número de muestras que tomará el código y0u puede cambiar la sensibilidad y si es grande puede ralentizar el umbral de flotación de arduinoconst =2000; // amplitud de tono mínima a considerar podemos cambiarla para más senstivityconst float sampling_freq =8900; // la frecuencia máxima detectable es la frecuencia de muestreo / 2 y arduino uno con 16Mhz puede soportar muestreos de hasta 8900 Hzfloat x_frequencies [4]; // hacer dos matrices para contener las frecuencias de los ejes xey que se detectarán flotar y_frequencies [4]; void setup () {pinMode (13, OUTPUT); // inicializa el led parpadeante para mostrar si se detecta algún tono pinMode (2, OUTPUT); // inicializar 10 pines como salida para mostrar las salidas dtmf del 2 al número 12; el resto se imprimirá directamente en el monitor pinMode (3, OUTPUT); pinMode (4, SALIDA); pinMode (5, SALIDA); pinMode (6, SALIDA); pinMode (7, SALIDA); pinMode (8, SALIDA); pinMode (9, SALIDA); pinMode (10, SALIDA); pinMode (11, SALIDA); pinMode (12, SALIDA); Serial.begin (9600); x_frequencies [0] =1209; // simplemente inicialice las matrices con las frecuencias de tono de los ejes xey junto con su número de filas y dos puntos x_frequencies [1] =1336; x_frequencies [2] =1477; x_frequencies [3] =1633; y_frequencies [0] =697; y_frequencies [ 1] =770; y_frequencies [2] =852; y_frequencies [3] =941;} bool detect_tone (float freq) {Goertzel goertzel =Goertzel (freq, N, sample_freq); // inicializar la función de la biblioteca con la frecuencia de muestreo dada no de muestras y frecuencia objetivo goertzel.sample (sensorPin); // Tomará n muestras float magnitude =goertzel.detect (); // verifíquelos para target_freq if (magnitud> umbral) {// si recibe falsos aciertos o ningún acierto ajuste el umbral digitalWrite (13, HIGH); // parpadea el led en 13 si se detecta un pulso delay (250); digitalWrite (13, BAJO); Serial.print (freq); Serial.print ("\ n"); devuelve verdadero; } else return false;} void print_number (int fila, int columna) {int número =0; if (fila ==0) {// encuentra el número correspondiente a la fila y columna encontradas if (columna ==0) número =1; si no (columna ==1) número =2; si no (columna ==2) número =3; si no (columna ==3) número =10; } más si (fila ==1) {si (columna ==0) número =4; más si (columna ==1) número =5; si no (columna ==2) número =6; más si (columna ==3) número =11; } más si (fila ==2) {si (columna ==0) número =7; si no (columna ==1) número =8; más si (columna ==2) número =9; si no (columna ==3) número =12; } más si (fila ==3) {si (columna ==0) número =14; si no (columna ==1) número =0; más si (columna ==2) número =15; si no (columna ==3) número =13; } if (número <10) {digitalWrite ((número + 2), HIGH); Serial.print (número);} else if (número ==10) Serial.print ('A'); else if (número ==11) Serial.print ('B'); else if (número ==12) Serial.print ('C'); else if (número ==13) Serial.print ('D'); else if (número ==14) Serial.print ('*'); else if (número ==15) Serial.print ('#'); Serial.print ("\ n"); retraso (800); for (int i =2; i <=12; i ++) {digitalWrite (i, LOW);}} bucle vacío () {int columna =0, fila =0; int i =0; while (1) {if (detect_tono (x_frecuencias [i] ) ==verdadero) {columna =i; descanso; } i ++; if (i ==4) i =0;} i =0; while (1) {if (detectar_tono (y_frecuencias [i]) ==verdadero) {fila =i; descanso; } i ++; if (i ==4) i =0;} print_number (fila, columna);} 

Esquemas

El circuito utiliza 10 LED conectados desde el pin digital 2 al 12 que se encenderán cuando se presione cualquier tono para los números entre 0-9 respectivamente y se conectará un LED de detección de pulso en el pin 13 que dará un breve parpadeo cuando un pulso o se detecta una señal, los números superiores a 9 (los caracteres especiales) se mostrarán mediante la impresión en serie en el IDE.
El pin de entrada del conector de audio o el cable AUX se conectará al pin analógico A0 con un condensador de 1uF en serie que filtrará las bajas frecuencias y la compensación de CC.

Proceso de manufactura

  1. Hacer Monitor Ambilight usando Arduino
  2. Máquina de LEVITACIÓN ULTRASÓNICA usando ARDUINO
  3. Sistema de alarma Arduino:SERENA
  4. Voltímetro de bricolaje con Arduino y un teléfono inteligente
  5. Monitor de frecuencia cardíaca con IoT
  6. Comunicación de código Morse usando el módulo láser (ambos)
  7. WebServerBlink usando Arduino Uno WiFi
  8. Contador de autos usando Arduino + Procesamiento + PHP
  9. Juego automatizado de Dino usando arduino
  10. Python3 y comunicación Arduino
  11. Radio FM usando Arduino y RDA8057M