DTMF, библиотека от Jacob Rosenthal и что из этого вышло
- Войдите на сайт для отправки комментариев
Делаю проект, одна из частей - это возможность считывать с телефона нажатие кнопок. Основная цель - дистанционное управление устройствами. Прилагаю фото моего макета (правда на беспаечной макетке и там есть куча не нужных элементов).
После исследования информации в интернете, выяснилось, что лучший вариант - это использование аппаратного декодера. Но у меня его пока что нет, попробовал решить этот вопрос (распознавание) программно.
В результате поисков была найдена бибилотека от Jacob Rosenthal, которая использует метод Goertzel.
Как пришлось заводить библиотеку - поробую коротенько расписать, поскольку такие вопросы уже возникали в форуме, но толком ничего никто не объяснил.
1. Промоделировал данную библиотеку в Proteus, работало невнятно, что то распознавало, но это и понятно, потому схема для проверки была собрана на беспаечной макетке.
2. Что использовалось:
2.1. Ардуино Леонардо (что есть под рукой, в дальнейшем будет использоваться Pro Mini)
2.2. Входная цепь для приведения сигнала к "норме", т.е. привести двуполярный аналоговый сигнал к однополярному. Здесь я не парился, использовал оригинальный вариант
Здесь два резистора (R2) на 100КОм, один на 1КОм (R1) и конденсатор (C) на 100нФ или 0,1мкФ.
2.3. Разъем jack 3,5
2.4. Кабель для подключения к телефону
2.5. Красный светодиод и резистор на 470Ом (для проверки потянет)
2.6. Провода и беспаечная макетка
2.7. USB кабель, для подключения Леонардо к компьютеру (питание и прошивка)
2.8. Телефон/смартфон
3. Остановлюсь подробнее на бибилиотеке, (прилагаю библиотеку и "переведенный" мной несколько дебильно скетч для проверки dtmf_test.7z). Да, начнем, пожалуй.
3.1. Первое, что нужно настроить - это определить, какое напряжение на пине А0 будет в режиме покоя ("ноль", напряжение без сигнала), для этого нужно раскомментарить строку 28 (#define USE_PRINT_A0). Скомпилировать и прошить. После прошивки запускаем монитор и видим раз в секунду выводится значение. У меня это было 510, т.е. к "заветным" 511-512 было очень близко. Если значение сильно отличается (например, 400, 600 или бОльшее отклонение от 512), проверяем схему (см. выше) и повторяем измерение. Полученное значение вписываем в строку 102, где значение 510 меняем на то, что выводилось в монитор.
3.2. Второе - это определение частоты семплирования (не обязательно, если не чем измерять частоту). Для этого необходимо закомментарить обратно строку 28 (#define USE_PRINT_A0) и раскомментарить строку 14 (#define USE_MEASURE_PIN4). В этом случае скетч будет семплировать данные и выводить частоту семплирования уменьшенную в два раза на цифровой пин 4. Компилируем, прошиваем, подключаем измеритель к пину 4 и смотрим частоту. У меня она получилась равной 4.454KHz, т.е. частота семплирования примерно равна 8908Hz.
Ну что ж, мы готовы выполнить первую проверку.
4. Закомментариваем строку (#define USE_MEASURE_PIN4) и раскомментариваем строку 20 (#define DEBUG_PRINT). Компилируем, прошиваем, подключаем телефон, увеличиваем громкость на нем до максимума (у меня LG NEXUS 5, если громкость уменьшить не срабатывает). Для формирования сигналов нажатия кнопок я установил специальную программу, которая формирует DTMF тоны. Впрочем здесь есть варианты, используйте любые другие методы. О да, программа работает, каждое нажатие кнопки сопровождается выводом в монитор соответствующего кода кнопки и отладочные данные из массива частот.
5. Чтобы окончательно проверить как работает программа, я удалил всю ненужную информацию ("очищенная" функция loop добавлена в скетч в самый конец. Для настройки необходимо в строке 38 указать пин, который будет управлять светодиодом (или бОльшей нагрузкой). У меня это А5, он оказался ближе других, да и провод у меня оказался коротким.
Дальше были проверки, потом звонок по скайпу другану, который мне позвонил на телефон и побаловался удлаленным управлением светодиодом.
На том всё и закончилось. Распознавалка работает достаточно надежно (я пробовал на вход подавать сигнал с интернет радио, ложный срабатываний не было обнаружено).
В дальнейшем планируется вместо светодиода подключить реле (одно или несколько), а также добавить возможность с телефона услышать состояние реле (передача через микрофон или гарнитуру), а также добавить стабилизатор питания, для подключения к автомобильной бортовой сети 12-14В. Разумеется, добавить возможность усложнения команд не в виде одной кнопки, а нажатия последовательности, дабы ибо (чтобы исключить ложные срабатывания и т.п).
Удачи!
я вам как старый телефонист на слово DTMF говорю
при кодировании и декодировании частотного кода 2-два из 7-ми аналоговая часть ключевая
и кварц на микрушках обязательно 3.58
вы хотите на 16 мегагерцовом проце и так занятом по самое нехачу частоты звуковые подравнивать?
даю вероятность 70% что у вас это получится но в результате без аппараных микрух с кварцами 3.58 получится глючное авнецо
помнится декодеры паяли, кварцев 4.43 как грязи было пробовал синхронно микрухи трясти что-то получалось но глючило
помню на советских паял глючило
помню сразу с аналоговым узлом импортные применял прекрасно
с глухого таксофона на улице лишь бы прижать резинкой динамик
с тихой комнаты с расстояния
я скажу так
софтово на 16 мегагерцовых ?
неверю
вы не в москве?
TEL приемник/дешифратор DTMF, Корпус:DIP-18
описание
18
http://ua3vvm.qrz.ru/digital/html/dtmf-decoder.htm
http://pdf1.alldatasheet.com/datasheet-pdf/view/77085/MITEL/MT8870.html
я бы от стариков для стариков не отходил
мое IMHO
Я потому в тексте написал, что надо делать аппаратно, а это так, для тестирования. Хотя работает вполне надёжно.
Приветствую, я иногда и радаиосканнере кручусь, поэтому посоветую глянуть на CTCSS енкодер, по краиней мере тот код что я видел много компактней, я понимаю что несколько разные методы, у DTMF двухтоновая модуляция.
https://code.google.com/p/arduino/issues/detail?id=441 или еще что схожее поискать.
Как 1-й вариант по таблице DTMF можно выделять сигналы биений соответствуещего кода, или 2-й допилив код использовать два аналоговых входа и определять их, например разделив сигнал на две составляющие простейшим RC фильтром на до 1000Гц и после 1000Гц. А может даже и через один вход контроллер сумеет разглядеть две разные частоты, при соответствующем коде программы.
Я согласен и с art100 про аппаратные микрухи, но понимаю и kisoft. Т.к. если справится с задачей то атмега сможет сразу после получения команды исполнить какуюто полезную задачу, при этом еще и на LCD инфу сможет показать, и что то сам после разрешения сделать.
Из Нижнего уже идёт посылка с MT8870. Локальную задачу (макетирование) я решил программно, отработал работу, а в устройство поставлю аппаратный декодер. Статью написал для тех, кто все таки решит использовать программный декодер. Работает он хорошо, сбоев нет, определение 100%. За ссылку спасибо, я их море нашёл, использовал ту, что показалась проще для меня.
А для какой ардуины скетч.
На уно и про мини не загружается
В первом сообщении написано: "Ардуино Леонардо". Насколько помню, там проблем не должно быть с платой, что Уно, что Мини должны работать.