工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoのみを使用するDTMFデコーダー

コンポーネントと消耗品

>
Arduino UNO
× 1
LED(汎用)
× 10
ブレッドボード(汎用)
× 1
ジャンパー線(汎用)
× 20

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

選択した学期のプロジェクトリストを調べていると、CM 8870 ICをDTMFデコーダーとして使用するDTMF制御の車が表示され、エンコードされたバイナリデータがArduinoに渡されて左右および前後の操作が実行されました。主要部分であるDTMFデコーダー機能は、統合が難しいと感じた外部ICを使用し、回路内のICを追加のコードに置き換えることさえできるコードまたはライブラリを探していましたが、満足のいく解決策を見つけることができませんでした。しかし、Goertzelアルゴリズム(Goertzel.h)に基づく1つのライブラリは、単位時間あたりのパルス数と特定のトーン信号での振幅の寄与を計算することにより、トーンに特定の周波数が存在するかどうかを判断できます。

基本的なサンプルコードをベースとして使用し、トーン内の現在の主要なDTMF周波数を検出し、それをデコードして、通話中に反対側で押された番号を取得できるコードを作成しました。

コード

  • ArduinoコードDTMFデコーダー
ArduinoコードDTMFデコーダー Arduino
Arduino IDEでコードをコンパイルしてアップロードし、最初にライブラリを追加することを忘れないでください。
ライブラリへのリンクは次のとおりです。
https://github.com/jacobrosenthal/Goertzel
 / *このコードは、アナログピンA0から16文字のDTMFコードを検出するためのDTMFデコーダーの基本的な実装であり、すべてのアッパーとDTMFマトリックスのトーンを低くし、0〜9の数字に対応するデジタルビットをオンにし、残りの文字を連続して印刷することにより、対応する数字を提供します。この作業は、http://www.embedded.com/design/embedded/4024443/The-Goertzel-AlgorithmにあるKevin Banksのコードに完全に基づいているため、彼の一般的な実装と内訳は彼の功績です。 Goertzelアルゴリズムは長年にわたって使用されているため、詳細についてはhttp://en.wikipedia.org/wiki/Goertzel_algorithmを参照してください。高速フーリエ変換の代わりにDTMFトーン検出でよく使用されます。これは、すべての周波数の発生を表示するのではなく、単一の周波数のみを検索するため、耳に聞こえない高速であるためです。 *このコードは、「Mian Mohammad Shoaib」によって作成/変更され、パブリックドメインにリリースされています。 *コードに関連する質問については、MMSHOAIB8452 @ GMAIL.COMまでお気軽にお問い合わせください。* /#include  int SensorPin =A0; const int N =100; //これは、コードが取るサンプルの数です。y0uは感度のために変更でき、大きい場合はarduinoconst float threshold =2000を遅くする可能性があります。 //考慮すべき最小トーン振幅感度を上げるために変更できますconstfloat sample_freq =8900; //最大検出可能周波数はサンプリングレート/ 2であり、16Mhzのarduinounoは最大8900Hzのサンプリングをサポートできますfloatx_frequencies [4]; //検出されるx軸とy軸の周波数を保持するための2つの配列を作成しますfloaty_frequencies [4]; void setup(){pinMode(13、OUTPUT); //まばたきを初期化して、トーンが検出されたかどうかを表示しますpinMode(2、OUTPUT); // 10ピンを出力として初期化して、2から12までのdtmf出力を表示します。残りはモニターに出力されますpinMode(3、OUTPUT); pinMode(4、OUTPUT); pinMode(5、OUTPUT); pinMode(6、OUTPUT); pinMode(7、OUTPUT); pinMode(8、OUTPUT); pinMode(9、OUTPUT); pinMode(10、OUTPUT); pinMode(11、OUTPUT); pinMode(12、OUTPUT); Serial.begin(9600); x_frequencies [0] =1209; //行とコロンの番号とともにx軸とy軸のトーン周波数でアレイを初期化するx_frequencies [1] =1336; x_frequencies [2] =1477; x_frequencies [3] =1633; y_frequencies [0] =697; y_frequencies [ 1] =770; y_frequencies [2] =852; y_frequencies [3] =941;} bool detect_tone(float freq){Goertzel goertzel =Goertzel(freq、N、sampling_freq); //指定されたサンプリング頻度でライブラリ関数を初期化します。サンプル数とターゲット頻度goertzel.sample(sensorPin); // n個のサンプルを取得しますfloatmagnitude =goertzel.detect(); // target_freqを確認しますif(magnitude> threshold){//誤ったヒットが発生した場合、またはヒットが発生しなかった場合は、しきい値を調整しますdigitalWrite(13、HIGH); //パルスが検出された場合は13で点滅しますdelay(250); digitalWrite(13、LOW); Serial.print(freq); Serial.print( "\ n"); trueを返します。 } else return false;} void print_number(int row、int column){int number =0; if(row ==0){//見つかった行と列に対応する番号を見つけるif(column ==0)number =1; else if(column ==1)number =2; else if(column ==2)number =3; else if(column ==3)number =10; } else if(row ==1){if(column ==0)number =4; else if(column ==1)number =5; else if(column ==2)number =6; else if(column ==3)number =11; } else if(row ==2){if(column ==0)number =7; else if(column ==1)number =8; else if(column ==2)number =9; else if(column ==3)number =12; } else if(row ==3){if(column ==0)number =14; else if(column ==1)number =0; else if(column ==2)number =15; else if(column ==3)number =13; } if(number <10){digitalWrite((number + 2)、HIGH); Serial.print(number);} else if(number ==10)Serial.print( 'A'); else if(number ==11)Serial.print( 'B'); else if(number ==12)Serial.print( 'C'); else if(number ==13)Serial.print( 'D'); else if(number ==14)Serial.print( '*'); else if(number ==15)Serial.print( '#'); Serial.print( "\ n"); delay(800); for(int i =2; i <=12; i ++){digitalWrite(i、LOW);}} void loop(){int column =0、row =0; int i =0; while(1){if(detect_tone(x_frequencies [i] )==true){column =i;壊す; } i ++; if(i ==4)i =0;} i =0; while(1){if(detect_tone(y_frequencies [i])==true){row =i;壊す; } i ++; if(i ==4)i =0;} print_number(row、column);} 

回路図

この回路は、デジタルピン2から12に接続された10個のLEDを使用し、0〜9の数字のいずれかのトーンが押されるとオンになり、パルス検出LEDがピン13に接続され、パルスが短く点滅します。または、信号が検出されると、IDEのシリアル印刷で9(特殊文字)より大きい数字が表示されます。
オーディオジャックまたはAUXケーブルからの入力ピンは、低周波数とDCオフセットをフィルターで除去する1uFコンデンサーを直列に接続してアナログピンA0に接続されます。

製造プロセス

  1. Arduinoを使用してモニターをAmbilightにする
  2. ARDUINOを使用した超音波浮揚機
  3. Arduino警報システム:SERENA
  4. Arduinoとスマートフォンを使用したDIY電圧計
  5. IoTを使用した心拍数モニター
  6. レーザーモジュールを使用したモールス信号通信(両方)
  7. Arduino UnoWiFiを使用したWebServerBlink
  8. Arduino +処理+ PHPを使用したカーカウンター
  9. arduinoを使用した自動恐竜ゲーム
  10. Python3とArduinoコミュニケーション
  11. ArduinoとRDA8057Mを使用したFMラジオ