Affichage des articles dont le libellé est I2C. Afficher tous les articles
Affichage des articles dont le libellé est I2C. Afficher tous les articles

Un écran HD44780 sur bus I2C avec Arduino

1407906-1360x768-[DesktopNexus.com]_thumb[32]
Les écrans HD44780 sont surement les plus utilisés dans le monde de la bidouille Arduino, notamment grâce au fait qu'ils soient peu chers (3€ en chine et environs 10€ chez nous) et plutôt simples à utiliser.

Le problème de ces écrans est le fait qu'ils utilisent un bus de données parallèle sur 4 bits et que 2 bornes de plus sont nécessaire à leur fonctionnement. On se retrouve donc avec un écran qui a besoin de 6 pins de notre microcontrôleur pour fonctionner. L'Arduino par exemple ne possède que 14 pins, ce qui en consomme presque la moitié.
Heureusement la plupart des microcontrôleurs (dont celui de l'Arduino) possède un bus I²C qui une méthode de connexion très simple sur seulement 2 bornes et sur lequel on peut connecter un grand nombre de périphérique. Donc sur ces 2 bornes I²C on va pouvoir connecter une horloge par exemple ou dans notre cas, un extenseur 8 bits pour faire fonctionner notre écran.

Cet extenseur 8 bits est le PCF8574, il coute entre 1 et 2€. C'est un composant traversant de 16 pins. Il en existe différentes variantes comme le PCF8574AP que j'ai, mais ils fonctionneront tous de façon similaire.

Voici le montage simple :



Ce montage requière un potentiomètre de 10KOhm pour régler le contraste de l'écran.
Le PCF8574 possède 3 bornes d'adresse pour permettre d'utiliser par exemple plusieurs écrans sur les même bornes I²C.

Ces 3 broches sont A0, A1 et A2 (voir schéma ci-dessous). Si vous désirez n'utiliser qu'un seul écran, il faut mettre ces trois broches sur 0v. Ce qui donne une adresse 0x38 pour les PCF8574A et 0x20 pour PCF8574.



Je me suis donc fabriqué une petite carte d'essai avec tout le nécessaire dessus :



Voici le schéma des bornes de l'écran LCD HD44780:


Pour information, la borne RS sert à sélectionner le registre dans lequel on écrit, la borne R/W permet de commuter entre lecture et écriture, on souhaite seulement "écrire" sur l'écran dont elle sera tout le temps à 0v. Et la borne E permet d'activer l'écriture dans un registre.

Mais tout ça est trop compliqué à faire "manuellement", sur Arduino une bibliothèque va le faire pour nous, on n'aura juste à lui dire quoi afficher sur l'écran.

Cette bibliothèque nommée LiquidCrystal_I2C utilise la même mise en forme que la bibliothèque LiquidCrystal intégré par défaut au logiciel Arduino. Je vous invite donc à la télécharger ici et à l'installer dans votre répertoire C:\Program Files (x86)\Arduino\libraries .





Voici un exemple de code :

#include <Wire.h> //bibliothèque série i2c
#include <LiquidCrystal_I2C.h> //bibliothèque du couple extenseur i2c + écran

LiquidCrystal_I2C lcd(0x38,16,2);
//L'adresse de l'écran : 0x38 (trois pin d’adresse sur GND) pour un écran de
//16 colonnes et 2 lignes

void setup() {

lcd.init(); //on initialise l'écran
lcd.clear(); //on vide l'écran

}

void loop() {

lcd.setCursor(0,0); //on se place en haut à gauche de l'écran
lcd.print("Salut"); //on affiche du texte
lcd.setCursor(0,1); //on se place sur la deuxième ligne à gauche
lcd.print((millis())/1000); //on affiche nombre de seconde depuis l'allumage

delay(1000);

}

Quelques liens :

Une horloge sur bus I2C avec Arduino

1407906-1360x768-[DesktopNexus.com]_thumb[32]
Si votre arduino a besoin de se souvenir de l'heure qu'il est, et ce même après l'avoir débranché, vous avez besoin d'une RTC (real time clock ou horloge temps réel).
Le circuit RTC le plus répandus est le DS1307 et ce n'est pas pour rien; il est très simple, se branche sur bus I²C et ne coute que 1€ chez la plupart des vendeurs.

Le circuit DS1307 possède 8 pattes, mais une n'est pas utile, il s'utilise avec deux résistances de pull-up de 10kohms, un cristal à 32 768 kHZ et en option une pile de +3v de type CR2032.

Le SDA est la borne A4 de l'arduino et le SCL la borne A5.
Vous pouvez bien évidement acheter des modules tout fait mais je ne trouve pas ça marrant donc je me suis soudé moi-même le petit circuit en rajoutant un condensateur de 0.1µF entre le +5v et le GND.

Ensuite pour contrôler ça avec Arduino, j'utilise une librairie RTC classique : rtc-library.rar
Voici un exemple de code Arduino :

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
  Serial.begin(9600);

  Wire.begin();
  RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("Le RTC ne marche pas");
    // mise à l'heure :
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }


}

void loop () {
  DateTime now = RTC.now();

  Serial.print(now.year(), DEC);   //on affiche la date et l'heure sur le port série
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  Serial.print(" depuis 1970 = ");
  Serial.print(now.unixtime());
  Serial.print("sec = ");
  Serial.print(now.unixtime() / 86400L);
  Serial.println("jours");


  Serial.println();
  delay(1000);
}



Une petite horloge que j'ai monté :










Quelques liens :