Arduino, entrées/sorties digitales

Arduino Uno

Vous ne trouverez pas dans cet article ce qu’est un Arduino, beaucoup l’ont déjà écrit, dit et filmé. Il sera uniquement question de la liaison entre les instructions logicielles de type “printMode(….)” et l’électronique des entrées/sorties digitales. Pour résumé cela concerne le connecteur I/O digital de l’Arduino :

Arduino UNO, connecteur IO

Ce qui est décrit, est aussi valable pour les autres Arduino de la gamme

Ce survol parlera que des trois déclarations logiciels de base pour définir les entrées/sorties digitales, donc nous ne traiterons pas des TX/RX, des PWM et autres interruptions. Ce sera rien que sur les déclarations :

  • printMode(….., INPUT);
  • printMode(…., INPUT_PULLUP);
  • printMode(…., OUTPUT);

La carte Arduino

Attention : les schémas électriques sont volontairement simplifiés, le but étant une explication des principes.

Un rappel l’Arduino est une carte à microprocesseurs qui permet de piloter via des entrées/sorties divers matériels électroniques. Les caractéristiques utilisées sont celle d’une carte UNO avec un microcontrôleur Atmel 328P mais cela est valable pour beaucoup de microcontrôleur. Une des caractéristiques, c’est par logiciel que l’on définit l’utilisation des connecteurs (bornes, pins) matérialisant ces entrées/sorties. Une instruction logiciel “pinMode(n° connecteur, output/input)” définit la fonction du connecteur. Exemple avec le connecteur 12 :

Entrées/sorties Arduino, schéma principe

Donc chaque connecteur peut-être vu soit comme une entrée (comme un voltmètre) soit comme une sortie (comme un générateur de tension)

Les entrées printMode( … , INPUT)

Une entrée peut-être utilisée de deux manières soit avec ou non une “résistance pull-up”, c’est aussi une instruction logicielle qui le définit : “pinMode(n° connecteur, INPUT ou INPUT_PULLUP). Que signifie cela et pourquoi un “truc” pareil ?

L’exemple classique du bouton poussoir permet de comprendre l’utilité d’une entrée avec une “résistance pull-up” qui monte le potentiel en quelque sorte.

Entrées/sorties Arduino, resistance pullup

Deux positions pour le bouton, appuyé ou relâché.

1.- Appuyé. Dans ce cas, le connecteur n°2 est directement en relation avec la masse, ce qui permet de définir le niveau 0 (0V).

2.- Relâché :  Deux possibilités avec et sans la résistance pull-up. Sans la résistance le connecteur n°2 serait relié à rien, en l’air, donc le niveau serait instable. Avec la résistance pull-up, le potentiel est positionné à 5V donc le niveau 1 est définit et maintenu.

Les concepteurs de l’Arduino aurait pu choisir une autre configuration, celle avec une résistance pull-down qui dans ce cas tirerait le potentiel vers le bas. Dans ce cas c’est le 0V qui est maintenu.

Entrées/sorties Arduino, resistance pull-down

C’est pour des raisons propres à l’électronique interne que le choix des résistances pull-up a été préféré. En réalité, les raisons profondes de ce choix, j’en sais rien 🙄 ! C’est comme cela et c’est souvent le cas dans les microcontrôleurs.

Impédance et pull-up

Reprenons depuis le début, l’entrée de l’Arduino est comme un voltmètre (c’est du moins ce que j’ai déclaré précédemment). Un voltmètre se doit d’avoir une très grande impédance (pour l’utilisation “Arduino” je considère impédance = résistance) pour ne pas perturber le signal mesuré. Généralement la résistance interne d’un voltmètre est de l’ordre de 10MΩ. Dans les spécifications de Atmel 328P, qui est le microcontrôleur de l’Arduino UNO, on peut lire que le courant consommé par une entrée est de l’ordre de 1μA. Avec la loi d’Ohm il est facile d’estimer la résistance interne d’une entrée : 5V/1μA=5MΩ. Comme nous venons de le voir il y a aussi une résistance de pull-up le schéma électrique d’une entrée Arduino sera donc :

Entrées/sorties Arduino, resistance pullup+interne
Entrées/sorties Arduino, resistance pullup+interne

Pour information la résistance interne des entrées analogiques est nettement plus grande de l’ordre de 100MΩ.

Si le bouton est relâché, comme le montre le schéma électrique simplifié, le potentiel au point rouge sera fonction du courant passant dans les deux résistances (interne et pull-up). La résistance interne étant très grande (selon les spécifications 5MΩ), le courant “consommé” est très faible considéré comme négligeable. Ce qui veut dire que la chute de potentiel dans la résistance pull-up est très faible car le courant la traversant est négligeable (50KΩ•1μA=0,05V), la tension au point rouge sera de l’ordre de 4.95 V au lieu de 5V !!

