Arduino : kit viens me chercher

Je continue dans les exemples de code rigolo avec arduino et nodejs, aujourd'hui on va réaliser un afficheur led à la kit de k2000, l'afficheur devra se déclencher lorsque l'on dira "kit viens me chercher".

Montage électronique

c'est l'exemple que l'on retrouve dans les premiers tutoriels arduino : le chenillard.
Pièces nécessaires :

  • Arduino uno
  • 6 LED rouge (c'est important le rouge)
  • 6 resistances 100 Ohms
  • 12 fils

attention, ne pas utiliser les entrées 0 et 1 qui servent à la liaison série sur la carte il est indiqué RX et TX.

Code Arduino

const int MIN_PIN = 2;  
const int MAX_PIN = 7;  
const int LIGHT_DELAY = 100;

void setup()  
{
//initialisation des entrées/sorties Arduino que l'on utilise
    for (int i = MIN_PIN; i <= MAX_PIN; ++i) {
        pinMode(i, OUTPUT);
    }
//initialisation de la connexion série à 9600 bauds
    Serial.begin(9600);
}

void loop()  
{

}

// utilisation de l'événement SerialEvent qui est appelé régulièrement par l'Arduino avant la fonction loop
void serialEvent() //déclaration de la fonction d'interruption sur la voie série  
{
    if (Serial.available())
    {
// des données sont disponibles sur l'interface série
        //lit toutes les données (vide le buffer de réception)
        while (Serial.read() != -1);

        //puis on allume les led
        startKitSequence();
    }
}


void startKitSequence()  
{
    for (int i = MIN_PIN; i <= MAX_PIN; ++i) {
        digitalWrite(i, LOW);
        delay(LIGHT_DELAY);
        digitalWrite(i, HIGH);
    }
    for (int i = MAX_PIN; i >= MIN_PIN; --i) {
        digitalWrite(i, LOW);
        delay(LIGHT_DELAY);
        digitalWrite(i, HIGH);
    }
}

Le chenillard se déclenche dès que l'on reçoit quelque chose sur le port série, évidement on peut imaginer le déclencher sur certains "mot", dans notre exemple c'est le client qui s'occupe de savoir si on communique avec Kit ou non.

Vous pouvez déjà tester que Kit répond correctement en ouvrant une liaison série avec le moniteur série, il faut alors taper un caractère et l'envoyer :
Le chenillard doit alors se déclencher.

Code du serveur

Afin de faire quelque chose de plus propre que sur le premier article d'exemple arduino, on va utiliser le paquet Express JS qui permet de créer facilement une API web.

On utilise toujours la librairie série serialport pour communiquer avec l'arduino, dès que j'aurai reçu mes puces wifi pour Arduino je ferai d'autres exemples avec ce mode de communication.

Après avoir créé votre projet NodeJS vous aurez donc besoin d'installer les deux paquets :

npm install serialport --save  
npm install express --save  
var express = require('express');  
var app = express();

app.use(express.static('public'));

app.get('/', function (req, res) {  
    res.sendFile(__dirname + "/" + "index.html");
});

var server = app.listen(8081, function () {

    var host = server.address().address;
    var port = server.address().port;

    console.log("Serveur accessible à l'adresse http://%s:%s", host, port);

});

var serialport = require('serialport');

//à remplacer par votre nom de port COM
var portName = 'COM4';  
var sp = new serialport.SerialPort(portName, {  
    baudRate: 9600,
    dataBits: 8,
    parity: 'none',
    stopBits: 1,
    flowControl: false,
    parser: serialport.parsers.readline("\r\n")
});


//l'api expose un point d'entrée 'hey_kit' en POST
app.post('/hey_kit', function(req, res) {  
    console.log("Quelqu'un souhaite demander Kit");
    sp.write('hey');
    res.end();
});

Le serveur a donc deux rôles :

  • communiquer avec l'arduino via une liaison série
  • exposer une api de communication et servir une page web affichée à l'utilisateur

code du client

Notre client est une page web, cette page sera nommée index.html et placée dans le même répertoire que le serveur node.
Pour l'interface graphique je laisse libre court à votre imagination, de mon coté ça donnait cela :

Vous aurez besoin de la librairie jQuery pour communiquer en HTTP avec le serveur node.

Pour la reconnaissance vocale on utilisera webkit, cela veut dire que ça ne fonctionnera que sous google chrome, vous pouvez utiliser également la librairie annyang mais elle donne de moins bon résultats. On reste dans le POC, en production il faudrait utiliser des moteurs bien plus performant.
J'ai laissé en commentaire dans les sources l'exemple avec annyang

        var recognition = new webkitSpeechRecognition();
        recognition.continuous = true;
        recognition.interimResults = false;
        recognition.lang = "fr-FR";
        recognition.onresult = function (event) {
//dès que l'api nous renvoie un résultat, on regarde si elle a réussi à identifier le mot kit
            if (event && event.results && event.results.length > 0) {
                $.each(event.results, function (index, result) {
                    if (result[0].transcript.toLowerCase() === "kit") {
//si c'est le cas alors on appelle l'api de notre serveur node :
                        $.post('http://localhost:8081/hey_kit', function (data) {
                        });
                    }
                });
                console.log(event.results);
            }
        }
        recognition.start();

la preuve en vidéo