DTMF декодер
- Войдите на сайт для отправки комментариев
Сб, 02/11/2013 - 22:53
хочу сделать на ардуине декодер тонального сигнала(который используется для набора телефонного номера), на сколько я знаю сегнал генерируется сложением двух синусоид, разных частот, например для цифры 1 - 697 Гц и 1209 Гц. Вопрос такой как с помощью дуины распознать 2е синусоиды?
Первым делм хочу цепануть к дуине линейный звуковой выход с компа например или сотовго телефона, и тут же второй вопрос если цепану на прямую нечего не спалю?(вольтаж там вроди как скачет от 0.75 до 1.5 вольт). Потом хочу посмотреть какие значения будут на аналоговом входе ардуины, а дальше разбератся как распознать.
Всем заранее спасибо:)
По программной части: только самый ленивый не может набрать в гугле "DTMF Arduino" и не найти много ссылок, на готовые решения и библиотеки, которые декодируют DTMF. А если Вы уже нашли, то вопрос должен звучать по другому, "как использовать" такую то библиотеку и привести ссылку на нее. Ах да, Вы же новичок.. как же я забыл. Удачи
По программной части: только самый ленивый не может набрать в гугле "DTMF Arduino" и не найти много ссылок, на готовые решения и библиотеки, которые декодируют DTMF. А если Вы уже нашли, то вопрос должен звучать по другому, "как использовать" такую то библиотеку и привести ссылку на нее. Ах да, Вы же новичок.. как же я забыл. Удачи
да искал я, но все что я находил это схемы где ардуино с микросхемой декодером MT8870, просто такую микросхему пока нет возможности купить, и чтоб не терять время зря думал мож на рдуине замострясить.
http://forum.arduino.cc/index.php?topic=121540.0
http://forum.arduino.cc/index.php?topic=121540.0
спасибо:) попробую разобраться.
Библиотека скачал. ссылка ниже:
http://members.shaw.ca/el.supremo/DTMF.zip
Загрузил скетч, вроди работает, только пока некоторые цыфры пропускает, но это возможно что монтаж на соплях был сделан, попробую все припаять и еще протестирую. А вообще в дальнейшем планирую курить MT8870 уже купил парочку, и объвязку к ним.
Сделал нормальный монтаж, поигрался с громкостью устройства с которого сигнл идет, и все очень хорошо распознает:)
Но возникла проблема все расшифрофаные цифры идут на комп через комп порт, а я хочу сделать чтоббы при вводе определенной комбинации например "789" у меня срабатывало релле на определенном выводе ардуино.
Подскажите как это в коде реализовать?
// The library toggles digital pin 4 in the sampling loop which allows // measurement of the actual sampling frequency. // If you call .sample() continuously like this: // while(1)dtmf.sample(sensorPin); // you can put a frequency counter on pin 4 to determine what the // sampling frequency is on your Arduino. Note that the frequency // counter will show half the actual rate. My meter showed 4.463kHz // so the sampling rate is 8926Hz #include <DTMF.h> int sensorPin = A0; int led = 13; // NOTE that N MUST NOT exceed 160 // This is the number of samples which are taken in a call to // .sample. The smaller the value of N the wider the bandwidth. // For example, with N=128 at a sample rate of 8926Hz the tone // detection bandwidth will be 8926/128 = 70Hz. If you make N // smaller, the bandwidth increases which makes it harder to detect // the tones because some of the energy of one tone can cross into // an adjacent (in frequency) tone. But a larger value of N also means // that it takes longer to collect the samples. // A value of 64 works just fine, as does 128. // NOTE that the value of N does NOT have to be a power of 2. float n=128.0; // sampling rate in Hz float sampling_rate=8926.0; // Instantiate the dtmf library with the number of samples to be taken // and the sampling rate. DTMF dtmf = DTMF(n,sampling_rate); void setup(){ pinMode(led, OUTPUT); Serial.begin(115200); } int nochar_count = 0; float d_mags[8]; void loop() { char thischar; // This reads N samples from sensorpin (must be an analog input) // and stores them in an array within the library. Use while(1) // to determine the actual sampling frequency as described in the // comment at the top of this file /* while(1) */dtmf.sample(sensorPin); // The first argument is the address of a user-supplied array // of 8 floats in which the function will return the magnitudes // of the eight tones. // The second argument is the value read by the ADC when there // is no signal present. A voltage divider with precisely equal // resistors will presumably give a value of 511 or 512. // My divider gives a value of 506. // If you aren't sure what to use, set this to 512 dtmf.detect(d_mags,506); // detect the button // If it is recognized, returns one of 0123456789ABCD*# // If unrecognized, returns binary zero // Pass it the magnitude array used when calling .sample // and specify a magnitude which is used as the threshold // for determining whether a tone is present or not // // If N=64 magnitude needs to be around 1200 // If N=128 the magnitude can be set to 1800 // but you will need to play with it to get the right value thischar = dtmf.button(d_mags,1800.); if(thischar) { Serial.print(thischar); nochar_count = 0; // Print the magnitudes for debugging //#define DEBUG_PRINT #ifdef DEBUG_PRINT for(int i = 0;i < 8;i++) { Serial.print(" "); Serial.print(d_mags[i]); } Serial.println(""); #endif } else { // print a newline if(++nochar_count == 50)Serial.println(""); // don't let it wrap around if(nochar_count > 30000)nochar_count = 51; } }в 73 строке кода писал if(thischar == 1), не помогло. так же в этом операторе if писал еще один IF с проверкой на то какое это число тоже не работает:(
Скорей всего сравнивать нужно с '1', а не с 1.
ок. попробую. я с двойными ковычками пробовал, а с одинарными нет.
kisoft,Спасибо
Попробовал
if(thischar =='1'). действительно работает:) в порт отправляет только единицы.Думаю переделать чтобы срабатывали на определенные ноги ардуины не составит особого труда.А что дают эти ковычки ' ' ? (просто еще понять охото:) )
Только как я понял из кода в порт по одному символу отсылается. и чтобы реальзовать срабатывание определнного кода (например *105#) нужно символы сначала в масив заносить? а вот как их заносить? создать массив из 5ти элементов? или массив не ограниченого размера и сделать проверки например символ *- означает начало кода а #-конец. И между ними любое количество символов (*105# или хоть *10765#). Для этого нужно использовать myPins массив???
Одиночные кавычки - это символ, двойные - строка. А это разные вещи.
Чтобы ловить последовательность есть разные варианты.
Один из них, ждать звездочку, потом записывать коды в массив до получения решетки, после чего
выполнять обработку полученных кодов. Только не забывайте, что длина массива ограничена и по ошибке
можно ввести много кодов, не нажимая решетку, что может привести к переполнению массива.
а нет такой возможности сделать динамический массив? который будет свой размерменять в зависимости от того сколько элементов в него запихали? или хотябы сделать массив для одного кода размером например 10 элементов? а код в него ввести из 5ти элементов? будет ли возможность корректно распознать такой код?
Можно использовать не массив, а переменную типа String, там длина ограничена размером памяти.
http://arduino.ru/Reference/StringObject
Попробую разобраться с типом String.
Но тут еще возникла странная проблемка. подключил релюшку к ардуине(12 нога) подал на нее 220 вольт включил нагрузку, и сделал включение на 5кнопку тонального набора а выключение на 9ую кнопку набора.Так вот звуки формировал на компе специальной программой, на этот же комп приходили сигналы с ардуино через ком порт(в ком монитор). Так вот проблемма собственно в том что при нажатии в на 5 или 9 время от времени мышка подвисала и отключалась и управление переходила на тачскри бука (буквально на секунду). при нажатии на другие клавиши (12346790) такого не наблюдалось. В связи с чем это может быть связвно? винда семерка.
Прежде чем продолжать, скажите, где Вы брали схему подключения (ссылку) и какое реле установлено (ссылку на ДШ)? Если не хотите сжечь дуину и комп сначала удостоверьтесь, что Вы правильно всё соединили и что реле подходит для подключения к Ардуино.
Вы уже убедились, что включение/выключение реле приводит к сбоям не только Ардуино, но и компа. Я бы не начинал с 220В, а попробовал на светодиодах и почитал про подключение реле к Ардуино, да еще с такой нагрузкой.
Поскольку я сам реле не подключал, надеюсь кто то подскажет более квалифицированно.
вот фото релюшки. модуль специально для дуины. Питание 5вольт. Три ноги vss gnd и in(это управляющий как я понял его я к 12 ноге дуины цепляю) а вообще релле странное при подаче на in 0 оно срабатывает а на 1 размыкает контакт. У меня больше подозрение что в коде может что токаряво написал я. А по сути все работает сигналы принимает релле работает( управлял лампой 30ватт). Еще отдельно управлял уже с помощью 2ух телефонов все тоже работает. И еще есть подозрение что провода плохо экранированы и поля от релле дают какие либо наводки.
Вот код уже с моими изменениями: Строки в которых я код добавил свой - 13,36,75,76
// The library toggles digital pin 4 in the sampling loop which allows // measurement of the actual sampling frequency. // If you call .sample() continuously like this: // while(1)dtmf.sample(sensorPin); // you can put a frequency counter on pin 4 to determine what the // sampling frequency is on your Arduino. Note that the frequency // counter will show half the actual rate. My meter showed 4.463kHz // so the sampling rate is 8926Hz #include <DTMF.h> int sensorPin = A0; int led = 13; int rel = 12; // NOTE that N MUST NOT exceed 160 // This is the number of samples which are taken in a call to // .sample. The smaller the value of N the wider the bandwidth. // For example, with N=128 at a sample rate of 8926Hz the tone // detection bandwidth will be 8926/128 = 70Hz. If you make N // smaller, the bandwidth increases which makes it harder to detect // the tones because some of the energy of one tone can cross into // an adjacent (in frequency) tone. But a larger value of N also means // that it takes longer to collect the samples. // A value of 64 works just fine, as does 128. // NOTE that the value of N does NOT have to be a power of 2. float n=128.0; // sampling rate in Hz float sampling_rate=8926.0; // Instantiate the dtmf library with the number of samples to be taken // and the sampling rate. DTMF dtmf = DTMF(n,sampling_rate); void setup(){ pinMode(led, OUTPUT); pinMode(rel, OUTPUT); Serial.begin(115200); } int nochar_count = 0; float d_mags[8]; void loop() { char thischar; // This reads N samples from sensorpin (must be an analog input) // and stores them in an array within the library. Use while(1) // to determine the actual sampling frequency as described in the // comment at the top of this file /* while(1) */dtmf.sample(sensorPin); // The first argument is the address of a user-supplied array // of 8 floats in which the function will return the magnitudes // of the eight tones. // The second argument is the value read by the ADC when there // is no signal present. A voltage divider with precisely equal // resistors will presumably give a value of 511 or 512. // My divider gives a value of 506. // If you aren't sure what to use, set this to 512 dtmf.detect(d_mags,506); // detect the button // If it is recognized, returns one of 0123456789ABCD*# // If unrecognized, returns binary zero // Pass it the magnitude array used when calling .sample // and specify a magnitude which is used as the threshold // for determining whether a tone is present or not // // If N=64 magnitude needs to be around 1200 // If N=128 the magnitude can be set to 1800 // but you will need to play with it to get the right value thischar = dtmf.button(d_mags,1800.); if(thischar) { if(thischar=='5')digitalWrite(rel, HIGH); if(thischar=='9')digitalWrite(rel, LOW); Serial.print(thischar); nochar_count = 0; // Print the magnitudes for debugging //#define DEBUG_PRINT #ifdef DEBUG_PRINT for(int i = 0;i < 8;i++) { Serial.print(" "); Serial.print(d_mags[i]); } Serial.println(""); #endif } else { // print a newline if(++nochar_count == 50)Serial.println(""); // don't let it wrap around if(nochar_count > 30000)nochar_count = 51; } }Ну это чуть проще.
По поводу контактов. Я не знаю какой у Вас шилд, поскольку видел в инете разные. У реле бывает три выходных клеммы, одна условно - центральная (это общий контакт в реле), а две остальные - одна в покое замкнута на центральную, а другая - разомкнута с центральной. Потому можете проверить тестером, так это в Вашем шилде или нет и перекоммутировать выходные провода в соответствии с тем нужно Вам нормальнозамкнутые контакты или нормальноразомкнутые.
Скетч в порядке, во всяком случае должен работать, там накосячить вроде бы негде.
Если есть помехи, то можно для начала отключить нагрузку в 220В и проверить, есть сбои или нет при переключении. Если есть, то искать без 220В нагрузки. Если нет, тогда, скорее всего, наводки при переключении большой нагрузки. Во всяком случае теоретически - это так, а как на практике - не подскажу.
Если есть помехи, то можно для начала отключить нагрузку в 220В и проверить, есть сбои или нет при переключении. Если есть, то искать без 220В нагрузки. Если нет, тогда, скорее всего, наводки при переключении большой нагрузки. Во всяком случае теоретически - это так, а как на практике - не подскажу.
так и сделаю:)
да выводов в релушке действительно три, как вы и сказали один центральный, а два других(один на размыкание другой на замыкание). но мне просо сама философия не нравится чт когда на упр ножке ноль релле под нагрузкой.
И особенно странно что лагает именно мышь. может на нее как раз наводки и идут( как раз косяк происходит именно в момент срабатывания релле). нужно еще будет попробовать рядом с компом погонять всю схему но не подрубая ее к компу.
Завтра все протестирую.и отпишусь.
Мышь USB? Если да, то может ли быт ьтакой вариант что что-то всё таки утекает на землю на ардуинку, через неё на землю юсбшную и далее на мышь или просто перебивает сигнал мыши? не слишком много но достаточно чтобы чуть прибить разницу потенциалов. Тачпад вроде как не сидит на юсб канале. попробуйте чисто по приколу ещё чё нить повесить кроме рдуинки и мышки
Вот здесь есть описание на английском https://sun-store.ru/1702--modul-rele-srd-05vdc-sl-c
во всяком случае про все контакты расписано что и как.
Мышь USB? Если да, то может ли быт ьтакой вариант что что-то всё таки утекает на землю на ардуинку, через неё на землю юсбшную и далее на мышь или просто перебивает сигнал мыши? не слишком много но достаточно чтобы чуть прибить разницу потенциалов. Тачпад вроде как не сидит на юсб канале. попробуйте чисто по приколу ещё чё нить повесить кроме рдуинки и мышки
Мне уже что то страшноват стало за USB порты, вдруг и вправду утекает. Как таковой гальваничекой развязки у релле нет. Гдето оптроны валялись у меня. надо попробовать через них сигнальный вывод подцепить. и питание на модуль релле отдельное подать. А на будущее надо свой модуль релле состряпать с нормальной развязкой.
Еще идейка возникла. А из за релле сильной просадки напряжения не может возникнуть? что аж во всех усб сбой? хотя глупость помоему:)
Попробую флешку еще воткнуть, будет ли она вылетать, и другую мышку еще.
http://modernlife.ucoz.ru/_ph/1/248335164.jpg
Вот фотка всего добра.
у меня почему то на скетч ругается, не нравится вот эта строка
Установил либу DTMF -скомпилировалась,залилась в уно,но при подачесигнала что с телефона,что с компа-никакой реакции
а с компа как подаешь?
При наборе номера единичка на StD (15-я нога) появляется?
Мне приходилось на телефоне ставить максимальную громкость, без этого не срабатывало.
а с компа как подаешь?
При наборе номера единичка на StD (15-я нога) появляется?
Контролировал через терминал.В него ничего не приходило.Громкость что на телефоне,что на компе на максималку ставил.Может надо через операционник загонять ?
А схема правильная? Кондер и три резистора на входе. У меня работало, но потом я перешёл на mt8870
Я на прямую подавал.Идея насчет mt8870 хорошая.Вот только не нашел для ардуино декодер с mt8870
Подавать напрямую - да Вы эстет (шучу). Найдите схему, она прилагается к библиотеке DTMF, там несложно. Без этого двуполярный сигнал на ардуину подавать, хмм.. Если я правильно помню, там кондер для развязки, а за ним подтяжка на полпитания, лучше схему посмотрите. Иначе работать и не будет.
С mt8870 Ардуина не нужна ;) Плюс работать будет надежно. Схема в ДШ есть, я так и делал.
По мт8870 -я в курсе как работает,собирал на ней конструкцию,но минус в том ,что 4 команды,а можно ведь команду шифровать несколькими цифрами и еще есть # и *
Видел в инете конструкции на pic -МК как дешифратор команд стоит после мт8870.Вот и подумал почему бы декодер на ардуино не сделать
MT8870 стоит 50 р. и работает стабильнее (процент разпознавания почти 100%).
А обработкой команд (разбором последовательности нескольких цифр) можно и Arduino Mini или Attiny85 загрузить.
Ну я тоже думал про тини2313 или тини 13-единственное у 8 ногих маловато портов для подключение ключей с релюшками
По мт8870 -я в курсе как работает,собирал на ней конструкцию,но минус в том ,что 4 команды,а можно ведь команду шифровать несколькими цифрами и еще есть # и *
Видел в инете конструкции на pic -МК как дешифратор команд стоит после мт8870.Вот и подумал почему бы декодер на ардуино не сделать
Ну не 4 команды всё таки, а 4 выхода плюс строб. Поставить дешифратор и будет 16 команд.
По мт8870 -я в курсе как работает,собирал на ней конструкцию,но минус в том ,что 4 команды,а можно ведь команду шифровать несколькими цифрами и еще есть # и *
Видел в инете конструкции на pic -МК как дешифратор команд стоит после мт8870.Вот и подумал почему бы декодер на ардуино не сделать
Ну не 4 команды всё таки, а 4 выхода плюс строб. Поставить дешифратор и будет 16 команд.
Согласен тогда вообще без мк обойтись можно
Указанная выше библиотека DTMF, работает на NANO или на UNO только если плата запитана по юсб, если питать через VIN, не реагирует на дтмф сигналы, хотя остальной програмный код нормально отрабатывается.
С чем это может быть связано?
Спасибо!
В каком посте указана библиотека DTMF, работающая на Nano запитанной от USB? Заинтересовало, может поэкспериментирую.
В каком посте указана библиотека DTMF, работающая на Nano запитанной от USB? Заинтересовало, может поэкспериментирую.
http://arduino.ru/forum/proekty/dtmf-dekoder#comment-46600
простите, а включение прибора использовав радиостанции на 433мгц с dtmf клавиатурой прогнав сигнал через них прокатит сие добро?
все таки лучше ардуино? хочется использовать всю клавиатуру, есть функция гнать сразу код из 5 цифр
Через 8870 должно сработать.
Простите пож-ста, я не такой крутой программист, поэтому буду ждать готового решения)
массового готового решения не будет, ибо это слишком специфическая ниша.