Laboratoire SUPINFO de recherche en robotique

Parce que robotique rime avec domotique

Parce que robotique rime avec domotique

30 sept, 2013

Introduction

 

Avec l’avancée des technologies de synthèse vocale, de reconnaissance vocale et faciale, la domotique est désormais à la portée de tous, et à moindre frais. Imaginez, vous demandez l’heure, la météo ou même votre agenda de la journée et l’ordinateur vous répond oralement. Mieux encore, faites interagir l’ordinateur avec le monde réel, ouvrez les volets électriques, allumez la lumière, contrôlez votre télévision, rien qu’à la voix ! C’est ce que nous permet le Projet S.A.R.A.H. dont le but est de faciliter, standardiser et unifier la façon de développer une application domotique.

Bref, j’ai testé ça pour vous, et je vais vous montrer que c’est à porté de clavier et de neurone.

 

Recevoir l’information : la reconnaissance vocale

 

Tout d’abord on va télécharger S.A.R.A.H (attention lien direct), et vous vous apercevrez que S.A.R.A.H. n’est disponible que sous windows car le projet utilise la reconnaissance vocale et faciale de microsoft embarquée à windows, qui est très performante en raison du développement de la kinect et des contrats passés avec le FBI, malheureusement à ce jour il ne semble pas encore exister une technologie libre aussi performante.

Le principe de S.A.R.A.H. est simple : Un XML utlisé par l’API Microsoft Speech dans lequel nous mettrons les phrases à reconnaitre d’un côté, et un script en nodejs qui peut retourner une valeur que S.A.R.A.H. va exprimer oralement grâce à la synthèse vocale.

Le tout fonctionne par plugin, il suffit de créer un dossier du nom voulu et de créer à l’intérieur le XML, le javascript et un fichier .prop permettant de décrire le plugin

Voilà comment se présente le XML qui me sert à lancer un script nodeJS lorsque les bonnes phrases ont été prononcées :

<grammar version="1.0" xml:lang="fr-FR" mode="voice" root="ruleLight" xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
    <rule id="ruleLight" scope="public">
        <example>Amanda, allume la lampe</example>
        <tag>out.action=new Object(); </tag>
        <item weight=".2">AMANDA</item>
        <one-of>
            <item>Allume<tag>out.action.a="on"</tag></item>
            <item>Eteind<tag>out.action.a="off"</tag></item>
        </one-of>
        <one-of>
           <item>la lumière</item>
    	   <item>la lampe</item>
        </one-of>
        <tag>out.action._attributes.play = "medias/qrcode.mp3"</tag>
        <tag>out.action._attributes.uri="http://127.0.0.1:8080/sarah/lumiere";</tag>
    </rule>
</grammar>

La grammaire vocale est rapide à comprendre et les balises utilisées sont assez parlante, pour plus de renseignements, vous pouvez aller directement sur la doc de microsoft.

Une des phrases <item> doit être prononcée dans chaque balise <one-of> pour que la suite du code soit executé.

<tag>out.action.a= »on »</tag> déclare la variable a de valeur « on », elle sera envoyé via méthode GET au nodeJS

<tag>out.action._attributes.uri="http://127.0.0.1:8080/sarah/lumiere";</tag> signifie que SARAH va répondre vocalement le retour du script lumiere.js, le script ne sera lancé que si les règles de la balise <rules> ont été appliqué.

Et lumiere.js :

var http = require('http');

exports.action = function(data, callback, config)
{
	var options = {
	  host: '10.0.0.2', //adresse ip du raspberry pi
	  port: 8080,
	  path: '/light?a='+data.a //notre variable a qui vaut "on" ou "off"
	};

	http.get(options); //requete http vers le raspberry : "http://10.0.0.2:8080/light?a="+data.a

	if(data.a == "on") text = "lampe allumée !";
	else if(data.a == "off") text = "Ok, j'éteint la lampe !";
	callback({'tts': text}); //retour : sarah va repondre ce que contient var text
}

Oh, et j’allais oublié, le fichier lumiere.prop :

{
  "modules" : { 
    "lumiere"  : {
      "description": "Amanda allume la lumiere",
      "version"    : "1.0"
    }
  }
}

 

Déclancher les broches GPIO du raspberry PI

 