Si le bouton est appuyé, le courant traversant le point rouge sera directement fonction de la résistance pull-up car la résistance interne est court-circuitée. Donc 5 V/50 KΩ = 0.1 mA soit une faible consommation.  Le potentiel au point rouge étant bien sûr de 0V car directement relié. 

Exemples câblés

Pour résumé avec l’Arduino vous avez le choix de câblage d’une entrée avec où sans résistance pull-up.

Entrées/sorties Arduino, resistance pull-up

cas d’un bouton poussoir :  Dans ce cas de figure le bouton ayant une position avec le connecteur (borne, pin) numéro 2 en l’air, reliée à rien, la déclaration avec une résistance pull-up permet de limiter le nombre d’élément discret à câbler tout en ayant un résultat “propre”.

Entrées/sorties Arduino, sans resistance pull-up

cas d’un bouton capacitif : Ce type de bouton n’est pas un élément passif, il renvoie vers le connecteur (borne, pin) numéro 2 un signal définit. Soit le niveau de tension GND (0V) donc cela sera interprété par le microcontrôleur comme 0,  soit un potentiel de 5V qui lui sera traduit par un 1 logique. La résistance de pull-up est dans ce cas totalement inutile.

Voici un exemple de projet ou l’on utilise justement “le branchement en l’air” de la pin 2 pour capter l’effet capacitif d’un fil. Ce n’est pas directement lié avec notre propos mais cela illustre très bien le “problème” de fil en l’air.

Les sorties printMode( … , OUTPUT)

En configurant le connecteur (borne, pin) de l’Arduino en sortie, ce dernier fournira de la puissance à un élément externe de la carte Arduino. Bien sûr cette puissance est limitée par les caractéristiques générales de la carte et du microcontrôleur utilisé. 

Puissance, courant maximum

Les caractéristiques “a ne pas dépasser”, “maximums”, “pour ne pas endommager”, “pour éviter les ennuis”, etc pour une sortie Arduino UNO sont légions sur internet. Pour ma part je me réfère à deux éléments pour me fixer mes limites : le courant maximum que peut fournir le port USB et la puissance que supporte le régulateur de tension 5V incorporé dans la carte Arduino. Bien sûr cela sous entends que j’utiliserais soit l’un soit l’autre de ces éléments, mais bon c’est ma pratique.

Les ports USB ont évolués et maintenant c’est le port USB 3.1 connecteur type C qui est d’actualité, sa puissance max est de 60 W. Pour ma part je me réfère (et j’utilise) encore au port USB 2 avec une puissance max de 5W. Ce qui sous 5V correspond à un courant max de 1A pour l’ensemble de la carte Arduino et éventuellement pour les éléments extérieurs à la carte (on utilise les Arduino pour quelque chose 🙂 )

Le régulateur 5V ( AMS117, du site http://www.advanced-monolithic.com) : le courant maximum est d’environ 900mA, presque équivalent au port USB2, mais au vu de la température du chip, je ne pense pas qu’il résiste longtemps à un tel débit. Un courant de 500mA est déjà énorme pour ce genre de chip et suivant les conditions externes (si votre Arduino est dans une boite par exemple) ne laissez pas trop longtemps circuler ce type de courant, enfin “c’est vous qui voyez !”

Pour résumé si on considère un courant maximum peu de temps de 500mA, en permanence préférer un maximum de 300mA, à répartir sur les 14 entrées/sorties digitales 21 mA par sorties. On rejoint les recommandations du site arduino.cc pour un Arduino UNO r3 (max 20mA/sortie).

Comment fonctionne une sortie

Entrées/sorties Arduino, sorties

La configuration des A et B est définie par la logique du programme du microcontrôleur et nous pouvons agir sur ces deux possibilités par l’instruction “digitalWrite(n° connecteur, LOW/HIGH);” une fois que le connecteur (broche, pin) soit définit comme une sortie pinMode(n° pin, OUTPUT).

Conclusion

Voilà ce petit parcours dans les “entrailles” (les entrées-sorties digitales) d’un microcontrôleur est terminé. J’espère qu’il vous aura  éclairé ou tout au moins rafraîchi les idées sur ces éléments de base que sont les déclarations des I/O (entrées/sorties) digitales d’un Arduino.

Un site qui explique (dans le détail), démontre et teste ce qui vient d’être écrit : utiliser les I/O

Bon projet et  …….  pas trop de fumée  😯    mais noonnnn soyons optimistes !  😆