Combien d'écrans peut-on brancher sur un Arduino

Bonjour,

Je suis en train de regarder comment fonctionne les écrans sur Arduino.
Je constate qu'on peut apparemment mettre jusqu'à 8 écrans si ceux-ci sont équipés du module I2C.
Le branchement se fait avec 4 fils sur les bornes + et - ainsi que les bornes SDL et SDA, ce qui fait 8 écrans brancher seulement sur 4 broches de l'Arduino.
Il faut également "ponter" avec un tout petit câble sur le module I2C pour permettre d'identifier l'écran dans le programme.

Admettons que j'ai 8 écrans, si je voudrais en mettre un 9ième est-ce que c'est possible ?
(Je n'ai pas encore vu l'utilisation des multiplexeurs)

Si c'est possible quel est la limite d'écrans ? J'imagine qu'il va falloir une alimentation autre que l'USB à un moment. Comment savoir si il faut une plus grosse alimentation ?

(Pour info j'utilise un léonardo pour mon apprentissage mais j'ai aussi un méga)

Merci d'avance.

Bonjour,

Il existe des multiplexeurs I2C comme le TCA9548A qui permettent de connecter 8 périphériques ayant la même adresse sur une seule adresse I2C. Tu peux en mettre jusqu'à 8 sur un bus I2C ce qui fait 64 périphériques ayant la même adresse.
Mais il faut pouvoir gérer les afficheurs. En général l'affichage prend beaucoup de ressources surtout s'il s'agit d'afficheurs graphiques.

Salut.
Tu parles d'un écran en particulier ? Je ne connais pas d'écran ayant 3 broches de sélection d'adresse, mis à part s'il s'agit d'un module PCF9574, destiné aux écrans LCD alphanumériques, plutôt dépassés.
En général il vaut mieux adopter un écran plus grand que plusieurs petits, sauf si les écrans sont disposés sur des faces différentes.
L'I2C est également lent, et un grand écran avec une interface SPI ou parallèle est préférable.

Le principe du I2C est bien décrit sur ce schéma :


Le bus n'occupe que 4 pins sur l'Arduino, quel que soit le nombre de modules connectés (5V, GND, SDA, SCL). Je ne suis pas un expert, je me suis formé comme toi par tests et erreurs... Ce que j'ai compris du bus I2C c'est que les divers esclaves sont identifiés par un numéro (une adresse sur 16 bits, soit un maximum de 256) et qu'ils ne traitent que les messages qui leurs sont adressés grâce à cette adresse.
On trouve souvent des écrans OLED en I2C, ils ont l'adresse codée en dur quelque part et c'est souvent 0x3C ou 0x3D (de mémoire, à confirmer). Du coup, s'il n'y a que 2 adresses possibles, il ne doit pas être possible d'avoir plus de 2 écrans OLED (pour y afficher des choses différentes).
Pour plus d'écrans, il faudra utiliser d'autres bus de communication (SPI, parallèle).

Bonjour lesept

C'est 7 bits, donc 128 maximum.

Ou, comme préconisé par @kamill

Qui est une très bonne solution dans le cas d'écrans multiples.

Cordialement
jpbbriucole

Bonjour Framboise_Prudente

Le mieux est de directement partir sur une alimentation externe, 5V pour autant que tu n'aies que des affichages en 5V. Pour ce faire tu t'équipes de petits plug de ce type:


que tu alimentes avec un chargeur USB.
G sur GND commun affichages et Arduino, V sur 5V Affichages et 5V Arduino, ainsi, en exploitation, plius besoin du càble USB PC > Arduino.

Cordialement
jpbbricole

Oui, 7 bits : merci de la précision.
Par contre, je ne comprends pas comment on peut afficher différemment sur 2 écrans ayant la même adresse I2C. Le MUX va permettre d'avoir plein d'écrans mais ils afficheront tous la même chose s'ils ont la même adresse (ou me trompe-je ?). Dans ce cas, je ne vois pas l'intérêt...

Bonjour lesept

