Hands Free, tetapi bukan ponsel. Rumah yang taat ketika tidak ada cukup tangan

Halo, Komunitas!

Saya memiliki keinginan untuk mengutak-atik mikrokontroler lagi dan melakukan sesuatu yang bermanfaat. Tujuannya terbentuk segera, ketika sesuatu mengganggu saya di apartemen.

Seperti yang Anda ketahui, meja komputer adalah meja makan untuk menonton Drobyshevsky atau membaca Giktayms / Green Cat / dll. bersamaan dengan makan malam. Tapi ada masalah - saya biasanya keluar dari dapur dengan kedua tangan yang sibuk, dan kembali juga , karena cangkir ditumpuk menjadi 3 bagian. Nyalakan dan matikan lampu di dapur (triple switch - dapur / kamar mandi / toilet) adalah bahu, hidung, kelingking. Artinya, tidak nyaman dengan cara apa pun, tetapi tidak mungkin mengaturnya kembali. Ada tugas untuk mengelola entah bagaimana dari jarak jauh.

Semua sensor kehadiran dan jalur segera diberhentikan - bukan akurasi itu, tidak ada kontrol atas kehendak pemilik. Solusinya ditemukan dalam kontrol suara, suara. Saya akan segera mengatakan bahwa saya tidak berencana untuk melakukan pengenalan suara, tidak diperlukan di sini. Lampu yang dinyalakan oleh pop dijelaskan di Radio 80-an, tetapi saya tidak ingin melakukan itu. Ternyata semacam handsfree ketika tangan sibuk. Detailnya aktif.

Bagian perangkat keras.


Ada papan dengan Atmega32 dengan kuarsa dan peripheral SEM0007M-32A dan hamburan elektronik.

gambar

Ada mikrofon dan penguat operasional. Untuk output, ada transistor dalam paket sot32 di papan, ada juga 7 amp relay. Semuanya dirangkai didorong ke dalam kotak untuk kartu nama, relay diparalelkan dengan sakelar, mikrofon disembunyikan di bawah outlet. Skema itu biasa, saya bahkan tidak menggambarnya. Hanya satu input analog dan satu output MK diskrit yang digunakan. SEM berlebihan, tetapi untuk sekarang biarkan saja.

gambar
Papan dan kabel yang belum dirakit. Lalu dia merapikannya dengan lebih akurat.

gambar
Saklar itu sendiri, mikrofon tidak terlihat di bawah outlet yang dibongkar.

Cari suatu algoritma.


Tujuan: sensor harus merespons kata, misalnya, " cahaya! Β»Dengan kode minimal.
Tugas: mengidentifikasi kata perintah dengan kemungkinan kebisingan, ketukan, klik dengan sakelar yang sama. Artinya, hanya analisis amplitudo tidak cocok, dan analisis spektral menunjukkan bahwa ada terlalu banyak harmonik dalam kata dan tentu saja mereka berubah. Oleh karena itu, perlu untuk mencari solusi sederhana, tetapi dengan kekebalan kebisingan yang dapat diterima. Anda dapat membuat beberapa filter frekuensi waktu dan perbandingan dengan sampel kata, tetapi Anda tidak perlu berurusan dengan pengakuan. Diputuskan untuk menganalisis keberadaan hanya suara vokal, misalnya, suara "E" atau "E".

gambar
Suara itu "E". Banyak harmonik terlihat, karena ini analisisnya sulit.

gambar
Suara itu adalah "A." Spektrum terlihat lebih bersih, ada frekuensi utama.

Bagian perangkat lunak


Untuk mengetahui komponen spektral sinyal, Anda dapat menggunakan filter digital. Ada program yang bagus di Internet untuk membangun filter FIR dan IIR digital dan menghitung koefisiennya - jelas di sana dan kode C dihasilkan secara otomatis.

Tapi saya menolak filter digital
Untuk penyaringan yang dapat diterima (4 pesanan atau lebih), banyak koefisien diperoleh, dan bahkan float. Seperti ini, ditambah semua perhitungan filter dalam float:

float ACoef[NCoef+1] = { 0.00000347268864059354, 0.00000000000000000000, -0.00001389075456237415, 0.00000000000000000000, 0.00002083613184356122, 0.00000000000000000000, -0.00001389075456237415, 0.00000000000000000000, 0.00000347268864059354 }; float BCoef[NCoef+1] = { 1.00000000000000000000, -7.09708794063733790000, 22.77454294680684300000, -43.03321836036351300000, 52.29813665034108500000, -41.84199842886619100000, 21.53121088556695300000, -6.52398963450972500000, 0.89383378261285684000 }; 

Mikrokontroler mungkin telah menanganinya, tetapi akan ada masalah dengan debugging - tidak mudah untuk mendorong batas filter - ini adalah koefisien baru untuk dihitung.

Setelah beberapa pencarian, saya menetap pada transformasi Fourier frekuensi tunggal online. Artinya, transformasi Fourier diskrit klasik, dilakukan pada kedatangan setiap sampel sinyal dengan frekuensi sampling (1600 Hz), tidak ada frekuensi yang melewati, hanya ada satu frekuensi, sehingga mudah untuk mengkonfigurasinya melalui RS-232 selama commissioning. Akibatnya, analisis dilakukan untuk frekuensi 128 Hz.

Karena sampel pendek (blok) dan jendela persegi panjang, resolusi frekuensi rendah, yang memberikan sensitivitas selektif dalam kisaran 114 ... 140 Hz, dan ini adalah P-filter yang ingin saya dapatkan.

