Cum se configurează smartphone-uri și PC-uri. Portal informativ

Recunoașterea numerelor pe microcontroler. Control vocal Arduino folosind Procesare și Google Speech API

În acest tutorial Arduino, vă vom arăta cum să utilizați aplicația mobilă Android și modulul Bluetooth HC-05 pentru a controla vocal un LED.

Pentru această lecție, avem nevoie de un minim de componente. După ce faci lecția, poți să complici circuitul și să-l completezi cu dispozitive pe placul tău.

  • Arduino UNO
  • Modul Bluetooth HC-05
  • Tabla de paine
  • fire
  • Rezistor de 330 ohmi
  • Diode emițătoare de lumină (LED)

Pasul 2: Conectarea modulului Bluetooth HC-05

Modulul Bluetooth HC-05 standard are șase pini. Cu toate acestea, în acest proiect, vom folosi doar 4.

Vom folosi pinul VCC, pinul GND, pinul TXD și pinul RXD. Pinul VCC al modulului bluetooth este conectat la +3,3V de la Arduino. Pinul GND al modulului este conectat la GND (masa) al Arduino. Pinul TX al modulului bluetooth este conectat la pinul digital 0 (RXD), iar pinul RXD este conectat la pinul digital 1 (TXD).

Pasul 3: Conectarea LED-urilor

Următorul pas în crearea LED-urilor controlate prin voce este conectarea LED-urilor la Arduino prin placa de breadboard.

Mai întâi, conectați capătul scurt al LED-ului la masă. Apoi conectați capătul lung al fiecărui LED-uri la un rezistor de 330 ohmi. În cele din urmă, conectați rezistența de curent de la LED-uri la pinii digitali de pe Arduino.

În acest proiect, vom conecta un LED la pinul digital 2, altul la pinul digital 3 și ultimul LED la pinul digital 4.

Pasul 4: Nutriție

Pentru acest proiect, putem alimenta Arduino prin orice sursă de alimentare de +5 V. Puteți utiliza portul USB de la computer pentru a alimenta Arduino, dar pentru acest proiect, vom folosi o baterie portabilă de 5 V. Înainte de a conecta o sursă de alimentare la Arduino, asigurați-vă că GND-ul Arduino este conectat la masa plăcii.

Pasul 5: Cod

Codul pentru proiectul nostru este mai jos.

Pasul 6: Folosind aplicația mobilă

Puteți începe să vă testați proiectul prin descărcarea aplicației Android - BT Voice Control for Arduino (BT Voice Control for Arduino), creată de SimpleLabsIN.

După ce ați descărcat și instalat aplicația pe telefonul dvs. Android, faceți clic pe bara de meniu din colțul din dreapta sus și selectați Connect Robot. În noua fereastră care apare, selectați modulul Bluetooth HC-05 și conectați-l.

Acum, când rostiți anumite comenzi din cod pe dispozitivul dvs. prin aplicație, anumite LED-uri ar trebui să se aprindă și să se stingă. Aruncă o privire mai atentă la cod, unde sunt indicate comenzile și pune-l pe al tău. De exemplu, în loc de „*porniți roșu” puteți specifica doar „roșu”. Deci comenzile vor fi mai rapide, mai scurte și mai clare.

Pasul 7: Rezultatul final

Rezultatul final poate fi văzut în videoclipul de mai jos.

Vă dorim proiecte de succes! Nu uitați să lăsați comentarii despre proiect în cadrul nostru

În acest proiect, am combinat un detector de detectare a feței și un sistem de urmărire.

Pe scurt, esența proiectului: o cameră web instalată pe un mecanism rotativ este conectată la un computer care rulează sistemul de operare Windows și cu software-ul instalat OpenCV. Dacă programul detectează o față în câmpul vizual al camerei web, atunci se calculează centrul feței. Coordonatele X și Y sunt transmise controlerului Arduino, care este conectat la computer prin USB. La rândul său, controlerul Arduino, conform comenzilor primite, controlează două servomotoare: de-a lungul coordonatei X și de-a lungul coordonatei Y, adică. este prevăzut un sistem de monitorizare.

Biblioteca OpenCV (Open Source Computer Vision Library) poate fi descărcată. Biblioteca este multi-platformă, în prezent există sub următoarele sisteme de operare: Windows, Linux, Android, Mac OS și chiar iOS. Biblioteca asigură procesarea imaginilor în timp real. Scris în C/C++.

Acea. acest proiect este un amestec de soluții moi și dure. Prelucrarea imaginii se realizează pe un computer, iar servocontrolul se realizează cu ajutorul unui controler.

Deci, ce am folosit pentru proiect:

Software:
Arduino IDE 1.0 pentru Windows

Microsoft Visual C++ 2010 Express SP1
Biblioteca serial C++ pentru Win32 (de Thierry Schneider)

