SCIENCES DE L'INGENIEUR

Niveau : Terminale générale, enseignement de spécialité SI

D
É
C
O
N
N
E
C
T
É

Communiquer avec l'afficheur LCD grove

Le but de ce TP est de capturer, puis de décoder une trame I2C et d'écrire un programme qui permet de se passer de la librairie

1 - Programmation de l'arduino

Vous allez capturer la trame envoyée par un Arduino vers un écran LCD I²C

Le constructeur met à disposition une bibliothèque permettant de simplifier la programmation de l'afficheur LCD.

  • Télécharger cette librairie en cliquant sur le lien suivant : Grove-LCD RGB Backlight Library
  • Exécuter le programme arduino
  • Dans le menu croquis, inclure une blibiothèque , ajouter une librairie zip et sélectionner le fichier précédemment téléchargé.
  • Copier-coller le programme ci-dessous dans l'éditeur Arduino
  • /* Capture d'une trame I²C */
    
    #include <Wire.h>
    #include "rgb_lcd.h"
    rgb_lcd lcd;
    
    void setup() 
    {
    	// Configure l'afficheur LCD 16 colonnes et 2 lignes
    	lcd.begin(16, 2);
    	delay(100);
    }
    
    void loop() 
    {
    	// Envoie le caractère Z toutes les secondes 
    	lcd.print('Z');  
    	delay(1000);	
    }
  • Depuis le menu Outils, sélectionner le port COM sur lequel l'arduino est connecté
  • Sauvegarder puis téléverser le programme dans l'Arduino
  • 2 - Capture de la trame ARDUINO SEUL SANS BRANCHER L'AFFICHER LCD

    Montage sans LCD

  • Branchez les voies A et B de l'oscilloscope sur les broches SDA et SCL (connecteur I2C)
  • Appuyer sur les boutons A, puis B de l'oscilloscope pour activer les 2 entrées (INPUT A : ON, PROBE 1:1 et INPUT B : ON, PROBE 1:1)
  • Régler le déclenchement TRIGGER : sur un front descendant (SLOPE ↓)
  • Options de déclenchement (TRIGGER OPTION) : déclenchement uniquement sur fronts (On Edges...On Trigger)
  • Régler la base de temps TIME sur 5µs
  • Décaler les 2 signaux SDA et SCL avec les boutons MOVE de chaque voie pour voir SDA en haut et SCL en bas de l'oscilloscope.
  • Appuyez sur le bouton CURSOR et déplacer les : (MOVE ).
  • Relever la fréquence de l'horloge générée par le maitre : FSCK = kHz et en déduire le débit : kbauds
  • Régler la base de temps sur 20µs
  • Capturer la tramme et reproduisez-la ci-dessous, vous pouvez utiliser la fonction zomm de l'oscilloscope pour être plus précis.


  • Trouver l'adresse hexadécimale de l'esclave et le type de requête
  • Schéma de l'afficheur LCD :

    Montage sans LCD

    Caractéristiques constructeur de l'afficheur LCD :

    Item Valeur
    Tension d'alimentation 5V
    Courant absorbé <60mA
    Taille de la mémoire CGROM 10880 bits
    Taille de la mémoire CGRAM 64x8 bits
    Adresse I2C de l'afficheur LCD 0X3E
    Adresse I2C rétroéclairage RVB (option) 0X62
  • d'après vos relevés et les caractéristiques constructeur quel élément de l'afficheur était destinataire de la trame ?
  • 3 - Capture de la trame AVEC L'AFFICHER LCD

    Montage LCD

  • Brancher à chaud l'afficheur LCD sur l'une des lignes I2C et l'oscilloscope sur une autre
  • Relever la trame complète à l'oscilloscope


  • Régler la base de temps de l'oscilloscope afin de pouvoir lire plus facilement les niveaux logiques et relever les deux données transmises
  • Donnée1 : Donnée2 :

    Commandes LCD  Caractères

    La donnée1 correspond au code de commande de l'afficheur et la donnée2 au caractère

  • Quelle commande a été envoyée à l'afficheur ?
  • Quel caractère à été envoyé à l'afficheur ?
  • Faire un reset du microcontrôleur pour vérifier l'envoi du caractère
  • 4 - Autre manière de programmer lcd.print('Z'):

  • Le maitre envoie l'adresse de l'esclave
  • Le maitre envoie la donnée de commande
  • Le maitre envoie la donnée correspondant au caractère à afficher
  • Copier puis coller le programme dans l'éditeur Arduino, puis complétez-le afin de remplacer la méthode lcd.print('Z') :

    // Envoi d'une trame I²C 
    
    #include <Wire.h>
    #include "rgb_lcd.h"
    rgb_lcd lcd;
    
    void setup() 
    {
      // Configure l'afficheur LCD 16 colonnes et 2 lignes
      lcd.begin(16, 2);
      lcd.clear();
      delay(100);
    }
    
    void loop() 
    {
      Wire.beginTransmission(?);  // Envoie start et les bits d'adresses
      Wire.write(?);              // Envoie sur le bus la commande
      Wire.write(?);              // Envoie sur le bus le code de la lettre
      Wire.endTransmission();     // Termine l'envoi par un stop
      delay(1000);  
    }
  • Remplacer les lignes lcd.begin(16, 2) et lcd.clear() en utiliant les commandes "FUNCTION SET" et "SCREEN CLEAR" du tableau de commande de l'afficheur LCD. La ligne #include "rgb_lcd.h" pourra alors être supprimée
  • 5 - rétroéclairage RVB

    Ecrire le programme permettant de choisir la couleur du rétroéclairage de l'afficheur LCD

    Fond : Texte : Tables :