Bonjour.
Petite mésaventure cet après-midi qui peut servir à d'autres. J'ai un encodeur en quadrature sur un de mes projets. C'était une occasion de faire un article et de montrer l'emploi des interruptions. Un encodeur se présente comme un potentiomètre mais il est généralement cranté et, correctement connecté avec des résistances de pullup de 10kΩ, chaque passage de cran génère une impulsion sur les deux sorties. Selon le sens de rotation, l'impulsion de la première sortie est en avance ou en retard sur la seconde. Ce qui fait que sur le front descendant de l'impulsion d'une des sorties, une lecture de la seconde permet de déterminer le sens de rotation. Pour utiliser un encodeur on branche donc une sortie sur une entrée interruption de l'Arduino et on lit l'état de la seconde dans l'ISR. Voir
Les interruptions.
Comme j'ai prêté un de mes 2 Uno et que le second était sur mon TCO, j'ai attrapé un compatible Léonardo que j'ai acheté sur eBay il y a peu et un LCD Keypad shield. Je branche l'encodeur, la broche commune sur la masse, une des sorties en quadrature sur l'entrée INT0, aka D2, et l'autre sur D3.
Rien ne marchait correctement le comportement était erratique ou bien aucune interruption ne pétait. Quand je manipulais la carte, mes gros doigts pleins de charges électrique déclenchaient pourtant des interruptions. Je commence par accuser les cartes chinoises d'eBay, le LCD keypad shield d'abord. J'enlève le LCD, passe sur la ligne série. Toujours rien de cohérent. J'accuse le Leonardo. Finalement je constate une erreur dans le programme. Comme premier argument de attachInterrupt, j'avais mis la constante que j'avais initialisé avec le numéro de broche, c'est à dire 2 au lieu de 0. Je rectifie. Fonctionnement toujours étrange, quelque soit le sens de rotation, le compteur que j'incrémente ou décrémente selon le sens de rotation ne fait que s'incrémenter
Je finis par chercher le brochage du Leonardo. Bingo ! alors que je pensais qu'il avait des entrées/sorties identiques à celle du Uno, ce n'est pas du tout le cas. INT0 et INT1 sont inversées ! et sur les broches 0 et 1 on a deux entrées supplémentaires d'interruption : INT2 et INT3.
Dans un premier temps, en appelant attachInterrupt avec 2 comme 1er argument, j'activais les interruptions sur INT2, broche qui était en l'air. En manipulant la carte, la broche attrapait mes charges électrique et les interruptions pétaient.
Dans un second temps, comme INT1 et INT0 sont inversés, la broche sensible aux interruptions étaient également celle où je lisais la valeur pour déterminer le sens de rotation. Comme l'interruption pétait sur le front descendant, la valeur était toujours 0
Moralité : quand on utilise une nouvelle carte, on regarde la doc avant de se lancer. Ça évite de perdre du temps
Moralité 2 : quand on écrit un article sur les interruptions, on s'y conforme soi-même !