25 avril 2012

Juillet 2014

Je laisse cette page mais ce composant est obsolète et la leçon 20 présente son successeur.

Arduino leçon 19 : l'afficheur graphique

Nous avons vu l'afficheur caractères de 2 lignes. Cette fois nous allons étudier les dessins sur afficheur.
pas FB

l'afficheur 128x64 pixels

afficheur graphique

Sur cet afficheur comme sur le mien, la broche 1 est à droite. Sur le 16x2, elle était à gauche. Sur le vôtre, pensez à vérifier.

La bibliothèque

Lors de l'installation basique d'Arduino, nous n'avions pas les fonctions de commande de cet afficheur.
Nous devons ajouter la bibliothèque spécifique.
La version actuelle s'appelle GLCD. La version précédente s'appelait ks0108.

installation

Il faut récupérer sur le web le fichier glcd-date.zip sur cette page.
La version que j'utilise a pour date 20111205 (5 déc 2011) mais prenez la plus récente que vous trouverez.
Sur votre PC, recherchez la bibliothèque .../Arduino/libraries/ et dézippez-y ce fichier.
Ça vous créera un sous-répertoire glcd dans lequel Arduino saura retrouver les fonctions nécessaires.

Les branchements

Voici le tableau des liaisons entre Arduino et l'afficheur :

afficheurArduino
  7 DB022
  8 DB123
  9 DB224
10 DB325
11 DB426
12 DB527
13 DB628
14 DB729
. .
15 CS133
16 CS234
17 RSTrst ou +5
  5 R/W35 ou gnd
  4 RS36
  6 En37
afficheurautres
1Ground
2+5v
3curseur du potentiomètre
18extrêmité du potentiomètre
19+5 via 270 ohms
20Ground

Quelques broches spéciales

réglage du contraste

Pour le contraste, l'afficheur a besoin d'une tension négative sur la pin 3 et d'une tension positive sur la pin 19.
La pin 19 est reliée au +5 par une résistance de 100 à 560 ohms qui limite le courant.
La tension négative fournie à la pin 3 doit être ajustée avec précision et n'est pas forcément la même pour 2 afficheurs qui nous paraissent identiques, d'où la nécessité d'un potentiomètre.
La pin 18 fournit une tension négative (contrairement aux autres pins, la 18 est une sortie).
Un potentiomètre entre la pin 18 et la masse fournira en son point milieu une tension ajustable pour la pin 3.

reset

La broche 17 provoque le reset de l'afficheur quand elle est au niveau bas.
On la reliera donc au +5 pour éviter ce reset. On peut aussi la relier à la broche RST d'Arduino si on veut provoquer un reset de l'afficheur quand on reset Arduino.
Si on la laisse en l'air, on risque d'avoir des reset aléatoires.

Les fonctions graphiques

Elles sont nombreuses, du genre tracer un trait de (x1,y1) à (x2,y2) ou bien tracer un cercle de centre (x,y) et de rayon r.
En voici quelques une définies dans glcd.h :

// Graphic Functions
void ClearScreen(int color = WHITE);
void DrawVLine(int x, int y, int height, int color= BLACK);
void DrawHLine(int x, int y, int width, int color= BLACK);
void DrawLine(int x1, int y1, int x2, int y2, int color= BLACK);
void DrawRect(int x, int y, int width, int height, int color= BLACK);
void DrawRoundRect(int x, int y, int width, int height, int radius, int color= BLACK);
void FillRect(int x, int y, int width, int height, int color= BLACK);
void InvertRect(int x, int y, int width, int height);
void DrawCircle(int xCenter, int yCenter, int radius, int color= BLACK);
void FillCircle(int xCenter, int yCenter, int radius, int color= BLACK);
void DrawBitmap(Image_t bitmap, int x, int y, int color= BLACK);

où les valeurs des abscisses vont de 0 à 127, celles des ordonnées de 0 à 63.

Programme

dessin bitmap

Notre programme va afficher un bitmap.
Ce bitmap est déjà converti en langage Arduino dans le fichier ArduinoIcon64x64.h du répertoire bitmaps.

logo sur afficheur

