Création d’un module Assistant Vocal Portable par Wifi avec un Wemos D1 Mini et le module Voice Recognition 3
27 août 2021Bonjour je m’appelle Colas Sigel et dans le cadre de mon stage de 2ème année d’ingénieur, il m’a été confié la tâche de fabriquer un assistant vocal portable. Il sera composé d’un module programmable VR3 qui par l’intermédiaire d’un Wemos D1 mini communiquera en Wifi avec le protocole MQTT et permettra d’envoyer des informations à votre serveur domotique (ici nous utiliserons Jeedom).
Sommaire
- Matériel et prérequis
- Partie 1 : Programmation initiale du module de reconnaissance vocale
- Partie 2 : Programmation du module portable
- Partie 3 : Fabrication du module portable
- Boitier de fabrication
- Conclusion
1. Matériel et prérequis
Pour la réalisation de ce projet vous aurez besoin de
Une carte Wemos D1 Mini
Le module Voice Recognition 3 de Elechouse avec son microphone
Un module convertisseur USB vers TTL
Une Arduino UNO (pour la programmation initiale)
De fils électroniques
Un broker MQTT avec son adresse IP et son port
Installation de Mosquitto –> Je vous conseille le site suivant https://projetsdiy.fr/jeedom-mqtt-objets-connectes-domotique-diy/
Un serveur Jeedom avec le plugin jMQTT installé
Installation de Jeedom — > Voir mon précédent article https://miniprojets.net/index.php/2019/05/13/jeedom-ou-comment-domotiser-sa-maison-en-quelques-clics/
Partie 1 : Programmation initiale du module de reconnaissance vocale
Dans un premier temps nous allons nous occuper de programmer le module de reconnaissance vocale « Voice Recognition 3 » (VR3).
La programmation du module VR3 se fait via la liaison UART (Rx/Tx) or pour programmer le VR3 nous avons également besoin d’accéder à cette liaison UART pour accéder au Moniteur Sérial de l’IDE Arduino. A cause de cela, nous ne pouvons pas utiliser le module Wemos D1Mini car celui ci ne propose qu’une seule liaison UART (Rx/Tx). Afin de palier à ce problème, nous allons utiliser une carte Arduino Uno comme préconisé par le constructeur Elechouse du module VR3 sur son tutoriel.
A) Mise en place de la partie programmable
Pour prendre en main le VR3, nous allons suivre le tutoriel proposé par le constructeur Elechouse :
https://www.elechouse.com/elechouse/index.php?main_page=product_info&products_id=2254
Sur cette page, vous trouverez un manuel d’utilisation, la librairie Arduino et des vidéos explicatives. Je vous conseille de télécharger le manuel et obligatoire la librairie pour Arduino.
Une fois la librairie téléchargée, il vous faut extraire le dossier! Choisissez un endroit facile d’accès !!
Ouvrez le dossier extrait : Vous devriez arrivez sur ça
Allez dans le dossier Examples -> vr_sample_train -> et ouvrez le fichier vr_sample_train.ino
L’IDE Arduino s’ouvre sur ce programme :
Maintenant, il faut connecter le module à l’Arduino comme ceci :
GND Arduino -> GND VR3
5V Arduino -> 5V VR3
Pin 3 Arduino -> RX VR3
Pin 2 Arduino -> TX VR3
Il suffit maintenant de connecter l’Arduino à votre ordinateur via USB et de brancher le microphone fourni au module VR3.
Choisissez le bon port sur IDE puis téléverser le programme.
Ouvrez le moniteur Série (n’oubliez pas de fixer les bauds à 115200), il apparait alors sur le moniteur les instructions suivantes:
Je passe les détails sur les différents types de commande (vous pouvez trouver les informations sur le manuel). Mais nous allons ici nous intéresser à la commande « sigtrain », « load » et « vr ».
Dans un premier temps, tapez la commande « vr ». Si vous avez tout bien suivi, vous devriez voir la réponse suivante :
Attention : si vous avez la réponse « check Recognizer failed or timeout. », vérifiez votre câblage et recommencez.
Si tout est bon, alors on peut continuer :
B) Enregistrement des commandes vocales
La commande qui va nous intéressez est la commande sigtrain, cette commande va permettre d’enregistrez vos commandes vocales en leur associant une signature (c’est à dire un nom de commande). (La commande train ne permet pas d’associer des noms de commande, seul le numéro d’enregistrement associé permet de connaître la commande… ce qui oblige à se remémorer le numéro d’enregistrement associé à la commande… Complexe). je vous conseille la méthode « J’écris sur un bout de papier pour me rappeler » ^^.
Mais revenons à nos moutons et commençons l’apprentissage. Pour cela, nous utiliserons la commande sigtrain.
La commande sigtrain fonctionne très simplement à l’aide de 2 paramètres : le premier est le numéro d’enregistrement que l’on veut modifier et le deuxième est la signature que l’on veut associer :
Exemple : sigtrain 0 allumeSalle
L’enregistrement se déroule en 2 étapes -> Un premier enregistrement de la commande lorsque le moniteur série vous indique « Speak Now » (et la LED du VR3 clignote rouge) où vous allez prononcer à voix haute façe au micro « Allume la salle ».
Puis un deuxième enregistrement lorsque le moniteur série vous indique « Speak again » (et la LED du VR3 clignote rouge à novueau après un clignotement jaune) où vous allez prononcer de la même manière « Allume la salle ».
Si l’enregistrement a marché, alors la LED jaune et rouge s’allume en même temps et le moniteur série vous indique « Success : 1 » avec le nom de votre signature « SIG : allumeSall » (la signature est tronquée pour la place).
Si l’enregistrement ne marche pas, le moniteur série vous fait recommencer, il existe plusieurs types d’erreurs tel que « Can’t matched » si les deux enregistrement ne coïncident pas, ou « too noisy » si il y a trop de bruit avoisinant.
Exemple d’enregistrement avec une erreur « too noisy »
Voilà, vous avez enregistré votre commande « allume la salle » avec la signature allumeSalle.
Dans ce tutoriel et pour la suite, nous allons enregistrer 3 autres commandes :
- sigtrain 1 eteinsSalle où vous dites « Eteins la salle »
- sigtrain 2 getTemperature où vous dites « Quelle est la température »
- sigtrain 3 getTime où vous dites « Quelle heure est-il? »
Une fois vos 3 enregistrements terminés, tapez la commande suivante :
load 0 1 2 3
puis tapez la commande vr
Si vous voyez cette même réponse c’est bon vous avez fini la première partie ! Vos commandes vocales sont prêtes :
Je vous préconise de noter quelque part votre commande vocale avec son numéro d’enregistrement et sa signature qui servira dans le programme suivant.
Vous pouvez directement les tester :
Par exemple dites « allume la salle » , vous devriez voir alors ça sur le moniteur série :
Partie 2 : Programmation du module portable
Si vous êtes là, c’est que vos commandes vocales sont prêtes, nous allons maintenant voir pour les exploiter. Ces commandes vocales vont permettre de commander votre maison via le protocole MQTT et un serveur Jeedom. (Il est donc nécessaire de posséder un broker MQTT fonctionnel avec l’adresse IP et son port).
A) Programmation sur Arduino du module Wemos D1 Mini (Wifi + MQTT + Reconnaissance vocale)
Dans un premier temps, nous allons d’abord faire le cablâge adéquat. Munissez vous de votre Wemos D1 Mini, de votre module Voice Recognition 3 tout fraîchement programmé et de votre convertisseur USB to TTL.
Et câblez le tout ainsi :
VR3 – WEMOS :
GND -> GND
VCC -> 5V
RXD -> TX
TXD -> RX
USB TO TTL -> WEMOS :
GND -> GND
RX –> D4
Une fois le tout câblé, nous pouvons passer à la programmation.
Le convertisseur USB To TTL est essentiel pour pouvoir afficher les informations et ne pas travailler à l’aveugle. En effet, durant le fonctionnement du programme, les pins RX et TX du Wemos sont utilisés par le module VR. La liaison série Serial avec le câble USB ne se fait donc pas. C’est pour cela qu’on utilise un convertisseur USB To TTL qui permet de récupérer ces données via le Serial1 (TX1 qui se trouve en pin D4 sur le Wemos).
Configuration du Wemos
Pour travailler avec le Wemos D1 Mini, il nous faut sa librairie et son pilote.
Comme indiqué sur la page de la librairie :
Allez sur l’IDE arduino -> Fichier -> Préférences puis rentrer dans la barre « URL de gestionnaires de cartes supplémentaires » : https://arduino.esp8266.com/stable/package_esp8266com_index.json
Rendez-vous dans Outils -> Type de carte -> Gestionnaire de carte.
Tapez esp8266 dans la barre de recherche puis installer la dernière version du gestionnaire de carte esp8266.
Maintenant, on va installer la bibliothèque qui gère le protocole MQTT : PubSubClient.h et la bibliothèque qui gère les events JSON.
Télécharger cette bibliothèque : PubSubClient-2.8.zip puis allez dans Arduino IDE -> Croquis -> Inclure un bibliothèques -> Ajouter une bibliothèque .ZIP puis sélectionnez votre .ZIP téléchargée.
Maintenant, on installe la bibliothèque JSON en allant dans Outils -> Gérer les bibliothèques et tapez ArduinoJson dans la barre de recherche -> Installez la bibliothèque ArduinoJson by Benoit Blanchon
On va vérifier que tout est bien installer en allant Croquis -> Inclure un bibliothèques et cherchez dans les bibliothèques les bibliothèques ArduinoJson, PubSubClient, et ESP8266WiFi et VoiceRecognition3.
Si vous voyez toutes les bibliothèques on va pouvoir passer à la suite :
Téléchargez ce programme Arduino , extrayez le et ouvrez le avec Arduino IDE :
Vous devez alors avoir ça : (un programme de 334 lignes)
Changez les paramètres de votre WIFI et rentrez l’adresse IP de votre broker MQTT et le port (ligne 69) :
Choisissez le bon port auquel est connecté votre Wemos D1 Mini : Allez dans Outils -> Type de carte -> ESP8266 Modules -> LOLIN(WEMOS) D1 R2 & mini
Puis sélectionnez le bon port auquel votre Wemos est branché par USB.
Déconnectez les câbles Rx et Tx du VR3 :
Comme les pins RX et TX du Wemos sont ceux utilisés lors du téléversement par Arduino IDE, il est important de déconnecter les fils entre le VR3 et le WEMOS lors du téléversement.
Une fois le téléversement effectué, vous pouvez recâbler et réinitialiser le programme en appuyant sur le bouton reset du Wemos.
Maintenant que vous avez téléversé le programme (Téléversement terminé), changez de port et choisissez le port sur lequel votre convertisseur USB To TTL est branché, puis ouvrez le moniteur série dans Outils -> Moniteur Série.
Appuyez sur le bouton reset du Wemos. Il devrait clignoter 5 fois en bleu puis devrait apparaitre sur votre moniteur Série :
Vous devriez voir apparaitre :
Votre programme fonctionne.
Mais ce que vous ne savez pas, c’est qu’en parallèle, votre Wemos envoie la même commande via MQTT au broker !!!
Vous n’avez plus qu’à récupérer cette commande via Jeedom.
Fonctionnement du programme :
Les fonctions sont expliquées dans le programme.
L’initialisation du tableau de commande est à remplir soigneusement :
/*Ici on crée un tableau de commande, c'est à remplir manuellement avec les noms de commandes que l'on a enregistré (c'est à dire les signatures)
* on y associe le topic et l'état de la commande.
*/
/*FORMAT A REMPLIR :
{
{"nomCommande"],{"topicCommandeMQTT/sousTopic"},etatCommande
}
,
{
{"nomCommande2"],{"topicCommandeMQTT/sousTopic2"},etatCommande2
}
,
etc.
* VEILLEZ A REMPLIR LES COMMANDES DANS LE MEME ORDRE QUE L'ENREGISTREMENT
* (le numéro d'enregistrement de la commande avec la signature "allumeSalle" doit correspondre à l'indice du tableau
* avec le nom de commande "allumeSalle", ici c'est l'enregistrement 0 et l'indice 0.
*/
Ensuite vient :
Initialisation de la connexion internet et la connexion au broker MQTT
Initialisation de la liaison Série via le convertisseur USB To TTL
Initialisation entre le module VR3 et le WEMOS D1 Mini.
Le fonctionnement général du programme se déroule en 3 étapes :
- Réception de la commande vocale : Lorsque vous prononcez une commande telle que « Quelle heure est-il? », le module VR3 comprend la commande et l’associe à un numéro d’enregistrement et une signature, il envoie ces deux informations au module WEMOS dans la variable buf :
- Traduction de la commande vocale en évènement JSON : Le module WEMOS reçoit une commande vocale, il va comparer le numéro d’enregistrement envoyé avec le numéro de commande du tableau de commande fournie au début du programme, il va ensuite remplir les variables à envoyer (nomCommande, topicActuel, etatCommande) avec le tableau de commande que l’on retrouve au début du programme et à remplir soi-même en fonction des commandes vocales et des besoins. On a alors un event JSON de la forme :
{"Message":"allumeSalle","topic":"CommandesLampes","etat":1}
- Envoi de la commande vocale :
B) Liaison avec JeeDom
Allez sur votre serveur Jeedom, allez sur la page du plugin jMQTT (si vous n’avez pas installé le plugin, installez le et activez le).
Sur la page du plugin, allez dans Ajouter un broker en nom de broker, nommez le comme vous le souhaitez (dans mon cas BrokerMQTT_Tuto)
Dans équipement cliquez sur « Activer », puis allez dans Broker et rentrez vos informations du broker MQTT.
IP de mosquitto et Port de mosquitto
Cliquez sur sauvegarder, le « Démon » devient vert.
Revenez à la page du plugin, vous devriez voir ça :
Cliquez sur Mode Inclusion
Et énoncez chacune de vos commandes une par une
« Allume la salle », « Eteins la salle », « Quelle heure est-il? », « Quelle est la température? »
Il devrait apparaître le topic du MQTT :
Cliquez sur le topic VRToNetwork et allez dans commandes, vous devriez voir ça :
Cliquez sur JSON à droite, cela permet de décomposer la commande en sous groupe détaillé :
Exemple : On va commander les lampes : (il est nécessaire d’avoir une lampe connectée à Jeedom !!) :
Dans la commande CommandesLampes, il y a plusieurs informations : le nom de la commande, le topic de la commande et l’état de la commande (qui est soit de 1 lorsque l’on dit « Allume la salle » soit de 0 lorsque l’on dit « Eteins la salle »).
En face de cet état, dans nom de l’info donnez lui un nom tel que « etatLampes » ou « etatSalle » puis cliquez sur sauvegarder, vous devriez voir alors ça :
Maintenant, on va contrôler la lampe.
Dans Jeedom -> Outils -> Scénario, ajoutez un scénario que vous nommez allumeLampe -> Ok
Puis
Allez dans l’onglet scénario et cliquez sur Ajouter bloc :
Puis dans le bloc Si
Puis dans le alors, ajouter une action qui allume votre lampe.
Rajoutez un sinon si avec la condition que l’etatSalle vaut 0 associée à une action qui éteint la lampe :
Cliquez sur sauvegarder.
Maintenant prononcez la commande « Allume la salle », votre lampe doit s’allumer !
Prononcez « Eteins la salle », votre lampe doit s’éteindre !
Bravo ! Vous avez réussi à contrôler votre lampe via une commande vocale envoyé par Wifi !
Il ne reste plus qu’à rendre ce module portable !
Les prochaines étapes seront de fabriquer un PCB qui permet de basculer en mode programmtion ou exploitation facilement puis de rendre plus compacte le module et de pouvoir le mettre dans un boitier imprimé en 3D.
J’espère que cet article vous a plu et vous a donné l’envie de faire votre propre assistant vocal.
Je vous souhaite une bonne journée,
Colas Sigel