Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Actionneurs > Les afficheurs > LCD sur I2C simplement

LCD sur I2C simplement

dimanche 25 septembre 2011, par Julien H.


Toutes les versions de cet article : [English] [français]

Le prix des afficheurs à cristaux liquides est en baisse, et il est de plus en plus fréquent de trouver des circuits de commande simples, évitant la gestion du protocole et économisant surtout le nombre de pattes d’entrée/sortie nécessaires. Georges utilise pour son projet un LCD sur bus I2C à base de PCF8574 dont voici la mise en œuvre.

Il y autant de circuits de communication avec un écran LCD que de contrôleurs de LCD. Deux possibilités de se retrouver bloquer par un manque de documentation. La récupération de ce type de composant est donc souvent infructueuse, et on a alors recours à l’achat d’un écran du commerce.

Pour 15 euros (prix public en France), on peut désormais disposer d’un module I2C LCD avec un écran 2 lignes 16 colonnes, rétro-éclairage, fond bleu et caractères blanc. Il existe aussi des versions à 4 lignes et 20 colonnes (B2CQshop par exemple). Dans les deux cas, c’est une bonne affaire.

Module I2C/TWI LCD chez Zartronic (FR)

Ecran 4x20 avec module I2C chez B2cqShop (CN)

Cette baisse s’explique par un nouveau marché grâce à la carte à base de micro-contrôleur Arduino. Il n’est donc pas étonnant que nous aussi nous ayons choisi ce support pour tester cet écran.

Une fois les principes bien maitrisés, il sera toujours possible d’utiliser un autre support, à base de micro-contrôleur ou même d’un PC.

Le matériel

L’écran LCD est équipé d’une puce très courante pour ce type d’afficheurs de texte, l’Hitachi HD44780 à port parallèle. Chacune des pattes est soudée à une petite carte avec une puce PCF8574 qui fait la conversion parallèle / I2C.

La puce PCF8574 est une simple extension de port pour 8 pattes d’entrée/sortie permettant de les contrôler une à une par I2C. Il y aura donc tout un traitement logiciel dans le micro-contrôleur maitre, contrairement à d’autres solutions qui définissent un protocole spécifique à l’affichage de texte, une puce sur l’esclave I2C faisant l’adaptation de protocole et toute la gestion du curseur ce qui allège la partie embarquée du maître. Un point à prendre en considération si vous craignez d’être à cours de ressources.

Datasheet du PCF8574 chez NXP

Ce circuit additionnel ajoute de l’épaisseur mais reste très discret. Il est surtout pratique, avec un connecteur à 4 pattes (masse, alimentation 5 volts, signaux série de données (SDA) et d’horloge (SCL) du bus I2C, ainsi qu’un potentiomètre réglable pour le contraste.

On connecte la masse et l’alimentation au connecteur femelle d’une Arduino Uno, tandis que le signal SDA va sur la patte ANALOG 4 et le signal SCL va sur la patte ANALOG 5. Il s’agit en fait des ports TWI du micro-contrôleur AVR, car sur ce type de puce chaque patte peut avoir plusieurs rôles.

Il n’est pas possible de connecter ailleurs ces signaux, à moins de développer votre propre code logiciel de gestion du bus I2C, sans passer par le périphérique intégré TWI de la puce : vous perdrez en ressources libres pour votre programme principal et le résultat n’est pas garanti.

ATTENTION !

Pour une carte Arduino Mega (ou votre propre carte utilisant un autre micro-contrôleur qu’un ATmega8 ou 168 et 328 comme les Arduino classiques), il faut rechercher quelles pattes portent les signaux SDA et SCL du bus I2C/TWI.

Correspondance des pattes de l’ATmega2560 avec Arduino

Ce problème s’avère particulièrement sournois quand vous utilisez une extension (shield) qui comporte un connecteur I2C : ce dernier n’est alors plus d’aucune utilité pour votre carte Mega.

Le logiciel

L’adressage de l’esclave I²C

L’adresse I2C du module est 0x27 (norme 7 bits) : il faut donc vous assurer qu’aucun autre module sur votre montage n’est connecté avec cette adresse. Mais de toute façon il est toujours conseillé de commencer ses tests avec seulement le maitre (votre micro-contrôleur ou votre carte Arduino) et un seul esclave connecté.

La datasheet du PCF8574 montre que trois pattes permettent de changer l’adresse. Dans le circuit que nous testons, elles sont toutes trois à 1 (ce qui complète la partie fixe pour donner 010 0111 soit 0x27).

Si vous n’utilisez pas une Arduino ou un dispositif logiciel similaire utilisant une adresse à 7 bits, pensez à ajouter le 0 ou le 1 selon que vous êtes en écriture ou en lecture : l’adresse 8 bits devient alors 0100 1110 soit 0x4E ou 0x4F.

Logiciel fourni

Le module LCD I2C est fourni avec une archive contenant une bibliothèque de code pour Arduino.

La bibliothèque s’appelle "Liquid Crystal I2C" et a été testée avec succès sur un environnement de développement Windows + Arduino 0021.

La liste de fonctions est presque compatible avec l’API LCD du Playground Arduino, une page collaborative qui rassemble toutes les façons standards de connecter un écran à cristaux liquides.

Déclaration de l’API LCD

On retrouve donc toutes les fonctions indispensables :

 le constructeur (LiquidCrystal_I2C) avec adresse, colonnes et lignes
 l’initialisation : init
 l’éclairage : backlight, noBacklight
 l’écriture : print
 la gestion du curseur : setCursor

A noter que "println" ne fonctionne pas (ajout d’un caractère illisible au lieu d’un retour à la ligne et qu’il manque certaines fonctions). Mais rien n’empêche de les ajouter, puisque toute la gestion de l’écran est faite depuis la bibliothèque logicielle, la puce PCF8574 étant simplement un convertisseur d’entrées/sorties numériques.

Attention, une page du Playground parle des différentes bibliothèques pour LCD par I2C dont une Liquid Crystal I2C mais il semble que ce ne soit pas la même. Celle de B2cqShop et de DFRobot ne contient pas la fonction setDelay() annoncée obligatoire selon l’API par exemple.

Tous les fichiers constituants la bibliothèque (code, exemples) doivent être placés dans le répertoire "libraries" du répertoire du programme Arduino, pas dans votre répertoire "sketchbook" contenant vos codes. Normalement (en version 0021 en tout cas), ce répertoire "LiquidCrystal_I2C" va se retrouver à côté d’un répertoire "LiquidCrystal" d’origine.

Premier test

Le code est simple :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4); 

