Pengecaman arahan suara pada mikropengawal. Membuat kawalan suara LED menggunakan Arduino

Adakah anda masih ingat bagaimana beberapa tahun yang lalu (dan mungkin juga sekarang) idea untuk mengawal cahaya di dalam bilik dengan bertepuk tangan adalah popular? Tetapi, ia sangat mudah, anda sedang berbaring di atas katil, terlalu malas untuk bangun dan menutup lampu dengan tepukan tangan anda, atau kita pulang ke rumah, gelap, mengambil masa yang lama untuk mencari suis, dan kemudian. dari ambang paling ada satu atau dua tepukan dan lampu sudah menyala. Nampaknya konsep ini masih relevan, tetapi ia boleh digunakan untuk lebih banyak lagi Teknologi tinggi berbanding 5 tahun, 10 tahun lalu. Sekarang untuk jumlah yang agak kecil anda boleh membeli beberapa bahagian dan memprogramkan reka bentuk fungsi yang serupa, yang akan dibincangkan di bawah.

Hari ini kita akan melihat modul yang direka untuk mengenali arahan suara(termasuk hanya suara dalam arahan suara yang dirakam) - Modul pengecaman suara V3.1 (V3) atau nama pengekodan yang sering ditemui FZ0475.

Pakej penghantaran termasuk modul itu sendiri ( papan litar bercetak sangat kualiti yang baik), mikrofon pada kaki fleksibel dengan penyambung bicu 3.5 mm dan sesentuh PLS sudut dengan pic 2.56 mm untuk papan modul (ia tidak boleh digunakan jika disambungkan ke sesentuh modul dengan cara yang berbeza).

Hari ini terdapat beberapa jenis modul dengan fungsi yang serupa. pengeluar yang berbeza dan pemaju atau pelaksanaan. Modul pengecaman suara ini, pada pendapat saya, mempunyai keseimbangan tertentu antara kos, kefungsian dan kemudahan. Modul EasyVR akan menjadi lebih berkuasa dan jauh lebih mahal. Modul berdasarkan LD3320 akan menjadi lebih murah dan lebih menyusahkan (sekurang-kurangnya menyusahkan kerana tidak mudah untuk mencari penerangan biasa untuk mereka, tetapi selebihnya adalah subjektif).

Ciri-ciri modul pengecaman Suara V3.1 (V3):

  • Voltan bekalan - 5 volt
  • Penggunaan semasa - sehingga 40 mA
  • Antara muka – UART, GPIO
  • Ketepatan pengecaman – 99% (dalam keadaan ideal)
  • Julat - bergantung pada mikrofon yang digunakan, untuk mikrofon standard yang disertakan dalam kit julat adalah jarak maksimum 0.5 - 1 meter dengan suara yang cukup kuat, tetapi jika suara itu senyap, anda perlu mendekatkan mikrofon ke mulut anda

Modul ini adalah papan kecil yang kemas di mana mikropengawal utama (bintik hitam), penyambung bicu 3.5 mm untuk menyambungkan mikrofon, dan litar mikro terletak. ingatan kilat, GPIO, UART dan sesentuh kuasa, sepasang LED dan selebihnya peralatan yang diperlukan untuk operasi litar - perintang, kapasitor, kuarza. Saiz padat papan akan membolehkan anda dengan mudah menyepadukan modul ke dalam perkembangan sendiri. Untuk meningkatkan julat arahan suara, mungkin perlu menggunakan mikrofon yang diperkuatkan. Setelah julat yang boleh diterima dicapai, modul ini sesuai untuk digunakan dalam sistem rumah pintar. Tanpa pengubahsuaian untuk meningkatkan julat operasi, modul boleh digunakan dalam sistem desktop pengurusan, serta dalam sistem keselamatan (kawalan akses dan sekatan). Dengan mikrofon standard, kerana jarak yang singkat, adalah paling boleh dipercayai untuk menggunakan modul pengecaman suara sebagai set kepala dan secara wayarles menghantar arahan kepada pengawal yang mengawal sesuatu menggunakan bateri dan modul wayarles (contohnya, HC-05 atau HC-12 atau mana-mana yang sesuai). Modul ini mampu beroperasi tanpa mikropengawal luaran, kerana pengeluar menyediakan kebebasan berfungsi anda hanya perlu merakam arahan suara sekali dan menetapkan tetapan untuknya; kerja bebas dengan bantuan peranti luaran(PC atau MK).

Jadi, untuk mula bekerja dengan modul pengecaman suara, kami perlu menyambungkannya sama ada ke komputer (anda memerlukan penyesuai USB-UART) atau ke mikropengawal (anda perlu membangunkan kod program untuk mengawal modul).

Tiada perbezaan asas dalam mengurus dan mengkonfigurasi modul antara menyambung ke komputer atau mikropengawal, jadi untuk kejelasan, kami akan menggunakan PC untuk konfigurasi. Arahan menerangkan arahan untuk modul dalam bentuk perenambelasan, jadi untuk kemudahan anda juga memerlukan terminal yang menghantar bait dalam bentuk perenambelasan, contohnya, AccessPort (boleh dimuat turun di penghujung artikel). Di samping itu, pengilang memberi tumpuan kepada pengguna platform Arduino dan menyediakan perpustakaan untuk menggunakan modul ini dan arahan untuk menggunakan perpustakaan ini. Walau bagaimanapun, ramai di antara kita lebih berminat untuk bekerja dengan modul itu sendiri secara langsung daripada melalui pembungkus Arduino.

