Chez Yoctopuce, chaque envoi est photographié avant d'être confié à la poste, pour le cas où il serait perdu lors de l'acheminement. Jusqu'à présent, on le faisait manuellement en se contentant de plaquer l'envoi sur un bête scanner de bureau, et on sauvait le fichier dans un coin. On a fini par se lasser de cette procédure répétitive et parfaitement inintéressante. On a donc décidé d'automatiser tout ça...
Anatomie d'un envoi Yoctopuce
Si vous avez déjà commandé quelque chose chez Yoctopuce, vous avez probablement remarqué que les envois Yoctopuce sont couverts d'autocollants. Loin d'être décoratifs, ils ont chacun une fonction particulière.
Un envoi Yoctopuce type
Ces autocollants sont généralement au nombre de 5:
- Un pour l'adresse et le numéro d'envoi, ce dernier sous forme de code barre et de texte.
- Un pour le numéro de tracking sous forme de code barre et de texte également.
- Un formulaire CN22 qui sert à déclarer le contenu de l'envoi aux douanes.
- Un pour le timbre avec un code datamatrix décrivant le montant de l'affranchissement.
- Un dernier pour signaler qu'il s'agit d'un envoi prioritaire, mais à vrai dire, celui-là on le soupçonne d'être un peu décoratif, au vu de son efficacité dans certains pays.
Certaines destinations impliquent une configuration un peu différente, mais le principe reste le même.
Le problème
On aimerait prendre une photo de chaque envoi juste après l'affranchissement et sauver l'image de façon à pouvoir la retrouver rapidement. Et pendant qu'on y est, on aimerait aussi enregistrer le poids de l'envoi ainsi que le montant de l'affranchissement. L'affranchissement est fait dans les locaux de Yoctopuce à l'aide d'une machine dédiée équipée d'une balance mais sur laquelle nous n'avons aucun contrôle, et il est probable que la Poste Suisse n'aimerait pas trop qu'on la bricole. L'idée est donc de construire un système indépendant qui permette de:
- Peser l'envoi
- Le photographier
- Scanner les codes-barre des numéros d'envoi et du montant de l'affranchissement.
- Sauver le résultat dans notre base de données
Il existe des scanners industriels qui pourraient nous faire tout ça en deux temps trois mouvements, mais on a préféré fabriquer notre propre système, juste pour le fun.
La solution
Après quelques tests fort peu satisfaisants avec une webcam, on a décidé de faire les choses en grand avec du matériel un peu sérieux. On a choisi un Canon EOS 700D monté sur un banc de reproduction. Cet appareil est relié par USB à un PC, et contrôlé par le SDK de Canon. Il est alimenté par l'adaptateur secteur idoine.
On a monté un appareil photo sur un banc de repro
Pour peser les envois, on a utilisé une balance avec une sortie RS232. On a déjà décrit ce système dans un article précédent.
La balance
Enfin pour éclairer la scène on a utilisé une torche à LED. Un éclairage correct est indispensable pour que l'appareil photo arrive à faire sa mise au point convenablement. Pour fixer la torche sur la barre du banc de reproduction on a utilisé l'extrémité d'une perche à selfie qu'on a coupée puis collée sur une espèce de pince en plastique faite à l'imprimante 3D. Cette pince est ensuite fixée à la barre du banc de reproduction.
La torche
Pour interfacer tout ce petit monde, on a bien sûr utilisé des modules Yoctopuce. Un Yocto-RS232 pour interfacer la balance, un Yocto-PowerRelay pour allumer la torche. On a configuré l'appareil photo pour qu'il se mette en veille au bout de quelques minutes de non utilisation et on utilise un Yocto-Relay pour le rallumer. En effet, il suffit de fermer le contact électrique qui correspond au focus sur le connecteur de la télécommande pour que l'appareil sorte du mode veille.
Le schéma de l’installation
Le software
Ecrire le software qui contrôle l'installation n'a pas été une tâche très complexe: elle a essentiellement consisté à mettre ensemble diverses librairies. Pour piloter l'appareil et surtout récupérer les photos directement par USB, on a utilisé la librairie de Canon avec une sur-couche C# écrite par Johannes Bildstein. Pour reconnaître les codes barres, on a utilisé la librairie payante SD-toolkit. Et évidement, pour piloter les modules Yoctopuce, on a utilisé notre API. Le software est écrit de manière à ce dès qu'on pose un envoi sur la balance, le système s'allume, prend la photo et scanne les codes barre. Un Yocto-Buzzer signale la fin de l'opération.
Pièges et difficultés
Le prototype a été développé avec un EOS 70D. Par contre, pour la mise en production, on a utilisé un 700D, bien moins cher. Cela a été l'occasion de constater que le système d'autofocus du 700D est bien moins performant que celui du 70D. C'est particulièrement flagrant avec le mode liveview activé. Au point qu'on a du renoncer à ce mode qui permet de voir en temps réel sur l'écran que ce l'appareil vise.
Le SDK de Canon est entièrement basé sur des callbacks: vous demandez à l'appareil de prendre une photo, et vous attendez que le SDK appelle une de vos fonctions avec le contenu de la photo. Sauf que de temps en temps votre callback n'est jamais appelé, sans que vous ne sachiez trop pourquoi: pas d'exception, pas de code d'erreur. Dans ce cas, fermer et rouvrir la session avec l'appareil permet de résoudre le problème.
La librairie SD-toolkit est raisonnablement performante, mais elle a parfois du mal à lire le code datamatrix peu contrasté de l'affranchissement, on a résolu le problème en ne scannant que certaines zones de la photo où l'on sait que les codes ont toutes les chances de se trouver. Avantage: comme on ne scanne qu'une partie de la photo, la procédure est bien plus rapide.
Le système complet
Conclusion
On a réussi à construire un système de lecture de code barres performant pour une somme relativement modeste comparée à un système professionnel dédié. Contrairement à beaucoup de nos projets du vendredi, celui-ci n'est pas centré sur les produits Yoctopuce. Ici nos modules n'ont servi qu'à interfacer avec simplicité les divers éléments d'un système plus complexe, ce qui correspond probablement assez à l'utilisation que nos clients font de nos produits.