Pour pouvoir allumer ma lampe lorsque la bonne phrase sera reconnue, on va utiliser les broches GPIO d’un raspberry pi qui permettent d’envoyer ou non un courant continu 5V. Pour se faire, j’ai choisis de mettre en place un serveur nodeJS accessible sur le raspberry pi : c’est simple à mettre en place, il existe plusieurs libraries de contrôle du GPIO et une simple requête http suffit (on peut imaginer faire un back-office en php, pourquoi pas ?).

Pour information, j’ai utilisé la distribution raspbian.

Tout d’abord on va activer la broche qui nous intéresse :

sudo su
cd /sys/class/gpio/
echo 7 > export
cd gpio7
echo out > direction
Maintenant, on peut mettre en place notre serveur http qui va s’occuper d’allumer ou d’éteindre notre broche GPIO grâce à la librairie pi-gpio préalablement installée.
var http = require("http");
var url = require('url');
var querystring = require('querystring');
var gpio = require('pi-gpio');

var server = http.createServer(function (request, response) 
{
		response.writeHead(200);
	var page = url.parse(request.url).pathname;
	var params = querystring.parse(url.parse(request.url).query)

	if (page == "/light") 
	{
		if (params['a'] == 'on') 
		{
			response.end('on');
			var action = 1;
		}
		else if (params['a'] == 'off') 
		{
			response.end('off');
			var action = 0;
		}
		gpio.open(26, "output", function(err) 
		{
			console.log(err);
			console.log(action);
			gpio.write(26, action, function() 
			{
				gpio.close(26);
			});
		});
	} 
});
server.listen(8080);
Un lecteur avisé remarquera que j’ai utilisé le nombre 26 pour allumer ma broche alors que plus haut j’ai initialisé la broche GPIO 7. En effet la broche GPIO 7 est le 26ème pin du raspberry, et pi-gpio nécessite le vrai numéro physique. Oh et j’allais oublié, en cherchant un peu sur google on peut trouver les correspondances, comme je suis un mec sympa je vous met le schéma le plus sexy que j’ai pu trouver.

Pour éviter de me faire écouter à mon insu (tout peut arriver) j’ai décidé de couper le windows du monde extérieur (notamment internet) et de le relier de la façon la plus bête possibles au raspberry : un cable éthernet et 1 adresse ip fixe pour chaque ordinateur. Pour vérifier la connexion, faites un ping depuis windows sur le raspbian, il vous répondra (alors que l’inverse n’est pas sûr). Maintenant, une bonne façon de vérifier si le serveur de notre raspeberry pi marche est simplement de taper dans le navigateur « localhost:8080/light?a=on ».

Allumer cette lampe qui ne demande que ça

 

Ca y est, on allume et on éteint notre broche GPIO à la voix. Il est temps de tester si c’est pas du flan.

J’ai acheté un relais qui fonctionne comme un interrupteur, dont le but est de faire passer le 220V alternatif domestique dans la lampe (circuit de puissance) dès que le 5V du raspberry pi passe dans le circuit de contrôle.


Mon relais 2 canaux. Au dessus, 4 broches pour le circuit de contrôle : VCC/GND pour le courant 5V, CH1 et CH2 les contrôles des canaux.

Avec le 220V, faites gaffe car il y a un fort risque d’électrocution (donc mortel), surtout, ne touchez jamais votre montage tant qu’une prise est branchée au mur ! Si vous ne le sentez pas, faites ça avec un connaisseur.

Bon et bien voilà on monte le tout, le 5V du raspberry sur le 5V du relais (VCC), la masse (GND) sur la masse, et la broche GPIO qu’on contrôle (en l’occurrence la 7 chez moi) sur le canal que l’on souhaite ouvrir ou fermer. De l’autre côté, on coupe le circuit de la lampe pour l’intégrer au relais. Après je sors l’appareil photo et paf !

Et voici le résultat final avec quelques petits bonus :

 

2 commentaires

  1. Vous pouvez aussi équiper le port rs232du raspberry avec un Zigbee et de l’autre coté équiper un Arduino ‘une second zigbee pour contrôler des relais et si vous faites un système d’adressage pour les arduino, carrément faire une solution complète pour votre maison :p

  2. Super merci pour ce super tuto !

    Petit détails:

    Dans la grammaire le weight n’est pas nécessaire, le premier mot (Amanda) de la grammaire a une confidence spécifique.

    Dans les dernières version on remplace, à chaud, SARAH par le nom définit dans custom.ini (Amanda)

    Je note de faire un petit tuto pour expliquer comment se brancher dans le serveur web de SARAH plutôt que d’en relancer un. Je pense que techniquement ça doit être faisable.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>