Sebelum memulakan kerja, mari lihat papan. Di hujung papan di sebelah kanan terdapat soket untuk menyambungkan mikrofon, di sisi lain terdapat empat kenalan antara muka UART. Di bahagian bawah terdapat lapan kenalan yang digunakan untuk mengeluarkan isyarat yang disebabkan oleh pengecaman arahan suara. Di bahagian atas, empat pin yang dikonfigurasikan sebagai input isyarat digunakan untuk bertukar antara kumpulan (dari tujuh arahan suara setiap satu) arahan, jika ciri sedemikian digunakan. Dan baki enam pin di bahagian atas mungkin digunakan untuk menyambung ke memori modul.

Sistem arahan digunakan untuk mengendalikan dan mengkonfigurasi modul. Borang am bingkai kelihatan seperti ini:

Empat arahan pertama 00, 01, 02, 03 digunakan untuk menyemak status modul dan tetapannya. Enam arahan seterusnya 10, 11, 12, 13, 14, 15 digunakan untuk menukar tetapan modul, termasuk kawalan port output dan tetapan beban auto. Seterusnya, tiga arahan 20,21, 22 digunakan untuk merakam arahan suara. Tiga arahan seterusnya 30,31,32 digunakan untuk mengawal pengecaman arahan suara. Perintah 0A, 0D, FF digunakan hanya apabila data dikembalikan oleh modul itu sendiri. Sebenarnya tidak ada banyak arahan dan semua ini tidaklah semenakutkan seperti yang kelihatan pada pandangan pertama dalam dokumentasi untuk modul. Mari lihat arahan yang diperlukan untuk berfungsi dengan modul pengecaman suara. Tidak semua pasukan sedia ada adalah bersifat praktikal.

Perlu diperhatikan bahawa modul boleh beroperasi tanpa mikropengawal kawalan luaran, dan juga boleh mengawal sesuatu secara bebas dengan port keluarannya. Untuk melakukan ini, anda perlu mengkonfigurasinya (perintah 12, 13, 14).

Pasukan 12 – konfigurasikan port output. Perintah ini mengkonfigurasi mod pengendalian port output modul pengecaman suara.

Format: | AA | 03 | 12 | MOD | 0A |

Di mana MODE boleh mengambil empat nilai: 0 – mod nadi (apabila arahan suara dicetuskan, output yang sepadan dengan arahan akan menukar keadaannya untuk masa yang ditetapkan oleh arahan 13), 1 – mod suis (togol atau flip) (setiap kali arahan suara dicetuskan, output yang sepadan dengan arahan suara terbalik), 2 – mod hidup (apabila arahan suara dicetuskan, output akan masuk ke keadaan logik satu dan tidak lagi akan masuk ke keadaan sifar logik, set semula adalah dijalankan dengan arahan 14), 3 – mod mati (sama dengan mod hidup, hanya sebaliknya, apabila arahan suara dicetuskan, output pergi ke keadaan sifar logik).

Yang paling praktikal ialah mod suis, yang tidak memerlukan arahan yang tidak perlu. Mod nadi adalah baik, tetapi logik mod ini adalah sedemikian rupa sehingga apabila arahan suara dicetuskan, ia mengeluarkan perintah logik sekali, untuk satu masa dari 10 ms hingga 1 s. Ianya tidak mencukupi. Walaupun, bergantung pada keperluan untuk mod ini, ia mungkin berguna. Mod hidup dan mati dilaksanakan dengan menyusahkan, kerana ia memerlukan pelaksanaan arahan tambahan.

Pasukan 13 – menetapkan tempoh nadi mod yang sepadan.

Format: | AA | 03 | 13 | TINGKAT | 0A |

Di mana LEVEL mengambil nilai dari 00 hingga 0F (bersamaan dengan tempoh dari 10 ms hingga 1 s).

TINGKAT tempoh masa
0x00 10 ms
0x01 15 ms
0x02 20 ms
0x03 25 ms
0x04 30 ms
0x05 35 ms
0x06 40 ms
0x07 45 ms
0x08 50 ms
0x09 75 ms
0x0A 100 ms
0x0B 200 ms
0x0C 300 ms
0x0D 400 ms
0x0E 500 ms
0x0F 1 s

Pasukan 14 – tetapkan semula port output kepada keadaan yang ditentukan oleh mod hidup atau mati.

Format: | AA| 03 | 14 | FF | 0A | - set semula semua port output

| AA| 03+n | 14 | IO0 | ... | Ion | 0A | - set semula port output yang dipilih

Di mana n ialah bilangan pin yang ditetapkan semula secara selektif, IO0...IOn ialah penyenaraian pin ini dalam bingkai penghantaran data.

Seterusnya, untuk arahan suara dilaksanakan, ia mesti direkodkan dalam modul (latih modul). Terdapat had di sini. Hanya tujuh arahan boleh dikenali pada satu masa, walaupun banyak lagi boleh direkodkan. Untuk mengembangkan julat arahan suara yang akan dikenali, sistem pengelompokan (arahan 32) digunakan, yang dikawal oleh port input modul. Dengan menetapkan konfigurasi isyarat pada pin ini, anda memilih kumpulan arahan yang akan dikenali. Ini disebabkan oleh prestasi terhad pengawal suara modul.

