DTMF декодер

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

хочу сделать на ардуине декодер тонального сигнала(который используется для набора телефонного номера), на сколько я знаю сегнал генерируется сложением двух синусоид, разных частот, например для цифры 1 - 697 Гц и 1209 Гц. Вопрос такой как с помощью дуины распознать 2е синусоиды? 

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

Всем заранее спасибо:)

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

По программной части: только самый ленивый не может набрать в гугле "DTMF Arduino" и не найти много ссылок, на готовые решения и библиотеки, которые декодируют DTMF. А если Вы уже нашли, то вопрос должен звучать по другому, "как использовать" такую то библиотеку и привести ссылку на нее. Ах да, Вы же новичок.. как же я забыл. Удачи

 

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

kisoft пишет:

По программной части: только самый ленивый не может набрать в гугле "DTMF Arduino" и не найти много ссылок, на готовые решения и библиотеки, которые декодируют DTMF. А если Вы уже нашли, то вопрос должен звучать по другому, "как использовать" такую то библиотеку и привести ссылку на нее. Ах да, Вы же новичок.. как же я забыл. Удачи

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

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

спасибо:) попробую разобраться.

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

Библиотека скачал. ссылка ниже:

http://members.shaw.ca/el.supremo/DTMF.zip

Загрузил скетч, вроди работает, только пока некоторые цыфры пропускает, но это возможно что монтаж на соплях был сделан, попробую все припаять и еще протестирую. А вообще в дальнейшем планирую курить MT8870 уже купил парочку, и объвязку к ним.

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

Сделал нормальный монтаж, поигрался с громкостью устройства с которого сигнл идет, и все очень хорошо распознает:)

Но возникла проблема все расшифрофаные цифры идут на комп через комп порт, а я хочу сделать чтоббы при вводе определенной комбинации например "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 с проверкой на то какое это число тоже не работает:(

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

Скорей всего сравнивать нужно с '1', а не с 1.

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

ок. попробую. я с двойными ковычками пробовал, а с одинарными нет.

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

kisoft,Спасибо

Попробовал if(thischar == '1'). действительно работает:) в порт отправляет только единицы.Думаю переделать чтобы срабатывали на определенные ноги ардуины не составит особого труда.

А что дают эти ковычки ' ' ? (просто еще понять охото:) )

Только как я понял из кода в порт по одному символу отсылается. и чтобы реальзовать срабатывание определнного кода (например *105#) нужно символы сначала в масив заносить? а вот как их заносить? создать массив из 5ти элементов? или массив не ограниченого размера и сделать проверки например символ *- означает начало кода а #-конец. И между ними любое количество символов (*105# или хоть *10765#). Для этого нужно использовать myPins массив???

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

Одиночные кавычки - это символ, двойные - строка. А это разные вещи.
Чтобы ловить последовательность есть разные варианты.
Один из них, ждать звездочку, потом записывать коды в массив до получения решетки, после чего
выполнять обработку полученных кодов. Только не забывайте, что длина массива ограничена и по ошибке
можно ввести много кодов, не нажимая решетку, что может привести к переполнению массива.

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

kisoft пишет:
Одиночные кавычки - это символ, двойные - строка. А это разные вещи. Чтобы ловить последовательность есть разные варианты. Один из них, ждать звездочку, потом записывать коды в массив до получения решетки, после чего выполнять обработку полученных кодов. Только не забывайте, что длина массива ограничена и по ошибке можно ввести много кодов, не нажимая решетку, что может привести к переполнению массива.

а нет такой возможности сделать динамический массив? который будет свой размерменять в зависимости от того сколько элементов в него запихали? или хотябы сделать массив для одного кода размером например 10 элементов? а код в него ввести из 5ти элементов? будет ли возможность корректно распознать такой код?

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

Можно использовать не массив, а переменную типа String, там длина ограничена размером памяти.
http://arduino.ru/Reference/StringObject

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

Попробую разобраться с типом String.

Но тут еще возникла странная проблемка. подключил релюшку к ардуине(12 нога) подал на нее 220 вольт включил нагрузку, и сделал включение на 5кнопку тонального набора а выключение на 9ую кнопку набора.Так вот звуки формировал на компе специальной программой, на этот же комп приходили сигналы с ардуино через ком порт(в ком монитор). Так вот проблемма собственно в том что при нажатии в на 5 или 9 время от времени мышка подвисала и отключалась и управление переходила на тачскри бука (буквально на секунду). при нажатии на другие клавиши (12346790) такого не наблюдалось. В связи с чем это может быть связвно? винда семерка.

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

Прежде чем продолжать, скажите, где Вы брали схему подключения (ссылку) и какое реле установлено (ссылку на ДШ)? Если не хотите сжечь дуину и комп сначала удостоверьтесь, что Вы правильно всё соединили и что реле подходит для подключения к Ардуино.

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

Поскольку я сам реле не подключал, надеюсь кто то подскажет более квалифицированно.

 

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

вот фото релюшки. модуль специально для дуины. Питание 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;
  }
}

 

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

