Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Membangun DTMF Decoder Hanya Menggunakan Arduino – Tidak Perlu IC Tambahan

Komponen dan Perlengkapan

Aplikasi dan Layanan Online

Tentang Proyek Ini

Saat menyusun daftar proyek semester, saya menemukan mobil yang dikendalikan DTMF menggunakan IC CM 8870 sebagai decoder DTMF. Data biner yang dienkode kemudian dikirim ke Arduino untuk melakukan operasi kiri, kanan, maju, dan mundur. Fungsi decoder DTMF, yang merupakan bagian utama, menggunakan IC eksternal yang sulit diintegrasikan. Saya mencari kode atau pustaka yang bisa menggantikan IC dalam rangkaian dengan kode tambahan, tetapi tidak menemukan solusi yang memuaskan.

Akhirnya, saya menemukan satu pustaka yang didasarkan pada algoritma Goertzel (Goertzel.h). Pustaka ini dapat mengetahui apakah frekuensi tertentu ada dalam nada atau tidak, dengan menghitung jumlah puluh per satuan waktu dan kontribusi amplitudenya dalam sinyal nada yang diberikan.

Saya menggunakan kode contoh dasar sebagai dasar dan menulis kode yang dapat mendeteksi frekuensi DTMF dominan yang ada dalam nada, lalu mendekodekannya untuk memberikan angka yang ditekan di pihak lain selama panggilan telepon.

Kode

Kode Arduino DTMF Decoder

Kompilasi dan unggah kode di Arduino IDE, dan jangan lupa untuk menambahkan pustaka terlebih dahulu. Tautan untuk pustaka tersebut adalah: https://github.com/jacobrosenthal/Goertzel

/* Kode ini merupakan implementasi dasar dari decoder DTMF untuk mendeteksi kode karakter 16 DTMF dari pin analog A0 dan memberikan output yang didekode dengan memeriksa semua nada atas dan bawah dalam matriks DTMF, lalu memberikan angka yang sesuai dengan menyalakan bit digital yang sesuai untuk angka 0-9 dan dengan mencetak secara serial karakter lainnya. Karya ini sepenuhnya didasarkan pada kode Kevin Banks yang ditemukan di https://www.embedded.com/design/embedded/4024443/The-Goertzel-Algorithm, jadi kredit penuh kepadanya untuk implementasi generik dan pembahasannya. Algoritma Goertzel sudah lama dikenal, lihat https://en.wikipedia.org/wiki/Goertzel_algorithm untuk deskripsi lengkap. Algoritma ini sering digunakan dalam deteksi nada DTMF sebagai alternatif dari Fast Fourier Transform karena cepat dengan beban overhead rendah karena hanya mencari satu frekuensi daripada menunjukkan kemunculan semua frekuensi. * KODE INI Dibuat/dimodifikasi oleh "Mian Mohammad Shoaib" dan dirilis ke domain publik. * untuk pertanyaan terkait kode, silakan tanyakan di MMSHOAIB8452@GMAIL.COM */ #include <Goertzel.h> int sensorPin = A0; const int N = 100; //jumlah sampel yang akan diambil kode, Anda dapat mengubahnya untuk sensitivitas dan jika terlalu besar dapat memperlambat Arduino const float threshold = 2000; //amplitudo nada minimum untuk dipertimbangkan, kita dapat mengubahnya untuk lebih sensitif const float sampling_freq = 8900; //frekuensi maksimum yang dapat dideteksi adalah sampling rate/2 dan Arduino Uno dengan 16Mhz dapat mendukung sampling hingga 8900 Hz float x_frequencies[4]; // buat dua array untuk menampung frekuensi sumbu x dan y yang akan dideteksi float y_frequencies[4]; void setup(){ pinMode(13, OUTPUT); //inisialisasi LED berkedip untuk menunjukkan apakah ada nada yang terdeteksi pinMode(2, OUTPUT); //inisialisasi 10 pin sebagai output untuk menunjukkan output DTMF dari 2 hingga nomor 12, sisanya hanya akan dicetak secara serial ke monitor 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; //inisialisasi array dengan frekuensi nada sumbu x dan y beserta nomor baris dan kolomnya 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); //inisialisasi fungsi pustaka dengan sampling frequency yang diberikan, jumlah sampel, dan target freq goertzel.sample(sensorPin); //akan mengambil n sampel float magnitude = goertzel.detect(); //periksa untuk target_freq if(magnitude>threshold){ //jika Anda mendapatkan false hits atau tidak ada hits, sesuaikan threshold digitalWrite(13,HIGH); //nyalakan LED di 13 jika puluh terdeteksi delay(250); digitalWrite(13,LOW); Serial.print(freq); Serial.print("\n"); return true; } else return false; } void print_number(int row,int column){ int number=0; if(row==0){ //temukan angka yang sesuai dengan baris dan kolom yang ditemukan 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; break; } i++; if(i==4) i=0; } i=0; while(1){ if(detect_tone(y_frequencies[i]) == true){ row = i; break; } i++; if(i==4) i=0; } print_number(row,column); } 

Skema Rangkaian

Rangkaian menggunakan 10 LED yang terhubung dari pin digital 2 hingga 12 yang akan menyala saat nada untuk angka antara 0-9 ditekan masing-masing, dan LED deteksi puluh akan terhubung pada pin 13 yang akan memberikan berkedip singkat saat puluh atau sinyal terdeteksi. Angka yang lebih besar dari 9 (karakter khusus) akan ditampilkan melalui pencetakan serial di IDE.
Pin input dari jack audio atau kabel AUX akan terhubung ke pin analog A0 dengan kapasitor 1uF secara seri yang akan menyaring frekuensi rendah dan offset DC.
Membangun DTMF Decoder Hanya Menggunakan Arduino – Tidak Perlu IC Tambahan

Proses manufaktur

  1. Buat Sistem Ambilight Monitor Menakjubkan dengan Arduino
  2. Buat Alat Levitasi Ultrasonik dengan Arduino – Panduan Langkah demi Langkah
  3. SERENA: Sistem Alarm Kustom Arduino Mega 2560 dengan Layar Sentuh TFT LCD
  4. Buat Voltmeter Cerdas dengan Arduino & Smartphone – Proyek DIY Mudah
  5. Pemantau Detak Jantung IoT Real-Time dengan Arduino & MAX30100
  6. Komunikasi Kode Morse dengan Modul Laser – Proyek Arduino Dua Sisi
  7. Arduino Uno WiFi Web Server: Nyalakan/Matikan LED Melalui Browser
  8. Smart Parking Counter: Pelacakan Kendaraan Real-Time dengan Arduino, Processing, dan PHP
  9. Membuat Permainan Google Chrome Dino Otomatis dengan Arduino
  10. Python 3 ke Arduino UNO: Kontrol Perintah Mudah dan Demo LED