void setup() 
{
  lcd.init(); 
  lcd.cursor_on();
  lcd.blink_on();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Hello, world!");
  lcd.setCursor(4,2);
  lcd.print("Pobot is alive !");
  delay(1000);  
  lcd.cursor_off();
  lcd.blink_off();
}

void loop()
{

}

Ce code pèse 2836 octets, preuve que la bibliothèque prend quand même pas mal de place. Pour rappel, tout le code du robot de la Coupe de France 2006 tenait dans 6000 octets.

Vos commentaires

  • Le 5 novembre 2017 à 10:14, par jp28 En réponse à : LCD sur I2C simplement

    Bonjour à tous,
    Merci pour cet article,
    Dans mon cas, cela fonctionne parfaitement (en Nov 2017) avec l’adresse "0x3F" (instruction trouvée sur site Gotronic) et en remplaçant "init" par "begin".

    Répondre à ce message

  • Le 7 février 2017 à 18:39, par roger En réponse à : LCD sur I2C simplement

    bonjour
    je viens de tomber sur votre site car j’essai de trouver des programmes avec arduino et les ecrans lcd mais quand je lance le programme il y a les erreurs que je vous ai laisse dans le fichier attache
    merci d’avance

    Répondre à ce message

  • Le 28 mars 2017 à 15:21, par Aquabiofarm En réponse à : LCD sur I2C simplement

    Bonjour,
    Merci pour vos explications, j’utilise l’exemple hello world fourni, j’ai un souci pour afficher sur la 4ème lignes, j’utilise :
    lcd.setCursor(0,0) ;
    lcd.print("test1") ;
    lcd.setCursor(0,1) ;
    lcd.print("test2") ;
    lcd.setCursor(0,2) ;
    lcd.print("test3") ;
    lcd.setCursor(0,3) ;
    lcd.print("test4") ;
    mais cela a pour effet de l’écrire test4 sur la 1ère ligne
    Une Idée ?
    Merci d’avance.

    • Le 12 avril 2017 à 23:11, par Eric P. En réponse à : LCD sur I2C simplement

      Et sur quelles lignes sont placés les textes précédents ? Y’aurait-il un décalage vertical éventuellement ?

    Répondre à ce message

  • Le 19 mars 2017 à 19:17, par Claude En réponse à : LCD sur I2C simplement

    Désolant !
    Cela ne marche pas !
    pas même possible de copier coller votre exemple !

    • Le 22 mars 2017 à 23:28, par Eric P. En réponse à : LCD sur I2C simplement

      « Cela ne marche pas »
      Désolé, mais difficile de vous aider avec aussi peu d’information. Pourriez-vous au moins préciser ce que vous obtenez comme erreur, par exemple en copiant les messages d’erreur.
      « pas même possible de copier coller votre exemple ! »
      Ah bon, le ctrl-C / ctrl-V ne fonctionne pas sur votre système 🙂 Nous voulons bien vous aider, mais là encore impossible de le faire avec une elle absence d’information.

    Répondre à ce message

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.