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 )-- */
Articles les plus consultés
-
Nous avons enfin nos coordonnées et notre cap! Il reste encore quelques petits calculs a faire: Si notre mobile suit un capGPS à 30° et qu...
-
Suite au programme de test convainquant sous Processing, le voici à la sauce Arduino: Comme indiqué, il faut entrer les valeurs dans les 8 ...
-
Si, comme moi, vous êtes nul en maths, mais que vous rêvez d'envoyer un mobile à un endroit précis de la Planète, ce petit tuto est fait...
-
Un drone en forme de dirigeable? Un peu de papier, de feuilles de plastiques, d'aluminium, de petits moteurs électriques, de servos, de...
-
La vitesse de transmission série du module GY 26 est de 9600bps. Il s'agit bien d'un véritable compas (comparable a une bousole...
-
Pour ne pas "fatiguer" mon arduino en chargeant et rechargeant des programme d'essai, j'ai mis au point ce programme tourn...
-
Dans cet article, je vous propose un programme complet: //Ce programme capture, décode et affiche les données provenant //d'un modul...
-
A présent, notre module sait quelle direction il doit prendre pour se déplacer et a quelle altitude il doit voler... Il faut maintenant lu...
-
Note: Dans ce programme de test de conversion d'une chaine en {int}, "ChaineLongitude" doit toujours avoir la même longueur, ...
Aucun commentaire:
Enregistrer un commentaire