Lorsque l’on fabrique un robot, il peut être amusant de lui donner plus de vie en le rendant interactif. Par exemple, il est possible de lui donner la parole, de lui faire émettre des sons ou changer de couleur en fonction d’actions extérieures et de ses états. Dans ce projet, nous allons utiliser un écran LCD16x2, disponible dans plusieurs kits Arduino, afin de lui permettre d’afficher des icônes représentant des émotions.

Schéma de câblage

Schéma de câblage arduino lcd16x2

Algorithme

Nous allons créer différentes formes pour donner des émotions au robot. Pour cela, nous choisissons de colorier certains des caractères en blanc. Afin de colorier en blanc un caractère de l’écran LCD il faut écrire la valeur 255 à l’emplacement correspondant. Nous allons donc créer une matrice pour chaque figure que nous voulons afficher avec une fonction qui viendra écrire 255 ou 0 selon l’emplacement du curseur.

PrintFace()

Tout d’abord, nous définissons la fonction PrintFace() qui va venir placer le curseur et colorier le caractère correspondant en fonction de la matrice donnée en entrée.

void printFace(int emo[][16]){
  lcd.clear();
  for(int i=0;i<2;i++){
    for(int j=0; j<16;j++){
      lcd.setCursor(j, i);    
      if(emo[i][j]==1){
        lcd.write(255);
      }
    }
  }
}

Sleepy

Pour chacune des faces, nous définissons les zones à colorier. Pour l’état endormi, nous colorions huit caractères en bas de manière symétrique pour représenter des yeux fermés. Cette icône peut être utilisé si le robot s’ennuie ou si la batterie est à plat, par exemple.

int  sleepyFace[2][16]={
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,0}
};
écran lcd16x2 affichant l'émotion endormi

Neutral

Pour l’état neutre, nous colorions huit caractères en bas et en haut de manière symétrique pour représenter des yeux ouvert. Cette icône peut être utilisé lorsque le robot attend ou en combinaisons avec l’icône endormi pour le faire cligner des yeux.

int  normalFace[2][16]={
 {0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,0},
 {0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,0}
};
écran lcd16x2 affichant l'émotion neutre

Happy

Pour l’état joyeux, nous colorions des caractères pour reproduire l’émoticône (^^) qui représente des yeux souriant. Cette icône peut être utilisé lorsque le robot a réussi une action.

int  happyFace[2][16]={
 {0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0},
 {0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0}
};
écran lcd16x2 affichant l'émotion joyeux

Angry

Pour l’état énervé, nous colorions des caractères pour reproduire des sourcils froncés. Cette icône peut être utilisé lorsque le robot a réussi une action.

int  angryFace[2][16]={
 {0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0},
 {0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0}
};
écran lcd16x2 affichant l'émotion en colère

Sad

L’état triste sera représenté par des yeux qui pleurent pour lequel il suffit d’inversé les lignes de la matrice de l’icône énervé.

int  sadFace[2][16]={
 {0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0},
 {0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0}
};
écran lcd16x2 affichant l'émotion triste

Code complet

Enfin, en associant les définitions précédentes, nous obtenons le code suivant qui va afficher les différentes icônes toutes les deux secondes.

/*
 * Liquid cristal faces
 */
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int  sleepyFace[2][16]={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,0}
};
int  happyFace[2][16]={
{0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0},
{0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0}
};
int  angryFace[2][16]={
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0},
{0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0}
};
int  sadFace[2][16]={
{0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0}
};
int  normalFace[2][16]={
{0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,0},
{0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,0}
};
void setup() {
 Serial.begin(9600);
 lcd.begin(16, 2);// set up the LCD's number of columns and rows: 
 analogWrite(8,15);
}
void loop() {
 neutral();
 delay(2000);
 
 happy();
 delay(2000);
 
 sleepy();
 delay(2000);  
 angry();
 delay(2000);  
 sad();
 delay(2000); 
 lcd.clear();
}
void neutral(){
 printFace(normalFace);
}
void happy(){
 printFace(happyFace);
}
void angry(){
 printFace(angryFace);
}
void sad(){
 printFace(sadFace);
}
void sleepy(){
 printFace(sleepyFace);
}
void printFace(int emo[][16]){
 lcd.clear();
 for(int i=0;i<2;i++){
   for(int j=0; j<16;j++){
     lcd.setCursor(j, i);    
     if(emo[i][j]==1){
       lcd.write(255);
     }
   }
 }
}

Après avoir mis en place un affichage d’émotion, vous pouvez utiliser ce code en association avec d’autres appareils afin de donner encore plus de vie et d’interactivité à votre robot. En utilisant des modules tels que des capteurs, des moteurs, des sons et des couleurs.

Prochaines étapes

Sources