Plutôt que d'appeler multiplexeur, il faudrait appeler multiplicateur de bus. Ainsi avec le TCA9548 on a 8 bus i2C indépendants que l'on invoque chaque fois que l'on doit intervenir sur un composant i2C "accroché" sur sa branche.

Cordialement
jpbbricole

OK, je comprends : le multiplicateur va donner un nouvel Id à chaque device qu'il connecte.

Pas vraiment, c'est comme un switch rotatif à deux galettes et 8 positions.
Si tu utilises la librairie AdaFruit, par exemple avec deux SHT31 :

QWIICMUX myMux;
Adafruit_SHT31 sht31A = Adafruit_SHT31();
Adafruit_SHT31 sht31B = Adafruit_SHT31();

 if (myMux.begin() == false) {
    Serial.println("Mux not detected. Freezing...");
    while (1);
  }
  Serial.println("Mux detected");

  byte currentPortNumber = myMux.getPort();
  Serial.print("CurrentPort: ");
  Serial.println(currentPortNumber);

   // initialisation SHT31 A
  myMux.setPort(2);
  if (!sht31A.begin(0x44)) {
    Serial.println("Couldn't find sensor A");
    while (1) delay(1);
  }
  // initialisation SHT31 B
  myMux.setPort(3);
  if (!sht31B.begin(0x44)) {
    Serial.println("Couldn't find sensor B");
    while (1) delay(1);
  }
}

Bonjour lesept

La "mécanique" est ainsi pour atteindre l'écran 0x27 sur la branche 2 du TCA9548:
On sélectionne la branche 2 du TCA9548
On envoie les ordres à l'écran 0x27 (comme s'il n'y avait pas de TCA9548)

Les devices conservent leur id.

Mon terme de multiplicateur n'était pas très adroit, c'est plutôt un aiguillage de bus i2C.

Cordialement
jpbbricole

En utilisant une interface parallèle, les écrans ont des brioches de dialogues plus nombreuses, par exemple 8 fils pour les données et 5 fils pour gérer la communication dont un fil "chip select".

En connectant tous les fils ensembles sauf les chips selects, cela mange 12 broches. Sur une méga qui en comporte 66 (si je ne me trompe) sans utiliser les broches 0 et 1, on peut donc brancher 66-12 soit 54 écrans sans circuits supplémentaires (peut être un amplificateur de bus pour pouvoir connecter 54 broches en parallèle sur les sorties de la Mega).

Si cela ne suffit pas, on peut utiliser les 54 broches pour choisir un écran parmi les 2 puissance 54 écrans.

Il faudra peut-être garder quelques broches pour mettre une carte SD.

De toutes façons un écran 320*240 en couleur 16 bits va occuper 154ko. il n'est donc pas question de stocker beaucoup de données d'un écran. Au cas ou il y a toujours la possibilité de lire les données de l'écran ou de les mettre en carte SD.

kamill veut peut-être parler de la librairie OLED SSD1306 d'AdaFruit, qui consomme beaucoup de RAM.

Le croquis utilise 14222 octets (44 %) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 1544 octets (75 %) de mémoire dynamique, ce qui laisse 504 octets pour les variables locales. Le maximum est de 2048 octets.

Cette librairie pourra difficilement offrir plusieurs instances d'écran sur un ATMEGA328.

Merci beaucoup pour vos explications ( pas toujours évidentes à comprendre à mon niveau :laughing: ).

En fait je pensais prendre ces écrans qui du coup ont l'I2C intégrés :

Pour un projet de contrôleur DAW, ils vont me servir à afficher le nom de la piste sur Ableton Live.
Mais du coup @hbachetti me fait douter, et comme suggéré j'ai cherché un seul grand écran qui fasse entre 13cm et 15cm de largeur et entre 5cm et 7 cm de hauteur (je n'afficherais que 4 noms de pistes avec une jauge de panoramique pour chaque pistes et cela suffira).

