Gérer un afficheur I2C LCD 4x20 !

Le langage C permet de créer des programmes rapides et proches de la machine

Modérateur : Francois

Répondre
Artemus24
Raspinaute
Messages : 1077
Enregistré le : ven. 15 sept. 2017 19:15

Gérer un afficheur I2C LCD 4x20 !

Message par Artemus24 » lun. 28 oct. 2019 07:37

Bonjour à tous.

Je suis en possession de cet afficheur que j'ai acheté chez GoTronic :
--> https://www.gotronic.fr/art-afficheur-l ... -25649.htm

Je suis sous raspbian buster dans une RPi 2B et j'essaye de faire un driver en "C/C++" à l'instar de ce qui existe déjà en python.
J'ai fait les tests en python, et j'arrive à afficher du texte sans problème.
A priori, le problème ne vient pas de la configuration du raspberry Pi 2B, ni de l'afficheur.

Depuis plusieurs jours, j'ai lu la documentation sur le net en ce qui concerne l'I2C et l'afficheur.
L'afficheur est constitué de deux blocs :
--> il y a l'affichage en LCD qui est, d'après ce que j'ai pu trouvé mais je n'en suis pas sûr, un HD44780.
--> la puce "PCF8574" qui permet de gérer l'I2C.

Comme je reprends tout à zéro, mon programme qui est en cours de développement comprends deux parties :
--> la gestion du I2C au travers de SMBus en gérant cela par des ioctl.
--> la gestion de l'afficheur que j'ai repris de ce qui se fait en Python.

J'ai plusieurs problèmes :
a) je ne sais pas si ce que je fais avec l'I2C est correcte. J'utilise pour cela les fonctionnalités de SMBus.
La fonction principale que j'utilise pour les commandes est la suivante :

Code : Tout sélectionner

/*--------------------------*/
/*     Function "write"     */
/*--------------------------*/

void i2c_write(unsigned char _cmd)
{
	struct	i2c_smbus_ioctl_data	args;

	args.read_write		= I2C_SMBUS_WRITE;
	args.command		= _cmd;
	args.size		= I2C_SMBUS_BYTE;
	args.data		= NULL;

	if(ioctl(i2c_handle,I2C_SMBUS,&args) < 0)
	{
		fprintf(stderr,"Ioctl Error : %s\n",, strerror(errno));
		fprintf(stderr,"Unable to write byte I2C data\n");
		fflush(stderr);
		exit(EXIT_FAILURE);
	}
}
J'arrive à faire quelque chose sur l'afficheur, mais cela ne fonctionne pas comme je le voudrais.
Dans le i2c_handle, j'ai le retour de la fonction open sur le bus 1 (/dev/i2c-1) qui st bien activé avec l'adresse du slave qui chez moi est 0x27.

b) selon les documents que je possède, je n'ai jamais la même séquence d'initialisation de l'afficheur.
J'ai fait le choix de travailler en mode 8 bits.

Code : Tout sélectionner

/*---------------------*/
/*      Initialize     */
/*---------------------*/

void led_init(void)
{
	i2c_write(LCD_FUNCTION_SET | LCD_8BITS);
	i2c_delay(5);

	i2c_write(LCD_FUNCTION_SET | LCD_8BITS);
	i2c_delay(5);

	i2c_write(LCD_FUNCTION_SET | LCD_8BITS);
	i2c_delay(5);

	i2c_write(LCD_FUNCTION_SET | LCD_8BITS | LCD_2LINE | LCD_5x8DOTS);
	i2c_delay(5);

	i2c_write(LCD_CLEAR_DISPLAY);
	i2c_delay(5);

	i2c_write(LCD_DISPLAY_CONTROL | LCD_DISPLAY_ON);
	i2c_delay(5);

	i2c_write(LCD_ENTRY_SET_MODE | LCD_ENTRY_LEFT);
	i2c_delay(200);
}
Résultat, l'écran ne s'efface pas et je ne sais pas pourquoi.
Pourtant quand je déclenche le programme, il agit bien sur l'afficheur.

c) je n'ai pas compris comment agir sur la broche "RS". Même problème aussi pour les broches "R/W" et "N".
Il me faudrait une autre fonction I2C mais je ne sais pas laquelle utiliser.
J'ai fait plusieurs tentatives mais cela ne donne rien.

d) Afficher des chaines de caractères.
J'ai compris (enfin je crois) que cela se faisait en deux temps
Sélectionner la position du curseur en fonction de la ligne où l'on désire mettre la chaîne de caractères.
Envoyer la chaîne, caractère par caractère.
Sauf que tous les exemples en python se font en mode 4 bits et je n'ai pas du tout compris pourquoi ce choix.

Le problème que je rencontre est que la caractère est une "data" et non une "command".
Pour forcer l'envoi d'une "data", il faut que je positionne la broche "RS" à 1 et je ne sais pas comment le faire.
Inversement, ce que j'envoie en tant que "command" semble fonctionner (enfin ça agit sur l'afficheur, mais cela ne fait pas ce que je veux).

Est-ce que vous avez déjà utiliser un afficheur i2c dans le langage "C/C++" ?

@+
RPI4B/8GB + Argon FanHAt
Rpi3A+, Rpi3B+
RPi 2B + Joy-It I2C Serial 20x4 2004 LCD Module
RPi 2B + PIM273 Unicorn HAT HD 16x16 Leds RGB
RPi0v1.3, RPi0W + LibreElec/Kodi, Rpi0WH + Tuner TV HAT
NodeMCU ESP32

Répondre

Retourner vers « C / C++ »