Come configurare smartphone e PC. Portale informativo
  • casa
  • Televisori (Smart TV)
  • Riconoscimento di numeri sul microcontrollore. Controllo vocale Arduino tramite Processing e Google Speech API

Riconoscimento di numeri sul microcontrollore. Controllo vocale Arduino tramite Processing e Google Speech API

In questo tutorial Arduino, ti mostreremo come utilizzare l'app mobile Android e il modulo Bluetooth HC-05 per controllare a voce un LED.

Per questa lezione, abbiamo bisogno di un minimo di componenti. Dopo aver fatto la lezione, puoi complicare il circuito e integrarlo con dispositivi a tuo piacimento.

  • Arduino UNO
  • Modulo Bluetooth HC-05
  • Tagliere per il pane
  • fili
  • Resistenza da 330 ohm
  • Diodi emettitori di luce (LED)

Passaggio 2: collegamento del modulo Bluetooth HC-05

Il modulo Bluetooth HC-05 standard ha sei pin. Tuttavia, in questo progetto, utilizzeremo solo 4.

Useremo il pin VCC, il pin GND, il pin TXD e il pin RXD. Il pin VCC del modulo bluetooth è collegato a +3,3 V da Arduino. Il pin GND del modulo è collegato al GND (massa) di Arduino. Il pin TX del modulo Bluetooth è collegato al pin digitale 0 (RXD) e il pin RXD è collegato al pin digitale 1 (TXD).

Passaggio 3: collegamento dei LED

Il passaggio successivo nella creazione di LED a comando vocale consiste nel collegare i LED ad Arduino tramite la breadboard.

Innanzitutto, collegare l'estremità corta del LED a terra. Quindi collegare l'estremità lunga di ciascuno dei LED a una resistenza da 330 ohm. Infine, collega la resistenza di corrente dai LED ai pin digitali su Arduino.

In questo progetto, collegheremo un LED al pin digitale 2, un altro al pin digitale 3 e l'ultimo LED al pin digitale 4.

Passaggio 4: nutrizione

Per questo progetto, possiamo alimentare Arduino tramite qualsiasi alimentatore da +5 V. Puoi utilizzare la porta USB del tuo computer per alimentare Arduino, ma per questo progetto utilizzeremo una batteria portatile da 5 V. Prima di collegare una fonte di alimentazione al tuo Arduino, assicurati che il GND di Arduino sia collegato alla massa della breadboard.

Passaggio 5: codice

Il codice per il nostro progetto è qui sotto.

Passaggio 6: utilizzo dell'app mobile

Puoi iniziare a testare il tuo progetto scaricando l'app Android - BT Voice Control per Arduino (BT Voice Control per Arduino), creata da SimpleLabsIN.

Dopo aver scaricato e installato l'app sul tuo telefono Android, fai clic sulla barra dei menu nell'angolo in alto a destra e seleziona Connetti Robot. Nella nuova finestra che appare, seleziona il modulo Bluetooth HC-05 e collegalo.

Ora, quando pronunci determinati comandi dal codice al tuo dispositivo tramite l'app, alcuni LED dovrebbero accendersi e spegnersi. Dai un'occhiata più da vicino al codice, dove sono indicati i comandi e metti il ​​tuo. Ad esempio, invece di "*accendi rosso" puoi semplicemente specificare "rosso". Quindi i comandi saranno più veloci, più brevi e più chiari.

Passaggio 7: risultato finale

Il risultato finale può essere visto nel video qui sotto.

Vi auguriamo progetti di successo! Non dimenticate di lasciare commenti sul progetto nella ns

In questo progetto ho combinato un rilevatore di volti e un sistema di tracciamento.

In breve, l'essenza del progetto: una webcam installata su un meccanismo rotante è collegata a un computer con sistema operativo Windows e con software installato Apri CV. Se il programma rileva un viso nel campo visivo della webcam, viene calcolato il centro del viso. Le coordinate X e Y vengono trasmesse al controller Arduino, che è collegato al computer tramite USB. A sua volta, il controller Arduino, in base ai comandi ricevuti, controlla due servomotori: lungo la coordinata X e lungo la coordinata Y, ovvero è previsto un sistema di monitoraggio.

È possibile scaricare la libreria OpenCV (Open Source Computer Vision Library). La libreria è multipiattaforma, attualmente esiste con i seguenti sistemi operativi: Windows, Linux, Android, Mac OS e persino iOS. La libreria fornisce l'elaborazione delle immagini in tempo reale. Scritto in C/C++.

Quella. questo progetto è una miscela di soluzioni morbide e dure. L'elaborazione delle immagini viene eseguita su un computer e il servocontrollo viene eseguito utilizzando un controller.

Quindi cosa ho usato per il progetto:

Software:
Arduino IDE 1.0 per Windows

