Combien de fois êtes-vous rentré des courses pour réaliser que vous aviez oublié d'acheter un truc essentiel, genre du café ou pire.. du sucre. Évidement, un crayon et un bloc-note permettent en théorie d'éviter ce genre de mésaventure. Encore faut-il ne pas perdre ou oublier la liste avant de partir faire les courses. Cette semaine, on vous propose une solution basée sur des modules Yoctopuce pour résoudre ce petit problème agaçant.
L'idée est de scanner les codes barre de chaque produit au fur et à mesure qu'on se rend compte qu'on doit en racheter et d'imprimer la liste juste avant de partir faire les courses. Évidement, pour que ça marche il faut le système soit pratique: pas question d'allumer un ordinateur à chaque fois qu'on doit scanner un produit ou imprimer la liste des courses. On a eu quelque idées.
Le lecteur de codes barres
L'idée de base est donc d'utiliser le code barre imprimé sur l'emballage de tous les produits courants. Pour ça, il a fallu construire un lecteur de codes barre. On a trouvé un module bon marché commercialisé par DFROBOT. Il est normalement conçu fonctionner en RS232, donc a priori, on devrait utiliser un Yocto-RS232 pour l'interfacer. on a essayé, ça marche. Le problème, c'est que non seulement on se retrouve avec un système volumineux et peu pratique, mais en plus l'isolation du Yocto-RS232 entraîne une consommation électrique supplémentaire non négligeable.
Le lecteur de codes barre de DFROBOT, tel qu'il est livré
En regardant le lecteur de plus près, on réalise qu'il est est en fait constitué de deux parties, le lecteur lui-même qui est un lecteur générique et d'une carte équipé d'un buzzer, d'un bouton poussoir, et d'un convertisseur de niveaux. Le scanner lui-même dispose d'une sortie série TTL 5V, on peut donc l'interfacer et l'alimenter directement avec un Yocto-Serial. Le pinout du lecteur est décrit dans sa doc, sachez simplement que le contact N°1 est celui qui est le plus à l'extérieur.
Le lecteur, interfacé avec un Yocto-Serial
Par contre, le connecteur du scanner est au format zif 0.5 mm, ce qui rend la connexion un peu délicate. On a trouvé chez Adafruit un petit PCB qui permet de souder un connecteur et les fils nécessaires. On a configuré le lecteur pour qu'il scanne en permanence. Attention, le module se configure en scannant des codes barre de configuration, c'est pourquoi il faut le configurer avant de le démonter. Quand on supprime le board de DFROBOT, on perd le bouton poussoir qui sert de gâchette en temps normal. Il est à noter que dans sa configuration par défaut, le lecteur émule un clavier, si vous scannez le code barre qui restaure les réglages d'usine du lecteur, vous devrez rescanner le code qui permet de re-passer l'interface en mode série. N'oubliez pas de scanner le code qui sauve la configuration.
Le Yocto-Serial est relié à un YoctoHub-Ethernet. Afin d'avoir une interface utilisateur convenable, on a ajouté un Yocto-MaxiDisplay-G et un Yocto-Buzzer. C'est à se demander s'il ne faudrait pas aussi ajouter un tiroir caisse. Le gros avantage du YoctoHub-Ethernet, c'est qu'il va permettre d'alimenter le scanner par PoE: on n'aura ainsi besoin que d'un seul fil pour connecter le scanner.
Les différents éléments du scanner
Le YoctoHub-Ethernet est configuré pour effectuer un callback sur un serveur à chaque fois que qu'on scanne un objet. Le serveur trouve la correspondance entre le code barre et le nom de l'objet, l'affiche et fait faire un bip au Yocto-Serial, tout en mettant à jour la liste des produits à racheter. On peut même signaler les erreurs en utilisant un bip différent et la led rouge du Yocto-Buzzer.
Le scanner complet
La correspondance code-barre / produit
A un moment donné, il va falloir convertir le code barre lu par le scanner en une donnée plus compréhensible par la personne qui va aller faire les courses. La première idée qui vient à l'esprit est d'utiliser Internet pour ça, il y a en effet une foultitude de bases de données qui référencent les codes barres de nombreux produits. Mais à l'usage on se rend compte qu'il a deux problèmes avec ces bases de données:
- Toutes ces bases, y compris celles qui se vantent d'avoir des millions d'entrées sont loin d'être exhaustives. La plupart des produits européens qu'on a essayés n'y figurent pas.
- Les produits qu'on y trouvent ont aussi tendance à être référencés par rapport à leur marque plutôt qu'à leur nature, ce qui ne fait pas trop notre affaire. Ainsi, si on scanne une bouteille d'eau gazeuse, on aimerait obtenir "Eau gazeuse" et non pas "Valser Classic".
C'est pourquoi on a pensé qu'il était plus simple de rentrer manuellement les correspondances au fur et à mesure. On a simplement écrit une petite interface web qui permet de mettre à jour les correspondance, et au besoin, de modifier la liste des choses à acheter.
Une petite interface toute simple pour mettre à jour la liste de courses
L'impression
L'impression de la liste de course est assurée par l'imprimante qu'on a construit la semaine dernière. Elle est basée sur un YoctoHub-Wireless-SR, ce qui signifie qu'elle est capable de se réveiller à des dates et heures précises, on peut donc la configurer pour qu'elle réveille à l'heure où habituellement on part faire les courses et le serveur pourra la faire flasher s'il y a quelques chose à imprimer. Ainsi, si on la place bien en évidence, pas trop loin de la porte d'entrée par exemple, on peut espérer qu'on n'oubliera pas la liste de courses avant de partir.
Il suffit d'appuyer sur le bouton pour avoir la liste des courses
Le software
La partie software n'est pas très compliquée, il s'agit essentiellement de trois scripts: deux callbacks PHP pour le scanner et l'imprimante et une petite page web pour l'édition de la liste.
Le scanner
Le script qui gère le scanner récupère la dernière ligne du buffer du Yocto-Serial, qui contient le dernier code barre lu. Il consulte un simple fichier ini et cherche une correspondance avec des produits qu'on aurait déjà scanné, et là, deux cas se présentent:
- Une correspondance est trouvée, le nom du produit est affiché sur l'écran du scanner, un bip aigu est émis, la LED verte du Yocto-Buzzer est allumée et l'entrée dans le fichier ini est mise à jour.
- Aucune correspondance n'est trouvé, un message d'erreur est affiché sur l'écran, un bip grave est émis, la LED rouge Yocto-Buzzer est allumée, et une entrée avec une description vide est insérée dans le fichier ini.
La structure du fichier est archi-simple, chaque section correspond à un code barre et contient un champ pour la description du produit plus un flag indiquant si on doit l'acheter ou non.
[7610335000069] desc="Eau gazeuse" mustbuy=0 [8002470006317] desc="Huile d'olive" mustbuy=0 [8714789750514] desc="Lave vitres" mustbuy=1
L'édition
La partie édition permet modifier à la main le contenu de la liste de course. Il s'agit un simple page PHP qui affiche le contenu du fichier ini sous une forme plus intuitive. Elle n'interagit pas avec les modules Yoctopuce, elle se contente de mettre à jour le fichier ini.
L'impression
Le script qui assure l'impression n'est qu'une variante ce celui qui a servi a imprimer des blagues Chuck Norris la semaine dernière. Au lieu de downloader une blague, il consulte le fichier ini, extrait la liste de produits à acheter et l'envoie sur le Yocto-Serial de l'imprimante. Notez que l'imprimante n'est pas indispensable, un smart-phone permettrait d'afficher assez facilement la liste pendant que vous déambulez dans les allées de votre magasin.
Et ça marche?
Ça marche plutôt pas mal. Un produit peut être scanné en moins de temps et de mouvements qu'il n'en aurait fallu pour écrire son nom sur une feuille de papier. La liste des courses peut être obtenue en quelques secondes en appuyant sur seul bouton. Un positionnement judicieux de l'imprimante, à coté des clefs par exemple, permet de limiter risque d'oubli de la liste de courses. Et tout ça sans être obligé de garder un ordinateur allumé en permanence dans la maison. Il y a évidement le problème d'entrer le nom des produits à la main la première fois, mais on se rend très vite compte qu'il n'y en a pas tant que ça, la liste de produits de base est entrée avant qu'on se soit lassé de jouer avec le système. Pour conclure, voici une petite vidéo du système en fonctionnement.