Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Декодер DTMF с использованием только Arduino

Компоненты и расходные материалы

Arduino UNO
× 1
LED (общий)
× 10
Макет (общий)
× 1
Перемычки (общие)
× 20

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Когда я просматривал свой список семестровых проектов с вариантами выбора, я увидел автомобиль с DTMF-управлением, который использовал CM 8870 IC в качестве DTMF-декодера, а закодированные двоичные данные были переданы Arduino для выполнения операций влево-вправо и вперед-назад. Функция декодера DTMF, основная часть, использовала внешнюю ИС, которую мне было трудно интегрировать, и я искал код или библиотеку, которая могла бы даже заменить ИС в схеме некоторым дополнительным кодом, и не могла найти удовлетворительного решения. . Но одна библиотека, основанная на алгоритме Герцеля (Goertzel.h), могла определить, присутствует ли конкретная частота в тоне или нет, путем вычисления количества импульсов в единицу времени и их амплитудного вклада в данный тональный сигнал.

Я использовал базовый пример кода в качестве основы и написал код, который может определять текущие доминирующие частоты DTMF в тоне и декодировать их, чтобы получить номер, который был нажат на другой стороне во время телефонного звонка.

Код

  • DTMF-декодер кода Arduino
Декодер DTMF кода Arduino Arduino
скомпилируйте и загрузите код в Arduino IDE и не забудьте сначала добавить библиотеку.
ссылка на библиотеку:
https://github.com/jacobrosenthal/Goertzel
/* Этот код является базовой реализацией DTMF-декодера для обнаружения 16-символьного DTMF-кода с аналогового вывода A0 и дает декодированный вывод, проверяя все верхние и более низкие тона в матрице DTMF и дает нам соответствующий номер, включив соответствующий цифровой бит для чисел 0-9 и последовательно распечатав остальные символы. Эта работа полностью основана на коде Кевина Бэнкса, который можно найти на http://www.embedded.com/design/embedded/4024443/The-Goertzel-Algorithm, поэтому вся его заслуга за его общую реализацию и анализ. Алгоритм Герцеля существует давно, поэтому полное описание см. На http://en.wikipedia.org/wiki/Goertzel_algorithm. Он часто используется при обнаружении тона DTMF в качестве альтернативы быстрому преобразованию Фурье, потому что он быстрый с низким уровнем подслушивания, потому что он ищет только одну частоту, а не показывает наличие всех частот. * ДАННЫЙ КОД СОЗДАН / изменен «Миан Мохаммад Шоаиб» и опубликован в открытом доступе. * по любым вопросам, связанным с кодом, обращайтесь по адресу [email protected] * / # include  int sensorPin =A0; const int N =100; // это количество выборок кода y0u может измениться для чувствительности, а может, если оно велико, может замедлить arduinoconst float threshold =2000; // минимальная амплитуда тона, которую необходимо учитывать, мы можем изменить ее для большей чувствительностиconst float sampling_freq =8900; // максимальная обнаруживаемая частота - это частота дискретизации / 2, и arduino uno с частотой 16 МГц может поддерживать дискретизацию до 8900 Гц float x_frequencies [4]; // создаем два массива для хранения частот осей x и y для определения float y_frequencies [4]; void setup () {pinMode (13, OUTPUT); // запускаем мигание светодиода, чтобы показать, обнаружен ли какой-либо тон pinMode (2, OUTPUT); // инициализируем 10 контактов в качестве выходных, чтобы показать, что выходы dtmf с 2 по номер 12, остальные будут просто распечатаны на мониторе pinMode (3, OUTPUT); pinMode (4, ВЫХОД); pinMode (5, ВЫХОД); pinMode (6, ВЫХОД); pinMode (7, ВЫХОД); pinMode (8, ВЫХОД); pinMode (9, ВЫХОД); pinMode (10, ВЫХОД); pinMode (11, ВЫХОД); pinMode (12, ВЫХОД); Serial.begin (9600); x_frequencies [0] =1209; // просто инициализируем массивы частотами тонов по осям x и y вместе с их номерами строк и двоеточий 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); // Возьмем n отсчетов float magnitude =goertzel.detect (); // проверяем их на target_freq if (magnitude> threshold) {// если вы получаете ложные совпадения или нет совпадений, настройте порог digitalWrite (13, HIGH); // мигает светодиод 13 при обнаружении импульса delay (250); digitalWrite (13, LOW); Serial.print (частота); Serial.print ("\ n"); вернуть истину; } else return false;} void print_number (int row, int column) {int number =0; if (row ==0) {// найти число, соответствующее найденной строке и столбцу if (column ==0) number =1; иначе, если (столбец ==1) число =2; иначе, если (столбец ==2) число =3; иначе, если (столбец ==3) число =10; } else if (row ==1) {if (column ==0) number =4; иначе, если (столбец ==1) число =5; иначе, если (столбец ==2) число =6; иначе, если (столбец ==3) число =11; } else if (row ==2) {if (column ==0) number =7; иначе, если (столбец ==1) число =8; иначе, если (столбец ==2) число =9; иначе, если (столбец ==3) число =12; } else if (row ==3) {if (column ==0) number =14; иначе, если (столбец ==1) число =0; иначе, если (столбец ==2) число =15; иначе, если (столбец ==3) число =13; } 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.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] ) ==истина) {столбец =я; ломать; } i ++; if (i ==4) i =0;} i =0; while (1) {if (detect_tone (y_frequencies [i]) ==true) {row =i; ломать; } i ++; if (i ==4) i =0;} print_number (строка, столбец);} 

Схема

В схеме используются 10 светодиодов, подключенных к цифровым контактам 2–12, которые будут включаться при нажатии любого тонального сигнала для чисел от 0 до 9 соответственно, а светодиод обнаружения импульса будет подключен к контакту 13, который будет давать короткое мигание при появлении импульса. или обнаружен сигнал, числа больше 9 (специальные символы) будут отображаться при последовательной печати в среде IDE.
Входной контакт аудиоразъема или кабеля AUX будет подключен к аналоговому контакту A0 с конденсатором емкостью 1 мкФ, который будет отфильтровывать низкие частоты и смещение постоянного тока.

Производственный процесс

  1. Создание монитора Ambilight с помощью Arduino
  2. Ультразвуковой левитационный аппарат с использованием ARDUINO
  3. Система сигнализации Arduino:SERENA
  4. Вольтметр своими руками с использованием Arduino и смартфона
  5. Монитор сердечного ритма с использованием Интернета вещей
  6. Передача кода Морзе с использованием лазерного модуля (оба)
  7. WebServerBlink с использованием Arduino Uno WiFi
  8. Счетчик автомобилей с использованием Arduino + Обработка + PHP
  9. Автоматизированная игра Дино с использованием arduino
  10. Связь Python3 и Arduino