Sur nos petits Arduino, les broches, ces connecteurs qui lui permettent d’appréhender et de piloter le monde réel sont plus complexes qu’il n’y paraît... La place est limitée sur ces circuits que l’on souhaite souvent les plus petits possibles, et le nombre de fonctions qu’on leur demande de couvrir est important. Comment les Arduino et assimilés ont-ils solutionné le problème ?
Salade de broches
A propos de la versatilité électronique...
.
Par :
DIFFICULTÉ :★☆☆
Rôle des broches
Les broches sont généralement accessibles via des connecteurs ’Dupont’ mâle ou femelle directement soudés sur l’Arduino, quelque soit le modèle. Sur les plus petits, les ATtiny, ce sont les pattes du circuit qui constituent les broches.
Sur certains Arduino, toutes les broches ne sont pas accessibles via des connecteurs, mais parfois par un pad, c’est à dire un emplacement de soudure, directement sur le circuit imprimé ou en dessous.
- Teensy 3.6 vu de dos, plein de broches supplémentaires !
- La taille réduite du Teensy 3.6 ne permet pas de loger des connecteurs sur toutes les broches offertes par le micro contrôleur, alors des pads sont disponibles pour souder des câbles supplémentaires si besoin...
Les différents rôles des broches ont déjà été expliqués par l’article Les entrées sorties de l’Arduino, mais revenons sur les grandes lignes :
Broches d’alimentation
Ces broches sont particulières parce qu’elles n’ont qu’un seul rôle, et il est primordial pour le fonctionnement et la survie de l’Arduino. Leur rôle et leurs limites ont déjà été traités dans l’article Comment alimenter l’Arduino sans ordinateur ? et je ne reviendrais pas dessus.
Broche numérique ou ’digitale’
Pour ce qui suit, je vais considérer un Arduino qui fonctionne en 5v, comme les Uno, Mega ou Nano. D’autres plus récents et basés sur d’autre circuits fonctionnent en 3.3V, comme les ESP, les STM ou le DUE. Cela ne change rien au comportement des broches, à part que ces modèles sont rarement tolérants au 5v.
Les broches les plus communes, dites digitales, sont capables de fonctionner en entrée comme en sortie, en fonction de l’appel à pinMode() qui les initialise, et fonctionnent en tout ou rien, en binaire. Dans le monde Arduino, on parle de Haut (HIGH, lorsque la broche est à 5 volts ou presque), ou LOW (lorsque la broche est à 0 volt ou presque, c’est à dire souvent relié à GND, la masse).
Entrée
- configuration :
pinMode(pin, INPUT)
oupinMode(pin, INPUT_PULLUP)
- utilisation :
digitalRead(pin)
pour lire l’état de la broche, récupère HIGH ou LOW.
Sortie
- configuration :
pinMode(pin, OUTPUT)
- utilisation :
digitalWrite(pin, etat)
pour fixer l’état d’une broche, donné en HIGH ou LOW.
Broche analogique
Le monde n’est pas noir et blanc, il y a quantité d’intermédiaires. C’est pareil sur un Arduino, tout n’est pas HIGH ou LOW. On peut vouloir mesurer une tension entre 0 et 5v, et on peut vouloir aussi fixer la tension d’une broche toujours entre 0 et 5v. Une broche analogique offre ces possibilités.
Entrée
- configuration : pas de pinMode. La broche AREF de l’Arduino permet de fixer la tension maximum admissible sur la broche toujours inférieure à la tension nominale de l’Arduino (5v ou 3.3v) . Par défaut, c’est la tension générale de l’Arduino (5v ou 3.3v là encore) qui est la référence.
- utilisation :
analogRead(pin)
retourne une valeur dépendant de la précision du module ADC (Analog/Digital Converter ou Convertisseur Analogique/Digital) de l’Arduino. Généralement 1024 valeurs possibles sur un ADC de 10 bits comme sur les Uno/Nano et Mega, entre 0 et 4095 (12 bits) pour un ESP32 ou un STM32.
Sortie
Une broche capable de produire une valeur analogique de tension a besoin d’un convertisseur numérique-analogique (DAC : Digital to Analog Converter à ne pas confondre avec ADC Analog to Digital Converter). Ce DAC est capable de transformer une valeur numérique en une tension analogique comprise par exemple entre 0 et 5 V. Le DAC réalise donc l’opération inverse de l’ADC. En fait, les microcontrôleurs AVR utilisés dans les cartes Arduino d’entrée de gamme (Uno, Nano, Mega, etc.) ne sont pas équipés de DAC et ne peuvent donc produire une vraie tension analogique, mais par contre les broches analogiques peuvent produire en sortie un signal de type PWM. Ce signal, dont la valeur passe de façon cyclique de 0 V à 5 V, peut être considéré comme une tension moyenne dépendant de son rapport cyclique (voir la série d’articles La PWM : Qu’est-ce que c’est ? (1) pour comprendre ce fonctionnement en détail).
- configuration : c’est actif par défaut, mais on peut voir l’article La PWM : Qu’est-ce que c’est ? (4) qui permet de jouer avec cette fonctionnalité.
- utilisation :
analogWrite(pin, valeur)
met en route le PWM de cette broche avec une valeur comprise entre 0 et 255 pour qualifier un rapport cyclique compris entre 0 et 100%. Notez bien qu’en entrée on est entre 0 et 1023, tandis qu’en sortie c’est entre 0 et 255. Les joies de la technique !
Interruptions
Certaines broches peuvent être pilotées par des interruptions. C’est là encore un domaine à part entière qui a fait l’objet d’une série d’articles Les interruptions (1). Il s’agit des broches en entrée qui génèrent une interruption au changement de leur état.
Timer
D’autres broches peuvent être activées par des interruptions générées par les timers internes de l’Arduino. Un timer est comme un chronomètre qui signale qu’il est arrivé au bout de son temps par une interruption qui va changer l’état d’une broche. Une série d’articles a aussi été écrite à ce sujet [1] Les Timers (I).
Communication
Les Arduino disposent souvent de plusieurs interfaces de communication permettant de discuter avec divers dispositifs extérieurs... L’article Des bus de communication pour l’Arduino détaille les fonctionnements des plus communs...
Série
La liaison série - aussi appelée UART - est la plus connue des Arduinistes, puisqu’elle est utilisée aussi bien dans le téléversement des programmes par l’USB que dans la communication avec la console de l’IDE. C’est aussi un vrai moyen de discussion avec des shields ou des dispositifs extérieurs. Les broches s’appellent TX et RX, et sur les modèles d’Arduino plus importants, on va retrouver des TX0, TX1, TX2, TX3 et RX0, RX1, RX2, RX3 par exemple sur un Mega2560, désignant quatre lignes série différentes. Une bibliothèque comme Bibliothèque SoftWare Serial permet en outre de transformer certaines broches digitales en interface série supplémentaire !
SPI
Le SPI (Serial Peripheral Interface) est une interface de communication simple basée sur un modèle maître/esclave et utile lorsque la distance entre les éléments raccordés est très faible [2], comme entre un Arduino et un shield connecté ou un écran Lcd. Trois broches doivent être présentes : MOSI, MISO, et SCK. Une quatrième, SS, permet à l’Arduino de se positionner en esclave, mais elle n’est pas toujours présente.
I2C
L’I2C (Inter-Integrated Circuit), ou I²C, ou Two Wires, est un protocole de communication série basée sur seulement deux fils SDA et SCL. Là encore, mieux vaut éviter les longs fils...
CAN
L’interface CAN, bien connue de nos lecteurs assidus, est un protocole utilisé dans l’industrie, l’aviation et l’automobile, sûr, rapide et efficace. Si pour la plupart des Arduino il faut un circuit extérieur pour se brancher sur un bus CAN, certains modèles comme le DUE ou ceux équipés de processeurs ARM ont déjà des modules pré-câblés embarqués. Par exemple sur le DUE, deux canaux CAN sont présents et utilisent des broches CANRX0 , CANTX0 et CANRX1, CANTX1 .
Divers
Au delà des fonctions de base -presque- toujours proposées sur les modèles d’Arduino les plus courants, d’autres possibilités sont souvent offertes via des broches supplémentaires, comme le pilotage d’écran Lcd graphiques ou non, d’écran tactiles, des capteurs de température ou de présence, de clavier tactiles...
Le mélange
S’il fallait que chaque fonctionnalité ait sa broche dédiée, alors les Arduino serait hérissés de broches et bien plus grands qu’aujourd’hui... Les fabricants des micro-contrôleurs qui équipent nos Arduino ont depuis longtemps préféré donner plusieurs rôles à chaque broche.
Par exemple, une broche comme la A5 d’un Nano R3 est bien sûr une broche analogique, mais c’est aussi une broche capable de fonctionner en digital, et en plus elle peut être utilisée comme broche SCL de l’interface I2C. Ces rôles sont toujours mutuellement exclusifs. Lorsqu’une communication I2C passe par cette broche A5, inutile de demander la valeur analogique de la tension ou si le signal digital est HIGH ou LOW. Le résultat ne sera pas utilisable...
L’exemple le plus parlant de ce mélange est l’ATtiny85 :
- Schéma de brochage des ATtiny25/45 et 85
- Seule les quantités de mémoires différencie les trois modèles.
Ce petit circuit intégré de huit pattes seulement est quand même capable de faire de l’analogique, du digital, du PWM, de communiquer en SPI, I2C et bus série.
Une fois enlevées les broches d’alimentation 5v (VCC) et masse (GND) qui ne sont pas partagées, il reste 4 broches analogiques avec une broche de référence, 6 broches digitales, 4 broches PWM, 6 broches pour des interruptions, les broches SDA et SCL de l’I2C, les MOSI, MISO et SCK du SPI ! 26 rôles sur six broches seulement !
Conséquences
Si je vous parle de tout ça, c’est parce qu’il y a peu de temps, sur un forum anglophone, un amateur qui a voulu utiliser Bibliothèque DCCpp pour se faire une centrale a déplacé des fils sur des broches qui l’arrangeaient sans se soucier de savoir si celles qui sont proposées par défaut avaient un rôle particulier... En l’occurrence, les broches 2 et 3 d’un Nano qui sont capables de changer d’après une interruption générée par un timer avaient été changées en 10 et 11... Et bien sûr plus rien ne marchait !
Donc si vous souhaitez déplacer des fils sur d’autres broches qui restent disponibles, pourquoi pas, mais il faut bien s’assurer que ces nouvelles broches sont capables d’endosser le travail que vous leur demandez ! Et n’oubliez pas de changer le code en conséquence... A ce sujet, les bibliothèques ne sont pas toujours très souples sur les broches à utiliser... C’est ce qui a justifié en partie l’existence de la Bibliothèque DCCpp face à son original DCC++ très peu configurable. Mais l’ouverture vers d’autres broches qui correspondait à une volonté de pouvoir faire fonctionner DCCpp sur d’autres modèles d’Arduino et de circuits de puissance a été comprise par certains comme la possibilité d’utiliser n’importe quelle broche pour n’importe quel usage...
Pour bien comprendre le rôle de chaque broche, il faut lire le datasheet du microcontrôleur qui doit être programmé. Sauf que ces textes sont assez souvent abscons, toujours en anglais, et parfois difficiles à trouver. Alors je vous conseillerai plutôt l’utilisation des images dites ’pinout’ lié au bon modèle d’Arduino. C’est graphique (un dessin vaut souvent mieux que de longues explications), et aussi facile (difficile ?) à trouver que les datasheet. Par contre, il faut que le modèle d’Arduino corresponde exactement à celui voulu, sinon les problèmes vont surgir rapidement. Un Uno R1 n’est pas un UNO R3, qui n’est pas un Leonardo ou un Duemilanove, même si la forme générale est la même !
Prenons par exemple le pinout d’une carte classique Uno R3. Celle ci a été prélevée sur le net en cherchant ’uno r3 pinout’ avec un moteur de recherche et dans la liste des images se trouvaient des dizaines d’image de ce type. Lorsque c’est possible/disponible, mieux vaut prendre les données chez les fabricants, voire les vendeurs. Prendre aussi les images les plus récentes, mais tout ça est juste du bon sens...
Ce qui va nous importer sur cette image, ce sont les rôles donnés à chaque broche. Attention d’abord à ne pas mélanger les numéros de broche. Les numéros à utiliser dans nos programmes sont ceux sérigraphiés sur la carte, ou écrits dans les cases mauve clair de l’image, nommés IDE dans le lexique de couleur en bas à droite. Il y a deux autres façons de nommer une broche : par le numéro correspondant sur le circuit Microcontrôleur lui même, c’est le numéro en gris qui renvoie sur l’image de l’ATMega328 en haut à gauche de l’image, et l’accès par port. Par exemple PB5 qui est la broche 5 sur le port B. Cet accès est possible dans un programme Arduino, surtout pour des questions de vitesse de traitement, mais il est bien plus complexe à utiliser que le simple digitalWrite(13) ! La bibliothèque DIO2 déjà utilisée dans la bibliothèque Commanders et la bibliothèque Accessories permet de bénéficier du meilleur des deux mondes en utilisant une syntaxe compréhensible avec -presque- la vitesse d’un accès direct par broche/port.
Notez aussi que sur certains modèle, certaines broches n’ont qu’un et un seul rôle. Par exemple, un Arduino Nano pourtant équipé du même microcontrôleur qu’un Uno dispose de deux broches A6 et A7 supplémentaires. Ces broches sont uniquement analogiques et ne sont pas utilisables en digital.
Les broches de nos Arduino ont toutes des rôles particuliers qu’il convient de connaître avant de les utiliser. Toutes les broches ne sont pas interchangeables ! Avant de changer de broche pour des raisons de facilité, consultez les documents constructeur ou au moins les images de pinout pour vérifier que le rôle attendu est bien celui fourni par la nouvelle broche ! Et modifiez le programme en fonction des nouvelles broches, mais ça vous le saviez déjà...
[1] Mine de rien, on a déjà couvert un paquet des sujets...
[2] on parle de quelques dizaines de centimètres au maximum..