Les contrôleurs indépendants
Le matériel
1. Présentation
Le panneau de contrôle précédemment présenté peut poser problème si l’on est plusieurs à vouloir piloter des trains. Dans ce cas, il est bien plus pratique de disposer de contrôleurs indépendants. Ces contrôleurs pourraient être connectés sur des « multiprises » I²C qui pourraient être disposées en différents points du réseau.
Voici donc ce qu’il serait possible de faire :
-
Connexion par le bus I²C,
-
Utilisation d’un Arduino Nano comme contrôleur,
-
Contrôle de la vitesse et du sens de marche,
-
Des boutons poussoirs et des interrupteurs pour piloter les fonctions,
-
Un petit écran OLED pour connaître la consigne de vitesse et la locomotive pilotée,
-
Et, pourquoi pas, une LED RGB pour connaître de loin l’état du contrôleur.
Tout se retrouve intégré dans le schéma qui suit, le petit Arduino Nano y étant utilisé de façon optimale.
Quelques explications s’imposent. La connexion I²C se fait par le connecteur J1, en haut à gauche, le signal I²C entrant par les pattes A4 et A5. La tension d’alimentation est injectée directement sur Vin, il est donc nécessaire qu’elle soit supérieure à 5 V pour que le régulateur intégré à l’Arduino Nano fonctionne correctement, on utilisera donc l’alimentation 7V5, qui est disponible sur les connecteurs I²C. En bas, on voit le potentiomètre de contrôle de vitesse et l’interrupteur de sélection du sens de marche qui sont branchés sur A6 et A7.
Le sens de marche est commandé par un interrupteur à trois positions branché sur le connecteur SW1. L’interrupteur commande un pont diviseur, comme dans le panneau de contrôle, c’est donc une valeur analogique qui va être lue et convertie vers une des trois valeurs possibles : avant, arrière et arrêt.
Selon la position de l’interrupteur, les résistances R2 et R3 sont conservées ou shuntées, ce qui permet de faire varier la tension appliquée sur A6 et donc la valeur lue par le programme, comme le représente la table suivante.
Position |
R2+R3 |
Tension... |
Le programme
1. La librairie graphique
L’Arduino Nano ne dispose pas d’énormément de mémoire. C’est pour cela que la librairie u8x8 a été choisie. Contrairement à sa grande sœur, la librairie u8g2 (que l’on a déjà utilisée dans le précédent chapitre), u8x8 écrit directement dans la mémoire de l’afficheur, d’où une importante économie de mémoire (avec cet afficheur 128x64 pixels, il faut réserver 1 ko de mémoire pour pouvoir utiliser u8g2). Cela ne se fait pas sans quelques contraintes : il n’est pas possible de tracer des graphiques à écran, mais on peut afficher des blocs de 8 par 8 pixels, et le texte ne peut faire qu’une taille multiple de 8 pixels, l’écran étant découpé en « tuiles » de 8 par 8 pixels (d’où le nom de la librairie).
La librairie u8x8 est disponible à l’adresse suivante : https://github.com/olikraus/u8g2/wiki/u8x8reference
Pour l’installer dans l’environnement de développement Arduino, il suffit d’ouvrir le gestionnaire de bibliothèques et d’installer la librairie u8g2, qui inclut également la librairie u8x8. Elle a donc probablement été installée lors du précédent chapitre.
Le constructeur
Pour utiliser la librairie u8x8, il faut tout d’abord déclarer une instance de l’objet u8x8. Il n’y a pas une seule classe U8X8, mais de nombreuses classes dérivées, une par modèle d’afficheur, il n’y a qu’à ouvrir l’un des programmes d’exemple fournis avec la librairie pour s’en rendre compte. Pour piloter l’écran présenté ici, il faut instancier la classe suivante :
U8X8_SSD1306_128X64_NONAME_4W_HW_SPI
Le nom n’est pas choisi au hasard, il correspond aux caractéristiques techniques de l’afficheur :
-
SSD1306 : référence du contrôleur d’affichage.
-
128x64 : nombre de colonnes et de lignes.
-
NONAME : signifie qu’il s’agit d’un modèle générique.
-
4W : communication sur 4 fils.
-
HW : utilisation de l’interface matérielle (hardware).
-
SPI : interface...
Pour aller plus loin
1. Un amplificateur de bus
Pour relier les contrôleurs au bus I²C, il va être nécessaire de créer des sortes de « multiprises I²C » qui permettront la connexion des contrôleurs. Tant qu’à faire, autant créer un prolongateur de bus I²C qui permettra également la connexion d’autres périphériques I²C.
Si on cherche bien dans les catalogues de composants de NXP (ex. Philips, le créateur de la norme I²C), on peut y trouver des circuits destinés à étendre la portée du bus I²C, ce qui permet de s’affranchir de sa principale limitation. Un des circuits les plus récents dans cette catégorie est le PCA9615. Il permet d’établir une liaison I²C différentielle, chacun des signaux SDA et SCL nécessitant alors deux fils pour la transmission des données. Avec la masse, cinq fils sont donc nécessaires en tout, au lieu de trois sur une liaison I²C classique. Ce bus est nommé dI²C, ce qui signifie I²C différentiel.
Le PCA9615 est essentiellement constitué de deux amplificateurs bidirectionnels. D’un côté, on a le bus I²C classique et de l’autre côté, le bus dI²C. Ce qui fait toute la force de ce circuit, c’est sa logique de changement de sens qui permet d’activer instantanément les amplificateurs dans un sens ou dans l’autre selon le côté d’où proviennent les signaux.
L’avantage de cette liaison différentielle, est une grande immunité des signaux au bruit. Par ailleurs, l’installation de véritables terminateurs aux extrémités du bus (et non pas de simples pull-up comme en I²C) permet de garantir une vitesse de transmission élevée même sur des longueurs importantes.
Il n’existe toujours pas de connecteur vraiment normalisé, car même si un câble Ethernet de catégorie 5 est recommandé pour véhiculer les signaux, le brochage du connecteur 8P8C de ìtype RJ45 est variable selon le fabricant.
La carte d’évaluation proposée par NXP (décrite dans la note UM10856) et la carte d’interface développée par SparkFun (qui n’est...