Un écran HD44780 sur bus I2C avec Arduino

1407906-1360x768-[DesktopNexus.com]_thumb[32]

Les écrans HD44780 sont surement les plus utilisés dans le monde de la bidouille Arduino, notamment grâce au fait qu'ils soient peu chers (3€ en chine et environs 10€ chez nous) et plutôt simples à utiliser.

Le problème de ces écrans est le fait qu'ils utilisent un bus de données parallèle sur 4 bits et que 2 bornes de plus sont nécessaire à leur fonctionnement. On se retrouve donc avec un écran qui a besoin de 6 pins de notre microcontrôleur pour fonctionner. L'Arduino par exemple ne possède que 14 pins, ce qui en consomme presque la moitié.

Heureusement la plupart des microcontrôleurs (dont celui de l'Arduino) possède un bus I²C qui une méthode de connexion très simple sur seulement 2 bornes et sur lequel on peut connecter un grand nombre de périphérique. Donc sur ces 2 bornes I²C on va pouvoir connecter
une horloge par exemple ou dans notre cas, un extenseur 8 bits pour faire fonctionner notre écran.

Cet extenseur 8 bits est le PCF8574, il coute entre 1 et 2€. C'est un composant traversant de 16 pins. Il en existe différentes variantes comme le PCF8574AP que j'ai, mais ils fonctionneront tous de façon similaire.
Voici le montage simple : Ce montage requière un potentiomètre de 10KOhm pour régler le contraste de l'écran.



Le PCF8574 possède 3 bornes d'adresse pour permettre d'utiliser par exemple plusieurs écrans sur les même bornes I²C.

Ces 3 broches sont A0, A1 et A2 (voir schéma ci-dessous). Si vous désirez n'utiliser qu'un seul écran, il faut mettre ces trois broches sur 0v. Ce qui donne une adresse 0x38 pour les PCF8574A et 0x20 pour PCF8574.


Je me suis donc fabriqué une petite carte d'essai avec tout le nécessaire dessus :


Voici le schéma des bornes de l'écran LCD HD44780:

Pour information, la borne RS sert à sélectionner le registre dans lequel on écrit, la borne R/W permet de commuter entre lecture et écriture, on souhaite seulement "écrire" sur l'écran dont elle sera tout le temps à 0v. Et la borne E permet d'activer l'écriture dans un registre.

Mais tout ça est trop compliqué à faire "manuellement", sur Arduino une bibliothèque va le faire pour nous, on n'aura juste à lui dire quoi afficher sur l'écran.

Cette bibliothèque nommée LiquidCrystal_I2C utilise la même mise en forme que la bibliothèque LiquidCrystal intégré par défaut au logiciel Arduino. Je vous invite donc à la télécharger ici et à l'installer dans votre répertoire C:\Program Files (x86)\Arduino\libraries .

Voici un exemple de code :
#include <Wire.h>  //bibliothèque sériel
#include <LiquidCrystal_I2C.h> //bibliothèque du couple extenseur i2c + écran

LiquidCrystal_I2C lcd(0x38,16,2);
//L'adresse de l'écran : 0x38 (trois pin d’adresse sur GND) pour un écran de 
//16 colonnes et 2 lignes

void setup()
{
lcd.init(); //on initialise l'écran
lcd.clear(); //on vide l'écran
}

void loop()
{
lcd.setCursor(0,0); //on se place en haut à gauche de l'écran
lcd.print("Salut"); //on affiche du texte

lcd.setCursor(0,1); //on se place sur la deuxième ligne à gauche
lcd.print((millis())/1000); //on affiche nombre de seconde depuis l'allumage

delay(1000);
}
 
Quelques liens :

2 commentaires:

  1. Bonjour, j'ai réalisé le montage mais j'ai un soucis, rien ne s'affiche, je pense que c'est un problème d'adresse car i2c_scanner m'indique 0x27.

    RépondreSupprimer
    Réponses
    1. Avez-vous bien mis les trois pins d'adresse à la masse (GND) ? Si oui l'adresse devrait être 0x20 ou 0x38 en fonction de votre puce.

      Supprimer