Генерация тонов DTMF только с помощью Arduino

В этом уроке объясняем как генерировать тональный набор DTMF только с помощью платы Arduino Uno. Двухтональный многочастотный аналоговый сигнал, тональный набор, тональный сигнал (англ. Dual-Tone Multi-Frequency, DTMF) - является распространенной системой сигнализации, используемой в телефонных сетях и других устройствах связи. Он использует смесь двух синусоидальных волн для генерации тонов, представляющих десять цифр, букв от A до D и символов # и *.

При анализе других генераторов DTMF на базе Arduino стало понятно, что большинство конструкций основано на Holtek HT9200 DTMF. После нескольких экспериментов получилось выяснить, что сам Arduino способен генерировать DTMF без использования внешней микросхемы или генератора. Данный проект основан на резисторной матрице R-2R. Матрица R-2R имеет два вида включения: прямое — матрица токов и инверсное — матрица напряжений. Включение матрицы резисторов R-2R по схеме матрицы напряжений показано на рисунке ниже.

В проекте используется плата Arduino Uno и библиотека поддерживает только эту плату. Но, в целом, всё можно легко распространить на другие платы Arduino на базе AVR MCU.

Шаг 1. Комплектующие

Для реализации на Arduino DTFM нам понадобятся следующие комплектующие:

  • Arduino UNO × 1
  • Резистор 100 Ом × 8
  • Резистор 220 Ом × 8
  • Конденсатор 1 мкФ × 1

Шаг 2. Схема соединения

Матрица R-2R подключена к PORTD микроконтроллера, который является цифровым выходом от 0 до 7 на плате Arduino Uno. В этой конструкции используются резисторы 100 и 220 Ом для построения схемы R-2R.

В микроконтроллере сигналы генерируются с использованием предварительно рассчитанной таблицы. Например, чтобы сгенерировать тон для цифры 1, он синтезирует 700 Гц (≈ 697 Гц) и 1200 Гц (≈ 1209 Гц) по отдельности и объединяет их на более поздних этапах для получения окончательного результата. Из-за более низкого разрешения нашего ЦАП выходная форма волны не имеет чисто синусоидальной формы, но она работает абсолютно хорошо.

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

Код и библиотека

Библиотека Arduino для этого генератора DTMF довольно проста в использовании. Файлы библиотеки и исходные коды вы можете скачать ниже или взять на GitHub здесь.

Загруженный файл библиотеки можно установить непосредственно в Arduino IDE, перейдя в меню:

Sketch -> Include Library -> Add.ZIP library

После установки, чтобы открыть пример эскиза нажмите:

Файл -> Примеры -> DTMFGen

Как только библиотека интегрирована в IDE, Arduino может генерировать тоны DTMF несколькими строками кода.

#include "dtmfgen.h"
  
DTMFGenerator dtmf;
  
void setup()
{
}
  
void loop()
{
 // Generate 100ms long DTMF tone for digit 5. 
 dtmf.generate('5', 100);
}

Можно спокойно использовать этот метод для генерации тонов DTMF, так как он прост и расширяем. Другая проблема, с которой можно столкнуться при выборе чипов генератора DTMF, заключается в том, что часто эти чипы и модули трудно найти на рынке. При таком подходе любой может создать генератор тонов DTMF с несколькими дискретными компонентами. Основным недостатком этого подхода является то, что он использует 8 контактов ввода/вывода платы Arduino.

16 мая 2019 в 14:35 | Обновлено 7 декабря 2019 в 00:01 (редакция)
Опубликовано:
Уроки

2 комментария

  1. Руслан
    21 марта 2020 в 21:21

    можно ли добавить диоды для определения состояния?

    Ответить
    1. ss
      23 февраля 2023 в 12:01

      Можно, добавь

      Ответить

Добавить комментарий

Ваш E-mail не будет никому виден. Обязательные поля отмечены *