Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Décodeur DTMF utilisant uniquement Arduino

Composants et fournitures

Arduino UNO
× 1
LED (générique)
× 10
Planche à pain (générique)
× 1
Câbles de raccordement (générique)
× 20

Applications et services en ligne

Arduino IDE

À propos de ce projet

Alors que je parcourais ma liste de projets de semestre avec les choix à choisir, j'ai vu une voiture contrôlée par DTMF qui utilisait le CM 8870 IC comme décodeur DTMF et les données binaires encodées ont été transmises à Arduino pour effectuer les opérations gauche droite et avant arrière. La fonction décodeur DTMF, la partie principale, utilisait un circuit intégré externe que je trouvais difficile à intégrer et était à la recherche d'un code ou d'une bibliothèque qui pourrait même remplacer le circuit intégré dans le circuit par un code supplémentaire et ne pouvait pas trouver de solution satisfaisante . Mais une bibliothèque basée sur l'algorithme de Goertzel (Goertzel.h) qui pourrait dire si une fréquence spécifique était présente dans la tonalité ou non en calculant le nombre d'impulsions par unité de temps et leur contribution en amplitude dans le signal de tonalité donné.

J'ai utilisé l'exemple de code de base comme base et j'ai écrit un code qui peut détecter les fréquences DTMF dominantes présentes dans la tonalité et peut les décoder pour nous donner le numéro qui a été pressé de l'autre côté pendant l'appel téléphonique.

Code

  • Décodeur Arduino Code DTMF
