Protocoles communication
Commander deux écrans LCD via une seule ligne
TechTalk

Les écrans LCD à commande sérielle utilisent les niveaux TTL (0 et 5V) et peuvent donc communiquer directement avec un arduino.
-

-

Le protocole de communication sériel historique (via un port RS-232) est décrit ici. Un convertisseur de niveaux pour transformer les niveaux TTL d'un arduino vers une imprimante sérielle se trouve ici.

Mais les écrans LCD peuvent être commandés directement à partir de l'arduino: ces écrans utilisent les niveaux TTL standard. Et ici je vous propose un truc pour commander individuellement deux écrans LCD à partir d'une seule ligne de l'arduino.

En effet, la norme sérielle se contente d'une seule ligne de communication (pas mal par rapport au protocole I2C et SPI), mais on peut faire encore mieux en commandant indépendamment deux périphériques avec une seule ligne.

Dans le protocole TTL standard, la ligne est haute au repos. Mais la fonction SoftwareSerial permet d'inverser la polarité. Voici las instructions à utiliser:

#include <SoftwareSerial.h>

const byte rxPin = 2;
const byte txPin = 3;

SoftwareSerial lcd1 (rxPin, txPin);
SoftwareSerial lcd2 (rxPin, txPin, true);

lcd1.begin(9600);
lcd2.begin(9600);

lcd1.write(...);
lcd2.print(...);

Nous devons utiliser la bibliothèque de fonctions SoftwareSerial car elle permet de modifier la polarité de la ligne sérielle.

Nous définissons ensuite le port d'entrée (que nous n'utilisons pas) et le port de sortie.

Nous créons ensuite deux objets lcd1 et lcd2 qui vont nous permettre d'écrire vers l'un ou l'autre écran. La présence du true indique une polarité de sortie inversée (qui n'est normalement pas utilisée). Les deux objets utilisent les mêmes ports, mais cela ne porte pas à conséquence car il s'agit de ports virtuels qui n'existent que grâce au logiciel.

Nous indiquons ensuite à quelle vitesse la communication doit s'établir. La position des bits dans un octed est déterminé par le timing (baud rate) et si celui ci n''est pas correct, l'écran va mal décoder les données.

Et finalement nous envoyons une donnée à l'écran 1 et à l'écran 2. Nous disposons pour cela des instructions classiques print qui permet d'envoyer du texte, la valeur d'une variable ou d'une constante et write qui envoie le contenu ASCII sans conversion.

Il ne nous manque plus qu'un petit circuit pour inverser la polarité à l'entrée d'un des deux écrans LCD. Le cable peut être assez long: plusieurs mètres au moins. Le mieux c'est d'utiliser du cable pour microphone qui a une bonne tresse de masse pour éviter les parasites (utiliser du cable à 3 conducteurs).

Mais si on veut transmettre les données sur une plus longue distance, on a intérêt à fournir une alimentation de 5V locale. Pour éviter la destruction du module il faut utiliser un double étage d'inversion qui agira comme tampon pour les deux modules (l'entrée RxD est généralement très fragile et entre directement sur un microprocesseur sous forme de goutte noire (qui ne peut pas être remplacé en cas de pépin). Le problème peut en effet se poser si l'arduino est alimenté et que le module ne l'est pas. Le transistor (BC548 ou BC558) résiste lui très bien à une tension inverse de 5V.

La solution, c'est d'utiliser un second inverseur.

L'alimentation est locale pour les deux transistors et les deux modules LCD.

Si la polarisation est normale, un des deux modules pourra décoder l'information reçue.

Si la polarisation est inversée (paramètre true), c'est l'autre module qui va décoder l'information.

La liaison entre l'arduino et les indicateurs LCD peut être plus longue, on ne doit pas tenir compte des pertes (tension d'alimentation). Une distance de 10m est tout à fait possible.

On peut utiliser du fil audio blindé normal, on transmet la masse (GND) et le signal sériel.

Un module LCD a trois entrées: RX ou RxD (receive data): ligne pour recevoir les données série), VDD tension d'alimentation de 5V et GND masse. Il y a parfois une alimentation séparée pour le backlight

La masse est globale: elle va de l'alimentation de l'arduino à l'arduino, au circuit à transistors, aux deux modules LCD et à l'alimentation des écrans LCD.

Un avantage important d'utiliser un transistor pour changer la polarité du signal, c'est que ce transistor élimine également les courts pics de tension qui peuvent apparaitre localement. C'est surtout le cas avec les modules alimentés localement.

Quand on connait le prix de ces modules LCD sériels, c'est une fonction bien utile qui permet de protéger l'entrée du module. Les comporants de l'écran LCD ne peuvent normalement pas être remplacés, ce sont des processeurs dans une goutte noire.(chip on board).

Un petit module inverseur simple

Il est possible que cette procédure ne fonctionne pas avec tous les écrans. Si c'est le cas, on peut commencer l'écriture vers l'autre écran par un blanc, suivi d'une pause de 100ms (delay(100)

Publicités - Reklame

-