On n'a pas trop eu l'occasion d'en discuter jusqu'à présent, mais les écrans Yocto-Display et Yocto-MaxiDisplay disposent chacun de six entrées analogiques. Pour faire simple, ils intègrent l'équivalent d'un Yocto-Knob. Cette semaine, on vous propose d'utiliser ces entrées pour interfacer un clavier et fabriquer un système de contrôle d'accès.
On va donc utiliser un petit clavier numérique bon marché (env. 10 EUR) que l'on va connecter à un Yocto-Display pour fabriquer un système de contrôle d'accès, en deux temps, trois mouvements.
Un clavier numérique bon marché
Les entrées analogiques du Yocto-Display. On y a soudé un connecteur pour que ce soit plus pratique
Le hardware
La connectique de ces petit claviers fonctionne comme une matrice. Lorsque qu'une des touches est enfoncée, une connexion est effectuée entre l'une des lignes et l'une des colonnes de la matrice. Toute la subtilité consiste à détecter lesquelles.
Le clavier est en fait une simple matrice de boutons poussoirs
Pour cela on utilise le fait que les fonctions anButton sont des entrées analogiques destinées à détecter des changement de résistance. On connecte donc les lignes directement sur les entrées du Yocto-Display et on place des résistances de 2.2K, 4.7K et 10KΩ sur chacune des colonnes avant de ramener le tout à la masse de l'écran. Ainsi pour chaque touche appuyée sur le clavier un changement de de résistance spécifique va se faire sur l'une des entrées du Yocto-Display
Connexion entre le clavier et le Yocto-Display
La partie électronique électrique est terminée, il n'y a plus qu'à mettre tout ça dans une jolie boîte et à attaquer la partie programmation.
Une jolie boîte pour rendre le tout un peu sexy
Ça a tout de suite plus un peu plus d'allure
Programmation
On a réalisé la partie programmation en python. L'idée est d'installer une fonction de callback qui sera appelée à chaque fois qu'une des entrée change de valeur, ce qui permettra de détecter quelle touche a été appuyée.
for i in range(5):
b = YAnButton.FindAnButton(serial+'.anButton'+str(i+1))
if not(b.isOnline()): sys.exit("anbutton"+str(i+1)+" found")
# reset calibration, just in case
b.set_calibrationMax(4095)
b.set_calibrationMin(0)
# no need to be too sensitive
b.set_sensitivity(550)
# when a button value change, the anButtonChange function will be called
b.registerValueCallback(anButtonChange)
Il y a toutefois une petite subtilité. Lorsqu'on appuie sur une touche, le changement de résistance n'est pas immédiat et les entrées anButton sont suffisamment rapides pour reporter des valeur intermédiaires. C'est pourquoi lorsqu'on détecte un changement sur une entrée, il faut mémoriser la valeur et continuer à surveiller l'entrée. On utilisera la valeur observée la plus basse pour décider quelle touche a été actionnée.
global lastfunction
global lastvalue
table ="#0*987654321"
fctname = str(fct)
v = int(value)
# the button index is the row
buttonindex= int(fctname[-1:])-1
if fctname == lastfunction:
if (v >900) : # keypad key went back to released position
if (lastvalue <200) : i = 0 # the minimal value is the column
elif lastvalue<330 : i = 1
elif lastvalue<500 : i = 2
# compute keypad key index in the table
index = buttonindex*3 +i
# a key was pressed, let's notify it
buttonPressed(table[index:index+1])
# reset
lastfunction = ""
lastvalue = 0
else: # memorize minimal value
if v<lastvalue: lastvalue = v;
else:
if v<500: # store function name and value
lastfunction = fctname
lastvalue = v
C'est l'essentiel du code, le reste ne sert qu'à la gestion de l'écran pour faire de l'affichage et à décider ce qu'il faut faire en fonction du code qui a été entré. Vous trouverez le code source complet ici, il fait moins de 150 lignes.
Et voila! un clavier de contrôle d'accès
Version Ethernet
Il est possible que vous n'ayez pas très envie de tirer un cable USB jusqu'à l'endroit où vous comptez placer le clavier. Qu'à cela ne tienne, Il suffit rajouter un YoctoHub-Ethernet pour ajouter à notre clavier une connectivité IP. Petit bonus: les hub Ethernet Yoctopuce supportant le PoE, notre clavier pourra même être alimenté par le câble Ethernet:
On rajoute un YoctoHub-Ethernet
Et on obtient un clavier Ethernet, compatible PoE
Au niveau programmation, le code reste identique, il suffit juste de rajouter un appel à registerHub avec l'adresse IP du hub qui se trouve dans le clavier.
sys.exit("YoctoHub-Ethernet init error"+errmsg.value)
Voilà, on a fait le tour de la question. Pour finir voici une petite vidéo du clavier en action.