Articles les plus consultés

Module LCD I2C 4004

Comme il serait interressant, dans un premier temps, de vérifier en situation réelle que les différents modules fonctionnent correctement, (notamment GPS & boussole), voici un petit tuto pour un afficheur 4004...

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.
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.

L’adressage de l’esclave I²C
Comment identifier l'adresse I2C du Module?
Le module Backpack I2C peut être livré soit avec un PCF857AT, soit un PCF8574T (lisible sur le composant).

L'adresse du module sur le bus I2C dépend:
    Du circuit utilisé
    Et des pontages d'adresse A0, A1, A2

Vous pouvez très facilement déduire ces informations a partir de l'image suivante:


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.
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

Rétro-éclairage:
Enlevez le cavalier (sur la gauche) si vous ne désirez pas utiliser le rétro-éclairage.
Si le cavalier reste en place, vous pourrez contrôler le rétro-éclairage à l'aide des fonctions backlight() et noBacklight() .

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.
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.
---------------------------------------------
Dans mon cas, cela fonctionne parfaitement avec l’adresse "0x3F" (instruction trouvée sur site Gotronic) et en remplaçant "init" par "begin".
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...

Un loop et un backlight et un noBacklight avec un delay(1000), le rétro éclairage clignote bien toutes les secondes.



j'utilise aussi des I²C/LCD basé sur ce compo
j'utilise cette lib =(https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads) LiquidCrystal_I2C

un prog de test qui fonctionne avec les miens (attention je suis en adresse 0x27 )


/* YourDuino.com Example Software Sketch
 20 character 4 line I2C Display
 Backpack Interface labelled "LCM1602 IIC  A0 A1 A2"
 terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <Wire.h>  // Comes with Arduino IDE
// Get the LCD I2C Library here:
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
// Move any other LCD libraries to another folder or delete them
// See Library "Docs" folder for possible commands etc.
#include <LiquidCrystal_I2C.h>

/*-----( Declare Constants )-----*/
//none
/*-----( Declare objects )-----*/
// set the LCD address to 0x20 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
long sec=0;
  long pm=0;
byte ad;
/*-----( Declare Variables )-----*/
byte c0[8] = {17,10,17,21,21,17,10,17};
byte c1[8] = {31,17,17,17,17,17,17,31};
byte c2[8] = {25,21,19,17,19,21,25,0};
byte c3[8] = {3,3,4,9,18,4,24,24};
byte c4[8] = {24,24,4,18,9,4,3,3};
;
//none

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);  // Used to type in characters

  lcd.begin(20,4);         // initialize the lcd for 16 chars 2 lines and turn on backlight
  lcd.createChar(0, c0);
  lcd.createChar(1, c1);
  lcd.createChar(2, c2);
  lcd.createChar(3, c3);
  lcd.createChar(4, c4);


// ------- Quick 3 blinks of backlight  -------------
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on

//-------- Write characters on the display ----------------
// NOTE: Cursor Position: CHAR, LINE) start at 0
lcd.home ();
  lcd.setCursor(3,0); //Start at character 4 on line 0
  lcd.print("Hello, world!");
  delay(1000);

  lcd.setCursor(0,2);
  lcd.print("20 by 4 Line Display");

  delay(2000);
  lcd.clear();
// Wait and then tell user they can start the Serial Monitor and type in characters to
// Display. (Set Serial Monitor option to "No Line Ending")
  lcd.setCursor(0,0); //Start at character 0 on line 0
  lcd.print("TOP Afficheur LCD");
  lcd.setCursor(0,3);
  lcd.print("COMPTEUR TEST");  
  lcd.setCursor(2,1);
  lcd.print("Ligne 2 ");
  lcd.write(byte(0));
  lcd.write(byte(1));
  lcd.write(byte(2));
  lcd.write(byte(3));
  lcd.write(byte(4));
  lcd.write(byte(3));
  lcd.write(byte(4));
  lcd.write(byte(3));
  lcd.write(byte(4));
  lcd.setCursor(0,2);
  lcd.print("        Ligne 3 ");  



}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  {
    // when characters arrive over the serial port...
    if (Serial.available()) {
      // wait a bit for the entire message to arrive
      delay(100);
      // clear the screen
      lcd.clear();
      // read all the available characters
      while (Serial.available() > 0) {
        // display each character to the LCD
        lcd.write(Serial.read());
      }
    }
    if (pm<= millis()-100) {
    sec=sec + 1;
    lcd.setCursor(14,3);
  
  lcd.print(sec);
  ad=sec % 20;
  lcd.setCursor(ad,2);
  lcd.print(" >");
  pm=millis();
    }
  }

}/* --(end main loop )-- */

Aucun commentaire:

Enregistrer un commentaire