Fier:
computer cu Windows 7 SP1
Arduino Uno sau compatibil + PSU
2 servo-uri
Webcam USB

Deci să mergem.

Pasul 1. Instalarea software-ului

1) Dacă aveți un sistem de operare Windows, descărcați fișierul OpenCV-2.3.1-win-superpack.exe (sau mai târziu) și instalați biblioteca.

2) Descărcați și instalați Microsoft Visual C++ 2010 Express. Dacă aveți o versiune de Windows pe 64 de biți, atunci va trebui să descărcați și SDK-ul Windows (dar pentru versiunea pe 64 de biți pot apărea probleme, nu am putut face ca OpenCV să funcționeze sub Windows 7 x64).

Citiți procesul de configurare a OpenCV pentru Visual C++ pe site-ul oficial.

Pasul 2 Atașarea camerei și a servomotoarelor

Nu am făcut designul „durabil”, pentru că după ce am atins obiectivul final, demontez totul pentru următorul proiect.
Am atașat camera web la servomotorul pe axa X și, la rândul meu, am fixat-o pe servomotorul pe axa Y. Și am fixat toată această structură într-o clemă cu mâna a treia.

Pasul 3 Conectați-vă

Conectarea servomotoarelor:
Pinul galben de la servo-axa X este conectat la pinul 9 al Arduino.
Pinul galben de la servo-axa Y este conectat la pinul 10 al controlerului Arduino
Pinul Vcc roșu de la servo se conectează la pinul de 5V
Pinul negru GND de la servo este conectat la pinul GND al controlerului Arduino.

Conexiune webcam:
Camera web este conectată la computer printr-o interfață USB. Programul C++ identifică camera web după numărul portului USB. Poate fi necesar să specificați portul în program.

Conectarea controlerului Arduino UNO:
Controlerul se conectează și la un computer printr-o interfață USB. În sistem apare un port COM virtual, care trebuie introdus în codul programului în C++.

Cumva a venit ideea de a face Arduino control vocal, dar un Arduino nu este suficient, pentru că. pentru un sistem de casă inteligentă, trebuie să comunicați și cu un computer și cu sistemele acestuia.

Găsirea unei soluții:

BitVoice
Am dat peste diverse articole folosind BitVoicer împreună cu Arduino, dar întreaga problemă este că BitVoicer funcționează doar pe Windows și acest lucru nu permite utilizarea sistemului pe dispozitive simple, cum ar fi Rasberry Pi care rulează Unix.
Recunoașterea vocii Arduino
Arduino poate fi controlat și prin voce datorită modulului de recunoaștere a vocii, dar până acum nu am mijloacele să-l achiziționez și există o serie de inconveniente la utilizarea acestui modul: un număr limitat de comenzi, antrenament obositor, comenzi noi necesită intermiterea modulului, ceea ce este deja un minus dacă sistemul a fost depanat și instalat.

Decizie

Am început să caut o soluție multiplatformă care să permită sistemului să funcționeze pe mai multe sisteme de operare. Am gasit asta: Bibliotecă Speech to Text pentru Java/Procesare. Complexul este implementat pe baza limbajului Procesare (Java)și API-ul Google Speach despre care a scris deja mai devreme. Această soluție vă permite să monitorizați vocea în timp real enableAutoRecord(), setați limita de volum enableAutoThreshold(), conectați microfoane externe getLineIn(), specificați limba de recunoaștere setLanguage(Șir). O listă completă a caracteristicilor și specificului este pe site-ul web al dezvoltatorului: http://stt.getflourish.com. Pentru a funcționa, avem nevoie de cheia API Google Speech. Cum se obține este descris aici: www.chromium.org/developers/how-tos/api-keys. Singurul punct negativ este că Google Speech vă permite să procesați doar 50 de solicitări pe zi, dar în practică trec peste 500 de solicitări.

Pentru a facilita navigarea prin text în viitor, atașez toate sursele care conțin deja comenzi vocale, conectarea la placa Arduino, o schiță pentru placa Arduino, confirmarea vocală a frazelor și tot ce este deja acolo si lucrand: surse. După descărcare, plasăm folderul GoogleTTS în bibliotecile Processing „a. Schița Arduino se află în folderul GoogleTTS / ArduinoSerial. Totul a fost scris pe Processing 3.0a4, disponibil în pre-lansare pe site-ul oficial.

