Auteur Sujet: Comment perdre son temps :)  (Lu 25881 fois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1717
    • Voir le profil
Comment perdre son temps :)
« le: décembre 26, 2014, 07:15:37 pm »
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  :o

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  :P

Moralité : quand on utilise une nouvelle carte, on regarde la doc avant de se lancer. Ça évite de perdre du temps  ;D
Moralité 2 : quand on écrit un article sur les interruptions, on s'y conforme soi-même !
« Modifié: décembre 26, 2014, 07:20:56 pm par Jean-Luc »
Cordialement

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Comment perdre son temps :)
« Réponse #1 le: décembre 27, 2014, 08:42:10 am »
J'ai perdu hier un peu de temps en testant mon écran Nokia, en pensant qu'un Leonardo compatible n'est pas si différent qu'un Uno. Manque de pot, pas du tout.
Mais bon, j'ai vite repris un Uno, mais je n'ai pas cherché ce qu'il bloquait ;)
Et vu que j'ai testé avec un pro mini, l'écran va rester dessus :)
G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1717
    • Voir le profil
Re : Comment perdre son temps :)
« Réponse #2 le: décembre 27, 2014, 09:04:34 am »
Et il y a d'autres différences.

Le SPI n'est disponible que sur le connecteur ICSP. L'I2C n'est pas sur les broches A4 et A5 mais est bien présent sur les broches les plus proches du bouton RESET. Contrairement au Uno, il y a peu d'interruptions externes PCINTx.
Cordialement

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Comment perdre son temps :)
« Réponse #3 le: décembre 27, 2014, 09:23:00 am »
J'avais vu un petit peu mais je n'avais pas poussé plus loin. Je m'en sers de test pour faire de petits montages pour le moment.
G.

chris_bzg

  • Sr. Member
  • ****
  • Messages: 319
    • Voir le profil
Re : Comment perdre son temps :)
« Réponse #4 le: janvier 17, 2015, 04:34:43 pm »
La documentation, rien que la documentation ! C'est ce que j'ai toujours enseigné à mes élèves dans mon métier !

Mais cela me rassure de voir que même toi tu peux te faire piéger, moi qui oubliais un des deux signes = dans les instructions if !

Le Leonardo est conçu autour d'un µC ATmega32u4 qui diffère de l'ATmega328P du Uno ; broches et registres internes ne sont sans doute pas les mêmes, et c'est pourquoi Guillaume n'avait pas réussi à compiler un de mes programmes, écrit pour ATmega328P.

Encore une doc à étudier ! ::)

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Comment perdre son temps :)
« Réponse #5 le: janvier 17, 2015, 10:14:42 pm »
La documentation...  ;)
G.