Microsoft Visual C++ 2010 Express SP1
Libreria C++ seriale per Win32 (di Thierry Schneider)

Ferro:
computer con Windows 7 SP1
Arduino Uno o compatibile + alimentatore
2 servi
webcam USB

Quindi andiamo.

Passaggio 1. Installazione del software

1) Se hai un sistema operativo Windows, scarica il file OpenCV-2.3.1-win-superpack.exe (o successivo) e installa la libreria.

2) Scarica e installa Microsoft Visual C++ 2010 Express. Se hai una versione a 64 bit di Windows, dovrai anche scaricare Windows SDK (ma per la versione a 64 bit potrebbero esserci problemi, non sono riuscito a far funzionare OpenCV con Windows 7 x64).

Leggi il processo di configurazione di OpenCV per Visual C++ sul sito Web ufficiale.

Passaggio 2 Collegamento della fotocamera e dei servomotori

Non ho reso il progetto "durevole", perché dopo aver raggiunto l'obiettivo finale, smonto tutto per il prossimo progetto.
Ho collegato la webcam al servomotore dell'asse X e, a sua volta, l'ho fissata sul servomotore dell'asse Y. E ho fissato l'intera struttura in un morsetto di terza mano.

Passaggio 3Connetti

Collegamento servomotori:
Il pin giallo del servo dell'asse X è collegato al pin 9 di Arduino.
Il pin giallo del servo dell'asse Y è collegato al pin 10 del controller Arduino
Il pin Vcc rosso dal servo si collega al pin 5V
Il pin GND nero del servo è collegato al pin GND del controller Arduino.

Connessione webcam:
La webcam è collegata al computer tramite un'interfaccia USB. Il programma C++ identifica la webcam tramite il suo numero di porta USB. Potrebbe essere necessario specificare la porta nel programma.

Collegamento del controller Arduino UNO:
Il controller si collega anche a un computer tramite un'interfaccia USB. Nel sistema appare una porta COM virtuale, che deve essere inserita nel codice del programma in C++.

In qualche modo è nata l'idea di realizzare il controllo vocale di Arduino, ma un Arduino non basta, perché. per un sistema di casa intelligente, devi anche comunicare con un computer e i suoi sistemi.

Trovare una soluzione:

BitVoice
Mi sono imbattuto in vari articoli che utilizzano BitVoicer insieme ad Arduino, ma l'intero problema è che BitVoicer funziona solo su Windows e questo non consente di utilizzare il sistema su dispositivi semplici come Rasberry Pi che esegue Unix.
Riconoscimento vocale Arduino
Arduino si può controllare anche a voce grazie al modulo di riconoscimento vocale, ma finora non ho i mezzi per acquistarlo e ci sono una serie di inconvenienti nell'utilizzo di questo modulo: un numero limitato di comandi, un tedioso addestramento, nuovi comandi richiedono il flashing del modulo, che è già un segno negativo se il sistema ha eseguito il debug e l'installazione.

Soluzione

Ho iniziato a cercare una soluzione multipiattaforma che consentisse al sistema di funzionare su più sistemi operativi. Trovato questo: Speech to Text Library per Java/Elaborazione. Il complesso è implementato sulla base della lingua Elaborazione (Java) e API di Google Speach di cui ho già scritto in precedenza. Questa soluzione consente di monitorare la voce in tempo reale enableAutoRecord(), impostare il limite del volume enableAutoThreshold(), collegare microfoni esterni getLineIn(), specificare la lingua di riconoscimento setLanguage(Stringa). Un elenco completo di funzionalità e specifiche è disponibile sul sito Web dello sviluppatore: http://stt.getflourish.com. Per funzionare, abbiamo bisogno della chiave API di Google Speech. Come ottenerlo è descritto qui: www.chromium.org/developers/how-tos/api-keys. L'unico punto negativo è che Google Speech consente di elaborare solo 50 richieste al giorno, ma in pratica passano più di 500 richieste.

Per facilitare la navigazione nel testo in futuro, allego tutti i sorgenti che già contengono i comandi vocali, il collegamento alla scheda Arduino, uno sketch per la scheda Arduino, la conferma vocale delle frasi e tutto ciò che è già lì e al lavoro: fonti. Dopo il download, posizioniamo la cartella GoogleTTS nelle librerie Processing "a. Lo sketch Arduino si trova nella cartella GoogleTTS/ArduinoSerial. Tutto è stato scritto su Processing 3.0a4, disponibile in pre-release sul sito ufficiale.