Implementarea("Ascultă comanda mea!"):
Recunoașterea este făcută. Acum trebuie să prindem comenzile de care avem nevoie și să luăm decizii cu privire la ele. Această secțiune este responsabilă pentru:
void commands() ( if (rezultat. equals("arduino")) ( // Căutați o potrivire // Executați comanda atunci când se primește o potrivire ) else if (rezultat. equals ("cât timp")) ( // Executați comanda când se primește o potrivire))
Răspuns vocal
Acum avem nevoie de un instrument care ne va răspunde cu o voce umană dacă se găsește o potrivire. Google Translate a fost ales ca instrument de implementare, sau mai degrabă un modul care convertește textul în voce. Textul este trimis printr-o cerere către serverul Google, convertit într-un fișier audio și trimis înapoi la noi în format mp3. Această secțiune este responsabilă pentru:
void googleTTS(String txt, String language) ( // conversia textului în sunet se face cu comanda googleTTS("text", "language") String u = "http://translate.google.com/translate_tts?tl=" ; u = u + limba + "&q=" + txt; u = u.replace(" ", "%20"); încercați ( URL URL = URL nouă (u); încercați ( URLConnection connection = url.openConnection() ; conexiune. setRequestProperty("User-Agent", "Mozilla/4.0 (compatibil; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 1.2.30703)"); conexiune .connect(); InputStream este = connection.getInputStream(); Fișier f = fișier nou (sketchPath + "/" + txt + ".mp3"); OutputStream out = nou FileOutputStream(f); byte buf = octet nou; int len; while ((len = is.read(buf)) > 0) ( out.write(buf, 0, len); ) out.close(); is.close(); println("Fișier creat: " + txt + " .mp3"); ) catch (IOException e) ( e.printStackTrace(); ) ) catch (MalformedURLException e) ( e.printStackTrace(); ) )

Secțiunea este responsabilă pentru procesarea directă a frazelor de text:
void voicer(String s) ( // Efectuat de voicer("text") println(s); // folosit pentru a monitoriza text Fișier f = fișier nou (sketchPath + "/" + s + ".mp3"); // Verificarea fișierului // Dacă fișierul există deja, redați fișierul if(f.exists())( println("Fișierul există deja! Se redă fișierul!"); player = minim.loadFile(s + ".mp3") ; player.play (); ) // Dacă fișierul nu există încă, creați-l else ( println ("Nu există încă un fișier! Îl creez!"); googleTTS(s, "ru" ); player = minim.loadFile(s + ".mp3"); player.play(); ) )

Un exemplu de implementare a recunoașterii și confirmării vocale:
void commands() ( dacă (rezultat. equals("computer")) ( // Căutați un vocal de potrivire ("Ascultați"); // Obțineți o confirmare vocală // Executați comanda când se primește o potrivire ) )
El traieste!

Procesare + Arduino

Ei bine, se pare că funcționează, dar lipsește ceva. Acum să ne împrietenim cu Arduino.
Inițializați conexiunea serială în Procesare pentru a trimite date către Arduino (pentru utilizatorii Mac și Unix):
String portName = Serial.list(); myPort = nou Serial(this, portName, 9600); myPort.bufferUntil("\n");

Pentru utilizatorii de Windows:
String myPort = nou Serial (acesta, „Portul dumneavoastră COM”, 9600); myPort.bufferUntil("\n");

Și vom trimite o comandă acolo când se găsește o potrivire vocală:
void commands() ( if (rezultat. equals("aprinde lumina")) ( // Dacă fraza vocală a fost recunoscută drept "aprinde lumina", atunci execută cererea myPort.write ("Înalt"); / / Trimite comanda înaltă către vocalul conexiunii seriale ("Aprinde lumina"); // Confirmare vocală a executării comenzii ) altfel dacă (rezultat. este egal ("stingi lumina")) ( myPort. write( "Scăzut"); // Trimite comanda Scăzută către vocalul conexiunii seriale ("Stop lumina"); // Confirmare // Executarea comenzii când se primește o potrivire ))

Acum să aruncăm o privire la placa Arduino. Trebuie să ascultăm portul serial și, când se găsește o comandă din listă, să efectuăm acțiunea necesară conform comenzii. Schița este foarte simplă:
int led = 13; // Pinul LED-ului la bord void setup() ( Serial.begin(9600); // Inițializați conexiunea serială pinMode(led, OUTPUT); // Pinul LED-ului transmite date ) void loop() ( int i=0; // variabilă pentru a împinge un șir într-un buffer de caractere tampon; // matrice de buffer pentru a împinge un șir în el if(Serial.available())( // Verificați portul serial pentru întârziere de date (100); // conduce ceea ce a fost citit în tamponul în timp ce (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); // Выключаем светодиод } } }
Toate. Verificăm.

Probleme și planuri:

pentru că Nu am făcut programare înainte de această dată, nu înțeleg pe deplin unele lucruri în procesul de depanare. Aș fi recunoscător dacă cineva mi-ar putea spune cum să rezolv problemele din lista de mai jos:

Cea mai de bază problemă este că fraza vocală nu este pronunțată în întregime. Ultimele litere lipsesc. Deși fișierul de sunet provine de la serverul Google în forma sa normală. După cum am înțeles situația: problema este playerul audio, dar unde exact nu este încă clar.
- Am scris deja că API-ul Google Speech are o limită de 50 de solicitări pe zi, dar de fapt iese mai multe. În orice caz, acest lucru nu este suficient. Intenționez să înregistrez recunoașterea locală a comenzii principale și numai după recunoașterea acesteia, trimit restul textului la Google pentru procesare. Caut o soluție.
- Cred că nu va strica să trimiți comenzi către scutul Ethernet Arduino, pentru că. unele sisteme pot fi la o distanță decentă de computerul gazdă și conexiunea serială nu va funcționa aici. Mă voi ocupa de această decizie într-una din aceste zile, pentru că. Nu am un router pentru a conecta un Arduino cu un scut Ethernet la el.

Asta este tot pentru acum! Vă rugăm să nu judeca strict după linii de cod! Tocmai am început să studiez acest trambulină și v-aș fi extrem de recunoscător dacă m-ați băga cu nasul cum să nu o fac și mi-ați arăta cum să o fac. De asemenea, mă voi bucura dacă și alte persoane interesate se alătură acestui proiect - sunt mereu deschis la comunicare!

Îți amintești cum în urmă cu câțiva ani (și poate chiar și acum) era populară ideea de a controla lumina într-o cameră cu ajutorul palmelor? Dar, la urma urmei, este foarte comod, ești întins în pat, prea leneș să te ridici și să bati din palme pentru a stinge lumina sau plecăm acasă, e întuneric, durează mult să găsești comutatorul și apoi chiar din prag se aude o palmă sau două și lumina este deja aprinsă. Mi se pare că acest concept este încă relevant, dar i se pot aplica tehnologii superioare față de cele care erau acum 5, 10 ani. Acum, pentru o sumă relativ mică, puteți cumpăra câteva piese și puteți programa designul pentru funcții similare, care vor fi discutate mai jos.

Astăzi vom lua în considerare un modul conceput pentru a recunoaște comenzile vocale (inclusiv doar vocile dintr-o comandă vocală înregistrată) - Modul de recunoaștere vocală V3.1 (V3) sau numele de codificare folosit în mod obișnuit FZ0475 .

Pachetul include modulul propriu-zis (placa de circuit imprimat este de foarte buna calitate), un microfon pe picior flexibil cu conector jack de 3,5 mm si contacte PLS unghiulare cu pas de 2,56 mm pentru placa modulului (pot fi omise daca conectat la contactele modulului în alt mod).

Până în prezent, există mai multe tipuri de module cu funcționalități similare de la diferiți producători și dezvoltatori sau versiuni. Acest modul de recunoaștere a vocii, în opinia mea, are un anumit echilibru între cost, funcționalitate și comoditate. Modulul EasyVR va fi mai puternic și semnificativ mai scump. Modulele bazate pe LD3320 vor fi mai ieftine și mai incomode (incomod cel puțin pentru că nu este ușor să le găsești descrieri normale, dar în rest este deja subiectivă).

Caracteristici ale modulului de recunoaștere vocală V3.1 (V3):

  • Tensiune de alimentare - 5 volți
  • Consum de curent - până la 40 mA
  • Interfețe – UART, GPIO
  • Precizia recunoașterii - 99% (în condiții ideale)
  • Raza de actiune - depinde de microfonul folosit, pentru un microfon standard din kit, raza de actiune este de 0,5 - 1 metru din distanta maxima cu o voce suficient de puternica, daca vocea este linistita, va trebui sa apropii microfonul de gura.

Modulul este o placă mică îngrijită pe care se află microcontrolerul principal (black blot), un conector jack de 3,5 mm pentru conectarea unui microfon, un cip de memorie flash, GPIO, UART și contacte de alimentare, o pereche de LED-uri și restul kit necesar pentru funcționarea circuitului - rezistențe, condensatoare, cuarț. Dimensiunea compactă a plăcii vă va permite să integrați modulul în propriile dvs. designuri fără prea multe dificultăți. Pentru a crește gama de comenzi vocale, este probabil necesar să folosiți un microfon cu amplificator. Când este atins un interval acceptabil, modulul este potrivit pentru utilizarea în sistemele de casă inteligentă. Fără modificări pentru îmbunătățirea domeniului de funcționare, modulul poate fi utilizat în sistemele de control desktop, precum și în sistemele de securitate (control acces și restricție). Cu un microfon standard, din cauza razei scurte, este cel mai fiabil să utilizați modulul de recunoaștere a vocii ca și căști și să transmiteți fără fir comenzi către controler, care controlează ceva folosind o baterie și module fără fir (de exemplu, HC-05 sau HC -12 sau orice altul potrivit). Modulul poate funcționa fără un microcontroler extern, deoarece producătorul a oferit independență funcțională, este necesar să înregistrați o singură dată comenzile vocale și să setați setările pentru funcționare independentă folosind un dispozitiv extern (PC sau MC).

Deci, pentru a începe să lucrăm cu modulul de recunoaștere a vocii, trebuie să-l conectăm fie la un computer (este nevoie de un adaptor USB-UART), fie la un microcontroler (este necesar să dezvoltăm un cod de program pentru a controla modulul).

Nu există nicio diferență fundamentală în controlul și configurarea modulului între conectarea la un computer sau la un microcontroler, așa că pentru claritate, vom folosi un PC pentru configurare. Instrucțiunile descriu comenzile pentru modul în formă hexazecimală, așa că, pentru comoditate, veți avea nevoie și de un terminal care transmite octeți în formă hexazecimală, de exemplu, AccessPort (poate fi descărcat la sfârșitul articolului). În plus, producătorul se concentrează pe utilizatorii platformei Arduino și oferă o bibliotecă pentru utilizarea acestui modul și instrucțiuni pentru utilizarea acestei biblioteci. Cu toate acestea, mulți dintre noi sunt mult mai interesați să lucreze cu modulul în sine direct decât prin ambalajul Arduino.

Înainte de a începe lucrul, să ne ocupăm de bord. De la capetele plăcii din dreapta este o mufă pentru conectarea unui microfon, pe cealaltă există patru contacte ale interfeței UART. Mai jos sunt opt ​​pini folosiți pentru a scoate semnale cauzate de recunoașterea comenzilor vocale. În partea de sus, patru pini configurați ca intrare de semnal sunt utilizați pentru a comuta între grupuri (de șapte comenzi vocale fiecare) de comenzi, dacă este utilizată o astfel de funcție. Iar ceilalți șase pini din partea de sus sunt probabil folosiți pentru a se conecta la memoria modulului.

Un sistem de comenzi este utilizat pentru a opera și configura modulul. Vederea generală a cadrului arată astfel:

Primele patru comenzi 00, 01, 02, 03 sunt folosite pentru a verifica starea modulului și setările acestuia. Următoarele șase comenzi 10, 11, 12, 13, 14, 15 sunt folosite pentru a modifica setările modulului, inclusiv controlul portului de ieșire și setările de încărcare automată. În continuare, trei comenzi 20,21, 22 sunt folosite pentru a înregistra comenzi vocale. Următoarele trei comenzi 30,31,32 sunt folosite pentru a controla recunoașterea comenzilor vocale. Comenzile 0A, 0D, FF sunt folosite numai atunci când datele sunt returnate de modul însuși. De fapt, nu există multe comenzi și toate acestea nu sunt atât de înfricoșătoare pe cât pare la prima vedere în documentația pentru modul. Să luăm în considerare comenzile necesare pentru a lucra cu modulul de recunoaștere vocală. Nu toate comenzile existente sunt practice.

Este de remarcat faptul că modulul poate funcționa fără un microcontroler de control extern, precum și poate gestiona în mod independent ceva cu porturile sale de ieșire. Pentru a face acest lucru, trebuie să le configurați (comenzile 12, 13, 14).

Echipa 12 – configurați porturile de ieșire. Această comandă setează modul de funcționare al porturilor de ieșire ale modulului de recunoaștere vocală.

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

Unde MODE poate lua patru valori: 0 - modul puls (atunci când o comandă vocală este declanșată, ieșirea corespunzătoare comenzii își va schimba starea pentru timpul stabilit de comanda 13), 1 - modul comutator (comutați sau flip) (de fiecare dată) comanda vocală este declanșată, ieșirea corespunzătoare comenzii vocale inversată), 2 – modul on (când este declanșată o comandă vocală, ieșirea va trece în starea unei unități logice și nu va mai trece în starea unei logice zero, resetarea se efectuează prin comanda 14), 3 – modul oprit (asemănător modului pornit, doar invers, când este declanșată o comandă vocală, ieșirea trece la zero logic).

Cel mai practic este modul de comutare, care nu necesită comenzi suplimentare. Modul puls ar fi bun, dar logica acestui mod este de așa natură încât atunci când este declanșată o comandă vocală, emite o unitate logică o singură dată, pentru o perioadă de la 10 ms la 1 s. Nu este de ajuns. Deși, în funcție de cerințele pentru acest mod, poate fi util. Modurile de pornire și oprire sunt implementate în mod incomod, deoarece necesită executarea unor comenzi suplimentare.

Echipa 13 – setarea duratei pulsului modului corespunzător.

Format: | AA | 03 | 13 | NIVEL | 0a |

Unde LEVEL ia o valoare de la 00 la 0F (corespunzător unei durate de la 10 ms la 1 s).

NIVEL durată
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

Echipa 14 – resetarea porturilor de ieșire la starea specificată de modurile pornit sau oprit.

Format: | AA| 03 | 14 | FF | 0A | - resetați toate porturile de ieșire

| AA| 03+n | 14 | IO0 | ... | ION | 0A | - resetați porturile de ieșire selectate

Unde n este numărul de pini care sunt resetati selectiv, IO0...IOn este enumerarea acestor pini în cadrul de date de trimitere.

În plus, pentru ca comenzile vocale să fie executate, acestea trebuie scrise în modul (antrenează modulul). Există o limitare aici. Doar șapte comenzi pot fi recunoscute simultan, deși multe altele pot fi înregistrate. Pentru a extinde gama de comenzi vocale care vor fi recunoscute, se folosește un sistem de grupare (comanda 32), care este controlat de porturile de intrare ale modulului. Prin setarea configurației semnalelor pe aceste contacte se selectează grupul de comenzi care vor fi recunoscute. Acest lucru se datorează performanței limitate a controlerului de voce al modulului utilizat.

Echipa 20 - înregistrarea uneia sau mai multor comenzi vocale.

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

Unde n este numărul de comenzi vocale înregistrate (dacă o comandă este înregistrată n=0, două comenzi n=1 și așa mai departe în conformitate cu formatul general de transmitere a comenzii Lungime - lungime), R0...Rn numere de comenzi vocale ( AA 03 20 03 0A - comandă pentru înregistrarea a treia comandă vocală).

Echipa 21 - înregistrarea unei comenzi vocale și setarea unei semnături pentru aceasta.

Format: | AA| 03+SIGLEN | 21 | ÎNREGISTRARE | SIG | 0a |

Unde RECORD este numărul comenzii vocale, SIG este semnătura (poate consta din mai mulți octeți, astfel încât fiecare octet să corespundă codării caracterelor alfabetului dacă este necesar), SIGLEN este numărul de octeți care compun semnătura.

Echipa 22 - Adăugați sau eliminați o semnătură pentru comanda vocală selectată.

Format: | AA | 03+SIGLEN | 22 | ÎNREGISTRARE | SIG | 0a | - adăugarea semnăturii

| AA | 03 | 22 | ÎNREGISTRARE | 0a | - eliminarea semnăturii

În procesul de înregistrare a comenzilor vocale, trebuie să fii ghidat de semnalele LED-urilor. După introducerea comenzii care pornește procesul de înregistrare, LED-ul galben (portocaliu) începe să clipească rapid. De îndată ce LED-ul roșu se aprinde, trebuie să rostiți o comandă vocală în microfon. Dacă are succes, LED-ul galben (portocaliu) se va aprinde și apoi din nou roșu - trebuie să confirmați comanda vocală, să o spuneți din nou. Dacă reușește, ambele LED-uri se vor aprinde - comanda vocală a fost salvată.

După ce comenzile vocale sunt scrise în modul, nu se va întâmpla nimic până când aceste comenzi nu sunt plasate în „recognizer” (Recognizer) al modulului. Pentru a face acest lucru, utilizați comanda 30. După executarea acestei comenzi, modulul va aștepta ca comanda vocală să se potrivească cu mostrele salvate. Doar șapte comenzi pot fi recunoscute simultan. În acest caz, LED-ul galben (portocaliu) de pe placa modulului va clipi lent.

Echipa 30 - încărcați înregistrările în „recognizer” (Recognizer) al modulului.

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

Formatul răspunsului este următorul: | AA | 07 | 0D | 00 | GRP | R | RI | SIGLEN | SIG | 0a |

Unde GRPM este informații despre grupul căruia îi aparține comanda (dacă este utilizată), R este o comandă vocală recunoscută (folosind aceste date, puteți distinge comanda una de alta dacă nu sunt utilizate semnături), RI este indexul comenzii din recunoscut, SIGLEN este lungimea semnăturii în octeți, SIG - semnătură (dacă este utilizată).

Și, în sfârșit, dacă modulul trebuie să funcționeze independent, atunci trebuie să utilizați comanda 15 pentru a lansa automat în funcție de presetările de recunoaștere. În acest caz, modulul de recunoaștere vocală va funcționa singur, fără a fi nevoie de inițializare după pornire.

Echipa 15 - setarea pornirii automate a dispozitivului de recunoaștere când îl porniți.

Format: | AA| 03 | 15 | 00 | 0a | - dezactivați funcția de autorun

| AA| 03+n | 15 | BITMAP | R0 | ... | Rn | 0A | - setarea funcției de rulare automată

Pentru a controla executarea corectă a comenzilor, fiecare dintre ele are propriul răspuns. Dacă este necesar, toate datele pot fi găsite în documentația pentru modulul de recunoaștere vocală, atașată la sfârșitul articolului. Nu uitați că toate valorile numerice sunt reprezentate în hexazecimal formă.

Astfel, folosind sistemul de comandă, puteți configura destul de flexibil modulul de recunoaștere a vocii pentru utilizare în diverse scopuri. Dacă pur și simplu controlul porturilor de ieșire ale modulului nu este suficient, atunci modulul de recunoaștere a vocii poate fi conectat la alte dispozitive prin UART sau GPIO. Pentru conexiunea wireless, puteți utiliza modulele discutate anterior.

Cu ajutorul modulelor wireless, puteți conecta modulul de recunoaștere vocală la orice dispozitiv acolo unde este necesar. De exemplu, să-l conectăm la un microcontroler, care, în raport cu datele primite despre recunoașterea comenzilor vocale, va controla LED-urile. Modulele wireless vă permit să transferați date în două direcții, așa că, dacă este necesar, puteți scrie cod pentru inițializarea modulului vocal și înregistrarea comenzilor vocale pentru microcontroler. În cazul nostru, sub controlul unui PC, mai multe comenzi vocale au fost deja înregistrate în modul și auto-pornirea recunoașterii este configurată la pornirea alimentării, așa că pentru microcontroler vom scrie doar recepția de date și controlul LED-urilor raportat la aceste date. Microcontrolerul STM32F103C8T6 folosește USART1 pentru a primi date și pinii PB10...PB15 setați la ieșire, care controlează LED-urile. Codul sursă se află în anexa de la sfârșitul articolului.

Un pic despre rezultate

Recunoașterea vocii nu este complet exactă. Depinde de comenzile selectate și de vocea utilizatorului. În timpul testării, am găsit câteva puncte negative. La învățarea comenzilor modulului s-au ales comenzile vocale „unu” și „două”. Comanda „două” a fost întotdeauna clară, dar comanda „unu” a fost destul de des definită ca comanda „două” și, în consecință, codul celei de-a doua comenzi a fost executat. Mai mult, atunci când încercam să dai comenzi vocale în engleză (și nu au fost înregistrate în modulul vocal), comanda „unu” a fost aproape întotdeauna definită ca „două”. Poate că totul este despre pronunție, intonație și alte aspecte ale vocii umane, încorporate în algoritmul de codificare a modulului vocal al comenzilor rostite. Cu toate acestea, producătorii nu oferă aceste secrete în domeniul public. În plus, calitatea recunoașterii este afectată de condițiile de zgomot extern - zgomot de pe stradă, zgomot ventilator, sunete aleatorii și așa mai departe. Producătorul atrage atenția asupra faptului că un nivel ridicat de acuratețe a recunoașterii are loc în condiții ideale. Ideea de a folosi un microfon cu un amplificator va crește, desigur, raza de acțiune a dispozitivului, dar va crește și probabilitatea de erori, deoarece amplificarea vocii va apărea și cu amplificarea zgomotului.

În cele din urmă, dacă aveți cerințe scăzute pentru recunoașterea vocii și executarea comenzilor vocale, atunci acest modul va calcula cu sinceritate banii cheltuiți pentru el.

Lista elementelor radio

Desemnare Tip Denumirea Cantitate NotăScorBlocnotesul meu
IC1 MK STM32

STM32F103C8

1 La blocnotes
VR1 Regulator liniar

AMS1117-3.3

1 La blocnotes
MOD1, MOD3 Modul wirelessHC-122 La blocnotes
MOD2 Modul de recunoaștere a vociiVR3.11 La blocnotes
Z1 Cuarţ8 MHz1
  • DIY sau bricolaj
  • Hei Giktimes!

    După cum sugerează și numele, acest articol se va concentra pe recunoașterea numerelor pe microcontroler. Vreau să fac imediat o rezervă că acest articol nu va furniza codul sursă, luați în considerare tehnologia sau algoritmul de recunoaștere, voi spune doar că sunt folosite ideile unei abordări sistematice. Unele dintre ele sunt prezentate în articolele noastre (și aici). Acest lucru se datorează faptului că abordarea noastră se bazează pe originalitate, dar necesită clarificarea unor probleme. Cineva ar putea spune: „un alt articol despre programarea microcontrolerelor”. Departe de asta, căutarea unor proiecte similare nu a dat niciun rezultat inteligibil, în afară de aceasta video. Un lucru este clar din discuțiile de pe forumuri: ideea de a obține un astfel de dispozitiv (camera + microcontroller = rezultatul recunoașterii ieșirii, și nu doar o imagine capturată) a venit la mulți, dar a rămas fără implementare. Da, iar recunoașterea, după toate conturile, necesită o mulțime de resurse de calcul, iar microcontrolerele nu sunt potrivite pentru asta, în special, au existat declarații despre Arduino că acest lucru este în general imposibil. Dacă a devenit interesant, întreb sub cat.

    Pentru ca să nu existe întrebări evidente, le vom răspunde:

    • Nu, acesta nu este un serviciu de recunoaștere a imaginii.
    • Nu, acesta nu este OpenCV
    • Nu, acestea nu sunt rețele neuronale.
    • Se foloseşte analiza morfologică a obiectelor care alcătuiesc figura
    • Da, recunoașterea se face de către microcontroler!

    Idee

    Pe scurt, totul a început cu dorința de a-mi încerca mâna și de a-mi testa ideile în recunoașterea imaginilor. În timpul discuției, am ajuns la concluzia că ne putem descurca cu o putere mică de calcul pentru a rezolva această problemă. Din motive evidente, nu vom descrie detaliile acestor discuții.

    Instalare

    Deci, sarcina este stabilită, este necesară implementarea. Fără a ne îndepărta de la deja stabilit
    luăm ceea ce este la îndemână. Și aveam la îndemână câteva Arduino Uno, un mouse optic vechi și o unitate CD. Apropo, ni s-a cerut să folosim senzorul unui mouse optic ca cameră pentru a obține o imagine, pe care am citit-o cu mult timp în urmă și, de fapt, tot restul materialului „șoarece”. Singurul lucru pe care trebuia să-l facem a fost să lipim senzorul și toate curelele acestuia pentru ușurință în utilizare, precum și să lipim o lentilă pe care l-am „smuls” cu grijă din unitatea CD. Acest lucru a fost necesar pentru a mări distanța de la subiect la cameră, altfel nu se potriveau numerele mărimii noastre și era vizibilă doar o mică parte. Apropo, în fața lentilei de pe unitatea CD, am încercat să atașăm optica de la camera web, dar cumva nu a crescut împreună.

    Mai mult


    Apoi a apărut întrebarea cum să poziționați această cameră deasupra subiectului. Aici am fost ajutați foarte mult de un microscop vechi stricat, care zăcea inactiv. Cu respect, au eliminat mecanismul de control al etapei obiectului. Acest mecanism ne-a permis să mișcăm camera doar de-a lungul a două axe și imediat a venit ideea să folosim ghidajul capului laser de la unitatea CD. Toate acestea au fost fixate pe carcasa de pe unitatea CD îndelungată. Drept urmare, am primit un mecanism de poziționare a camerei.

    Mai mult


    În rezumat: avem așa-numita cameră, există un mecanism de poziționare, rămâne să punem o bucată de hârtie cu un număr și să obținem o imagine de la cameră. De aici au început „problemele”. Deoarece caracteristicile senzorului optic „mouse” sunt foarte slabe pentru a-l folosi ca cameră, au început să improvizeze cu iluminare de fundal.

    Mai mult


    A devenit clar că nu se poate evidenția pur și simplu intensitatea, direcția luminii exterioare face și ajustări. A trebuit să pornesc un alt „arduino” pentru a controla intensitatea luminii de fundal ( în mod firesc, a fost posibil să-l controlăm diferit, dar mai târziu nu numai lumina de fundal, ci și comutarea numerelor pe indicator). Drept urmare, s-a dovedit că fotografierea în lumină este mult mai bună. Și dacă, de exemplu, un indicator luminos cu șapte segmente este folosit ca țintă, atunci senzorul îl vede în general perfect. Deci, acum avem un indicator și o bandă cu numere albe umplute cu un fundal negru ca subiecte pentru fotografiere.

    in stanga este o imagine in tonuri de gri obtinuta din indicator (o astfel de imagine o primim de la senzor), in dreapta este binarizata.

    Mai mult


    Vedere generală a ansamblului


    opțiune de instalare timpurie


    Bloc de recunoaștere


    Un rol important în instalația noastră îl joacă așa-numitul bloc de recunoaștere (în imaginea de mai sus). După cum puteți vedea, este format dintr-un Arduino Uno și un transmițător wifi binecunoscut ESP8266. Vă explic, avem nevoie de un transmițător wifi pentru a vedea rezultatul recunoașterii pe tabletă. Aplicația de pe tabletă trimite o cerere, „arduino”, primind o solicitare, „elimină” imaginea din senzorul mouse-ului, apoi o binarizează. După binarizare, are loc recunoașterea, iar după finalizarea acesteia, se formează un răspuns. Ca răspuns, trimitem rezultatul recunoașterii și 41 de octeți pentru a construi o imagine binarizată pe ecranul tabletei, ca să spunem așa, pentru claritate.

    Dacă te uiți în urmă, atunci i se atribuie funcționalități bune „arduino”: lucrul cu camera, recunoașterea și lucrul cu esp8266. Ceea ce nu putea decât să afecteze munca – a trebuit să mă confrunt cu o lipsă de memorie. Nu m-am gândit niciodată că va trebui vreodată să recâștig fiecare octet de memorie.

    Demonstrarea procesului de recunoaștere

    În loc de o concluzie

    Asta e tot. Mai este mult de lucru înainte. Și prima sarcină: recunoașterea numerelor (șiruri de numere) luate de o cameră „umană” (și nu un „senzor mouse”) și transferul tehnologiei dezvoltate la ESP8266 și reducerea intensității luptei pentru fiecare octet de memorie.

    Vom răspunde cu plăcere la întrebări.

    Top articole similare