Pasukan 20 - merakam satu atau lebih arahan suara.

Format: | AA| 03+n | 20 | R0 | ... | Rn | 0A |

Di mana n ialah bilangan arahan suara yang dirakam (jika satu arahan n=0 direkodkan, dua arahan n=1 dan seterusnya mengikut format umum untuk menghantar arahan Panjang - panjang), R0...Rn nombor arahan suara (AA 03 20 03 0A - arahan untuk merakam arahan suara ketiga).

Pasukan 21 - rakam satu arahan suara dan tetapkan tandatangan untuknya.

Format: | AA| 03+SIGLEN | 21 | REKOD | SIG | 0A |

Di mana RECORD ialah nombor arahan suara, SIG ialah tandatangan (boleh terdiri daripada beberapa bait, supaya setiap bait boleh sepadan dengan pengekodan aksara abjad jika perlu), SIGLEN ialah bilangan bait yang membentuk tandatangan.

Pasukan 22 - tambah atau padam tandatangan untuk arahan suara yang dipilih.

Format: | AA | 03+SIGLEN | 22 | REKOD | SIG | 0A | - menambah tandatangan

| AA | 03 | 22 | REKOD | 0A | - penyingkiran tandatangan

Apabila merakam arahan suara, anda mesti dipandu oleh isyarat LED. Selepas memasukkan arahan yang memulakan proses rakaman, LED kuning (oren) mula berkelip dengan cepat. Sebaik sahaja LED merah menyala, anda mesti menyebut arahan suara ke dalam mikrofon. Jika berjaya, LED kuning (oren) akan menyala dan kemudian merah semula - anda perlu mengesahkan arahan suara dan menyebutnya sekali lagi. Jika berjaya, kedua-dua LED akan menyala - arahan suara telah disimpan.

Setelah arahan suara direkodkan dalam modul, tiada apa yang akan berlaku sehingga arahan ini diletakkan dalam "Pengecam" modul. Untuk melakukan ini, anda perlu menggunakan arahan 30. Selepas melaksanakan arahan ini, modul akan mula menunggu arahan suara sepadan dengan sampel yang disimpan. Hanya tujuh arahan boleh dikenali pada satu masa. Dalam kes ini, LED kuning (oren) pada papan modul akan berkelip perlahan.

Pasukan 30 - memuatkan rekod ke dalam Pengecam modul.

Format: | AA| 2+n | 30 | R0 | ... | Rn | 0A |

Format jawapan adalah seperti berikut: | AA | 07 | 0D | 00 | GRPM | R | RI | SIGLEN | SIG | 0A |

Di mana GRPM ialah maklumat tentang kumpulan yang menjadi milik perintah (jika digunakan), R ialah arahan suara yang diiktiraf (menggunakan data ini anda boleh membezakan arahan antara satu sama lain jika tandatangan tidak digunakan), RI ialah indeks arahan dalam pengecam, SIGLEN ialah panjang tandatangan dalam bait, SIG - tandatangan (jika digunakan).

Dan akhirnya, jika modul mesti berfungsi secara bebas, maka anda perlu menggunakan arahan 15 untuk permulaan automatik mengikut pratetap pengecam. Dalam kes ini, modul pengecaman suara akan berfungsi secara bebas tanpa memerlukan pemulaan selepas dihidupkan.

Pasukan 15 - menetapkan pengecam untuk autostart apabila dihidupkan.

Format: | AA| 03 | 15 | 00 | 0A | - lumpuhkan fungsi autorun

| AA| 03+n | 15 | BITMAP | R0 | ... | Rn | 0A | - menetapkan fungsi autorun

Untuk mengawal pelaksanaan arahan yang betul, setiap daripada mereka mempunyai tindak balasnya sendiri. Jika perlu, semua data boleh didapati dalam dokumentasi untuk modul pengecaman suara yang dilampirkan pada akhir artikel. Jangan lupa bahawa segala-galanya nilai angka dibentangkan dalam perenambelasan bentuk.

Oleh itu, menggunakan sistem arahan, anda boleh mengkonfigurasi modul pengecaman suara secara fleksibel untuk digunakan untuk pelbagai tujuan. Jika kawalan mudah Memandangkan port output modul tidak mencukupi, modul pengecaman suara boleh disambungkan ke peranti lain melalui UART atau GPIO. Untuk hubungan tanpa wayar Anda boleh menggunakan modul yang dibincangkan sebelum ini.

Menggunakan modul wayarles, anda boleh menyambungkan modul pengecaman suara ke mana-mana peranti jika perlu. Sebagai contoh, mari kita sambungkannya ke mikropengawal, yang akan mengawal LED berdasarkan data yang diterima tentang pengecaman arahan suara. Modul tanpa wayar benarkan data dipindahkan dalam dua arah, jadi jika perlu, anda boleh menulis kod untuk mikropengawal untuk memulakan modul suara dan merakam arahan suara. Dalam kes kami, di bawah kawalan PC, beberapa arahan suara telah direkodkan dalam modul dan pengecaman dikonfigurasikan untuk autostart apabila kuasa dihidupkan, jadi untuk mikropengawal kami hanya akan mendaftar penerimaan data dan kawalan LED berkenaan dengan data ini. Pengawal mikro STM32F103C8T6 menggunakan USART1 untuk menerima data dan pin PB10...PB15 dikonfigurasikan sebagai output, yang mengawal LED. Kod sumber terletak di lampiran pada akhir artikel.