Je ne trouve pas ce genre d'écran dans les 40 - 50 euros max en tout cas, en plus je ne vois que du tactile et je n'en ai pas besoin. Si il y a des couleurs tant mieux mais s'il n'y en a pas ce n'est pas grave, le noir et blanc peuvent suffirent.

Je continue mes recherches !

Merci :slightly_smiling_face:

C'est bien l'écran auquel je pensais.
Ce type d'écran peut parfaitement afficher 4 lignes lisibles.
Par contre il sera limité en largeur, contrairement à un TFT plus grand

Jeff Bezos étant un des hommes les plus riches du monde (> 100 milliards de $), tu n'as pas besoin de l'enrichir encore plus. Quand on voit les prix pratiqués, ce n'est pas étonnant. Et si tu regardais ailleurs ?
SSD1306 I2C
ILI9341 SPI

5 pouces environ. Tu entre dans la catégorie des écrans de grande taille avec interface ITDB02
SSD1963 5"
SSD1963 4.3"
Ces écrans se pilotent plutôt avec une MEGA, mais un processeur plus rapide serait serait certainement plus confortable.

Le tactile n'est pas une obligation, rien ne t'empêche de ne pas l'utiliser.

Tu ferais bien de lire ceci :

Paragraphe 6. Les écrans TFT de grande taille

Il existe une version de l’i2c sous deux octets, donc un plus grand nombre d’adresses possibles, je ne sais pas comment cela fonctionne.
Je n’ai pas encore vu de composants qui utilisent cette facilité. Probablement que cela viendra quand toutes les adesses 7 bits seront épuisées, comme ce fût le cas pour les adresses IP.

La norme i2c dit que la fréquence max de l’i2c peut etre superieure a 4 MHz avec des limitations de fonctionnalité comme l’abandon du bidectionnel : seul le maitre peut parler, ce qui pour un écran n’est pas genant.

Ce qui est genant c’est que je n’ai pas encore vu de produit utilisant cette norme.

Sans prise de tête l’i2c peut fonctionner ”officiellement” à 400 kHz.
Tout aussi officiellement l’i2c peut fonctionner a 10 kHz.
Quand la rapidité n’est pas utile, baisser la fréquence peut resoudre des problèmes de longueur de connexion.

La bibliothèque Wire permet de modifier la fréquence de l’horloge i2c.
Micro avr : fréquence max un peu plus de 500 kHz (j’ai fait l’essai, mais je n’ai plus le chiffre en tête). Les registres 8 bits limitent les choix possibles.

Il faudrait recommencer les tests avec des micros 32 bits.

J'avais l'impression qu'il n'y avait pas de régulateur, comment fait ton pour réserver une adresse ?

Il faut adherer à l'organisation qui gère l'I2C soit probablement NXP qui a repris les activité Philips composant et payer pour chaque adresse.

Il faut aussi payer pour avoir le droit de dire qu'on est I2C.
C'est pour cela qu'Atmel, qui n'a pas besoin d'adresse, n'a pas adhérer au consortium I2C et emploie le terme "Two Wire".
Idem pour le bus CAN qui a changé de nom. Les fabricants de microcontroleurs ne voulaient pas payer pour dire qu'ils incorporaient un bus CAN.

Oui je me doutais que si il y a une entité de régulation, ça ne serait pas gratuit :slight_smile:
Merci pour les informations.

Merci !

J'ai eu l'idée de me rapprocher d'un Fablab, ça pourrait être une bonne idée pour ce projet et aussi pour d'autres à l'avenir !

En gros les TFT n'ont pas de bords (cadre) noir, toute la surfasse est utilisable ?

Ok, on va éviter ça merci :grin:

Par curiosité j'aimerai bien faire le test sur un léonardo pour voir ce que ça donnerai et ensuite sur le mega pour voir la différence.

Je pense que je vais prendre 4 petits oled (SSH1106 1,3) et 1 TFT pour voir également la différence entre ces deux options, et cela m’intéresse de faire divers tests dessus. Au pire ça me servira pour d'autres choses.

Merci pour la lecture ! C'est très instructif tout ça !