Une boîte aux lettres USB

Une boîte aux lettres USB

Cette semaine nous allons nous attarder un peu moins sur la partie bricolage, et un peu plus sur la programmation, plus particulièrement l'API C++ pour les modules USB branché directement à la machine. L'objectif est de modifier notre vieille boîte aux lettres afin que l'on puisse savoir quand le facteur est passé tout en restant tranquillement au chaud dans notre bureau. Comme ce post est un peu plus long que d'habitude, si vous avez la flemme de tout lire, vous pouvez sauter directement en fin de page pour voir le résultat en vidéo.

Pour détecter l'état de la boîte au lettre, nous allons tout d'abord tirer un câble USB jusqu'à elle. Nous avons utilisé des rallonges actives que l'on trouve dans le commerce, qui ne sont en fait qu'un long câble intégrant un mini-hub doté d'un seul port, et qui permet donc de réamplifier le signal.

Une fois USB disponible dans la boite aux lettres, il suffit d'un Yocto-Knob pour détecter aussi bien l'insertion d'une lettre par le portique que l'ouverture de la boîte aux lettres pour récupérer le courrier. Pour détecter l'ouverture de la porte. il suffit de récupérer un simple contacteur qui traînait par là, et de le coller à la colle à chaud de sorte à ce qu'il soit en position pressée quand la porte est fermée et en position ouverte quand la porte est ouverte. Grâce à ceci nous serons capables de savoir quand quelqu'un aura relevé le courrier en ouvrant la porte.

le contacteur pour détecter l'ouverture de la porte, fixé avec de la colle à chaud
le contacteur pour détecter l'ouverture de la porte, fixé avec de la colle à chaud



Pour détecter le passage du facteur, nous allons utiliser un contacteur à bille. Un contacteur à bille est en fait un simple interrupteur qui passe de "on" à "off" en fonction de la position d'une bille qui peut se déplacer à l'intérieur. C'est un moyen simple, efficace et très peu cher de détecter un mouvement sur une partie mobile (c'est ce qui était utilisé dans les bombes des vieux films d'action :-) ). En choisissant correctement l'orientation de l'interrupteur à bille, on détecte facilement le balancement du portique quand le facteur insère le courrier dans la boite aux lettres. La fixation de l'interrupteur à la boite au lettre se fait aussi à l'aide de colle à chaud.

Le contacteur à bille utilisé pour détecter l'insertion d'une lettre
Le contacteur à bille utilisé pour détecter l'insertion d'une lettre


Le contacteur est simplement collé contre le portique
Le contacteur est simplement collé contre le portique



En ce qui concerne la connexion, il suffit de visser les fils des deux interrupteurs au bornier du Yocto-Knob (un seul module peux gérer jusqu'à 5 interrupteurs ou potentiomètres).

Une vieille boîte au lettre après le passage de Yoctopuce
Une vieille boîte au lettre après le passage de Yoctopuce



A l'intérieur du bureau, pour signaler le passage du facteur nous allons simplement brancher un module Yocto-Color (le même que l'on a utilisé pour notre courge d'halloween) en USB et on pourra ainsi afficher n'importe quelle couleur sur les deux leds RGB.

Vient ensuite la partie software! Nous avons utilisé le C++ pour illustrer ce langage, mais on aurait aussi bien pu faire cela en Javascript, PHP, Shell script ou en Delphi (si votre langage favoris n'est pas parmi ceux-là, ne vous inquétez pas! Nous avons prévu d'élargir cette liste très vite).

Bref pour commencer on va inclure trois headers pour accéder aux classes nécessaires.

 
#include "yocto_api.h"
#include "yocto_colorled.h"
#include "yocto_anbutton.h"



Ensuite nous avons besoin d'initialiser l'API en lui disant que l'on ne veut détecter que les modules USB qui sont connectés directement à la machine. On pourrait décider d'accéder a des modules qui sont sur une machine distante ou les deux, mais pour l'instant restons dans un cas simple.

 
    yAPI::initAPI(Y_DETECT_USB, errmsg);



Ensuite on instancie quatre objets pour les quatre fonctions que l'on va utiliser (l'interrupteur à bille, le contacteur, et les deux leds). Pour identifier la fonction on utilise une string de la forme "NUMERO_DE_SERIE.IDENTIFIANT_DE_LA_FONCTION" ("YBUTTON1-99999.anButton5" va accéder a la fonction "anButton5" du module pourtant le numéro de série "YBUTTON1-99999"). On pourrait compléter l'exemple en attribuant un nom logique aux périphériques et/ou aux fonctions lors de leur première utilisation et ensuite l'utiliser au lieu de devoir se souvenir du numéro de série de son module, mais cela fera l'objet d'un autre article.

 
    YAnButton *postmanSensor = yFindAnButton("YBUTTON1-99999.anButton5");
    YAnButton *collectSensor  = yFindAnButton("YBUTTON1-99999.anButton4");  
       
    YColorLed *led1 =  yFindColorLed("YRGBLED1-001A8.colorLed1");
    YColorLed *led2 =  yFindColorLed("YRGBLED1-001A8.colorLed2");



