Site icon AranaCorp

Torne o seu robô interativo com um ecrã LCD 16×2

Quando se cria um robô, pode ser divertido dar-lhe mais vida, tornando-o interativo. Por exemplo, é possível dar-lhe uma voz, fazê-lo emitir sons ou mudar de cor em função de acções externas e dos seus estados. Neste projeto, vamos utilizar um ecrã LCD 16×2, disponível em vários kits Arduino, para lhe permitir apresentar ícones que representam emoções.

Esquema elétrico

Algoritmo

Vamos criar formas diferentes para dar emoções ao robô. Para isso, escolhemos colorir alguns dos caracteres a branco. Para colorir um carácter do ecrã LCD de branco, temos de escrever o valor 255 na localização correspondente. Assim, vamos criar uma matriz para cada figura que queremos mostrar com uma função que escreverá 255 ou 0, dependendo da localização do cursor.

PrintFace()

Em primeiro lugar, definimos a função PrintFace(), que coloca o cursor e colore o carácter correspondente de acordo com a matriz de entrada.

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);
      }
    }
  }
}

Sonolento

Para cada rosto, definimos as zonas a colorir. Para o estado de sono, colorimos oito caracteres na parte inferior, de forma simétrica, para representar os olhos fechados. Este ícone pode ser utilizado se o robô estiver aborrecido ou se a bateria estiver descarregada, por exemplo.

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}
};

Neutro

Para o estado neutro, colorimos oito caracteres simetricamente na parte superior e inferior para representar os olhos abertos. Este ícone pode ser utilizado quando o robô está à espera ou em combinação com o ícone do sono para o fazer piscar.

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}
};

Feliz

Para o estado feliz, colorimos os caracteres para reproduzir o emoticon (^^) que representa olhos sorridentes. Este ícone pode ser utilizado quando o robô conseguiu realizar uma ação.

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}
};

Zangado

Para o estado zangado, colorimos os caracteres para reproduzir as sobrancelhas franzidas. Este ícone pode ser utilizado quando o robô completou uma ação.

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}
};

Triste

O estado triste será representado por olhos a chorar, para o que basta inverter as linhas da matriz do ícone zangado.

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}
};

Código completo

Por fim, combinando as definições anteriores, obtemos o seguinte código, que apresentará os vários ícones de dois em dois segundos.

/*
 * 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);
      }
    }
  }
}

Depois de ter configurado um ecrã de emoções, pode utilizar este código em conjunto com outros dispositivos para dar ainda mais vida e interatividade ao seu robô. Utilizando módulos como sensores, motores, sons e cores.

Próximas etapas

Fontes

Exit mobile version