Sedikit tentang hasilnya

Pengecaman suara tidak sepenuhnya tepat. Ia bergantung pada arahan yang dipilih dan suara pengguna. Semasa ujian saya dapati beberapa titik negatif. Semasa mengajar arahan modul, arahan suara "satu" dan "dua" telah dipilih. Perintah "dua" sentiasa lulus dengan jelas, tetapi arahan "satu" sering dikenal pasti sebagai arahan "dua" dan kod arahan kedua telah dilaksanakan dengan sewajarnya. Selanjutnya, apabila cuba memberikan arahan suara dalam bahasa Inggeris (dan ia tidak dirakam dalam modul suara), perintah "satu" hampir selalu ditakrifkan sebagai "dua". Mungkin ini semua tentang sebutan, intonasi dan aspek lain suara manusia yang tertanam dalam algoritma untuk pengekodan modul suara bagi arahan yang dituturkan. Walau bagaimanapun, pengeluar rahsia ini akses terbuka jangan beri. Di samping itu, kualiti pengecaman dipengaruhi oleh keadaan bunyi luaran - bunyi dari jalan, bunyi kipas, bunyi rawak, dsb. Pengilang menarik perhatian kepada fakta bahawa tahap tinggi ketepatan pengecaman berlaku dalam keadaan yang ideal. Idea menggunakan mikrofon dengan penguat, sudah tentu, akan meningkatkan julat pengendalian peranti, tetapi ia juga akan meningkatkan kemungkinan ralat, kerana penguatan suara juga akan meningkatkan bunyi.

Akhirnya, jika anda mempunyai keperluan yang rendah untuk pengecaman suara dan pelaksanaan arahan suara, maka modul ini secara jujur ​​akan menyelesaikan wang yang dibelanjakan untuknya.

Senarai unsur radio

Jawatan taip Denominasi Kuantiti CatatanKedaipad nota saya
IC1 MK STM32

STM32F103C8

1 Ke pad nota
VR1 Pengatur linear

AMS1117-3.3

1 Ke pad nota
MOD1, MOD3 Modul wayarlesHC-122 Ke pad nota
MOD2 Modul pengecaman suaraVR3.11 Ke pad nota
Z1 Kuarza8 MHz1

Dalam projek ini, saya menggabungkan pengesan pengesanan muka dan sistem pengesanan.

Secara ringkas intipati projek: kamera web yang dipasang pada mekanisme berputar disambungkan ke komputer yang dikawal oleh bilik operasi sistem Windows dan dengan dipasang perisian OpenCV. Jika program mengesan wajah dalam medan pandangan kamera web, bahagian tengah muka dikira. Koordinat X dan Y dihantar ke pengawal Arduino, yang disambungkan ke komputer melalui USB. Sebaliknya, pengawal Arduino, berdasarkan arahan yang diterima, mengawal dua motor servo: sepanjang koordinat X dan sepanjang koordinat Y, i.e. sistem pengesanan disediakan.

Pustaka OpenCV ( Sumber terbuka Computer Vision Library) boleh dimuat turun. Pustaka ini berbilang platform dan kini wujud untuk sistem pengendalian berikut: Windows, Linux, Android, Mac OS dan juga iOS. Perpustakaan menyediakan pemprosesan imej masa nyata. Ditulis dalam C/C++.

Itu. projek ini ialah campuran larutan lembut dan keras. Pemprosesan imej dijalankan pada komputer, dan kawalan servo dijalankan menggunakan pengawal.

Jadi apa yang saya gunakan untuk projek itu:

Perisian:

besi:

komputer dengan Windows 7 SP1

Arduino Uno atau serasi + PSU

2 servos

Webcam USB

Jadi, mari kita pergi.

Langkah 1: Pasang perisian

1) Jika anda mempunyai OS Windows, kemudian muat turun fail OpenCV-2.3.1-win-superpack.exe (atau lebih versi kemudian) dan pasang perpustakaan.

2) Muat turun dan pasang Microsoft Visual C++ 2010 Express. Jika anda mempunyai 64-bit versi Windows, maka anda juga perlu memuat turun Windows SDK (tetapi mungkin terdapat masalah untuk versi 64; saya tidak boleh mendapatkan OpenCV untuk berfungsi di bawah Windows 7 x64).

Baca proses menyediakan OpenCV untuk Visual C++ di tapak web rasmi.

Langkah 2. Memasang kamera dan servos

Saya tidak membuat reka bentuk "tahan lama", kerana selepas mencapai matlamat akhir, saya membongkar segala-galanya untuk projek seterusnya.

Saya melampirkan webcam pada servomotor paksi-X, dan ia, seterusnya, melampirkannya pada servomotor paksi-Y Dan saya mengamankan keseluruhan struktur ini dalam pengapit "tangan ketiga".

Langkah 3: Sambungan

Menyambung servomotors:

Pin kuning dari servo paksi X disambungkan ke pin 9 Pengawal Arduino

Pin kuning dari servo paksi Y disambungkan ke pin 10 pengawal Arduino

Pin Vcc merah dari servo bersambung ke pin 5V

