Cours:TPS 2103 tp horlogeI2c

De troyesGEII
Aller à : navigation, rechercher

Fiche résumé

Retour à la liste des Tds/Tps

Éléments de correction

Arduino-nano-pinout.png
AfficheurLCD.png

Afficheur LCD, principe général

On définit un afficheur par le nombre de caractères par ligne (20x4), sa tension d’alimentation, sa couleur ainsi que sa taille.

USASCII code chart.png


Pour Afficher un caractère à l’écran on a recours à la table ASCII (American Standard Code for Information Interchange). Les codes ASCII de 0 à 127 sont les codes standards, les codes de 128 à 255 sont les codes étendus peuvent varier suivant le constructeur.

Remarque : Pour nous simplifier le travail, nous utiliserons en programmation des librairies qui font la transposition des caractères en binaire.

Exemple :

  • Pour afficher le caractère A, le code ASCII est 0x41 en hexadécimal, soit 65 en décimal et 0b01000001 en binaire.
  • Remarque : le bit 8 est à zéro (MSB poids fort) car les codes standards sont codés sur 7 bits.
  • Pour afficher le caractère m, le code ASCII est 0x6D en hexadécimal, soit 109 en décimal et 0b01101101 en binaire.


Le connecteur de brochage de l’affichage (partie haute de l’image ci-dessus)

VSS Masse de l’écran.
VDD Alimentation positive de l’écran.
V0 Permet de régler le contraste en faisant varier la tension sur cette borne.
RS Register Select
R/W Read/Write, pour écrire dans l’afficheur on place cette entrée à 0
E Enable, permet d’indiquer à l’afficheur que la donnée sur son bus de data est valide
D0 Bus de communication parallèle 8 bits (data) pour l’échange de données
D1
D2
D3
D4
D5
D6
D7
A Anode des leds pour le rétroéclairage de l’afficheur
K Cathode des leds pour le rétroéclairage de l’afficheur


Pour utiliser cet afficheur avec une carte Arduino, il nous faudrait 11 broches (RS, R/W, E, D0, D1, D2, D3, D4, D5, D6, D7). Pour limiter le nombre de broche, on peut mettre la broche R/W à la masse car on veut uniquement écrire dans l’afficheur. Les constructeurs proposent deux modes de configuration au démarrage soit de travailler avec un bus 8 bits soit avec un bus 4 bits. L’avantage d’un bus 4 bits (D7, D6, D5, D4) c’est que l’on diminue par deux le nombre de broche, par contre notre code ASCII sera envoyé en deux fois pour faire 8 bits donc le temps de transmission sera deux fois plus long. Nous utiliserons le mode 4 bits, il nous faudra donc que six broches (RS, E, D7, D6, D5, D4), si possible on utilisera le même PortX, ce qui simplifiera la programmation. Comme nous utiliserons des libraires pour la programmation, elles ont habituellement une configuration par défaut.


écran LCD et GPIO expander

LcdShield.png

Nous allons utiliser le shield i2c utilisé lors du TP précédent pour connecter l'écran sur la carte arduino Nano que nous allons programmer.

Ce ShieldLCD comporte un écran LCD avec son potentiomètre de réglage du contraste ainsi 6 boutons poussoirs. Il est fait pour être utilisé avec une carte Arduino UNO mais fonctionne aussi sur un Arduino MEGA.

Ici nous allons utiliser une librairie modifiée pour l'utilisation au travers d'un MCP23017.

Todo.jpg Télécharger la librairie donnée dans la partie ressources, et exécuter le programme d'exemple pour vérifier le bon fonctionnement


horloge i2c : DS1307

Ds1307Registres.png

Nous allons ajouter une horloge i2c, et utiliser l'écran LCD pour afficher l'heure sous la forme

Lun 28 Mar 2022
05 :36 :54

Attention :

  • il conviendra d'ajouter au besoin un 0 pour conserver un affichage de chaque champ (heure/minute/seconde) sur 2 caractères.
  • jour/mois seront affichés sur 3/4 caractères


Todo.jpg Connecter cette target i2c et lister à l'aide d'un logiciel "i2c scanner" les périphériques i2c.

Todo.jpg En utilisant ladatasheet du circuit DS1307 en déduire l'adresse configurée du composant


Question.jpg Ecrire un programme permettant d'afficher la date sous la forme demandée

Remarques :

  • le bit CH doit être mis à 0 pour que l'horloge fonctionne
  • il est judicieux d'utiliser un tableau de chaînes de caractères pour les jours/mois
    • const char* jours[]={"Lun","Mar",....};
  • Le codage BCD est utilisé :
    • pour coder en binaire le nombre 45
      • on code 5 en binaire : 0101
      • on code 4 en binaire : 0100
      • le code bcd de 45 sur 8 bits est : 01000101
    • le chiffre des dizaines n'est pas nécessairement codé sur 4 bits (dépend de la valeur maximale)
    • pour convertir un nombre bcd en code ascii :
      • trouver la valeur des unités en masquant les bits des dizaines.
      • trouver la valeur des dizaines en masquant les unités et en faisant un décalage
      • pour convertir un nombre en code ASCII, ajouter 0x30 : char c=n+0x30;
  • Vous pouvez vous servir de la date de compilation de votre programme pour initialiser l'horloge, ci dessous un programme d'exemple affichant l'heure et la date de compilation sur la liaison série.
  char Month[12];
  uint16_t Year;
  uint8_t Day, monthIndex;
  const char *monthName[12] = {
      "Jan", "Feb", "Mar", "Apr", "May", "Jun",
      "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
    };

  sscanf(__DATE__, "%s %d %d", Month, &Day, &Year);
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  Serial.print(Month);
  Serial.print(" : ");
  Serial.println(monthIndex);
  Serial.println(Day);
  Serial.println(Year);
  uint16_t Hour, Min, Sec;
  sscanf(__TIME__, "%d:%d:%d", &Hour, &Min, &Sec);
  Serial.println(Hour);
  Serial.println(Min);
  Serial.println(Sec);

Réglage de l'heure

ConnecteurI2cShield.png

Les boutons sont reliés directement à la carte Arduino via la nappe I2C.

Pour limiter le nombre d’entrée pour les cinq boutons, on utilise qu’une seule entrée analogique A2 (A0 si le Shield LCD est branché directement sur une carte Arduino UNO).

Chaque bouton modifie un pont diviseur de tension.

Suivant la valeur de la tension mesurée on sait quel bouton est appuyé.

Le bouton Reset est relié directement à l’entrée numérique D13. (ne fonctionne pas !!)


BoutonShieldEcran.png

Avec Vcc = 5V déterminez les tensions sur AD0 en fonction du bouton appuyé.

R2 = 3k, R3 = 315, R4 = 593, R5 = 1348, R6 = 914 pour la version 2 du Shield LCD Keypad.

Question.jpg Réalisez un programme qui indique le bouton appuyé sur la liaison série.


Question.jpg Utiliser les boutons pour permettre un réglage de l'heure

Ressources