Décodeur Arduino Code DTMFArduino
compilez et téléchargez le code dans Arduino IDE et n'oubliez pas d'ajouter d'abord la bibliothèque.
le lien pour la bibliothèque est :
https://github.com/jacobrosenthal/Goertzel
/* Ce code est une implémentation de base d'un décodeur DTMF pour détecter le code DTMF à 16 caractères de la broche analogique A0 et donne la sortie décodée en vérifiant tous les des tons plus bas dans la matrice DTMF et nous donne le numéro correspondant en activant le bit numérique correspondant pour les chiffres 0-9 et en imprimant en série le reste des caractères. Ce travail est entièrement basé sur le code de Kevin Banks trouvé sur http://www.embedded.com/design/embedded/4024443/The-Goertzel-Algorithm, donc tout le mérite à lui pour sa mise en œuvre et sa ventilation génériques. L'algorithme de Goertzel existe depuis longtemps, alors consultez http://en.wikipedia.org/wiki/Goertzel_algorithm pour une description complète. Il est souvent utilisé dans la détection de tonalité DTMF comme alternative à la transformée de Fourier rapide car il est rapide avec une faible écoute car il ne recherche qu'une seule fréquence plutôt que de montrer l'occurrence de toutes les fréquences. * CE CODE EST Créé/modifié par "Mian Mohammad Shoaib" et publié dans le domaine public. * pour toute question relative au code, n'hésitez pas à demander à [email protected] */#include int sensorPin =A0; const entier N =100 ; // c'est le nombre d'échantillons que le code prendra que vous pouvez changer pour la sensibilité et peut, s'il est grand, ralentir le seuil flottant de l'arduinoconst =2000 ; //amplitude de tonalité minimale à prendre en compte, nous pouvons la modifier pour plus de sensibilitéconst float sampling_freq =8900; //la fréquence maximale détectable est le taux d'échantillonnage/2 et l'arduino uno avec 16Mhz peut prendre en charge l'échantillonnage jusqu'à 8900 Hzfloat x_frequencies[4] ; // crée deux tableaux pour contenir les fréquences des axes x et y à détecter float y_frequencies[4];void setup(){ pinMode(13, OUTPUT); // initialise la led clignotante pour montrer si une tonalité est détectée pinMode(2, OUTPUT); // initialiser 10 broches en tant que sortie pour afficher les sorties dtmf de 2 au numéro 12, le reste sera simplement imprimé en dérial sur le moniteur pinMode (3, OUTPUT); pinMode(4, SORTIE); pinMode(5, SORTIE); pinMode (6, SORTIE); pinMode(7, SORTIE); pinMode(8, SORTIE); pinMode(9, SORTIE); pinMode (10, SORTIE); pinMode(11, SORTIE); pinMode(12, SORTIE); Serial.begin(9600); x_frequences[0]=1209 ; // il suffit d'initialiser les tableaux avec les fréquences de tonalité des axes x et y ainsi que leur nombre de lignes et de deux pointsx_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, sampling_freq); //initialiser la fonction de bibliothèque avec la fréquence d'échantillonnage donnée, le nombre d'échantillons et la fréquence cible goertzel.sample(sensorPin); // Prendra n échantillons float magnitude =goertzel.detect(); //vérifiez-les pour target_freq if(magnitude>threshold){ //si vous obtenez de faux résultats ou aucun résultat, ajustez le seuil digitalWrite(13,HIGH); //clignotement de la led sur 13 si une impulsion est détectée delay(250); digitalWrite(13,LOW); Serial.print(freq); Serial.print("\n"); renvoie vrai ; } else return false;}void print_number(int row,int column){int number=0;if(row==0){ //trouver le numéro correspondant à la ligne et à la colonne trouvées if(column==0) number=1; sinon si(colonne==1) nombre=2; sinon si(colonne==2) nombre=3; sinon si(colonne==3) nombre=10; } else if(ligne==1){ if(colonne==0) nombre=4; sinon si(colonne==1) nombre=5; sinon si(colonne==2) nombre=6; sinon si(colonne==3) nombre=11; } else if(ligne==2){ if(colonne==0) nombre=7 ; sinon si(colonne==1) nombre=8; sinon si(colonne==2) nombre=9; sinon si(colonne==3) nombre=12; } else if(ligne==3){ if(colonne==0) nombre=14 ; sinon si(colonne==1) nombre=0 ; sinon si(colonne==2) nombre=15; sinon si(colonne==3) nombre=13; }if(nombre <10){digitalWrite((nombre+2),HIGH);Serial.print(nombre);}else if(nombre ==10)Serial.print('A');else if(nombre ==11)Serial.print('B');else if(number ==12)Serial.print('C');else if(number ==13)Serial.print('D');else if(number ==14)Serial.print('*');else if(number ==15)Serial.print('#');Serial.print("\n");delay(800);for(int i=2;i<=12;i++){ digitalWrite(i,LOW);}}void loop(){int column=0,row=0;int i=0;while(1){ if(detect_tone(x_frequencies[i] ) ==vrai){ colonne =i; Pause; } i++;if(i==4)i=0;}i=0;while(1){if(detect_tone(y_frequencies[i]) ==true){ row =i; Pause; } i++;if(i==4)i=0;}print_number(ligne,colonne);}

Schémas

Le circuit utilise 10 LED connectées de la broche numérique 2 à 12 qui s'allumeront lorsqu'une tonalité pour les chiffres entre 0-9 est enfoncée respectivement et une LED de détection d'impulsion sera connectée sur la broche 13 qui donnera un bref clignotement lorsqu'une impulsion ou un signal est détecté, les nombres supérieurs à 9 (les caractères spéciaux) seront affichés via l'impression série dans l'IDE.
La broche d'entrée de la prise audio ou du câble AUX sera connectée à la broche analogique A0 avec un condensateur 1uF en série qui filtrera les basses fréquences et le décalage CC.

Processus de fabrication

  1. Créer un moniteur Ambilight à l'aide d'Arduino
  2. Machine à LÉVITATION ULTRASONIQUE utilisant ARDUINO
  3. Système d'alarme Arduino :SERENA
  4. Voltmètre DIY utilisant Arduino et Smartphone
  5. Moniteur de fréquence cardiaque utilisant l'IoT
  6. Communication en code Morse à l'aide du module laser (les deux)
  7. WebServerBlink avec Arduino Uno WiFi
  8. Compteur de voitures utilisant Arduino + Traitement + PHP
  9. Jeu Dino automatisé utilisant arduino