Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Decodificador DTMF usando apenas Arduino

Componentes e suprimentos

Arduino UNO
× 1
LED (genérico)
× 10
Breadboard (genérico)
× 1
Fios de jumpers (genérico)
× 20

Aplicativos e serviços online

Arduino IDE

Sobre este projeto


Enquanto eu examinava minha lista de projetos semestrais com as opções para escolher, vi um carro controlado por DTMF que usava o CM 8870 IC como um decodificador DTMF e os dados binários codificados foram fornecidos ao Arduino para realizar as operações esquerda direita e frente para trás. A função de decodificador DTMF, a parte principal, usava um IC externo que eu achava difícil de integrar e estava em busca de um código ou biblioteca que pudesse até mesmo substituir o IC do circuito por algum código adicional e não conseguir encontrar uma solução satisfatória . Mas uma biblioteca baseada no algoritmo Goertzel (Goertzel.h) que poderia dizer se uma frequência específica estava presente no tom ou não, calculando o número de pulsos por unidade de tempo e sua contribuição de amplitude no sinal de tom dado.

Usei o código de exemplo básico como base e escrevi um código que pode detectar as freqüências DTMF dominantes presentes no tom e pode decodificá-lo para nos dar o número que foi pressionado do outro lado durante a chamada telefônica.

Código

  • Decodificador DTMF de código do Arduino
Decodificador DTMF de código do Arduino Arduino
compile e carregue o código no IDE do Arduino e não se esqueça de adicionar a biblioteca primeiro.
o link para a biblioteca é:
https://github.com/jacobrosenthal/Goertzel
/* Este código é uma implementação básica de um decodificador DTMF para detectar o código DTMF de 16 caracteres do pino analógico A0 e dá a saída decodificada verificando todos os superiores e tons mais baixos na matriz DTMF e nos dá o número correspondente ativando o bit digital correspondente para os números 0-9 e imprimindo serialmente o resto dos caracteres. Este trabalho é inteiramente baseado no código de Kevin Banks encontrado em http://www.embedded.com/design/embedded/4024443/The-Goertzel-Algorithm, portanto, crédito total a ele por sua implementação genérica e divisão. O algoritmo Goertzel é antigo, então consulte http://en.wikipedia.org/wiki/Goertzel_algorithm para uma descrição completa. É frequentemente usado na detecção de tom DTMF como uma alternativa para a Transformação Rápida de Fourier porque é rápido com baixo ouvido porque está apenas procurando uma única frequência em vez de mostrar a ocorrência de todas as frequências. * ESTE CÓDIGO É Feito / modificado por "Mian Mohammad Shoaib" e liberado para o domínio público. * para quaisquer perguntas relacionadas ao código, sinta-se à vontade para perguntar em [email protected] * / # include  int sensorPin =A0; const int N =100; // é o número de amostras de código que você pode alterar para sensibilidade e pode, se grande, pode retardar o arduinoconst float threshold =2000; // amplitude de tom mínima a ser considerada, podemos alterá-la para mais sensibilidadeconst float sampling_freq =8900; // frequência máxima detectável é a taxa de amostragem / 2 e o arduino uno com 16Mhz pode suportar amostragem de até 8900 Hzfloat x_frequencies [4]; // faz duas matrizes para manter as frequências dos eixos xey a serem detectadasfloat y_frequencies [4]; void setup () {pinMode (13, OUTPUT); // led intermitente de inicialização para mostrar se algum tom foi detectado pinMode (2, OUTPUT); // inicializar 10 pinos como saída para mostrar que as saídas dtmf do 2 ao número 12 resto serão impressas apenas derialmente no monitor pinMode (3, OUTPUT); pinMode (4, SAÍDA); pinMode (5, SAÍDA); pinMode (6, SAÍDA); pinMode (7, SAÍDA); pinMode (8, SAÍDA); pinMode (9, SAÍDA); pinMode (10, SAÍDA); pinMode (11, SAÍDA); pinMode (12, SAÍDA); Serial.begin (9600); frequências_x [0] =1209; // basta inicializar as matrizes com as frequências de tom dos eixos xey junto com suas linhas e dois pontos numberx_frequencies [1] =1336; x_frequencies [2] =1477; x_frequencies [3] =1633; y_frequencies [0] =697; y_frequencies [ 1] =770; y_frequências [2] =852; y_frequências [3] =941;} bool detect_tone (float freq) {Goertzel goertzel =Goertzel (freq, N, sampling_freq); // inicializa a função de biblioteca com a frequência de amostragem fornecida no de amostras e freq alvo goertzel.sample (sensorPin); // Tirará n amostras float magnitude =goertzel.detect (); // verifique se há target_freq if (magnitude> threshold) {// se você está obtendo acertos falsos ou nenhum acerto, ajuste o limite digitalWrite (13, HIGH); // pisca o led 13 se um pulso for detectado delay (250); digitalWrite (13, BAIXO); Serial.print (freq); Serial.print ("\ n"); return true; } else return false;} void print_number (int linha, int coluna) {int número =0; if (linha ==0) {// encontre o número correspondente à linha e coluna encontradas if (coluna ==0) número =1; senão se (coluna ==1) número =2; senão se (coluna ==2) número =3; senão se (coluna ==3) número =10; } else if (linha ==1) {if (coluna ==0) número =4; senão se (coluna ==1) número =5; senão se (coluna ==2) número =6; senão se (coluna ==3) número =11; } else if (linha ==2) {if (coluna ==0) número =7; senão se (coluna ==1) número =8; senão se (coluna ==2) número =9; senão se (coluna ==3) número =12; } else if (linha ==3) {if (coluna ==0) número =14; senão se (coluna ==1) número =0; senão se (coluna ==2) número =15; senão se (coluna ==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 ('*'); senão if (número ==15) Serial.print ('#'); Serial.print ("\ n"); atraso (800); para (int i =2; i <=12; i ++) {digitalWrite (i, LOW);}} void loop () {int coluna =0, linha =0; int i =0; while (1) {if (detect_tone (x_frequencies [i] ) ==verdadeiro) {coluna =i; pausa; } i ++; if (i ==4) i =0;} i =0; while (1) {if (detect_tone (y_frequencies [i]) ==true) {row =i; pausa; } i ++; if (i ==4) i =0;} print_number (linha, coluna);} 

Esquemas

O circuito usa 10 LEDs conectados do pino digital 2 a 12 que acenderão quando qualquer tom para os números entre 0-9 for pressionado respectivamente e um LED de detecção de pulso será conectado no pino 13, o que dará uma piscada curta quando um pulso ou um sinal for detectado, números maiores que 9 (os caracteres especiais) serão exibidos por meio da impressão serial no IDE.
O pino de entrada do conector de áudio ou o cabo AUX será conectado ao pino analógico A0 com um capacitor de 1uF em série que filtrará as baixas frequências e o deslocamento DC.

Processo de manufatura

  1. Faça Monitor Ambilight usando Arduino
  2. Máquina de LEVITAÇÃO ULTRASÔNICA Usando ARDUINO
  3. Sistema de alarme Arduino:SERENA
  4. Faça você mesmo voltímetro usando Arduino e Smartphone
  5. Monitor de freqüência cardíaca usando IoT
  6. Comunicação em código Morse usando módulo laser (ambos)
  7. WebServerBlink usando Arduino Uno WiFi
  8. Contador de carros usando Arduino + Processing + PHP
  9. Jogo Dino automatizado usando arduino
  10. Comunicação Python3 e Arduino