De bonnes avancées depuis la dernière fois : 5 boutons connectés sur une entrée analogique, le circuit de contrôle du switch sous sa forme définitive et finalement, des résultats corrects avec le rotary encoder.
Vu que je vais être un peu juste niveau entrées sorties (le contrôle du LCD, 2 I/O utilisés pour le switch et plus tard un xbee monté sur l’arduino) j’essaye de grapiller un peu partout. Et je suis tombé sur un lien de forumqui donne une solution pour avoir plusieurs boutons sur une seule entrée analogique : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1226896251. C’est simple, il suffisait d’y penser : mettre des résistances en cascade et des boutons au niveau de chaque résistance. Quand on appuie sur le premier bouton, on a une résistance de .5k, sur le deuxième 1k, sur le troisième 1.5k et ainsi de suite. J’ai testé, et ça marche super bien. J’en ai profité pour simplifier le code de l’exemple qui fait tests sur tests et remplaçant par une petite formule toute simple :
NoButton=(valeurIO-minima)/pas
En testant et affichant les valeurs retournées, j’en ai déduit mon minima et mon pas, j’ai ajusté un peu pour éviter d’être trop strict sur les valeurs et ça marche.
En plus, c’est bien plus propre niveau cablage que d’avoir tous les boutons cablés sur une entrée de l’Arduino.
J’ai aussi travaillé sur la version définitive de la gestion du switch: les deux optocoupleurs et mes deux leds de debug. J’ai laissé les leds de debug, je me suis dit qu’en cas de problème futur, c’était bien plus simple de localiser un problème éventuel. Voilà ce que cela donne en image :
Je suis plutôt content du peu de place que cela prend, je ne pense pas que j’aurais pu gagner beaucoup en gravant mon propre circuit … C’est plus simple, plus rapide et vu la ‘complexité’ du circuit, cela me parait tout à fait adapté comme solution.
Et enfin, le rotary encoder (ou potentiomètre digital). Vu le peu de résultats que j’avais eu la dernière fois, j’ai attaqué d’un autre côté. J’ai là aussi utilisé deux entrées analogiques qui de toutes façons ne me servent pas dans ce projet et j’ai ajouté deux résistance de pull down pour avoir une entrée propre. Le résultat est assez convaincant, j’avais des 0 ou des 1024 sur mes deux entrées, on ne peut plus propre. Pour comprendre maintenant comment utiliser l’encodeur, j’ai pris mes deux signaux je les ai ‘transformés’ en bits et à eux deux ils me donnent 4 valeurs possibles. J’ai ensuite envoyé les valeurs lues sur le port série, question d’essayer d’y voir une logique.
Quand je tournais en horlogique, j’avais suivant la vitesse : 0310 ou 02310 et en antihorlogique : 01310 ou 0130 (je ne sais pas ou passent les ‘2’). J’ai donc fait un petit bout de code qui considère que le 0 est une position de repos et dès qu’il y a un 3 qui arrive en premier, j’attends un 1 et je dis que je tourne dans un sens. Si j’ai un 1 en premier, j’attends un 3 et je dis que je tourne dans l’autre sens. Et ça marche très bien même. J’ai eu juste une fois une direction parasite, mais globalement, c’est impeccable.