start:arduino:easyvr
Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédenteDernière révisionLes deux révisions suivantes | ||
start:arduino:easyvr [2017/02/24 11:47] – modification externe 127.0.0.1 | start:arduino:easyvr [2023/06/05 17:24] – gerardadmin | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ==== Arduino et sheild EasyVR | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | __Ci-dessous une traduction" | ||
+ | |||
+ | EasyVR est un Module de reconnaissance vocale conçu pour ajouter facilement des fonctions polyvalentes, | ||
+ | Le module EasyVR peut être utilisé avec n' | ||
+ | Certains exemples d' | ||
+ | |||
+ | === EasyVR Caractéristiques : === | ||
+ | |||
+ | |||
+ | Dans les commandes Speaker Independent (SI) pour les commandes de base prêtes pour les Langues suivantes: | ||
+ | * Anglais (États-Unis) | ||
+ | * Italien | ||
+ | * Allemand | ||
+ | *** Français** | ||
+ | * Espagnol | ||
+ | * Japonais | ||
+ | |||
+ | Prise en charge jusqu' | ||
+ | |||
+ | * - Commandes déclenchés à la voix ou par evenements. | ||
+ | * - Les mots de passe. Les commandes personnalisées SD peuvent être prononcées dans n' | ||
+ | *- Utilisation et une interface utilisateur graphique simple pour programmer des commandes vocales et audio. | ||
+ | *- Module peut être utilisé avec n' | ||
+ | *- Simple et robuste protocole sériel documenté pour accéder et programmer via la carte hôte 6 lignes GPIO (IO1, IO2, IO3, IO4, IO5, IO6) pouvant être commandées par de nouvelles commandes de protocole. | ||
+ | *- PWM qui prend en charge les haut-parleurs 8Ω. | ||
+ | *- Lecture sonore d'un maximum de 9 minutes de sons | ||
+ | |||
+ | === Schémas technique === | ||
+ | |||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | === Interface série === | ||
+ | L' | ||
+ | *Taux de transmission: | ||
+ | *Cadre: 8 Les bits de données, N O parité, 1 Bit d' | ||
+ | *La ligne de données d' | ||
+ | |||
+ | Exemple d'une série | ||
+ | Cadre de données représentant le caractère " | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | === Microphone === | ||
+ | Le microphone fourni avec le module EasyVR est un microphone à condensateur électreté omnidirectionnel (Horn EM9745P-382): | ||
+ | *Sensibilité- 38dB (0dB = 1V / Pa à 1KHz) | ||
+ | *Impédance de charge 2.2K | ||
+ | *Tension de fonctionnement 3V | ||
+ | *Réponse en fréquence presque plate dans la plage 100Hz-20 kHz | ||
+ | *Si vous utilisez un microphone avec des spécifications différentes, | ||
+ | |||
+ | Une bonne fixation du micro peut nettement améliorer la qualité de la reconnaissance vocale | ||
+ | |||
+ | **1. Montage encastré** | ||
+ | -L' | ||
+ | |||
+ | **2. Aucun obstacle, avec un grand trou** | ||
+ | - La zone devant l' | ||
+ | |||
+ | **3.Isolation** | ||
+ | - Le micro doit être isolé acoustiquement du boîtier. Ceci peut être réalisé en entourant l' | ||
+ | |||
+ | **4.Distance** | ||
+ | -Si le micro est placé entre 15 cm à 30 cm de la bouche du locuteur, | ||
+ | |||
+ | |||
+ | -1-{{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | === EasyVR Shield 3 pour Arduino === | ||
+ | |||
+ | {{: | ||
+ | |||
+ | == Parametres == | ||
+ | |||
+ | Sur le côté inférieur de la carte il y a deux résistances SMD que vous pouvez déplacer pour sélectionner les deux broches de Arduino sur lequel l' | ||
+ | |||
+ | RX-Broche du récepteur série Serial | ||
+ | | ||
+ | | ||
+ | |||
+ | TX-Broche du transmetteur série logiciel | ||
+ | | ||
+ | | ||
+ | Le choix des broches 12 - 13 pour une compatibilité ascendante avec les révisions matérielles précédentes du bouclier EasyVR. Cependant, ces broches peuvent également être utilisées pour l' | ||
+ | Si vous voulez utiliser des broches différentes assurez-vous La broche du récepteur supporte les interruptions de changement. | ||
+ | |||
+ | == Réglages == | ||
+ | On peut faire des réglages pour améliorer la reconnaissance vocale dans le menu " | ||
+ | |||
+ | |||
+ | {{: | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | |||
+ | Mais cela reste quand même assez pointu pour faire un bon réglage , je vais me contenter dans un premier temps des sons enregistrés en implicite (voir WordSet 1,2,et 3). Ils sont mieux reconnu même si l'on change de voix. | ||
+ | |||
+ | |||
+ | === Démarrage rapide avec un Arduino Uno === | ||
+ | |||
+ | * 1.Insérez le Shield EasyVR sur la carte Arduino | ||
+ | * 2.Si vous voulez une sortie audio, Connecté un Haut-parleur 8Ω sur le Connecteur J5 sur le Module EasyVR ou connecter un casque ou des haut-parleurs amplifiés au LINE OUT 3.5mm Prise audio sur le sheild | ||
+ | * 3.Connectez le microphone fourni à MIC Connecteur J6) Sur le module EasyVR | ||
+ | * 4.Installer l' | ||
+ | * 5.Connectez votre carte Arduino à votre PC via USB | ||
+ | |||
+ | ** Avec Arduino 2009 Uno - Mega ** | ||
+ | |||
+ | __Testez le Shield avec Arduino__ | ||
+ | *1. Réglez le cavalier Mode (J7) en position SW | ||
+ | *2. Ouvrez l' | ||
+ | *3. Téléchargez l' | ||
+ | *4. Voir les commentaires en haut de l' | ||
+ | |||
+ | __Testez le bouclier avec le EasyVR Commander__ | ||
+ | *1.Assurez-vous que le cavalier Mode (J7) est en position PC | ||
+ | *2.Ouvrez le EasyVR Commander et connecté au même port série utilisé par Arduino | ||
+ | |||
+ | |||
+ | __Télécharger un nouveau son dans le tableau ou mise à jour du firmware__ | ||
+ | *1. Assurez-vous que le cavalier Mode (J7) est en position UP | ||
+ | *2. Ouvrez EasyVR Commander et sélectionnez le port série Arduino | ||
+ | *3. Lorsque vous êtes déconnecté, | ||
+ | |||
+ | Lorsque le EasyVR Commander est connecté, vous pouvez générer un modèle de code pour Arduino Cela va Utiliser les bibliothèques fournies (voir [[http:// | ||
+ | Il vous suffit d' | ||
+ | |||
+ | === les programmes ==== | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Le programme EasyVR V3.14.0 est utilisé pour entrer les commandes vocales dans le module. | ||
+ | Ce programme est un programme Windows, on peut l' | ||
+ | |||
+ | Une méthode, | ||
+ | |||
+ | Lancer le logiciel EasyVR3 et connecté votre Arduino avec le shield inséré et vérifié le cavalier sur " | ||
+ | Vous avez toutes les commandes vocales qui s' | ||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | Il est proposé 15 groupes pour la programmation des commandes. Avec 32 commandes Maxi à configurer en tout. | ||
+ | La premier chose à faire c'est de configurer le Français, dans " | ||
+ | |||
+ | {{: | ||
+ | |||
+ | On va faire un exemple simple pour commencer , allumer une LED sur la broche 9 de l' | ||
+ | |||
+ | On se positionne sur le Groupe 1 ( Index 1) , on va dans " | ||
+ | |||
+ | Maintenant on va enregistrer le son lié au mot, Sélectionner | ||
+ | Un pop up s' | ||
+ | Quand le son est bon , on a dans le champ " | ||
+ | |||
+ | On procède de même pour le deuxième mot et tous les mots que l'on veut enregistrer ( MAX 32 ) | ||
+ | |||
+ | On insère également dans le groupe " | ||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | Quand les mots/sons sont enregistrés, | ||
+ | |||
+ | On se déconnecte : " | ||
+ | |||
+ | On ouvre l'IDE Arduino, on charge le programme que l'on vient de générer, on vérifie le type de carte et le port Com utilisé. | ||
+ | |||
+ | dans "void setup()" | ||
+ | |||
+ | <code c setuppin9.c> | ||
+ | pinMode(9, | ||
+ | digitalWrite(9, | ||
+ | </ | ||
+ | |||
+ | Dans le même programme , on va dans le sous programme | ||
+ | |||
+ | dans la partie "Case GO_ARDUINO" | ||
+ | |||
+ | <code .c allergroup1.c> | ||
+ | group = GROUP_1; | ||
+ | </ | ||
+ | |||
+ | dans la partie "Case GROUP_1" | ||
+ | |||
+ | <code .c GROUP_1.c> | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G1_ALLUME: | ||
+ | digitalWrite(9, | ||
+ | group = GROUP_1; // on peut mettre group = GROUP_0 si l'on veut à chaque fois redire le mot de passe " | ||
+ | break; | ||
+ | case G1_ETEINT: | ||
+ | digtalWrite(9, | ||
+ | group = GROUP_1; | ||
+ | break; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | === Le code complet pour allumer la LED 9 et l’éteindre par reconnaissance vocale === | ||
+ | |||
+ | <code .c LED9.c> | ||
+ | #include " | ||
+ | #if !defined(SERIAL_PORT_MONITOR) | ||
+ | #error " | ||
+ | #endif | ||
+ | |||
+ | #if defined(SERIAL_PORT_USBVIRTUAL) | ||
+ | // Shield Jumper on HW (for Leonardo and Due) | ||
+ | #define port SERIAL_PORT_HARDWARE | ||
+ | #define pcSerial SERIAL_PORT_USBVIRTUAL | ||
+ | #else | ||
+ | // Shield Jumper on SW (using pins 12/13 or 8/9 as RX/TX) | ||
+ | #include " | ||
+ | SoftwareSerial port(12, 13); | ||
+ | #define pcSerial SERIAL_PORT_MONITOR | ||
+ | #endif | ||
+ | |||
+ | #include " | ||
+ | |||
+ | EasyVR easyvr(port); | ||
+ | |||
+ | //Groups and Commands | ||
+ | enum Groups | ||
+ | { | ||
+ | GROUP_0 | ||
+ | GROUP_1 | ||
+ | }; | ||
+ | |||
+ | enum Group0 | ||
+ | { | ||
+ | G0_ARDUINO = 0, | ||
+ | }; | ||
+ | |||
+ | enum Group1 | ||
+ | { | ||
+ | G1_ALLUME = 0, | ||
+ | G1_ETEINT = 1, | ||
+ | }; | ||
+ | |||
+ | int8_t group, idx; | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | pinMode(9, OUTPUT); | ||
+ | digitalWrite(9, | ||
+ | | ||
+ | // setup PC serial port | ||
+ | pcSerial.begin(9600); | ||
+ | |||
+ | // bridge mode? | ||
+ | int mode = easyvr.bridgeRequested(pcSerial); | ||
+ | switch (mode) | ||
+ | { | ||
+ | case EasyVR:: | ||
+ | // setup EasyVR serial port | ||
+ | port.begin(9600); | ||
+ | // run normally | ||
+ | pcSerial.println(F(" | ||
+ | pcSerial.println(F(" | ||
+ | break; | ||
+ | | ||
+ | case EasyVR:: | ||
+ | // setup EasyVR serial port (low speed) | ||
+ | port.begin(9600); | ||
+ | // soft-connect the two serial ports (PC and EasyVR) | ||
+ | easyvr.bridgeLoop(pcSerial); | ||
+ | // resume normally if aborted | ||
+ | pcSerial.println(F(" | ||
+ | pcSerial.println(F(" | ||
+ | break; | ||
+ | | ||
+ | case EasyVR:: | ||
+ | // setup EasyVR serial port (high speed) | ||
+ | port.begin(115200); | ||
+ | // soft-connect the two serial ports (PC and EasyVR) | ||
+ | easyvr.bridgeLoop(pcSerial); | ||
+ | // resume normally if aborted | ||
+ | pcSerial.println(F(" | ||
+ | pcSerial.println(F(" | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | while (!easyvr.detect()) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | delay(1000); | ||
+ | } | ||
+ | |||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | Serial.println(" | ||
+ | easyvr.setTimeout(10); | ||
+ | easyvr.setLanguage(5); | ||
+ | |||
+ | group = EasyVR:: | ||
+ | } | ||
+ | |||
+ | void action(); | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | if (easyvr.getID() < EasyVR:: | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | |||
+ | Serial.print(" | ||
+ | Serial.println(group); | ||
+ | easyvr.recognizeCommand(group); | ||
+ | |||
+ | do | ||
+ | { | ||
+ | // can do some processing while waiting for a spoken command | ||
+ | } | ||
+ | while (!easyvr.hasFinished()); | ||
+ | | ||
+ | if (easyvr.getID() < EasyVR:: | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | |||
+ | idx = easyvr.getWord(); | ||
+ | if (idx >= 0) | ||
+ | { | ||
+ | // built-in trigger (ROBOT) | ||
+ | // group = GROUP_X; <-- jump to another group X | ||
+ | return; | ||
+ | } | ||
+ | idx = easyvr.getCommand(); | ||
+ | if (idx >= 0) | ||
+ | { | ||
+ | // print debug message | ||
+ | uint8_t train = 0; | ||
+ | char name[32]; | ||
+ | Serial.print(" | ||
+ | Serial.print(idx); | ||
+ | if (easyvr.dumpCommand(group, | ||
+ | { | ||
+ | Serial.print(" | ||
+ | Serial.println(name); | ||
+ | } | ||
+ | else | ||
+ | Serial.println(); | ||
+ | // beep | ||
+ | easyvr.playSound(0, | ||
+ | // perform some action | ||
+ | action(); | ||
+ | } | ||
+ | else // errors or timeout | ||
+ | { | ||
+ | if (easyvr.isTimeout()) | ||
+ | Serial.println(" | ||
+ | int16_t err = easyvr.getError(); | ||
+ | if (err >= 0) | ||
+ | { | ||
+ | Serial.print(" | ||
+ | Serial.println(err, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void action() | ||
+ | { | ||
+ | switch (group) | ||
+ | { | ||
+ | case GROUP_0: | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G0_ARDUINO: | ||
+ | group = GROUP_1;// apres avoir dit le mot " | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case GROUP_1: | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G1_ALLUME: | ||
+ | digitalWrite(9, | ||
+ | group = GROUP_1;// on reste dans le groupe 1 | ||
+ | break; | ||
+ | case G1_ETEINT: | ||
+ | digitalWrite(9, | ||
+ | group = GROUP_1;// on reste dans le groupe 1 | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | le code qui commande l' | ||
+ | |||
+ | == les sons == | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | <code c meuhhh.c> | ||
+ | #include " | ||
+ | #if !defined(SERIAL_PORT_MONITOR) | ||
+ | #error " | ||
+ | #endif | ||
+ | |||
+ | #if defined(SERIAL_PORT_USBVIRTUAL) | ||
+ | // Shield Jumper on HW (for Leonardo and Due) | ||
+ | #define port SERIAL_PORT_HARDWARE | ||
+ | #define pcSerial SERIAL_PORT_USBVIRTUAL | ||
+ | #else | ||
+ | // Shield Jumper on SW (using pins 12/13 or 8/9 as RX/TX) | ||
+ | #include " | ||
+ | SoftwareSerial port(12, 13); // on déclare le port série virtuel sur les broches 12 et 13 pour le dialogue entre le Shield et l' | ||
+ | #define pcSerial SERIAL_PORT_MONITOR | ||
+ | #endif | ||
+ | |||
+ | #include " | ||
+ | |||
+ | EasyVR easyvr(port); | ||
+ | |||
+ | //Groups and Commands | ||
+ | enum Groups | ||
+ | { | ||
+ | GROUP_0 | ||
+ | GROUP_1 | ||
+ | GROUP_2 | ||
+ | GROUP_3 | ||
+ | // GROUP_0 correspond à l' | ||
+ | }; | ||
+ | |||
+ | enum Group0 | ||
+ | { | ||
+ | G0_ARDUINO = 0,// le son " | ||
+ | }; | ||
+ | |||
+ | enum Group1 | ||
+ | { | ||
+ | G1_ALLUME = 0,// le son " | ||
+ | G1_ETEINT = 1,// le son " | ||
+ | }; | ||
+ | |||
+ | enum Group2 | ||
+ | { | ||
+ | G2_TAP = 0, // le son " | ||
+ | G2_TAPTAP = 1,// le son " | ||
+ | }; | ||
+ | |||
+ | enum Group3 | ||
+ | { | ||
+ | G3_MIAOU = 0, // le son " | ||
+ | G3_MEUHHH = 1, // le son " | ||
+ | G3_ELEPHANT = 2, // le son " | ||
+ | }; | ||
+ | |||
+ | |||
+ | int8_t group, idx;// Déclare les variables " | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | pinMode(9, OUTPUT); // on declare la broche 9 de l' | ||
+ | digitalWrite(9, | ||
+ | | ||
+ | // setup PC serial port | ||
+ | pcSerial.begin(9600); | ||
+ | |||
+ | // bridge mode? | ||
+ | int mode = easyvr.bridgeRequested(pcSerial); | ||
+ | switch (mode) | ||
+ | { | ||
+ | case EasyVR:: | ||
+ | // setup EasyVR serial port | ||
+ | port.begin(9600); | ||
+ | // run normally | ||
+ | pcSerial.println(F(" | ||
+ | pcSerial.println(F(" | ||
+ | break; | ||
+ | | ||
+ | case EasyVR:: | ||
+ | // setup EasyVR serial port (low speed) | ||
+ | port.begin(9600); | ||
+ | // soft-connect the two serial ports (PC and EasyVR) | ||
+ | easyvr.bridgeLoop(pcSerial); | ||
+ | // resume normally if aborted | ||
+ | pcSerial.println(F(" | ||
+ | pcSerial.println(F(" | ||
+ | break; | ||
+ | | ||
+ | case EasyVR:: | ||
+ | // setup EasyVR serial port (high speed) | ||
+ | port.begin(115200); | ||
+ | // soft-connect the two serial ports (PC and EasyVR) | ||
+ | easyvr.bridgeLoop(pcSerial); | ||
+ | // resume normally if aborted | ||
+ | pcSerial.println(F(" | ||
+ | pcSerial.println(F(" | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | while (!easyvr.detect()) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | delay(1000); | ||
+ | } | ||
+ | |||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | Serial.println(" | ||
+ | easyvr.setTimeout(10); | ||
+ | easyvr.setLanguage(5); | ||
+ | |||
+ | group = EasyVR:: | ||
+ | } | ||
+ | |||
+ | void action(); // on test si on reconnais un son | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | if (easyvr.getID() < EasyVR:: | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | |||
+ | Serial.print(" | ||
+ | Serial.println(group); | ||
+ | easyvr.recognizeCommand(group); | ||
+ | |||
+ | do | ||
+ | { | ||
+ | // can do some processing while waiting for a spoken command | ||
+ | } | ||
+ | while (!easyvr.hasFinished()); | ||
+ | | ||
+ | if (easyvr.getID() < EasyVR:: | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | |||
+ | idx = easyvr.getWord(); | ||
+ | if (idx >= 0) | ||
+ | { | ||
+ | // built-in trigger (ROBOT) | ||
+ | // group = GROUP_X; <-- jump to another group X | ||
+ | return; | ||
+ | } | ||
+ | idx = easyvr.getCommand(); | ||
+ | if (idx >= 0) | ||
+ | { | ||
+ | // print debug message | ||
+ | uint8_t train = 0; | ||
+ | char name[32]; | ||
+ | Serial.print(" | ||
+ | Serial.print(idx); | ||
+ | if (easyvr.dumpCommand(group, | ||
+ | { | ||
+ | Serial.print(" | ||
+ | Serial.println(name); | ||
+ | } | ||
+ | else | ||
+ | Serial.println(); | ||
+ | // beep | ||
+ | easyvr.playSound(0, | ||
+ | // perform some action | ||
+ | action(); | ||
+ | } | ||
+ | else // errors or timeout | ||
+ | { | ||
+ | if (easyvr.isTimeout()) | ||
+ | Serial.println(" | ||
+ | int16_t err = easyvr.getError(); | ||
+ | if (err >= 0) | ||
+ | { | ||
+ | Serial.print(" | ||
+ | Serial.println(err, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void action() | ||
+ | { | ||
+ | switch (group) | ||
+ | { | ||
+ | case GROUP_0: | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G0_ARDUINO: | ||
+ | // write your action code here | ||
+ | // group = GROUP_X; <-- or jump to another group X for composite commands | ||
+ | group = GROUP_3; | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case GROUP_1: | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G1_ALLUME: | ||
+ | digitalWrite(9, | ||
+ | group = GROUP_1; | ||
+ | break; | ||
+ | case G1_ETEINT: | ||
+ | digitalWrite(9, | ||
+ | group = GROUP_2; | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case GROUP_2: | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G2_TAP: | ||
+ | | ||
+ | group = GROUP_2; | ||
+ | break; | ||
+ | case G2_TAPTAP: | ||
+ | digitalWrite(9, | ||
+ | group = GROUP_3; | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case GROUP_3: | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G3_MIAOU: | ||
+ | digitalWrite(9, | ||
+ | group = GROUP_3; | ||
+ | break; | ||
+ | case G3_MEUHHH: | ||
+ | digitalWrite(9, | ||
+ | group = GROUP_3; | ||
+ | break; | ||
+ | case G3_ELEPHANT: | ||
+ | digitalWrite(9, | ||
+ | group = GROUP_3; | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | === les commandes en mode implicite === | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Le programme pour allumer/ | ||
+ | <code .cpp ROBOTLED9.cpp> | ||
+ | #include " | ||
+ | #if !defined(SERIAL_PORT_MONITOR) | ||
+ | #error " | ||
+ | #endif | ||
+ | |||
+ | #if defined(SERIAL_PORT_USBVIRTUAL) | ||
+ | // Shield Jumper on HW (for Leonardo and Due) | ||
+ | #define port SERIAL_PORT_HARDWARE | ||
+ | #define pcSerial SERIAL_PORT_USBVIRTUAL | ||
+ | #else | ||
+ | // Shield Jumper on SW (using pins 12/13 or 8/9 as RX/TX) | ||
+ | #include " | ||
+ | SoftwareSerial port(12, 13); | ||
+ | #define pcSerial SERIAL_PORT_MONITOR | ||
+ | #endif | ||
+ | |||
+ | #include " | ||
+ | |||
+ | EasyVR easyvr(port); | ||
+ | |||
+ | |||
+ | int8_t group, idx; | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | |||
+ | pinMode(9, OUTPUT); | ||
+ | digitalWrite(9, | ||
+ | | ||
+ | // setup PC serial port | ||
+ | pcSerial.begin(9600); | ||
+ | |||
+ | // bridge mode? | ||
+ | int mode = easyvr.bridgeRequested(pcSerial); | ||
+ | switch (mode) | ||
+ | { | ||
+ | case EasyVR:: | ||
+ | // setup EasyVR serial port | ||
+ | port.begin(9600); | ||
+ | // run normally | ||
+ | pcSerial.println(F(" | ||
+ | pcSerial.println(F(" | ||
+ | break; | ||
+ | | ||
+ | case EasyVR:: | ||
+ | // setup EasyVR serial port (low speed) | ||
+ | port.begin(9600); | ||
+ | // soft-connect the two serial ports (PC and EasyVR) | ||
+ | easyvr.bridgeLoop(pcSerial); | ||
+ | // resume normally if aborted | ||
+ | pcSerial.println(F(" | ||
+ | pcSerial.println(F(" | ||
+ | break; | ||
+ | | ||
+ | case EasyVR:: | ||
+ | // setup EasyVR serial port (high speed) | ||
+ | port.begin(115200); | ||
+ | // soft-connect the two serial ports (PC and EasyVR) | ||
+ | easyvr.bridgeLoop(pcSerial); | ||
+ | // resume normally if aborted | ||
+ | pcSerial.println(F(" | ||
+ | pcSerial.println(F(" | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | while (!easyvr.detect()) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | delay(1000); | ||
+ | } | ||
+ | |||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | Serial.println(" | ||
+ | easyvr.setTimeout(5); | ||
+ | easyvr.setLanguage(5); | ||
+ | | ||
+ | group = 0; //<-- start group (considering to start from custom grammar 0) | ||
+ | } | ||
+ | |||
+ | void action(); | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | if (easyvr.getID() < EasyVR:: | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | |||
+ | Serial.print(" | ||
+ | Serial.println(group); | ||
+ | easyvr.recognizeWord(group); | ||
+ | // | ||
+ | |||
+ | do | ||
+ | { | ||
+ | // can do some processing while waiting for a spoken command | ||
+ | } | ||
+ | while (!easyvr.hasFinished()); | ||
+ | | ||
+ | if (easyvr.getID() < EasyVR:: | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | |||
+ | /* This part of the code is not needed if using SI commands only (excluding the built-in trigger ROBOT) | ||
+ | if (idx >= 0) | ||
+ | { | ||
+ | // built-in trigger (ROBOT) | ||
+ | // group = GROUP_X; <-- jump to another group X | ||
+ | return; | ||
+ | } | ||
+ | idx = easyvr.getCommand(); | ||
+ | */ | ||
+ | | ||
+ | idx = easyvr.getWord(); | ||
+ | if (idx >= 0) | ||
+ | { | ||
+ | // print debug message for SI commands | ||
+ | uint8_t flags, num; | ||
+ | char name[32]; | ||
+ | Serial.print(" | ||
+ | Serial.print(idx); | ||
+ | if (easyvr.dumpGrammar(group, | ||
+ | for (int8_t i = 0; i <= idx; ++i) easyvr.getNextWordLabel(name); | ||
+ | pcSerial.print(F(" | ||
+ | pcSerial.println(name); | ||
+ | | ||
+ | // beep | ||
+ | easyvr.playSound(0, | ||
+ | // perform some action | ||
+ | action(); | ||
+ | } | ||
+ | else // errors or timeout | ||
+ | { | ||
+ | if (easyvr.isTimeout()) | ||
+ | Serial.println(" | ||
+ | int16_t err = easyvr.getError(); | ||
+ | if (err >= 0) | ||
+ | { | ||
+ | Serial.print(" | ||
+ | Serial.println(err, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void action() | ||
+ | { | ||
+ | switch (group) | ||
+ | { | ||
+ | case 0: // groupe TRIGGER | ||
+ | switch (idx) | ||
+ | { | ||
+ | case 0: | ||
+ | | ||
+ | group = 1; // saute au Groupe WORDSET N°1 | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case 1: // Groupe WORDSET N°1 | ||
+ | switch (idx) | ||
+ | { | ||
+ | case 0: | ||
+ | digitalWrite(9, | ||
+ | group = 1; | ||
+ | break; | ||
+ | | ||
+ | case 6: | ||
+ | digitalWrite(9, | ||
+ | group = 1; | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | == Programme de commande d'une LED et d'un servo-moteur par reconnaisance vocale == | ||
+ | |||
+ | |||
+ | <code c lumiere.ino> | ||
+ | |||
+ | #if defined(ARDUINO) && ARDUINO >= 100 | ||
+ | #include " | ||
+ | #include " | ||
+ | SoftwareSerial port(12, | ||
+ | #else // Arduino 0022 - use modified NewSoftSerial | ||
+ | #include " | ||
+ | #include " | ||
+ | NewSoftSerial port(12, | ||
+ | #endif | ||
+ | |||
+ | #include " | ||
+ | EasyVR easyvr(port); | ||
+ | |||
+ | //Groups and Commands | ||
+ | enum Groups | ||
+ | { | ||
+ | GROUP_0 | ||
+ | GROUP_1 | ||
+ | GROUP_2 | ||
+ | GROUP_3 | ||
+ | }; | ||
+ | |||
+ | enum Group0 | ||
+ | { | ||
+ | G0_ADAM = 0, | ||
+ | }; | ||
+ | |||
+ | enum Group1 | ||
+ | { | ||
+ | G1_VEILLE = 0, | ||
+ | G1_LUMIERE = 1, | ||
+ | }; | ||
+ | |||
+ | enum Group2 | ||
+ | { | ||
+ | G2_ACTIVATION = 0, | ||
+ | }; | ||
+ | |||
+ | enum Group3 | ||
+ | { | ||
+ | G3_OUI = 0, | ||
+ | G3_NON = 1, | ||
+ | }; | ||
+ | |||
+ | |||
+ | EasyVRBridge bridge; | ||
+ | |||
+ | int8_t group, idx, LED; | ||
+ | |||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | // bridge mode? | ||
+ | if (bridge.check()) | ||
+ | { | ||
+ | cli(); | ||
+ | bridge.loop(0, | ||
+ | } | ||
+ | // run normally | ||
+ | Serial.begin(9600); | ||
+ | port.begin(9600); | ||
+ | |||
+ | if (!easyvr.detect()) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | for (;;); | ||
+ | } | ||
+ | enum Level {NORMAL}; | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | Serial.println(" | ||
+ | easyvr.setTimeout(10); | ||
+ | easyvr.setLanguage(5); | ||
+ | easyvr.setKnob(0); | ||
+ | easyvr.setLevel(2); | ||
+ | |||
+ | |||
+ | group = EasyVR:: | ||
+ | } | ||
+ | |||
+ | void action(); | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | |||
+ | Serial.print(" | ||
+ | Serial.println(group); | ||
+ | easyvr.recognizeCommand(group); | ||
+ | |||
+ | do | ||
+ | { | ||
+ | // can do some processing while waiting for a spoken command | ||
+ | } | ||
+ | while (!easyvr.hasFinished()); | ||
+ | |||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | |||
+ | idx = easyvr.getWord(); | ||
+ | if (idx >= 0) | ||
+ | { | ||
+ | // built-in trigger (ROBOT) | ||
+ | // group = GROUP_X; <-- jump to another group X | ||
+ | return; | ||
+ | } | ||
+ | idx = easyvr.getCommand(); | ||
+ | if (idx >= 0) | ||
+ | { | ||
+ | // print debug message | ||
+ | uint8_t train = 0; | ||
+ | char name[32]; | ||
+ | Serial.print(" | ||
+ | Serial.print(idx); | ||
+ | if (easyvr.dumpCommand(group, | ||
+ | { | ||
+ | Serial.print(" | ||
+ | Serial.println(name); | ||
+ | } | ||
+ | else | ||
+ | Serial.println(); | ||
+ | |||
+ | // perform some action | ||
+ | action(); | ||
+ | } | ||
+ | else // errors or timeout | ||
+ | { | ||
+ | if (easyvr.isTimeout()) | ||
+ | Serial.println(" | ||
+ | int16_t err = easyvr.getError(); | ||
+ | if (err >= 0) | ||
+ | { | ||
+ | Serial.print(" | ||
+ | Serial.println(err, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void action() | ||
+ | { | ||
+ | switch (group) | ||
+ | { | ||
+ | case GROUP_0: | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G0_ADAM: | ||
+ | easyvr.playSound(7, | ||
+ | group = GROUP_1; | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case GROUP_1: | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G1_VEILLE: | ||
+ | if (LED == 1) | ||
+ | { | ||
+ | | ||
+ | group = GROUP_3; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | | ||
+ | group = GROUP_2; | ||
+ | } | ||
+ | break; | ||
+ | case G1_LUMIERE: | ||
+ | if (LED == 1) | ||
+ | { | ||
+ | LED = 0; | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | easyvr.playSound(9, | ||
+ | group = GROUP_1; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | LED = 1; | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | easyvr.playSound(8, | ||
+ | group = GROUP_1; | ||
+ | } | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case GROUP_2: | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G2_ACTIVATION: | ||
+ | easyvr.playSound(2, | ||
+ | group = GROUP_0; | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case GROUP_3: | ||
+ | switch (idx) | ||
+ | { | ||
+ | case G3_OUI: | ||
+ | LED = 0; | ||
+ | easyvr.playSound(1, | ||
+ | easyvr.setPinOutput(EasyVR:: | ||
+ | group = GROUP_2; | ||
+ | break; | ||
+ | case G3_NON: | ||
+ | easyvr.playSound(1, | ||
+ | group = GROUP_2; | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | // | ||
+ | |||
+ | Voici le code, explication plus en détails : | ||
+ | |||
+ | <code c> | ||
+ | easyvr.playSound(1, | ||
+ | </ | ||
+ | |||
+ | Cette ligne a pour fonction de sélectionner un enregistrement préalablement fait sur Audacity (ou autre) lorsqu' | ||
+ | |||
+ | Cet enregistrement est à envoyer sur la carte à l'aide de QuickSynthesis, | ||
+ | http:// | ||
+ | |||
+ | qui permet d' | ||
+ | |||
+ | Si on décortique ce qu'il y a entre parenthèses, | ||
+ | |||
+ | <code c> | ||
+ | case G1_LUMIERE: | ||
+ | if (LED == 1) | ||
+ | </ | ||
+ | Plus de détails sur ces deux lignes : La première ligne correspond à l' | ||
+ | === Les Liens === | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | [[https:// |
/home/chanteri/www/fablab37110/data/pages/start/arduino/easyvr.txt · Dernière modification : 2023/06/05 17:26 de gerardadmin