Ну это чуть проще.

По поводу контактов. Я не знаю какой у Вас шилд, поскольку видел в инете разные. У реле бывает три выходных клеммы, одна условно - центральная (это общий контакт в реле), а две остальные - одна в покое замкнута на центральную, а другая - разомкнута с центральной. Потому можете проверить тестером, так это в Вашем шилде или нет и перекоммутировать выходные провода в соответствии с тем нужно Вам нормальнозамкнутые контакты или нормальноразомкнутые.

Скетч в порядке, во всяком случае должен работать, там накосячить вроде бы негде.

Если есть помехи, то можно для начала отключить нагрузку в 220В и проверить, есть сбои или нет при переключении. Если есть, то искать без 220В нагрузки. Если нет, тогда, скорее всего, наводки при переключении большой нагрузки. Во всяком случае теоретически - это так, а как на практике - не подскажу.

 

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

kisoft пишет:

Если есть помехи, то можно для начала отключить нагрузку в 220В и проверить, есть сбои или нет при переключении. Если есть, то искать без 220В нагрузки. Если нет, тогда, скорее всего, наводки при переключении большой нагрузки. Во всяком случае теоретически - это так, а как на практике - не подскажу.

так и сделаю:)

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

И особенно странно что лагает именно мышь. может на нее как раз наводки и идут( как раз косяк происходит именно в момент срабатывания релле). нужно еще будет попробовать рядом с компом погонять всю схему но не подрубая ее к компу.

Завтра все протестирую.и отпишусь. 

Zizilk
Offline
Зарегистрирован: 30.05.2013

Мышь USB? Если да, то может ли быт ьтакой вариант что что-то всё таки утекает на землю на ардуинку, через неё на землю юсбшную и далее на мышь или просто перебивает сигнал мыши? не слишком много но достаточно чтобы чуть прибить разницу потенциалов. Тачпад вроде как не сидит на юсб канале. попробуйте чисто по приколу ещё чё нить повесить кроме рдуинки и мышки

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

Вот здесь есть описание на английском https://sun-store.ru/1702--modul-rele-srd-05vdc-sl-c

во всяком случае про все контакты расписано что и как.

 

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

Zizilk пишет:

Мышь USB? Если да, то может ли быт ьтакой вариант что что-то всё таки утекает на землю на ардуинку, через неё на землю юсбшную и далее на мышь или просто перебивает сигнал мыши? не слишком много но достаточно чтобы чуть прибить разницу потенциалов. Тачпад вроде как не сидит на юсб канале. попробуйте чисто по приколу ещё чё нить повесить кроме рдуинки и мышки

Мне уже что то страшноват стало за USB порты, вдруг и вправду утекает. Как таковой гальваничекой развязки у релле нет. Гдето оптроны валялись у меня. надо попробовать через них сигнальный вывод подцепить. и питание на модуль релле отдельное подать. А на будущее надо свой модуль релле состряпать с нормальной развязкой.

Еще идейка возникла. А из за релле сильной просадки напряжения не может возникнуть? что аж во всех усб сбой? хотя глупость помоему:)

Попробую флешку еще воткнуть, будет ли она вылетать, и другую мышку еще.

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013
провел эксперимент:) как оказалось походу все дело в мышке самой. чем ближе мышь к реле в момент его срабатывания( а точнее отключения, в момент отключения подвисания чаще случались(походу дуга которая появляется в момент размыкания контактов помехи не плохие дает)) тем чаще подвисает(мышь Logitech м90), воткнул флешку и поставил на копирование стал щелкать мышь подвисала, а копирование не прервалось, еще цеплял другую мышь(X7), щелкал раз 20 не разу не висануло, причем реле рядом лежало в пару см. И еще мышь виснет только когда на реле есть нагрузка (аквариумный компрессор).
И еще странности происходят с монитором порта, после первых подвисаний порт перестает принимать данные, и помаргивает на дуине RX. Думаю помехи довольно сильные у релле раз уж мышь рубят то на ком порт навести помехи не составляет особого труда:)
Пока писал текст в голову еще одна затея пришла.Положил мышку рядом с розеткой и начал вилку тыкать туда сюда, тоже стала подвисать но не так часто:) вот походу и решена проблема, чего чего но такого я ни как не ожидал прям ЭМИ какойто:)
 
 
 
azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

http://modernlife.ucoz.ru/_ph/1/248335164.jpg

Вот фотка всего добра.

raptoridze
Offline
Зарегистрирован: 10.01.2014

у меня почему то на скетч ругается, не нравится вот эта строка

DTMF dtmf = DTMF(n,sampling_rate);
 
