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

Construire un décodeur DTMF avec un Arduino seul – Aucun CI supplémentaire nécessaire

Composants et fournitures

Arduino UNO × 1
LED (standard) × 10
Plaque d'essai (breadboard) × 1
Fils de connexion (jumper wires) × 20

Applications et services en ligne

Arduino IDE

À propos de ce projet

Dans le cadre de mon projet de semestre, j'ai découvert un véhicule commandé par DTMF qui utilisait le CI CM8870 comme décodeur DTMF. Les données binaires décodées étaient transmises à l'Arduino pour contrôler les mouvements avant/arrière et gauche/droite. La fonction de décodage DTMF, partie centrale du projet, reposait sur un CI externe que je trouvais difficile à intégrer. Je cherchais donc un code ou une bibliothèque capable de remplacer ce CI par du code additionnel, sans trouver de solution satisfaisante.

J'ai alors découvert une bibliothèque basée sur l'algorithme de Goertzel (Goertzel.h) qui permet de détecter la présence d'une fréquence spécifique dans un signal tonal en calculant le nombre d'impulsions par unité de temps et leur contribution en amplitude. J'ai utilisé l'exemple de base de cette bibliothèque comme point de départ et j'ai développé un code capable de détecter les fréquences DTMF dominantes présentes dans le signal et de les décoder pour restituer le chiffre appuyé lors d'un appel téléphonique.

Code

Code Arduino pour décodeur DTMF

Compilez et téléversez le code dans l'Arduino IDE après avoir installé la bibliothèque Goertzel disponible ici : GitHub - jacobrosenthal/Goertzel

/* Implémentation basique d'un décodeur DTMF pour détecter les 16 caractères DTMF
 * depuis la broche analogique A0 et afficher le résultat décodé en vérifiant
 * toutes les fréquences hautes et basses de la matrice DTMF.
 * Basé sur le code de Kevin Banks (https://www.embedded.com/design/embedded/4024443/The-Goertzel-Algorithm)
 * et l'algorithme de Goertzel (https://en.wikipedia.org/wiki/Goertzel_algorithm).
 * Modifié par Mian Mohammad Shoaib - domaine public.
 * Contact : MMSHOAIB8452@GMAIL.COM
 */
#include <Goertzel.h>

int sensorPin = A0;
const int N = 100;                 // Nombre d'échantillons (ajustable pour la sensibilité)
const float threshold = 2000;      // Seuil minimal d'amplitude tonale
const float sampling_freq = 8900;  // Fréquence d'échantillonnage (max detectable = sampling_rate/2)

float x_frequencies[4]; // Fréquences colonne (hautes)
float y_frequencies[4]; // Fréquences ligne (basses)

void setup() {
  pinMode(13, OUTPUT); // LED indicatrice de détection
  for (int i = 2; i <= 12; i++) pinMode(i, OUTPUT); // Sorties pour chiffres 0-9
  Serial.begin(9600);

  // Fréquences DTMF standard
  x_frequencies[0] = 1209; 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, sampling_freq);
  goertzel.sample(sensorPin);
  float magnitude = goertzel.detect();

  if (magnitude > threshold) {
    digitalWrite(13, HIGH);
    delay(250);
    digitalWrite(13, LOW);
    Serial.println(freq);
    return true;
  }
  return false;
}

void print_number(int row, int column) {
  int number = 0;
  // Matrice de correspondance ligne/colonne -> touche
  if (row == 0) {
    if (column == 0) number = 1;
    else if (column == 1) number = 2;
    else if (column == 2) number = 3;
    else number = 10; // A
  } else if (row == 1) {
    if (column == 0) number = 4;
    else if (column == 1) number = 5;
    else if (column == 2) number = 6;
    else number = 11; // B
  } else if (row == 2) {
    if (column == 0) number = 7;
    else if (column == 1) number = 8;
    else if (column == 2) number = 9;
    else number = 12; // C
  } else if (row == 3) {
    if (column == 0) number = 14; // *
    else if (column == 1) number = 0;
    else if (column == 2) number = 15; // #
    else number = 13; // D
  }

  if (number < 10) {
    digitalWrite(number + 2, HIGH);
    Serial.print(number);
  } else if (number == 10) Serial.print('A');
  else if (number == 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.println();

  delay(800);
  for (int i = 2; i <= 12; i++) digitalWrite(i, LOW);
}

void loop() {
  int column = 0, row = 0, i = 0;

  // Détection fréquence colonne
  while (1) {
    if (detect_tone(x_frequencies[i])) { column = i; break; }
    i = (i + 1) % 4;
  }

  // Détection fréquence ligne
  i = 0;
  while (1) {
    if (detect_tone(y_frequencies[i])) { row = i; break; }
    i = (i + 1) % 4;
  }

  print_number(row, column);
}

Schéma de câblage

Le circuit utilise 10 LED connectées aux broches numériques 2 à 12 qui s'allument lorsque les touches 0 à 9 sont pressées. Une LED de détection d'impulsion sur la broche 13 clignote brièvement lors de la détection d'un signal. Les caractères spéciaux (*, #, A, B, C, D) sont affichés via le moniteur série.

L'entrée audio (prise jack ou câble AUX) se connecte à la broche analogique A0 via un condensateur de 1 µF en série pour filtrer les basses fréquences et le décalage DC.

Construire un décodeur DTMF avec un Arduino seul – Aucun CI supplémentaire nécessaire

Processus de fabrication

  1. Créer un système Ambilight spectaculaire pour moniteur avec Arduino
  2. Construire un dispositif de lévitation ultrasonique avec Arduino – Guide étape par étape
  3. SERENA : Système d'Alarme Arduino Mega 2560 Personnalisé avec Écran Tactile TFT LCD
  4. Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
  5. Moniteur de Fréquence Cardiaque IoT en Temps Réel avec Arduino et MAX30100
  6. Communication en Code Morse par Module Laser – Projet Arduino Double Face
  7. Serveur Web Arduino Uno WiFi : Commander une LED via Navigateur
  8. Compteur de stationnement intelligent : Suivi véhicule en temps réel avec Arduino, Processing et PHP
  9. Automatiser le Jeu Chrome Dino avec Arduino et LDR