On a de temps en temps des clients qui nous demandent si on aurait des idées pour vérifier qu'un moniteur censé afficher des vidéos est bien allumé et fonctionne correctement. Il se trouve que oui, on a quelques idées :-)
Le problème est, semble-t-il, assez courant. Imaginez un écran placé dans un lieu public, qui diffuse des vidéos, pour ne pas dire des publicités. Il arrive que le système tombe en panne, mais que la personne chargée de la maintenance du système ne s'en rende pas compte, faute d'être devant en permanence. Comment fabriquer un dispositif pas trop cher qui permette de se rendre compte à distance que le système est tombé en panne? Le problème est un peu délicat: il faut fabriquer un système capable de "regarder" l'écran et d'en déduire s'il fonctionne ou pas.
Le principe
L'idée de base, c'est de détecter la lumière émise par l'écran, à l'aide d'un photo-transistor et d'un Yocto-Knob. Il suffit d'afficher un motif clignotant dans un coin discret de l'écran, de placer le photo-transistor devant et de mesurer la fréquence de clignotement à l'aide du Yocto-Knob. C'est assez facile à faire: le Yocto-Knob dispose d'un compteur d'impulsions couplé à un chronomètre.
On a juste besoin d'un Yocto-Knob et d'un photo-transistor
Pour la partie capteur, on s'est contenté d'imprimer un petit bloc en plastique noir dans lequel on a caché le photo-transitor. Le tout tient sur l'écran à l'aide d'un adhésif repositionnable. Dans le cas d'une vraie utilisation dans un endroit public, il faudra probablement prévoir quelque chose d'un peu plus solide :-)
Notre détecteur
Le motif clignotant
Pour que le système marche bien, il faut qu'il y ait suffisamment de lumière à détecter. Il se trouve qu'un écran n'en émet pas énormément. C'est pourquoi on a choisi de dessiner un petit carré dont la couleur alterne entre noir et blanc dans le coin inférieur gauche de l'écran. Ainsi on maximise les différences de luminosité et on les rend plus faciles à détecter. Il y a deux manières de réaliser ce carré clignotant.
Le mettre directement dans la vidéo
La première idée qui vient à l'esprit est de mettre le carré clignotant directement dans la vidéo. Mais ce n'est pas forcément le plus pratique ni le plus malin.
- Vous n'avez pas forcément l'envie et/ou la possibilité de refaire le rendering de toutes les vidéos que vous comptez afficher pour y intégrer un petit carré qui clignote
- S'il est intégré dans la vidéo, le carré ne va pas forcément se trouver à la position voulue. En effet, si l'aspect ratio de la vidéo et de l'écran ne correspondent pas, le player vidéo va ajouter des bandes noires, ce qui risque bien de décaler le carré par rapport au bord de l'écran.
Si la taille de l'écran et de la vidéo ne correspondent pas, il va y avoir un problème
Le rajouter dans le player vidéo
Finalement le moyen le plus pratique qu'on ait trouvé, c'est de recoder notre propre player vidéo, qui en plus d'afficher les vidéos voulues, affiche le carré clignotant en bas a gauche. Ça a l'air un peu effrayant dit comme ça, mais en réalité, en C# sous Windows, il suffit d'intégrer le composant "Windows media player", cela ne prend que quelques lignes. Voici le code source du projet c# qui permet de faire ça.
Réalisation
On a choisi de faire un système de contrôle complètement indépendant de la machine qui diffuse la vidéo: On a connecté le Yocto-Knob directement à un YoctoHub-Ethernet. Ce dernier est configuré pour envoyer directement l'état du Yocto-Knob sur un serveur PHP qui calcule la fréquence des clignotements et en déduit l'état du système de diffusion de vidéo.
Schéma du système
Le code PHP qui gère tout ça est archi simple. La seule subtilité est qu'on s'est arrangé pour que le code de l'interface utilisateur et le code de gestion des callbacks HTTP tiennent dans le même fichier.
La tablette affiche l'état du moniteur
Voici une petite démo du concept:
Évidemment, le gros inconvénient de cette méthode, c'est que le capteur utilise une petite partie de l'écran qu'il vaudrait mieux pouvoir cacher, par exemple à l'aide d'un cadre, quitte à perdre un peu en surface d'affichage.