Ensuite on initialise nos modules en mettant les deux leds en vert.

    led1->set_rgbColor(RGB_GREEN);
    led2->set_rgbColor(RGB_GREEN);  



On vérifie que l'on a bien branché la boîte au lettres au PC. (conseil de pro: avant de vérifier votre code, pensez à vérifier que le câble est bien branché au PC...)

    if (!postmanSensor->isOnline() || !collectSensor->isOnline()) {
        cout << "The mailbox sensors are not connected" << endl;
        return 1;
    }




Pour détecter "l'état" de la boite aux lettres nous n'avons pas besoin de surveiller précisément le changement d'état des deux contacteurs, car l'API le fait déja pour nous. Il nous suffit de comparer "l'heure" du dernier changement pour chaque contacteur et de déterminer le plus récent. Il faut juste faire attention de traiter la logique inverse de la porte (interrupteur pressé == porte fermée).

    unsigned lastPostman = postmanSensor->get_lastTimePressed();
    unsigned lastCollect = collectSensor->get_lastTimeReleased();



La suite c'est de l'algorithmique de première année: si l'événement le plus récent est l'ouverture de la porte, quelqu'un a été cherché le courrier. Si c'est le portique qui a bougé en dernier, c'est que le facteur est passé et qu'il faut sortir au froid.

Voilà le code complet.

#include <Windows.h>
#include <iostream>
// includes
#include "yocto_api.h"
#include "yocto_colorled.h"
#include "yocto_anbutton.h"

using namespace std;

#define RGB_GREEN   0x00FF00
#define RGB_RED     0xFF0000


int main(int argc, const char * argv[])
{
    string      errmsg;
 
    yAPI::initAPI(Y_DETECT_USB, errmsg);

    YAnButton *postmanSensor = yFindAnButton("YBUTTON1-99999.anButton5");
    YAnButton *collectSensor  = yFindAnButton("YBUTTON1-99999.anButton4");  
     
    YColorLed *led1 =  yFindColorLed("YRGBLED1-001A8.colorLed1");
    YColorLed *led2 =  yFindColorLed("YRGBLED1-001A8.colorLed2");

    led1->set_rgbColor(RGB_GREEN);
    led2->set_rgbColor(RGB_GREEN);  

    if (!postmanSensor->isOnline() || !collectSensor->isOnline()) {
        cout << "The mailbox sensors are not connected" << endl;
        return 1;
    }
    unsigned lastPostman = postmanSensor->get_lastTimePressed();
    unsigned lastCollect = collectSensor->get_lastTimeReleased();
    while(1) {
        unsigned newPostman = postmanSensor->get_lastTimePressed();
        if(lastPostman != newPostman){          
            lastPostman = newPostman;
            cout << "Postman Deteected"<< endl;
            led1->set_rgbColor(RGB_RED);
            led2->set_rgbColor(RGB_RED);  
        }
        unsigned newCollect = collectSensor->get_lastTimeReleased();
        if(lastCollect != newCollect){          
            lastCollect = newCollect;
            cout << "Collect Detected"<< endl;
            led1->set_rgbColor(RGB_GREEN);
            led2->set_rgbColor(RGB_GREEN);  
        }
        Sleep(300);
    }

    return 0;
}



Si ces explications ne vous semblent pas suffisantes pour faire votre propre projet, ne vous inquiétez pas: la documentation complète et détaillée de l'API est presque prête. Vous pouvez aussi nous laisser des commentaires ou nous envoyer un e-mail.

Et enfin la vidéo de démo promise en début d'article.

  



Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.