Créer des animations et jeux sur LCD avec Arduino UNO
Composants et fournitures
| Arduino UNO | × | 1 |
| Écran LCD alphanumérique 16×2 | × | 1 |
Applications et services en ligne
- Arduino IDE
À propos de ce projet
Ce tutoriel couvre les bases de l'animation sur un écran LCD 16×2 avec Arduino. Les principes s'appliquent à d'autres dimensions d'écrans.
Câblage du LCD
Le schéma ci-dessus montre les connexions :
| Broche LCD | Connexion |
|---|---|
| 1 : VSS | Rail + du breadboard (5 V Arduino) |
| 2 : VDD | Rail – du breadboard (GND Arduino) |
| 3 : VO (contraste) | Curseur du potentiomètre (extrémités sur rails + et –) |
| 4 : RS | Broche Arduino 12 |
| 5 : R/W | Rail – (masse) |
| 6 : E | Broche Arduino 11 |
| 15 : A (anode rétroéclairage) | Rail + via résistance 220 Ω |
| 16 : K (cathode rétroéclairage) | Rail – |
N.connectez pas encore les broches de données. Mettez sous tension : la ligne du bas doit s'allumer. Sinon, vérifiez soudures et câblage.
Si l'écran s'allume, connectez les broches de données :
- 11 (D4) → Arduino 4
- 12 (D5) → Arduino 5
- 13 (D6) → Arduino 6
- 14 (D7) → Arduino 7
Téléversez le code test :
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 4, 5, 6, 7); // rs, e, d4, d5, d6, d7
void setup() {
lcd.begin(16, 2);
lcd.setCursor(0, 1);
lcd.print("Working");
}
void loop() {}
Si des caractères aléatoires apparaissent ou rien ne s'affiche : ajustez le contraste, vérifiez les soudures des broches de données (pas de court-circuit), et contrôlez que les numéros de broches dans le code correspondent au câblage.
Si « Working » s'affiche, le câblage est réussi.
Explication du code de test
LiquidCrystal lcd(12,11,4,5,6,7);: déclare l'objetlcdavec les broches d'interface.lcd.begin(16,2);: définit 16 colonnes × 2 lignes (adaptez selon votre écran).lcd.setCursor(0,1);: positionne le curseur colonne 0, ligne 1 (index 0-based).lcd.print("Welcome");: affiche le texte à la position du curseur.
Texte défilant (scrolling)
Seules setup() et loop() changent :
void setup() { lcd.begin(16,2); }
void loop() {
int n = 15;
char message[] = "scrolling text!";
char* ptr = message;
while(n != -14) {
lcd.clear();
lcd.setCursor(n, 1);
if(n < 0) ptr++;
lcd.print(ptr);
n--;
delay(250);
}
}
Le pointeur ptr avance pour afficher la portion visible du message quand le début sort de l'écran à gauche. La bibliothèque gère la sortie à droite. Ajustez delay(250) pour la vitesse.
Caractères personnalisés
On définit un octet par ligne (1 = pixel allumé, 0 = éteint) :
byte dino[] = {
B01110, B01110, B01100, B01111,
B11101, B01010, B01010, B01010
};
Créez les vôtres ici : LCD Character Creator.
Pour les afficher :
void setup() {
lcd.createChar(0, dino);
lcd.begin(16,2);
lcd.setCursor(0,1);
lcd.write(byte(0));
}
createChar(0, dino) enregistre le caractère à l'index 0. lcd.write(byte(0)) l'affiche.
Animation : flèches tirées
Trois caractères personnalisés (pointe, corps, queue) simulent une flèche en mouvement :
byte arrowhead[] = { B00001, B00011, B00111, B01111, B00111, B00011, B00001, B00000 };
byte arrowbody[] = { B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000 };
byte arrowtail[] = { B00011, B00111, B11111, B11111, B11111, B00111, B00011, B00000 };
void setup() {
lcd.createChar(0, arrowhead);
lcd.createChar(1, arrowbody);
lcd.createChar(2, arrowtail);
lcd.begin(16,2);
}
void loop() {
int n = 15;
while(n != -1) {
lcd.clear();
lcd.setCursor(0,1);
lcd.write(byte(0));
lcd.write(byte(1));
lcd.write(byte(2));
n--;
delay(50);
}
}
Un léger « trainée » peut apparaître derrière la queue – c'est normal (rémanence de l'affichage).
Jeu sur LCD : esquive les flèches
Objectif : Un héros (bonhomme) sur la ligne 1 (index 1) doit éviter des flèches qui défilent. Appuyez sur un bouton (broche 2) pour sauter sur la ligne 0. Le score s'incrémente à chaque frame et s'affiche en haut à droite. Si une flèche touche le héros : Game Over.
Le code complet (avec interruptions et génération aléatoire) est fourni dans la section Code. Points clés :
attachInterrupt(0, buttonin, CHANGE);: appellebuttonin()à tout changement d'état sur la broche 2 (interruption externe 0), garantissant une réactivité temps réel.randomSeed(analogRead(A0));: initialise le générateur aléatoire avec le bruit analogique de A0 (non connecté) – vraiment aléatoire.- La fonction
buttonin()lit l'état du bouton et modifie la variablelevel(0 = ligne haute, 1 = ligne basse).
Code
Animation (flèches)
#include <LiquidCrystal.h>
const int rs=12, en=11, d4=4, d5=5, d6=6, d7=7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
byte arrowhead[] = { B00001, B00011, B00111, B01111, B00111, B00011, B00001, B00000 };
byte arrowbody[] = { B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000 };
byte arrowtail[] = { B00011, B00111, B11111, B11111, B11111, B00111, B00011, B00000 };
byte man[] = { B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001 };
void setup() {
lcd.createChar(0, arrowhead);
lcd.createChar(1, arrowbody);
lcd.createChar(2, arrowtail);
lcd.createChar(3, man);
lcd.begin(16,2);
}
void loop() {
int n = 15;
while(n != -1) {
lcd.clear();
delay(10);
lcd.setCursor(0,0);
lcd.print("by Debanshu Das");
delay(65);
n--;
}
}
Jeu complet
#include <LiquidCrystal.h>
const int rs=12, en=11, d4=4, d5=5, d6=6, d7=7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int level = 1;
int score = 0;
byte arrowhead[] = { B00001, B00011, B00111, B01111, B00111, B00011, B00001, B00000 };
byte arrowbody[] = { B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000 };
byte arrowtail[] = { B00011, B00111, B11111, B11111, B11111, B00111, B00011, B00000 };
byte man[] = { B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001 };
void setup() {
lcd.createChar(0, arrowhead);
lcd.createChar(1, arrowbody);
lcd.createChar(2, arrowtail);
lcd.createChar(3, man);
lcd.begin(16,2);
attachInterrupt(0, buttonin, CHANGE);
randomSeed(analogRead(A0));
}
int n;
void loop() {
n = 15;
int rnd = random(15,25);
while(n != -1) {
lcd.clear();
delay(10);
drawman();
lcd.setCursor(n,1);
if(n == 1 && level == 1) { stopgame(); continue; }
lcd.write(byte(0));
lcd.write(byte(1));
lcd.write(byte(2));
lcd.setCursor(10,0);
lcd.print(score);
delay(100 - rnd);
n--;
score++;
if(level == 0) score--;
}
}
void drawman() { lcd.setCursor(1, level); lcd.write(byte(3)); }
void buttonin() { level = (digitalRead(2) == LOW) ? 0 : 1; }
void stopgame() {
lcd.clear();
lcd.setCursor(0,0); lcd.print("Game over");
lcd.setCursor(10,0); lcd.print(score);
level = 1; score = 0; n = 15;
delay(3000);
}
Schéma

Processus de fabrication
- Capteurs Arduino : Types, Applications et Projets Réels
- Construire une console de jeu portable Arduboy DIY (Arduino Micro + PCB)
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Enregistreur de Température et Humidité Arduino avec DHT11 et Shield Ethernet
- Contrôle Arduino UNO depuis Python 3 – Communication Série et Démo LED
- Automates Cellulaires Temps Réel sur Arduino avec Écran OLED 128x64
- Construire une Radio FM Compacte avec Arduino Nano et RDA5807M
- Construire une Station Météo Arduino Fiable avec Capteurs DHT
- Construisez un jeu d'arcade LCD classique avec Arduino, buzzer et joystick