dtmf_test:32: error: 'DTMF' does not name a type
dtmf_test.ino: In function 'void loop()':
dtmf_test:49: error: 'dtmf' was not declared in this scope
 
upd
вроде компильнулось.... 
пс
кто-то знает распиновку сименса с55 в разьеме? чтото не получается подлкючить как гарнитуру (( 
fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Установил либу DTMF -скомпилировалась,залилась в уно,но при подачесигнала что с телефона,что с компа-никакой реакции

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а с компа как подаешь?

При наборе номера единичка на StD (15-я нога) появляется?

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

Мне приходилось на телефоне ставить максимальную громкость, без этого не срабатывало.

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Tomasina пишет:

а с компа как подаешь?

При наборе номера единичка на StD (15-я нога) появляется?

Контролировал через терминал.В него ничего не приходило.Громкость что на телефоне,что на компе на максималку ставил.Может надо через операционник загонять ?

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

А схема правильная? Кондер и три резистора на входе. У меня работало, но потом я перешёл на mt8870

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

kisoft пишет:
А схема правильная? Кондер и три резистора на входе. У меня работало, но потом я перешёл на mt8870

Я на прямую подавал.Идея насчет mt8870 хорошая.Вот только не нашел для ардуино декодер с mt8870

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

Подавать напрямую - да Вы эстет (шучу). Найдите схему, она прилагается к библиотеке DTMF, там несложно. Без этого двуполярный сигнал на ардуину подавать, хмм.. Если я правильно помню, там кондер для развязки, а за ним подтяжка на полпитания, лучше схему посмотрите. Иначе работать и не будет.

С mt8870 Ардуина не нужна ;) Плюс работать будет надежно. Схема в ДШ есть, я так и делал.

 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

По мт8870 -я в курсе как работает,собирал на ней конструкцию,но минус в том ,что 4 команды,а можно ведь команду шифровать несколькими цифрами и еще есть #  и *

Видел в инете конструкции на pic -МК  как дешифратор команд стоит после мт8870.Вот и подумал почему бы декодер на ардуино не сделать

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

MT8870 стоит 50 р. и работает стабильнее (процент разпознавания почти 100%).

А обработкой команд (разбором последовательности нескольких цифр) можно и Arduino Mini или Attiny85 загрузить.

 

 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Ну я тоже думал про тини2313 или тини 13-единственное у 8 ногих маловато портов для подключение ключей с релюшками

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

fly245 пишет:

По мт8870 -я в курсе как работает,собирал на ней конструкцию,но минус в том ,что 4 команды,а можно ведь команду шифровать несколькими цифрами и еще есть #  и *

Видел в инете конструкции на pic -МК  как дешифратор команд стоит после мт8870.Вот и подумал почему бы декодер на ардуино не сделать

Ну не 4 команды всё таки, а 4 выхода плюс строб. Поставить дешифратор и будет 16 команд.

 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

kisoft пишет:

fly245 пишет:

По мт8870 -я в курсе как работает,собирал на ней конструкцию,но минус в том ,что 4 команды,а можно ведь команду шифровать несколькими цифрами и еще есть #  и *

Видел в инете конструкции на pic -МК  как дешифратор команд стоит после мт8870.Вот и подумал почему бы декодер на ардуино не сделать

Ну не 4 команды всё таки, а 4 выхода плюс строб. Поставить дешифратор и будет 16 команд.

Согласен тогда вообще без мк обойтись можно

Renome
Offline
Зарегистрирован: 05.07.2015

Указанная выше библиотека DTMF, работает на NANO или на UNO только если плата запитана по юсб, если питать через VIN, не реагирует на дтмф сигналы, хотя остальной програмный код нормально отрабатывается.

С чем это может быть связано?

Спасибо!

gena
Offline
Зарегистрирован: 04.11.2012

  В каком посте указана библиотека DTMF, работающая на Nano запитанной от USB?  Заинтересовало, может поэкспериментирую.

Renome
Offline
Зарегистрирован: 05.07.2015

gena пишет:

  В каком посте указана библиотека DTMF, работающая на Nano запитанной от USB?  Заинтересовало, может поэкспериментирую.

 

http://arduino.ru/forum/proekty/dtmf-dekoder#comment-46600

mickel52
Offline
Зарегистрирован: 25.12.2015

простите, а включение прибора использовав радиостанции на 433мгц с dtmf клавиатурой прогнав сигнал через них прокатит сие добро?

все таки лучше ардуино? хочется использовать всю клавиатуру, есть функция гнать сразу код из 5 цифр

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Через 8870 должно сработать.

mickel52
Offline
Зарегистрирован: 25.12.2015

Простите пож-ста, я не такой крутой программист, поэтому буду ждать готового решения)

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

массового готового решения не будет, ибо это слишком специфическая ниша.