Pin GND hitam dari servo disambungkan ke pin GND pengawal Arduino

Sambungan kamera web:

Webcam bersambung ke komputer melalui antara muka USB. Program C++ mengenal pasti kamera web dengan nombor port USBnya. Anda mungkin perlu menentukan port dalam program.

Menyambungkan pengawal Arduino UNO:

Pengawal juga bersambung ke komputer melalui antara muka USB. Port COM maya muncul dalam sistem, yang mesti ditambahkan pada kod program dalam C++.

Muat turun fail projek

Artikel asal pada Bahasa Inggeris(terjemahan oleh A.V. Koltykov untuk tapak web cxem.net)

  • DIY atau Buat Sendiri
  • Hello Giktimes!

    Seperti yang dicadangkan oleh tajuk, artikel ini akan memberi tumpuan kepada mengenal pasti nombor pada mikropengawal. Saya ingin membuat tempahan segera yang artikel ini tidak akan diberikan sumber, teknologi atau algoritma pengiktirafan dipertimbangkan, saya hanya akan mengatakan bahawa idea digunakan pendekatan yang sistematik. Sebahagian daripadanya digariskan dalam artikel kami (dan di sini). Ini disebabkan oleh hakikat bahawa pendekatan kami berusaha untuk keaslian, tetapi memerlukan penjelasan beberapa isu. Seseorang mungkin berkata: "artikel lain tentang pengaturcaraan mikropengawal." Tidak sama sekali, pencarian untuk projek serupa tidak memberikan hasil yang jelas, kecuali untuk ini video. Daripada perbincangan di forum, satu perkara yang jelas: idea untuk mendapatkan peranti serupa(kamera + mikropengawal = hasil pengecaman output, bukan hanya gambar yang ditangkap) datang kepada ramai orang, tetapi kekal tanpa pelaksanaan. Ya, dan pengiktirafan, oleh pendapat umum, memerlukan banyak sumber pengkomputeran dan mikropengawal tidak sesuai untuk ini, khususnya mengenai Arduino terdapat kenyataan bahawa ini secara amnya mustahil. Jika anda berminat, sila lihat kucing.

    Untuk mengelakkan sebarang soalan yang jelas, mari kita jawabnya:

    • Tidak, ini bukan perkhidmatan pengecaman imej.
    • Tidak, ini bukan OpenCV
    • Tidak, ini bukan rangkaian saraf
    • Analisis morfologi objek yang membentuk nombor digunakan
    • Ya, pengecaman dilakukan oleh mikropengawal!

    Idea

    Pendek kata, semuanya bermula dengan keinginan untuk mencuba tangan saya dan menguji idea saya dalam pengecaman imej. Semasa perbincangan kami membuat kesimpulan bahawa kami boleh bertahan dengan yang kecil kuasa pengkomputeran untuk menyelesaikan masalah ini. Atas sebab yang jelas, kami tidak akan menerangkan butiran perbincangan ini.

    Pemasangan

    Jadi, tugas telah ditetapkan, pelaksanaan diperlukan. Tanpa bertolak dari yang telah ditetapkan
    kita ambil apa yang kita ada. Dan saya mempunyai beberapa Arduino Unos, tetikus optik lama dan pemacu CD di tangan. By the way, untuk apa anda menggunakan sensor itu? tetikus optik Sebagai kamera untuk mendapatkan imej, kami telah digesa oleh sesuatu yang kami baca lama dahulu, dan, sebenarnya, semua bahan "tikus" yang lain. Satu-satunya perkara yang perlu kami lakukan ialah menyahsolder sensor dan keseluruhan abah-abahnya untuk kemudahan penggunaan, dan juga gamkan kanta padanya, yang kami "koyakkan" dengan berhati-hati dari pemacu CD. Ini adalah perlu untuk meningkatkan jarak dari subjek ke kamera, jika tidak, bilangan saiz kami tidak akan muat dan hanya bahagian kecil. Ngomong-ngomong, kami cuba melampirkan optik dari kamera web di hadapan lensa dari pemacu CD, tetapi entah bagaimana ia tidak berjaya.

    Lagi


    Kemudian timbul persoalan bagaimana meletakkan kamera ini di atas subjek. Di sini kami banyak dibantu oleh mikroskop lama yang rosak yang terbiar. Kami dengan hormat mengalih keluar mekanisme kawalan pentas daripadanya. Mekanisme ini membolehkan kami menggerakkan kamera hanya dalam dua paksi; idea segera datang untuk menggunakan panduan kepala laser dari pemacu CD. Semua ini telah dijamin kepada kes pemacu CD yang telah lama menderita. Hasilnya, kami mendapat mekanisme kedudukan kamera yang hebat.

    Lagi


    Jumlah: kami mempunyai kamera yang dipanggil, terdapat mekanisme kedudukan, yang tinggal hanyalah meletakkan sekeping kertas dengan nombor dan mendapatkan imej dari kamera. Di sinilah "masalah" bermula. Oleh kerana ciri-ciri sensor optik "tikus" sangat lemah untuk menggunakannya sebagai kamera, mereka mula membuat improvisasi dengan lampu latar.

    Lagi


    Ia menjadi jelas bahawa tidak mungkin hanya menyerlahkan keamatan; arah cahaya luaran juga membuat pelarasan. Saya terpaksa menghidupkan Arduino lain untuk mengawal keamatan lampu latar ( Sememangnya, adalah mungkin untuk mengawalnya secara berbeza, tetapi kemudiannya bukan sahaja dengan lampu latar, tetapi juga dengan menukar nombor pada penunjuk). Pada akhirnya, ternyata menembak dalam cahaya adalah lebih baik. Dan jika, sebagai contoh, anda menggunakan penunjuk tujuh segmen yang bercahaya sebagai sasaran, penderia melihatnya dengan baik. Jadi sekarang kita mempunyai penunjuk dan jalur dengan nombor putih yang diisi dengan latar belakang hitam sebagai objek menembak.

    di sebelah kiri adalah imej skala kelabu yang diperoleh daripada penunjuk (kami menerima imej sedemikian daripada sensor), di sebelah kanan adalah binarized.

    Lagi


    Pandangan umum pemasangan yang dipasang


    pilihan pemasangan awal


    Blok pengiktirafan


    Peranan penting dalam pemasangan kami dimainkan oleh unit pengecaman yang dipanggil (dalam gambar di atas). Seperti yang anda lihat, ia terdiri daripada Arduino Uno dan pemancar wifi yang terkenal ESP8266. Biar saya jelaskan, kami memerlukan pemancar wifi untuk melihat hasil pengecaman pada tablet. Aplikasi pada tablet menghantar permintaan, Arduino, apabila menerima permintaan itu, "menangkap" imej daripada sensor tetikus, kemudian meduakannya. Selepas perduaan, pengecaman berlaku, dan selepas selesai, respons dijana. Dalam respons, kami menghantar hasil pengecaman dan 41 bait untuk membina imej terdua pada skrin tablet, boleh dikatakan, untuk kejelasan.

    Jika anda melihat ke belakang, Arduino mempunyai beberapa fungsi yang baik: bekerja dengan kamera, pengecaman dan bekerja dengan esp8266. Apa yang tidak boleh menjejaskan kerja ialah kami terpaksa berhadapan dengan kekurangan ingatan. Saya tidak pernah terfikir bahawa saya perlu menuntut semula setiap bait memori.

    Demonstrasi proses pengiktirafan

    Daripada kesimpulan

    Itu sahaja. Masih banyak kerja di hadapan. Dan tugas pertama: mengenali nombor (rentetan nombor) yang ditangkap oleh kamera "manusia" (dan bukan "sensor tetikus") dan memindahkan teknologi yang dibangunkan ke ESP8266 dan mengurangkan keamatan perjuangan untuk setiap bait memori.

    Kami dengan senang hati akan menjawab soalan anda.

    Dalam projek ini, saya menggabungkan pengesan pengesanan muka dan sistem pengesanan.

    Secara ringkas, intipati projek: kamera web yang dipasang pada mekanisme berputar disambungkan ke komputer yang menjalankan sistem pengendalian Windows dan dengan perisian yang dipasang OpenCV. Jika program mengesan wajah dalam medan pandangan kamera web, bahagian tengah muka dikira. Koordinat X dan Y dihantar ke pengawal Arduino, yang disambungkan ke komputer melalui USB. Sebaliknya, pengawal Arduino, berdasarkan arahan yang diterima, mengawal dua motor servo: sepanjang koordinat X dan sepanjang koordinat Y, i.e. sistem pengesanan disediakan.

    Pustaka OpenCV (Perpustakaan Penglihatan Komputer Sumber Terbuka) boleh dimuat turun. Pustaka ini berbilang platform dan kini wujud untuk sistem pengendalian berikut: Windows, Linux, Android, Mac OS dan juga iOS. Perpustakaan menyediakan pemprosesan imej masa nyata. Ditulis dalam C/C++.

    Itu. Projek ini adalah campuran penyelesaian lembut dan keras. Pemprosesan imej dijalankan pada komputer, dan kawalan servo dijalankan menggunakan pengawal.

    Jadi apa yang saya gunakan untuk projek itu:

    Perisian:
    Arduino IDE 1.0 untuk Windows

    Microsoft Visual C++ 2010 Express SP1
    Perpustakaan C++ Bersiri untuk Win32 (oleh Thierry Schneider)

    besi:
    komputer dengan Windows 7 SP1
    Arduino Uno atau serasi + PSU
    2 servos
    Webcam USB

    Jadi, mari kita pergi.

    Langkah 1: Pasang perisian

    1) Jika anda mempunyai OS Windows, kemudian muat turun fail OpenCV-2.3.1-win-superpack.exe (atau versi yang lebih baru) dan pasang pustaka.

    2) Muat turun dan pasang Microsoft Visual C++ 2010 Express. Jika anda mempunyai versi Windows 64-bit, anda juga perlu memuat turun Windows SDK (tetapi untuk versi 64 mungkin terdapat masalah; saya tidak boleh mendapatkan OpenCV untuk berfungsi di bawah Windows 7 x64).

    Baca proses menyediakan OpenCV untuk Visual C++ di tapak web rasmi.

    Langkah 2. Memasang kamera dan servos

    Saya tidak membuat reka bentuk "tahan lama", kerana selepas mencapai matlamat akhir, saya membongkar segala-galanya untuk projek seterusnya.
    Saya melampirkan webcam pada servomotor paksi-X, dan ia, seterusnya, melampirkannya pada servomotor paksi-Y Dan saya mengamankan keseluruhan struktur ini dalam pengapit "tangan ketiga".

    Langkah 3: Sambungan

    Menyambung servomotors:
    Pin kuning dari servo paksi X disambungkan ke pin 9 pengawal Arduino
    Pin kuning dari servo paksi Y disambungkan ke pin 10 pengawal Arduino
    Pin Vcc merah dari servo bersambung ke pin 5V
    Pin GND hitam dari servo disambungkan ke pin GND pengawal Arduino

    Sambungan kamera web:
    Webcam bersambung ke komputer melalui antara muka USB. Program C++ mengenal pasti kamera web dengan nombor port USBnya. Anda mungkin perlu menentukan port dalam program.

    Menyambungkan pengawal Arduino UNO:
    Pengawal juga bersambung ke komputer melalui antara muka USB. Port COM maya muncul dalam sistem, yang mesti ditambahkan pada kod program dalam C++.

    Entah kenapa datang idea untuk bersuara Kawalan Arduino, tetapi Arduino sahaja tidak mencukupi, kerana... Untuk sistem rumah pintar, anda juga perlu berkomunikasi dengan komputer dan sistemnya.

    Mencari penyelesaian:

    BitVoicer
    Saya menjumpai pelbagai artikel menggunakan BitVoicer bersama Arduino, tetapi masalahnya ialah BitVoicer hanya berfungsi pada Windows, dan ini tidak membenarkan menggunakan sistem pada peranti mudah seperti Rasberry Pi yang menjalankan Unix.
    Pengecaman Suara Arduino
    Arduino juga boleh dikawal dengan suara terima kasih kepada modul pengecaman suara, tetapi setakat ini saya tidak mempunyai kegembiraan untuk membelinya dan terdapat beberapa kesulitan apabila menggunakan modul ini: bilangan arahan yang terhad, latihan yang membosankan, arahan baru memerlukan berkelip modul, yang sudah menjadi tolak jika sistem dinyahpenyah dan dipasang.

    Penyelesaian

    Saya mula mencari penyelesaian merentas platform yang membolehkan sistem berfungsi pada berbilang sistem operasi. Terjumpa ini: Ucapan kepada Pustaka Teks untuk Java/Pemprosesan. Kompleks ini dilaksanakan berdasarkan bahasa Pemprosesan (Jawa) Dan API Google Speach Kucing itu telah pun ditulis sebelum ini. keputusan ini Membenarkan penjejakan suara masa nyata enableAutoRecord(), nyatakan had volum enableAutoThreshold(), sambung mikrofon luaran getLineIn(), nyatakan bahasa pengecaman setLanguage(String). Senarai penuh keupayaan dan spesifikasi ada di tapak web pembangun: http://stt.getflourish.com. Untuk kerja kita perlukan Google Speech Kunci API. Cara mendapatkannya diterangkan di sini: www.chromium.org/developers/how-tos/api-keys. Hanya satu titik negatif Masalahnya ialah Google Speech membenarkan anda memproses hanya 50 permintaan setiap hari, tetapi dalam praktiknya lebih daripada 500 permintaan diproses.

    Untuk memudahkan untuk menavigasi teks pada masa hadapan, saya melampirkan semua sumber, yang sudah mengandungi arahan suara, sambungan ke papan Arduino, lakaran untuk Papan Arduino, pengesahan suara bagi frasa dan segala-galanya yang kini tersedia dan berfungsi: kod sumber. Selepas memuat turun, kami meletakkan folder GoogleTTS dalam pustaka Processing"a. Lakaran untuk Arduino berada dalam folder GoogleTTS/ArduinoSerial. Semuanya telah ditulis dalam Processing 3.0a4, tersedia dalam pra-keluaran di tapak web rasmi.

    Perlaksanaan(“Dengarlah perintahku!”):
    Kami telah membuat keputusan mengenai pengiktirafan. Sekarang kita perlu menangkap arahan yang kita perlukan dan membuat keputusan mengenainya. Bahagian ini bertanggungjawab untuk ini:
    void commands() ( if (result.equals("arduino")) ( // Mencari padanan // Laksanakan arahan apabila perlawanan diterima ) else if (result.equals("what time is it")) ( / / Laksanakan arahan apabila perlawanan diterima ) )
    Respons suara
    Sekarang kita memerlukan alat yang akan bertindak balas kepada kita dengan suara manusia jika perlawanan ditemui. Alat pelaksanaan yang dipilih ialah Terjemahan Google, atau sebaliknya modul yang menukar teks kepada suara. Teks dihantar melalui permintaan ke pelayan Google dan ditukar menjadi fail bunyi dan dihantar semula kepada kami dalam format mp3. Bahagian ini bertanggungjawab untuk ini:
    void googleTTS(String txt, String language) ( // teks ditukar kepada bunyi menggunakan arahan googleTTS("text", "language") String u = "http://translate.google.com/translate_tts?tl="; u = u + bahasa + "&q=" + txt; URL URL= URL baharu(u); cuba ( Sambungan URLConnection = url.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla/4.0 (serasi; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; . NET CLR 1.2.30703)"); connection.connect(); InputStream ialah = connection.getInputStream(); Fail f = Fail baharu(sketchPath + "/" + txt + ".mp3"); OutputStream out = new FileOutputStream( f); byte buf = new byte; while ((len = is.read(buf)) > 0) ( out.write(buf, 0, len); ) out.close("Fail dibuat : " + txt + ".mp3") tangkapan (IOException e) ( e.printStackTrace(); ) ) tangkapan (MalformedURLException e) ( e.printStackTrace(); )

    Bahagian ini bertanggungjawab untuk memproses frasa teks secara langsung:
    void voicer(String s) ( // Dilaksanakan oleh command voicer("text") println(s); // digunakan untuk memantau teks Fail f = new File(sketchPath + "/" + s + ".mp3"); // Menyemak fail // Jika fail sudah wujud, mainkan fail if(f.exists())( println("Fail sudah wujud! Saya sedang memainkan Fail!");player = minim.loadFile(s + ".mp3"); player.play (); ) // Jika fail belum wujud lagi, buat fail lain ( println("Fail belum wujud! Saya sedang buat!"); "ru"); pemain = minim.loadFile(s + ".mp3");

    Contoh pelaksanaan pengecaman dan pengesahan suara:
    void commands() ( if (result.equals("computer")) ( // Mencari penyuara padanan("Dengar"); // Menerima pengesahan suara // Laksanakan arahan apabila menerima padanan ) )
    Dia masih hidup!

    Pemprosesan + Arduino

    Nah, nampaknya telah berjaya, tetapi ada yang hilang. Sekarang mari "berkawan" dengan Arduino.
    Kami memulakan sambungan bersiri dalam Pemprosesan untuk menghantar data ke Arduino (untuk pengguna Mac dan Unix):
    String portName = Serial.list(); myPort = Siri baru(ini, portName, 9600); myPort.bufferUntil("\n");

    Untuk pengguna Windows:
    Rentetan myPort = Siri baru(ini, "Port COM anda", 9600); myPort.bufferUntil("\n");

    Dan kami akan menghantar arahan ke sana jika padanan suara ditemui:
    void commands() ( if (result.equals("hidupkan lampu")) ( // Jika frasa suara dikenali sebagai "hidupkan lampu", kemudian laksanakan permintaan myPort.write("High"); / / Menghantar arahan Tinggi kepada penyuarakan sambungan Bersiri("Hidupkan lampu"); // Pengesahan suara pelaksanaan arahan ) jika tidak (result.equals("Matikan lampu")) ( myPort.write("Rendah "); // Menghantar arahan Rendah kepada penyuarakan sambungan Bersiri (" Mematikan lampu"); // Pengesahan // Laksanakan arahan apabila perlawanan diterima) )

    Sekarang mari kita mulakan Papan Arduino. Kita perlu mendengar port Serial dan apabila kita menemui arahan daripada senarai, lakukan tindakan yang diperlukan mengikut arahan itu. Lakarannya sangat mudah:
    int led = 13; // Pin LED pada persediaan void board() ( Serial.begin(9600); // Mulakan pinMode sambungan bersiri(led, OUTPUT); // Pin LED menghantar data ) void loop() ( int i=0; / / pembolehubah untuk meletakkan rentetan ke dalam buffer char buffer; // tatasusunan penimbal untuk meletakkan rentetan ke dalamnya if(Serial.available())( // Semak port bersiri untuk kehadiran kelewatan data(100); // masukkan apa yang dibaca ke dalam penimbal sambil(Serial.available () && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
    Semua. Jom semak.

    Masalah dan rancangan:

    Kerana Saya tidak melakukan pengaturcaraan sebelum ini, saya tidak memahami sepenuhnya beberapa perkara dalam proses penyahpepijatan. Saya akan berterima kasih jika sesiapa boleh memberitahu saya bagaimana untuk menyelesaikan masalah yang disenaraikan di bawah:

    Masalah paling asas ialah keseluruhan frasa suara tidak dituturkan. Huruf terakhir hilang. Walaupun fail bunyi disertakan dengan pelayan Google V bentuk biasa. Seperti yang saya faham keadaan: terdapat masalah dengan pemain audio, tetapi di mana sebenarnya masih belum jelas.
    - Saya sudah menulis bahawa API Pertuturan Google mempunyai had 50 permintaan setiap hari, tetapi sebenarnya ia lebih banyak. Walau apa pun, ini tidak mencukupi. Saya bercadang untuk mendaftarkan pengiktirafan tempatan bagi arahan utama dan hanya selepas ia diiktiraf, hantar teks yang lain untuk diproses oleh Google saya sedang mencari penyelesaian.
    - Saya rasa tidak rugi menghantar arahan ke perisai Ethernet Arduino, kerana... Sesetengah sistem mungkin terletak pada jarak yang agak jauh dari komputer hos dan sambungan Bersiri tidak akan berfungsi lagi di sini. Saya akan menangani keputusan ini satu hari ini, kerana... Saya tidak mempunyai penghala untuk menyambungkan Arduino dengan perisai Ethernet kepadanya.

    Itu sahaja! Tolong jangan menilai secara ketat berdasarkan baris kod! Saya baru sahaja mula mengkaji papan anjal ini dan saya akan sangat berterima kasih jika anda menggosok hidung saya dalam perkara yang tidak sepatutnya dilakukan dan menunjukkan kepada saya bagaimana untuk melakukannya. Saya juga akan gembira jika orang lain menyertai projek ini orang yang berminat- sentiasa terbuka kepada komunikasi!