Bonjour,
Dans cet article, je vais vous montrer comment contrôler les GPIOs de votre Raspberry préféré avec la voix. A la fin de cet article, votre vie peut en être bouleversée à différents niveaux :
- vous passez pour un fou qui parle tout seul dans son salon
- vous ne vous levez plus jamais de votre canapé pour allumer une lampe
- vous quittez votre femme pour une dénommée Sarah
Passons à la présentation de nos deux projets qui vont révolutionner votre vie, vous l’aurez compris dans le titre, je parle du Raspberry Pi et de S.A.R.A.H. Voici un exemple de ce qu’on va obtenir :
S.A.R.A.H. tire son nom de l’excellente série Eureka. Ce projet a pour vocation de rassembler et de faire communiquer tout les objets connectés tels que les SmartTV, Nabaztag, box TV, etc., ainsi que les différentes informations que l’on peut récupérer sur le net grâce à des API voir même sans API (PhantomJS) comme la météo, des infos sur Wikipédia, etc. Un des grands avantages de S.A.R.A.H. est l’intégration de la reconnaissance vocale ou gestuelle ( Kinect ). Un autre avantage est l’écriture de plugins qui est extrêmement simple et ne nécessite que des connaissances basiques de XML et de JS.
S.A.R.A.H. sera donc le point central du projet ( le cerveau ?) qui vas nous permettre de connecter notre voix avec les GPIOs de notre Raspberry Pi.
Le Raspberry Pi, quant à lui, n’est plus à présenter mais, si c’est encore le cas, voici quelques liens qui vont vous aider :
Ce petit ordinateur est tellement flexible en termes d’utilisation que ça fait de lui notre meilleur ami pour ce genre de projet. Le contrôle de ses entrées/sorties se font simplement par script python ou même pas simple commande bash.
A partir de là, il suffit de connecter ce que l’on souhaite sur ses entrées/sorties. Personnellement, j’ai branché un capteur de température, 3 DEL, un détecteur de mouvement ainsi qu’une carte relais que j’ai relié à une prise 220 V . Vous trouverez facilement des plans de montage sur Internet. Voici un exemple sur un excellent blog que je vous conseille de suivre : http://blog.idleman.fr/?p=1623.
Si vous faites comme moi et que vous branchez votre Raspberry avec du 220 V, je vous conseille la plus grande prudence en ce qui concerne l’isolation et l’accessibilité du circuit. Pour ma part, en plus de l’isolation, je lui ai construit un petit boîtier en LEGO qui évite de laisser la carte à l’air libre.
Une fois nos périphériques connectés aux différents GPIOs de notre Raspberry, il nous faut rendre accessibles les GPIOs à S.A.R.A.H. Pour cela, j’ai écrit un petit projet python https://github.com/bewiwi/py-script qui permet d’exécuter un script depuis une requête HTTP. Il est fourni avec le script rb.py qui permet de contrôler les GPIOs en mode sortie ou de lire le statut d’une entrée.
Pour l’installation et l’utilisation, rendez-vous dans l’article précédent : L’Apéiseur de script
Pour l’utilisation avec les GPIOs, nous utiliserons des requêtes comme celle ci-dessous qui va activer la sortie de la GPIO 23 :
curl "http://192.168.1.2:8080/rb.py?s=1&i=23"
et pour la désactiver :
curl "http://192.168.1.2:8080/rb.py?s=0&i=23"
L’avantage de passer par cette surcouche HTTP est la simplicité d’ajout de nouveaux capteurs. Pour exemple, en plus du contrôle des GPIOs, j’ai aussi un simple script qui me permet de consulter la température de mon capteur.
Une fois le contrôle effectué depuis nos requêtes HTTP, il ne nous reste plus qu’a écrire le lien entre S.A.R.A.H. et notre Raspberry par le biais d’un petit plugin en 3 fichiers tout simple :
- rb.prop
- rb.js
- rb.xml
Le fichier rb.prop définit le plugin avec son type, son nom, ses arguments
{
"modules" : {
"rb" : {
"description": "Sarah controle mon raspberry",
"version" : "1.0",
"rb_http": "http://192.168.1.2:8080/"
}
}
}
Dans ce fichier on peut définir le lien vers l’API de notre service de contrôle des GPIOs. Ce lien sera aussi modifiable dans l’interface de S.A.R.A.H.
La définition de la grammaire vocale est définie dans le fichier rb.xml :
<grammar version="1.0" xml:lang="fr-FR" mode="voice" root="ruleRb" xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
<rule id="ruleRb" scope="public">
<example>Sarah allume la guirlande</example>
<tag>out.action=new Object(); </tag>
<item>Sarah</item>
<one-of>
<item>Allume<tag>out.action.status="1";</tag></item>
<item>Demarre<tag>out.action.status="1";</tag></item>
<item>Stop<tag>out.action.status="0";</tag></item>
<item>Eteint<tag>out.action.status="0";</tag></item>
<item>Arrete<tag>out.action.status="0";</tag></item>
</one-of>
<item repeat="0-1">
<one-of>
<item>la guirlande<tag>out.action.gpio="25";</tag></item>
<item>la lampe<tag>out.action.gpio="21";</tag></item>
</one-of>
</item>
<tag>out.action._attributes.tts = "En cours";</tag>
<tag>out.action._attributes.uri="http://127.0.0.1:8080/sarah/rb";</tag>
</rule>
</grammar>
La définition de la grammaire est très simple. Ici on définit différentes syntaxes qui définiront les arguments passés au script JS. Ici, les mots « Allume » et « Demarre » vont permettre de spécifier le statut souhaité à 1 et les mots « Stop », »Eteint » et « Arrete » permettent de passer le statut à 0. Dans le même esprit, les mots « la lampe » définissent le GPIO numéro 21 et « la guirlande » le GPIO 25.
Et pour finir le fichier rb.js qui est exécuté et qui appellera notre service :
exports.action = function(data, callback, config, SARAH){
// Retrieve config
config = config.modules.rb;
if (!config.rb_http){
console.log("No link http found for RB");
callback({'tts' : 'La config est invalide'});
return;
}
console.log('api :'+config.rb_http);
var url = config.rb_http+'rb.py?s='+data.status+'&i='+data.gpio;
var request = require('request');
request({ 'uri' : url }, function (err, response, body){
if (err || response.statusCode != 200) {
callback({'tts': "L'action a échoué"});
return;
}
callback({'tts' : 'Fait !'});
});
}
Concrètement, une fois la configuration ( l’adresse HTTP de l’api ) renseignée dans l’interface de S.A.R.A.H., il suffit de respirer un grand coup et de dire : « Sarah, allume la guirlande ».
Bon bidouillage à tous,
Download :
Le plugin S.A.R.A.H. : rb-sarah
(EDIT : Il manquait un paramètre pour le contrôle des GPIOs dans rb.js merci @guiguiabloc)
Source / Lien externe :
Bonjour,
J’aimerai commander les modules RF chacon mais n’étant pas doué en programmation comment envoyer
/var/www/yana-server/plugins/relay/radioEmission 0 12325261 1 on
avec Sarah
D’avance Merci
Bonjour
Quel micro avez vous utiliser pour ce montage ?
Merci beaucoup
Bonjour,
N’ayant pas de kinect lors du test, j’ai simplement utiliser mon casque audio bluetooth équiper d’un micro.
Bonjour, je cherche a récupérer le résultat par texte pour un traitement par le raspberry est ce faisable ?
merci pour le tutoriel mais
ce n’est pas très compréhensible pour l’utilisateur lambda comme moi
j’ai bien compris que vous vous serviez des ports gpio pour mettre par exemple un capteur pour les prises chacon…
mais effectivement pour le micro, comment le configurer? vous parlez d’un micro en bluethoot, il marche directement une fois connecter??
merci d’avance
bonjour
Pour ce tuto, le serveur de sarah doit être sur le raspberry?
Bonjour,
D’après mes souvenir, le serveur SARAH n’étais pas sur le RB, c’est pour cela que je passais par « l’apéiseur de script »
Bonjour Loïc
Alors je vais faire encore appel à tes souvenirs…
Les script de ton « apéiseur » tu les mets où exactement? et il suffit d’exécuter que le start.py, ou seul rb.py est nécessaire…
Pour modifier les GPIO (je suis sur le RBI 2) j’ai juste à changer .xml?
Merci pour ton aide
Bonjour,
Encore un dernier petit coup de pouce :
Tout est opérationnel coté serveur, j’ai du repasser sur le port 80 pour que ca marche… mais Sarah me dis « fait » mais rien ne se passe sur les gpio… tu as une idée de pourquoi?
Salut,
Svp comment je peux connecter Raspberry Pi avec S.A.R.A.H??
est ce qu’il faut enregistrer le code source dans /var/www???
merciii
Bonjour quand je fait le test avec
http://192.x.x.x:8080/rb.py?s=1&i=23 sur le web il me met ERROR : [Errno 2] No such file or directory
et sur le terminal de mon rasberry : get /favicon.icon http/1.1″ 500
MERCI
bonjour a tous
j ai un blem avec rb je voudrais couper un enssemble de gpio
genre « sarah coupe tout »
si vous avez une idee…