Pertama, Anda perlu memahami di mana sinyal perintah suara mulai menjerit . Untuk melakukan ini, pertama, tingkat sinyal nol dihitung, melalui pemulusan eksponensial dengan konstanta pemulusan 1/64. Kode di bawah.

Bagian dari kode penghitung waktu untuk pemrosesan sinyal. Timer Frekuensi 1600 Hz
Sinyal menormalkan rata-rata. Untuk menentukan tingkat intensitas suara, nilai absolut dari sinyal juga dirata-ratakan dengan konstanta 1/16, untuk penyaringan high-pass dari setengah gelombang sinyal individual (ini adalah analog RMS, tetapi lebih mudah untuk dihitung). Melampaui level ini di atas ambang batas adalah awal dari perintah suara, dan analisis berurutan dari 5 blok dari 135 sampel (84,3 ms) dimulai.

 // Timer 0 output compare interrupt service routine interrupt [TIM0_COMP] void timer0_comp_isr(void) { a = adc_data[0] << 2 ; //       4   . a0 = (a0*63 + a+ 63) >> 6; // .   "0".   10%  150  ae = (int)(a - a0); // a = ae; //      . ae = abs(ae); if (ae < 32) { //      ae = 0; }; d = (int)((15 * (long int) d + ae + 15) >> 4); //  .  //   10%  35  if (d > 100) { //    if (snd == 0) { Yz=0; snd++; } //    PORTB.1 = 1; //      }; ..... 

Gambar di bawah ini menunjukkan sinyal, level sinyal, ambang batas dan 5 blok.

gambar

Perlindungan gangguan


Sinyal dibagi menjadi beberapa blok untuk melindungi dari impuls - bunyi klik atau ketukan. Denyut nadi, seperti yang Anda ketahui, memiliki respons frekuensi yang seragam, yaitu, dalam pita frekuensi apa pun akan ada hasil yang tidak nol dan mungkin di atas ambang batas. Tetapi rambut itu panjang, tetapi dorongan pikiran itu pendek. Artinya, tidak akan ada lagi pulsa di blok berikutnya, yang berarti bahwa level dalam pita frekuensi akan di bawah ambang batas. Bersamaan dengan keuntungan ini, blok pendek memberikan resolusi frekuensi rendah. Oleh karena itu, beberapa perbedaan frekuensi dalam sinyal masih masuk ke dalam jalur frekuensi yang dipilih.

Konversi frekuensi


Di setiap blok, transformasi Fourier frekuensi tunggal dilakukan untuk satu frekuensi f.

Secara tradisional, untuk mempercepat perhitungan, fungsi sin dan cos ditabulasi dan diskalakan ke -127 .. + 127.
Indeks ps dari array si(ps) dihitung dari argumen sin (2 * Ο€ * f * t / T), tentu saja dengan loopback di dalam periode yang sama. Indeks pc untuk cos (2 * Ο€ * f * t / T) cukup didorong 12 posisi ke depan dalam array si sama.

Hasil Y - tingkat garis spektral diperoleh sebagai jumlah dari nilai absolut dari bagian nyata dan imajiner selama satu blok.
Jadi
dengan cara yang benar, Anda perlu melakukan jumlah kuadrat, dan root, tapi ini mengerikan untuk MK 8-bit.

Dalam timer yang sama:
  a_si = (long int) (a * si[ps]) >> 4; // a*sin a_co = (long int) (a * si[pc]) >> 4; // a*cos Ysi = Ysi + a_si ; // Yco = Yco + a_co; Y = (labs(Ysi) + labs(Yco)) >> 7; //   128    int    rs-232. 

Pada akhir setiap blok, Y dibandingkan dengan ambang batas, jumlah blok dihitung yang melebihi ambang batas pemicu blok. Setelah percobaan, ternyata jumlah minimum blok yang dipicu adalah 3 dari 5.

gambar
Contoh intensitas spektral dalam blok dengan perintah suara. Tim telah lulus.

Tiga atau lebih blok yang dipicu ditafsirkan sebagai perintah yang diterima dengan benar. Sinyal pada keluaran diskrit dari MK terbalik, menyalakan atau mematikan lampu. Karena keseluruhan analisis terjadi di dalam blok, tidak ada penundaan dalam operasi setelah blok terakhir.

Waktu komputasi sekitar 1600 siklus, timer dipanggil setiap 9000 siklus, sehingga beban MK rendah - ada ruang untuk percobaan lebih lanjut dengan pengakuan. Atau Anda dapat membuat solusi lengkap untuk ukuran yang lebih kecil dan pada MK yang lemah.

Ketepatan algoritma dikendalikan melalui pertukaran variabel yang diperlukan (log) melalui RS-232 dengan program di VBasic. Frekuensi f dan ambang batas disimpan dalam eeprom.

Hasilnya: sensor ternyata sangat nyaman, ia merespons kata-kata dari " A ", misalnya, " Waaau ", " Taaam ", " Laite ", " Laaa ", " Miaaa ", " Yao-Yao " . Volume umum digunakan untuk percakapan manusia. Kata " Lit " dengan keras kepala menolak untuk mendengarkan. Klik, mengetuk pintu, langkah, menuangkan air mengabaikan. Sekarang Anda bisa berjalan dengan tangan penuh gelas dan piring)).

Source: https://habr.com/ru/post/id408745/


All Articles