Implementazione("Ascolta il mio comando!"):
Il riconoscimento è fatto. Ora dobbiamo catturare i comandi di cui abbiamo bisogno e prendere decisioni su di essi. Questa sezione è responsabile di:
void comandi() ( if (result. equals("arduino")) ( // Cerca una corrispondenza // Esegui il comando quando viene ricevuta una corrispondenza ) else if (result. equals ("quanto tempo")) ( // Esegui comando quando viene ricevuta una corrispondenza ) )
Risposta vocale
Ora abbiamo bisogno di uno strumento che ci risponda con voce umana se viene trovata una corrispondenza. Come strumento di implementazione è stato scelto Google Translate, ovvero un modulo che converte il testo in voce. Il testo viene inviato su richiesta al server di Google, convertito in un file audio e rispedito a noi in formato mp3. Questa sezione è responsabile di:
void googleTTS(String txt, String language) ( // la conversione del testo in suono viene eseguita con il comando googleTTS("text", "language") String u = "http://translate.google.com/translate_tts?tl=" ; u = u + lingua + "&q=" + txt; u = u.replace(" ", "%20"); try ( URL url = nuovo URL(u); try ( connessione URLConnection = url.openConnection() ; connection. setRequestProperty("User-Agent", "Mozilla/4.0 (compatibile; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 1.2.30703)"); connessione .connect( ); InputStream is = connection.getInputStream(); File f = new File(sketchPath + "/" + txt + ".mp3"); OutputStream out = new FileOutputStream(f); byte buf = new byte; int len; while ((len = is.read(buf)) > 0) ( out.write(buf, 0, len); ) out.close(); is.close(); println("File creato: " + txt + " .mp3"); ) catch (IOException e) ( e.printStackTrace()); ) ) catch (MalformedURLException e) ( e.printStackTrace(); ) )

La sezione è responsabile del trattamento diretto delle frasi di testo:
void voicer(String s) ( // Eseguito da voicer("text") println(s); // usato per monitorare il testo File f = new File(sketchPath + "/" + s + ".mp3"); // Verifica del file // Se il file esiste già, riproduci il file if(f.exists())( println("Il file esiste già! Sto riproducendo il file!"); player = minim.loadFile(s + ".mp3") ; player.play (); ) // Se il file non esiste ancora, crealo else ( println("Non c'è ancora un file! Lo sto creando!"); googleTTS(s, "ru" ); player = minim.loadFile(s + ".mp3"); player.play(); ) )

Un esempio dell'implementazione del riconoscimento e della conferma vocale:
void command() ( if (result. equals("computer")) ( // Cerca un voicer di corrispondenza ("Ascolta"); // Ottieni una conferma vocale // Esegui il comando quando viene ricevuta una corrispondenza ) )
È vivo!

Elaborazione + Arduino

Bene, sembra funzionare, ma manca qualcosa. Ora facciamo amicizia con Arduino.
Inizializza la connessione seriale in Elaborazione per inviare dati ad Arduino (per utenti Mac e Unix):
String PortName = Serial.list(); myPort = new Serial(this, portName, 9600); myPort.bufferUntil("\n");

Per gli utenti Windows:
String myPort = new Serial(questo, "La tua porta COM", 9600); myPort.bufferUntil("\n");

E invieremo un comando lì quando viene trovata una corrispondenza vocale:
void command() ( if (result. equals("accendi la luce")) ( // Se la frase vocale è stata riconosciuta come "accendi la luce", esegui la richiesta myPort.write("High"); / / Invia il comando High al voicer della connessione Seriale("Accendi la luce"); // Conferma vocale dell'esecuzione del comando ) else if (result. equals("spegni la luce")) ( myPort. write( "Low"); // Invia il comando Low al voicer della connessione Serial ("spengo la luce"); // Conferma // Esecuzione del comando quando viene ricevuta una corrispondenza ) )

Ora diamo un'occhiata alla scheda Arduino. Dobbiamo ascoltare la porta seriale e, quando viene trovato un comando dall'elenco, eseguire l'azione richiesta in base al comando. Lo schizzo è molto semplice:
led int = 13; // LED pin on board void setup() ( Serial.begin(9600); // Inizializza connessione seriale pinMode(led, OUTPUT); // LED pin trasmette dati ) void loop() ( int i=0; // variabile per inserire una stringa in un buffer char buffer; // array di buffer per inserire una stringa in esso if(Serial.available())( // Controlla la porta seriale per data delay(100); //guida ciò che è stato letto il buffer while(Serial.disponibile () && 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); // Выключаем светодиод } } }
Qualunque cosa. Controlliamo.

Problemi e progetti:

Perché Non ho fatto la programmazione prima di questa volta, non capisco completamente alcune cose nel processo di debug. Sarei grato se qualcuno potesse dirmi come risolvere i problemi dall'elenco seguente:

Il problema più basilare è che la frase vocale non è pronunciata nella sua interezza. Mancano le ultime lettere. Sebbene il file audio provenga dal server di Google nella sua forma normale. A quanto ho capito la situazione: il problema è il lettore audio, ma dove esattamente non è ancora chiaro.
- Ho già scritto che l'API di Google Speech ha un limite di 50 richieste al giorno, ma in realtà ne risulta di più. In ogni caso, questo non basta. Ho intenzione di registrare il riconoscimento locale del comando principale e solo dopo il suo riconoscimento inviare il resto del testo a Google per l'elaborazione Sto cercando una soluzione.
- Penso che non farà male inviare comandi allo shield Ethernet di Arduino, perché. alcuni sistemi potrebbero trovarsi a una discreta distanza dal computer host e la connessione seriale non funzionerà qui. Affronterò questa decisione uno di questi giorni, perché. Non ho un router per collegare un Arduino con uno scudo Ethernet ad esso.

È tutto per ora! Si prega di non giudicare rigorosamente da righe di codice! Ho appena iniziato a studiare questo trampolino di lancio e ti sarei estremamente grato se mi ficcassi il naso su come non farlo e mi mostrassi come farlo. Sarò anche felice se altre persone interessate si uniranno a questo progetto - sono sempre aperto alla comunicazione!

Ricordi come qualche anno fa (e forse anche adesso) era diffusa l'idea di controllare la luce in una stanza con l'aiuto dei battiti delle mani? Ma, in fondo, è molto comodo, sei sdraiato a letto, troppo pigro per alzarti e battere le mani per spegnere la luce o andiamo a casa, è buio, ci vuole molto tempo per trovare l'interruttore, e poi dalla soglia stessa si sente uno o due applausi e la luce è già accesa. Mi sembra che questo concetto sia ancora rilevante, ma ad esso possono essere applicate tecnologie superiori rispetto a quelle che erano 5 anni, 10 anni fa. Ora, per un importo relativamente piccolo, puoi acquistare alcune parti e programmare il progetto per funzioni simili, che verranno discusse di seguito.

Oggi prenderemo in considerazione un modulo progettato per riconoscere i comandi vocali (comprese solo le voci all'interno di un comando vocale registrato) - Modulo di riconoscimento vocale V3.1 (V3) o il nome di codifica comunemente usato FZ0475 .

La confezione comprende il modulo stesso (il circuito stampato è di ottima qualità), un microfono su gamba flessibile con connettore jack da 3,5 mm e contatti PLS angolati con passo 2,56 mm per la scheda del modulo (possono essere omessi se collegato ai contatti del modulo in altro modo).

Ad oggi, esistono diversi tipi di moduli con funzionalità simili di diversi produttori e sviluppatori o versioni. Questo modulo di riconoscimento vocale, secondo me, ha un certo equilibrio tra costo, funzionalità e praticità. Il modulo EasyVR sarà più potente e notevolmente più costoso. I moduli basati su LD3320 risulteranno più economici e scomodi (scomodo almeno perché non è facile trovarne le normali descrizioni, ma per il resto è già soggettivo).

Caratteristiche del modulo di riconoscimento vocale V3.1 (V3):

  • Tensione di alimentazione - 5 volt
  • Consumo di corrente - fino a 40 mA
  • Interfacce – UART, GPIO
  • Precisione di riconoscimento - 99% (in condizioni ideali)
  • Portata - dipende dal microfono utilizzato, per un microfono standard del kit, la portata è 0,5 - 1 metro della distanza massima con una voce sufficientemente alta, se la voce è bassa dovrai avvicinare il microfono alla bocca

Il modulo è una piccola scheda ordinata su cui si trova il microcontrollore principale (black blot), un connettore jack da 3,5 mm per il collegamento di un microfono, un chip di memoria flash, GPIO, UART e contatti di alimentazione, una coppia di LED e il resto del kit necessario necessario per il funzionamento del circuito - resistori, condensatori, quarzo. Le dimensioni compatte della scheda ti permetteranno di integrare il modulo nei tuoi progetti senza troppe difficoltà. Per aumentare la gamma dei comandi vocali è presumibilmente necessario utilizzare un microfono con amplificatore. Quando viene raggiunto un intervallo accettabile, il modulo è adatto per l'uso in sistemi domestici intelligenti. Senza modifiche per migliorare il raggio d'azione, il modulo può essere utilizzato nei sistemi di controllo desktop, così come nei sistemi di sicurezza (controllo accessi e restrizione). Con un microfono standard, a causa del corto raggio, è più affidabile utilizzare il modulo di riconoscimento vocale come auricolare e trasmettere i comandi in modalità wireless al controller, che controlla qualcosa utilizzando una batteria e moduli wireless (ad esempio, HC-05 o HC -12 o qualsiasi altro idoneo). Il modulo è in grado di funzionare senza un microcontrollore esterno, poiché il produttore ha fornito l'indipendenza funzionale, è sufficiente registrare i comandi vocali una sola volta e impostare le impostazioni per il funzionamento indipendente utilizzando un dispositivo esterno (PC o MC).

Quindi, per iniziare a lavorare con il modulo di riconoscimento vocale, è necessario collegarlo a un computer (è necessario un adattatore USB-UART) o a un microcontrollore (è necessario sviluppare un codice di programma per controllare il modulo).

Non c'è alcuna differenza fondamentale nel controllo e nella configurazione del modulo tra il collegamento a un computer o a un microcontrollore, quindi per chiarezza utilizzeremo un PC per la configurazione. Le istruzioni descrivono i comandi per il modulo in forma esadecimale, quindi per comodità ti servirà anche un terminale che trasmetta byte in forma esadecimale, ad esempio AccessPort (scaricabile a fine articolo). Inoltre, il produttore si concentra sugli utenti della piattaforma Arduino e fornisce una libreria per l'utilizzo di questo modulo e istruzioni per l'utilizzo di questa libreria. Tuttavia, molti di noi sono molto più interessati a lavorare con il modulo stesso direttamente che tramite il wrapper Arduino.

Prima di iniziare il lavoro, affrontiamo il consiglio. Dalle estremità della scheda a destra c'è un jack per il collegamento di un microfono, dall'altra ci sono quattro contatti dell'interfaccia UART. Di seguito sono riportati otto pin utilizzati per emettere segnali causati dal riconoscimento dei comandi vocali. Nella parte superiore, quattro pin configurati come ingresso di segnale vengono utilizzati per passare da un gruppo di comandi (di sette comandi vocali ciascuno) a un gruppo di comandi, se viene utilizzata tale funzione. E gli altri sei pin in alto sono probabilmente usati per connettersi alla memoria del modulo.

Un sistema di comandi viene utilizzato per azionare e configurare il modulo. La vista generale della cornice si presenta così:

I primi quattro comandi 00, 01, 02, 03 servono per controllare lo stato del modulo e le sue impostazioni. I successivi sei comandi 10, 11, 12, 13, 14, 15 vengono utilizzati per modificare le impostazioni del modulo, incluso il controllo della porta di uscita e le impostazioni del caricamento automatico. Successivamente, tre comandi 20,21, 22 vengono utilizzati per registrare i comandi vocali. I successivi tre comandi 30,31,32 sono usati per controllare il riconoscimento dei comandi vocali. I comandi 0A, 0D, FF vengono utilizzati solo quando i dati vengono restituiti dal modulo stesso. In realtà non ci sono molti comandi e tutto questo non è così spaventoso come sembra a prima vista nella documentazione del modulo. Consideriamo i comandi necessari per lavorare con il modulo di riconoscimento vocale. Non tutti i comandi esistenti sono pratici.

È interessante notare che il modulo può funzionare senza un microcontrollore di controllo esterno, oltre a gestire qualcosa in modo indipendente con le sue porte di uscita. Per fare ciò, è necessario configurarli (comandi 12, 13, 14).

Squadra 12 – configurare le porte di uscita. Questo comando imposta la modalità di funzionamento delle porte di uscita del modulo di riconoscimento vocale.

Formato: | AA | 03 | 12 | MODALITÀ | 0a |

Dove MODE può assumere quattro valori: 0 - modalità a impulsi (quando viene attivato un comando vocale, l'uscita corrispondente al comando cambierà il suo stato per il tempo impostato dal comando 13), 1 - modalità di commutazione (commuta o capovolgi) (ogni volta il comando vocale viene attivato, l'uscita corrispondente al comando vocale invertita), 2 – modalità on (quando viene attivato un comando vocale, l'uscita andrà allo stato di unità logica e non andrà più allo stato di unità logica zero, il reset si effettua con il comando 14), 3 – modalità off (simile alla modalità on, solo viceversa, quando scatta un comando vocale, l'uscita va a zero logico).

La più pratica è la modalità switch, che non richiede comandi aggiuntivi. La modalità a impulsi sarebbe buona, ma la logica di questa modalità è tale che quando viene attivato un comando vocale, emette un'unità logica una volta, per un periodo da 10 ms a 1 s. Non è abbastanza. Anche se, a seconda dei requisiti per questa modalità, può essere utile. Le modalità di accensione e spegnimento sono implementate in modo scomodo, poiché richiedono l'esecuzione di comandi aggiuntivi.

Squadra 13 – impostazione della durata dell'impulso della modalità corrispondente.

Formato: | AA | 03 | 13 | LIVELLO | 0a |

Dove LEVEL assume un valore da 00 a 0F (corrispondente a una durata da 10 ms a 1 s).

LIVELLO durata
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

Squadra 14 – ripristino delle porte di uscita allo stato specificato dalle modalità on o off.

Formato: | AA| 03 | 14 | FF | 0a | - ripristinare tutte le porte di uscita

| AA| 03+n | 14 | IO0 | ... | ION | 0a | - resettare le porte di uscita selezionate

Dove n è il numero di pin che vengono reimpostati in modo selettivo, IO0…IOn è l'enumerazione di questi pin nel frame di dati di invio.

Inoltre, affinché i comandi vocali possano essere eseguiti, devono essere scritti nel modulo (addestrare il modulo). C'è una limitazione qui. È possibile riconoscere solo sette comandi alla volta, sebbene se ne possano registrare molti di più. Per ampliare la gamma dei comandi vocali che verranno riconosciuti, viene utilizzato un sistema di raggruppamento (comando 32), che è controllato dalle porte di ingresso del modulo. Impostando la configurazione delle segnalazioni su questi contatti si seleziona il gruppo di comandi che verranno riconosciuti. Ciò è dovuto alle prestazioni limitate del controller vocale del modulo utilizzato.

Squadra 20 - registrazione di uno o più comandi vocali.

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

Dove n è il numero di comandi vocali registrati (se viene registrato un comando n=0, due comandi n=1 e così via secondo il formato generale di trasmissione dei comandi Lunghezza - lunghezza), R0...Rn numeri di comandi vocali ( AA 03 20 03 0A - comando per registrare il terzo comando vocale).

Squadra 21 - registrare un comando vocale e impostarne una firma.

Formato: | AA| 03+SIGLE | 21 | REGISTRA | SIG | 0a |

Dove RECORD è il numero del comando vocale, SIG è la firma (può essere composta da più byte, in modo che ogni byte possa corrispondere alla codifica dei caratteri dell'alfabeto se necessario), SIGLEN è il numero di byte che compongono la firma.

Squadra 22 - Aggiungi o rimuovi una firma per il comando vocale selezionato.

Formato: | AA | 03+SIGLE | 22 | REGISTRA | SIG | 0A | - aggiunta di firma

| AA | 03 | 22 | REGISTRA | 0a | - rimozione della firma

Nel processo di registrazione dei comandi vocali, devi essere guidato dai segnali dei LED. Dopo aver inserito il comando che avvia il processo di registrazione, il LED giallo (arancione) inizia a lampeggiare velocemente. Non appena il LED rosso si accende, devi pronunciare un comando vocale nel microfono. In caso di successo, il LED giallo (arancione) si accenderà e poi di nuovo rosso: è necessario confermare il comando vocale, ripeterlo. In caso di successo, entrambi i LED si accendono - il comando vocale è stato salvato.

Dopo che i comandi vocali sono stati scritti nel modulo, non succede nulla finché questi comandi non vengono inseriti nel "riconoscitore" (Riconoscitore) del modulo. Per fare ciò, utilizzare il comando 30. Dopo aver eseguito questo comando, il modulo attenderà che il comando vocale corrisponda ai campioni salvati. È possibile riconoscere solo sette comandi alla volta. In questo caso, il LED giallo (arancione) sulla scheda del modulo lampeggerà lentamente.

Squadra 30 - caricare i record nel "riconoscitore" (riconoscitore) del modulo.

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

Il formato della risposta è il seguente: | AA | 07 | 0D | 00 | GRP | R | RI | SIGLE | SIG | 0a |

Dove GRPM è l'informazione sul gruppo a cui appartiene il comando (se utilizzato), R è un comando vocale riconosciuto (utilizzando questi dati, è possibile distinguere il comando l'uno dall'altro se non vengono utilizzate le firme), RI è l'indice del comando nel riconoscitore, SIGLEN è la lunghezza della firma in byte, SIG - firma (se utilizzata).

E infine, se il modulo deve funzionare in modo indipendente, è necessario utilizzare il comando 15 per avviarsi automaticamente in base alle preimpostazioni del riconoscimento. In questo caso, il modulo di riconoscimento vocale funzionerà da solo senza necessità di inizializzazione dopo l'accensione.

Squadra 15 - impostazione dell'auto-start del riconoscitore all'accensione.

Formato: | AA| 03 | 15 | 00 | 0a | - disabilitare la funzione di esecuzione automatica

| AA| 03+n | 15 | BITMAP | R0 | ... | Rn | 0a | - impostazione della funzione di autorun

Per controllare la correttezza dell'esecuzione dei comandi, ognuno di essi ha la propria risposta. Se necessario, tutti i dati sono reperibili nella documentazione relativa al modulo di riconoscimento vocale, allegata a fine articolo. Non dimenticare che tutti i valori numerici sono rappresentati in esadecimale modulo.

Pertanto, utilizzando il sistema di comando, è possibile configurare in modo abbastanza flessibile il modulo di riconoscimento vocale per l'uso in vari scopi. Se il semplice controllo delle porte di uscita del modulo non è sufficiente, allora il modulo di riconoscimento vocale può essere collegato ad altri dispositivi tramite UART o GPIO. Per la connessione wireless, è possibile utilizzare i moduli discussi in precedenza.

Con l'ausilio di moduli wireless è possibile collegare il modulo di riconoscimento vocale a qualsiasi dispositivo ove necessario. Ad esempio colleghiamolo ad un microcontrollore, che, in relazione ai dati ricevuti sul riconoscimento dei comandi vocali, controllerà i led. I moduli wireless consentono di trasferire i dati in due direzioni, quindi, se necessario, è possibile scrivere il codice per l'inizializzazione del modulo vocale e la registrazione dei comandi vocali per il microcontrollore. Nel nostro caso, sotto il controllo di un PC, nel modulo sono già stati registrati diversi comandi vocali e all'accensione è configurato l'avvio automatico del riconoscimento, quindi per il microcontrollore scriveremo solo ricezione dati e controllo dei LED rispetto a questi dati. Il microcontrollore STM32F103C8T6 utilizza USART1 per ricevere dati e pin PB10...PB15 configurati per l'uscita, che controlla i LED. Il codice sorgente si trova in appendice a fine articolo.

Un po' sui risultati

Il riconoscimento vocale non è del tutto accurato. Dipende dai comandi selezionati e dalla voce dell'utente. Durante i test, ho riscontrato diversi punti negativi. Durante l'apprendimento dei comandi del modulo, sono stati scelti i comandi vocali "uno" e "due". Il comando "due" passava sempre chiaramente, ma il comando "uno" veniva spesso definito come il comando "due" e, di conseguenza, veniva eseguito il codice del secondo comando. Inoltre, quando si cercava di dare comandi vocali in inglese (e non erano registrati nel modulo vocale), il comando "uno" veniva quasi sempre definito come "due". Forse si tratta di pronuncia, intonazione e altri aspetti della voce umana, incorporati nell'algoritmo per la codifica del modulo vocale dei comandi vocali. Tuttavia, i produttori non danno questi segreti di pubblico dominio. Inoltre, la qualità del riconoscimento è influenzata dalle condizioni di rumore esterno: rimbombo dalla strada, rumore della ventola, suoni casuali e così via. Il produttore richiama l'attenzione sul fatto che un elevato livello di precisione del riconoscimento avviene in condizioni ideali. L'idea di utilizzare un microfono con un amplificatore, ovviamente, aumenterà la portata del dispositivo, ma aumenterà anche la probabilità di errori, poiché l'amplificazione della voce si verificherà anche con l'amplificazione del rumore.

Infine, se hai requisiti bassi per il riconoscimento vocale e l'esecuzione di comandi vocali, questo modulo elaborerà onestamente i soldi spesi per esso.

Elenco di elementi radio

Designazione Un tipo Denominazione Quantità NotaPuntoIl mio taccuino
IC1 MK STM32

STM32F103C8

1 Al blocco note
VR1 Regolatore lineare

AMS1117-3.3

1 Al blocco note
MOD1, MOD3 Modulo senza filiHC-122 Al blocco note
MOD2 Modulo di riconoscimento vocaleVR3.11 Al blocco note
Z1 Quarzo8 MHz1
  • Fai da te o fai da te
  • Ehi Giktimes!

    Come suggerisce il nome, questo articolo si concentrerà sul riconoscimento dei numeri sul microcontrollore. Voglio fare subito una riserva sul fatto che questo articolo non fornirà il codice sorgente, considererà la tecnologia o l'algoritmo di riconoscimento, dirò solo che vengono utilizzate le idee di un approccio sistematico. Alcuni di essi sono illustrati nei nostri articoli (, e qui). Ciò è dovuto al fatto che il nostro approccio si basa sull'originalità, ma richiede il chiarimento di alcune questioni. Qualcuno potrebbe dire: "un altro articolo sulla programmazione dei microcontrollori". Al contrario, la ricerca di progetti simili non ha dato risultati intelligibili, tranne questo video. Una cosa è chiara dalle discussioni sui forum: l'idea di ottenere un tale dispositivo (fotocamera + microcontrollore = risultato del riconoscimento dell'uscita e non solo un'immagine catturata) è venuta a molti, ma è rimasta senza implementazione. Sì, e il riconoscimento, a detta di tutti, richiede molte risorse di calcolo e i microcontrollori non sono adatti a questo, in particolare, ci sono state affermazioni su Arduino secondo cui questo è generalmente impossibile. Se è diventato interessante, chiedo sotto cat.

    In modo che non ci siano domande ovvie, risponderemo loro:

    • No, questo non è un servizio di riconoscimento delle immagini.
    • No, questo non è OpenCV
    • No, queste non sono reti neurali.
    • Viene utilizzata l'analisi morfologica degli oggetti che compongono la figura
    • Sì, il riconoscimento viene effettuato dal microcontrollore!

    Idea

    Insomma, tutto è iniziato con la voglia di cimentarmi e mettere alla prova le mie idee nel riconoscimento delle immagini. Durante la discussione, siamo giunti alla conclusione che possiamo fare con una piccola potenza di calcolo per risolvere questo problema. Per ovvie ragioni, non descriveremo i dettagli di queste discussioni.

    Installazione

    Quindi, il compito è impostato, è necessaria l'implementazione. Senza discostarsi dal già stabilito
    prendiamo ciò che è a portata di mano. E avevo a portata di mano un paio di Arduino Uno, un vecchio mouse ottico e un lettore CD. A proposito, ci è stato chiesto di utilizzare il sensore di un mouse ottico come fotocamera per ottenere un'immagine, che abbiamo letto molto tempo fa, e, appunto, tutto il resto del materiale "mouse". L'unica cosa che dovevamo fare era saldare il sensore e tutte le sue cinghie per facilità d'uso, oltre a incollarvi una lente, che abbiamo "strappato" con cura dall'unità CD. Ciò era necessario per aumentare la distanza dal soggetto alla fotocamera, altrimenti i numeri della nostra taglia non combaciavano ed era visibile solo una piccola parte. A proposito, davanti all'obiettivo dell'unità CD, abbiamo provato a collegare l'ottica della webcam, ma in qualche modo non è cresciuta insieme.

    Di più


    Quindi è sorta la domanda su come posizionare questa fotocamera sopra il soggetto. Qui siamo stati molto aiutati da un vecchio microscopio rotto, che giaceva inattivo. Con rispetto, hanno rimosso il meccanismo per il controllo del palcoscenico dell'oggetto. Questo meccanismo ci ha permesso di muovere la fotocamera lungo solo due assi, e subito è nata l'idea di utilizzare la guida della testina laser del lettore CD. Tutto questo è stato risolto sul caso dal lettore CD longevo. Di conseguenza, abbiamo ottenuto un fantastico meccanismo di posizionamento della fotocamera.

    Di più


    In sintesi: abbiamo la cosiddetta fotocamera, c'è un meccanismo di posizionamento, resta da mettere un pezzo di carta con un numero e ottenere un'immagine dalla fotocamera. È qui che sono iniziati i "problemi". Poiché le caratteristiche del sensore ottico "mouse" sono molto scarse per utilizzarlo come fotocamera, hanno iniziato a improvvisare con il controluce.

    Di più


    È diventato chiaro che la semplice evidenziazione non funziona, l'intensità è importante, anche la direzione della luce esterna effettua regolazioni. Ho dovuto accendere un altro "arduino" per lavorare in modo da controllare l'intensità della retroilluminazione ( naturalmente è stato possibile controllarlo diversamente, ma in seguito non solo la retroilluminazione, ma anche la commutazione dei numeri sull'indicatore). Di conseguenza, si è scoperto che scattare alla luce è molto meglio. E se, ad esempio, utilizzi un indicatore luminoso a sette segmenti come target, il sensore lo vede in generale perfettamente. Quindi, ora abbiamo un indicatore e una striscia con numeri bianchi riempiti con uno sfondo nero come soggetti per lo scatto.

    a sinistra c'è un'immagine in scala di grigi ottenuta dall'indicatore (otteniamo tale immagine dal sensore), a destra è binarizzata.

    Di più


    Vista generale dell'assemblea


    opzione di installazione anticipata


    Blocco di riconoscimento


    Un ruolo importante nella nostra installazione è svolto dal cosiddetto blocco di riconoscimento (nella foto sopra). Come puoi vedere, è composto da un Arduino Uno e da un noto trasmettitore wifi ESP8266. Spiego, ci serve un trasmettitore wifi per vedere il risultato del riconoscimento sul tablet. L'applicazione sul tablet invia una richiesta, "arduino", ricevendo una richiesta, "rimuove" l'immagine dal sensore del mouse, quindi la binarizza. Dopo la binarizzazione, si verifica il riconoscimento e, dopo il suo completamento, si forma una risposta. In risposta, inviamo il risultato del riconoscimento e 41 byte per creare un'immagine binarizzata sullo schermo del tablet, per così dire, per chiarezza.

    Se guardi indietro, all'"arduino" viene assegnata una buona funzionalità: lavorare con la fotocamera, riconoscere e lavorare con esp8266. Ciò che non poteva che influenzare il lavoro: ho dovuto fare i conti con una mancanza di memoria. Non ho mai pensato che avrei mai dovuto riconquistare ogni byte di memoria.

    Dimostrazione del processo di riconoscimento

    Invece di una conclusione

    È tutto. C'è ancora molto lavoro da fare. E il primo compito: riconoscere i numeri (stringhe di numeri) presi da una fotocamera "umana" (e non un "sensore del mouse") e trasferire la tecnologia sviluppata sull'ESP8266 e ridurre l'intensità della lotta per ogni byte di memoria.

    Risponderemo volentieri alle domande.

    Articoli correlati in alto