#include <glcd.h>
#include "bitmaps/ArduinoIcon64x64.h" // bitmap
#include "fonts/SystemFont5x7.h" // system font
void setup()      {
      GLCD.Init(NON_INVERTED); // initialise the library, non inverted writes pixels onto a clear screen
      GLCD.ClearScreen();
      GLCD.DrawBitmap(ArduinoIcon64x64, 32,0, BLACK); //draw the bitmap at the given x,y position
      GLCD.SelectFont(System5x7); // switch to fixed width system font
//      countdown(15);
//      GLCD.ClearScreen();
}

void loop(){
      // on ne fait rien
}

Avant d'aller plus loin, on essaye ce programme. Ensuite, on va regarder comment est fait le bitmap dans ArduinoIcon64x64.h

dessin géométrique

Dans la partie gauche de l'afficheur, nous allons tracer un cercle et aussi des traits issus d'un angle.
Pour libérer de la place, nous activons les 2 lignes qui étaient en commentaire.

#include <glcd.h>
#include "fonts/Arial14.h" // proportional font
#include "fonts/SystemFont5x7.h" // system font
#include "bitmaps/ArduinoIcon.h" // bitmap

void showCharacters();
//void drawSpinner(byte pos, byte x, byte y);

unsigned long startMillis;
unsigned int loops = 0;
unsigned int iter = 0;

void setup()      {
      on supprime les // devant les 2 dernières lignes
}

void loop()      {
      iter = 0;
      startMillis = millis();
      while( millis() - startMillis < 1000){ // loop for one second
            GLCD.DrawRect(0, 0, 64, 61, BLACK);      // rectangle in left side of screen
            for(int i=0; i < 62; i += 4)
            GLCD.DrawLine(1,1,63,i, BLACK);     // draw lines from upper left down right side of rectangle
            GLCD.DrawCircle(32,31,30,BLACK);     // draw circle centered in the left side of screen
            //GLCD.FillRect(66,0,63,63, BLACK);      // clear previous spinner position
            //drawSpinner(loops++,96,32);          // draw new spinner position
            GLCD.CursorTo(5,5);            // locate curser for printing text
            GLCD.PrintNumber(++iter);     // print current iteration at the current cursor position
      }
}

 void countdown(int count)      {
       while(count--){ // do countdown
             GLCD.CursorTo(0,1); // first column, second row (offset is from 0)
             GLCD.PutChar(count + '0');
             delay(1000);
        }
  }

Testez ce programme.
Essayez de comprendre le rôle de la variable "iter".

animation

Nous allons maintenant créer une animation dans la partie droite de l'afficheur.
Pour cela, nous allons dessiner un trait, puis le remplacer par un autre légèrement incliné, puis par un davantage incliné etc...
On garde tout ce qu'on avait dans le programme, dans la boucle on supprime les //, et à la fin on ajoute :

    void drawSpinner(byte pos, byte x, byte y)         {
        switch(pos % 8)         {
            case 0 : GLCD.DrawLine( x , y-16, x, y+16, WHITE); break;
            case 1 : GLCD.DrawLine( x+6, y-14, x-6, y+14, WHITE); break;
            case 2 : GLCD.DrawLine( x+12, y-12, x-12, y+12, WHITE); break;
            case 3 : GLCD.DrawLine( x+14, y-6, x-14, y+6, WHITE); break;
            case 4 : GLCD.DrawLine( x+16, y , x-16, y , WHITE); break;
            case 5 : GLCD.DrawLine( x+14, y+6, x-14, y-6, WHITE); break;
            case 6 : GLCD.DrawLine( x+12, y+12, x-12, y-12, WHITE); break;
            case 7 : GLCD.DrawLine( x+6, y+14, x-6, y-14, WHITE); break;
        }
    }

aller plus loin ?

Si vous voulez afficher vos propres images, je vous propose une autre leçon supplémentaire qui risque d'être plus difficile.
Sinon, passez directement à la leçon 20.



haut de la page
flèche gauche Page Précédente : la liaison SPI Leçon 19bis : suite sur les afficheurs flèche droite
Leçon 20 : l'afficheur couleur flèche droite

Valid XHTML 1.0 Transitional