fbpixel
Etiquetas:
0
(0)

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

Esquema elétrico arduino lcd16x2

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}
};
écran lcd16x2 affichant l'émotion endormi

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}
};
écran lcd16x2 affichant l'émotion neutre

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}
};
écran lcd16x2 affichant l'émotion joyeux

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}
};
écran lcd16x2 affichant l'émotion en colère

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}
};
écran lcd16x2 affichant l'émotion triste

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

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?