start:arduino:easyvr
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| start:arduino:easyvr [2018/10/06 07:29] – [Programme de commande d'une LED et d'un servo-moteur par reconnaisance vocale] gerardadmin | start:arduino:easyvr [2023/06/05 17:26] (Version actuelle) – [Démarrage rapide avec un Arduino Uno] 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 [[https:// | ||
| + | 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:// | ||
