DTMF, библиотека от Jacob Rosenthal и что из этого вышло

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

 

Делаю проект, одна из частей - это возможность считывать с телефона нажатие кнопок. Основная цель - дистанционное управление устройствами. Прилагаю фото моего макета (правда на беспаечной макетке и там есть куча не нужных элементов).

После исследования информации в интернете, выяснилось, что лучший вариант - это использование аппаратного декодера. Но у меня его пока что нет, попробовал решить этот вопрос (распознавание) программно.

В результате поисков была найдена бибилотека от 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В. Разумеется, добавить возможность усложнения команд не в виде одной кнопки, а нажатия последовательности, дабы ибо (чтобы исключить ложные срабатывания и т.п).

Удачи!

 
art100
Offline
Зарегистрирован: 09.03.2014

я вам как старый телефонист на слово DTMF говорю 

при кодировании и декодировании частотного кода 2-два из 7-ми аналоговая часть ключевая

и  кварц на микрушках обязательно 3.58

вы хотите на 16 мегагерцовом проце и так занятом по самое нехачу частоты звуковые подравнивать?

даю вероятность 70% что у вас это получится но в результате без аппараных микрух с кварцами 3.58 получится  глючное авнецо

помнится декодеры паяли, кварцев 4.43 как грязи было пробовал синхронно микрухи трясти что-то получалось но глючило

помню на советских паял глючило

помню сразу с аналоговым узлом импортные применял прекрасно

с глухого таксофона на улице лишь бы прижать резинкой динамик

с тихой комнаты с расстояния

я скажу так

софтово на 16 мегагерцовых ?

неверю

 

вы не в москве?

PL-1 Импортные радиодетали (Россия, Москва)  
+7 (495) 926-81-06 pl1_mitino@mail.ru http://www.pl-1.ru
Производитель Наименование и комментарии Розн. М.Опт Опт. Склад
  MT8870 (MC88L70)
TEL приемник/дешифратор DTMF, Корпус:DIP-18
описание
48,0 руб. 45,6 руб. 43,5 руб.

18
 

 

http://ua3vvm.qrz.ru/digital/html/dtmf-decoder.htm

http://pdf1.alldatasheet.com/datasheet-pdf/view/77085/MITEL/MT8870.html

я бы от стариков для стариков не отходил

мое IMHO

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я потому в тексте написал, что надо делать аппаратно, а это так, для тестирования. Хотя работает вполне надёжно.

TevatroN
Offline
Зарегистрирован: 17.11.2013

Приветствую, я иногда и радаиосканнере кручусь, поэтому посоветую глянуть на CTCSS енкодер, по краиней мере тот код что я видел много компактней, я понимаю что несколько разные методы, у DTMF двухтоновая модуляция.

https://code.google.com/p/arduino/issues/detail?id=441 или еще что схожее поискать.

Как 1-й вариант по таблице DTMF можно выделять сигналы биений соответствуещего кода, или 2-й допилив код использовать два аналоговых входа и определять их, например разделив сигнал на две составляющие простейшим RC фильтром на до 1000Гц и после 1000Гц. А может даже и через один вход контроллер сумеет разглядеть две разные частоты, при соответствующем коде программы.

Я согласен и с art100 про аппаратные микрухи, но понимаю и kisoft. Т.к. если справится с задачей то атмега сможет сразу после получения команды исполнить какуюто полезную задачу, при этом еще и на LCD инфу сможет показать, и что то сам после разрешения сделать.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Из Нижнего уже идёт посылка с MT8870. Локальную задачу (макетирование) я решил программно, отработал работу, а в устройство поставлю аппаратный декодер. Статью написал для тех, кто все таки решит использовать программный декодер. Работает он хорошо, сбоев нет, определение 100%. За ссылку спасибо, я их море нашёл, использовал ту, что показалась проще для меня.

 

Voventy
Offline
Зарегистрирован: 07.02.2015

А для какой ардуины скетч.

На уно и про мини не загружается

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В первом сообщении написано: "Ардуино Леонардо". Насколько помню, там проблем не должно быть с платой, что Уно, что Мини должны работать.