ESP32 + RoboEyes: Como Criar Olhos Animados para seu Robô com Display OLED
- Gerar link
- X
- Outros aplicativos
Os olhos são um dos elementos que mais dão personalidade a um robô. Mesmo um projeto simples se torna muito mais interessante quando parece olhar ao redor, piscar e demonstrar emoções.
Nos vídeos anteriores do RodRobot, utilizamos o driver DRV8833, os motores N20 e um display OLED SSD1306 para construir nosso robô. Agora chegou a hora de dar vida a ele.
Neste artigo vamos conhecer a biblioteca RoboEyes, desenvolvida pela FluxGarage, que permite criar olhos animados de forma simples e com poucas linhas de código.
O que é a RoboEyes?
A RoboEyes é uma biblioteca para Arduino e ESP32 que desenha olhos animados em displays OLED.
Com ela é possível criar diversas animações automaticamente, como:
- 👀 Movimento dos olhos
- 😉 Piscadas automáticas
- 😀 Expressão feliz
- 😴 Expressão cansada
- 😠 Expressão brava
- 😐 Expressão normal
Tudo isso praticamente sem precisar programar animações manualmente.
Hardware utilizado
- ESP32
- Display OLED SSD1306 128×64 I2C
Ligações
| OLED | ESP32 |
|---|---|
| VCC | 3,3 V |
| GND | GND |
| SDA | GPIO 21 |
| SCL | GPIO 22 |
Instalando a biblioteca
A instalação é muito simples.
Acesse o GitHub da biblioteca:
https://github.com/FluxGarage/RoboEyes
Clique em:
Code → Download ZIP
Será baixado o arquivo:
RoboEyes-main.zip
Depois abra a Arduino IDE e escolha:
Rascunho ↓ Incluir Biblioteca ↓ Adicionar Biblioteca .ZIP
Selecione o arquivo RoboEyes-main.zip e aguarde alguns segundos até a instalação ser concluída.
Abrindo o exemplo
Após instalar a biblioteca, abra:
Arquivo ↓ Exemplos ↓ FluxGarage RoboEyes ↓ I2C_SSD1306_Basics
Esse exemplo já funciona muito bem, mas fiz algumas modificações e acrescentei comentários para facilitar o entendimento.
Entendendo o código
Primeiro incluímos todas as bibliotecas necessárias.
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <FluxGarage_RoboEyes.h>
Cada uma possui uma função específica.
- Wire realiza a comunicação I2C.
- Adafruit GFX fornece as funções gráficas.
- Adafruit SSD1306 controla o display OLED.
- FluxGarage RoboEyes cria as animações dos olhos.
Depois configuramos nosso display OLED.
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1
Aqui informamos que o display possui resolução de 128 × 64 pixels.
Agora criamos o display.
Adafruit_SSD1306 display( SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET );
Em seguida criamos o objeto da biblioteca RoboEyes.
RoboEyes<Adafruit_SSD1306> roboEyes(display);
É através desse objeto que controlaremos todas as animações.
Escolhendo a expressão
Uma das grandes vantagens da biblioteca é poder alterar a expressão do robô modificando apenas uma linha.
//#define EXPRESSAO HAPPY // 😀 Feliz // #define EXPRESSAO DEFAULT // 😐 Normal // #define EXPRESSAO TIRED // 😴 Cansado #define EXPRESSAO ANGRY // 😠 Bravo
Basta comentar as demais linhas e deixar ativa apenas a expressão desejada.
As expressões disponíveis são:
| Expressão | Resultado |
|---|---|
| DEFAULT | 😐 Normal |
| HAPPY | 😀 Feliz |
| TIRED | 😴 Cansado |
| ANGRY | 😠 Bravo |
Inicialização
No setup() iniciamos a comunicação I2C.
Wire.begin(21,22);
Depois inicializamos o display OLED.
display.begin(SSD1306_SWITCHCAPVCC,0x3C);
Em seguida iniciamos a biblioteca.
roboEyes.begin(128,64,100);
O último parâmetro representa a taxa máxima de atualização da animação.
Quanto maior esse valor, mais suave será o movimento.
Abrindo os olhos
Esta linha faz o robô acordar.
roboEyes.open();
Definindo a emoção
Depois aplicamos a expressão escolhida.
roboEyes.setMood(EXPRESSAO);
Piscadas automáticas
Esta função faz o robô piscar sozinho.
roboEyes.setAutoblinker(true);
Não é necessário criar temporizadores ou utilizar delay().
Movimento automático
Outra função interessante é:
roboEyes.setIdleMode(true);
Ela faz os olhos olharem para diferentes direções de maneira automática, deixando o robô muito mais natural.
Loop principal
O loop possui apenas uma função.
roboEyes.update();
Ela atualiza continuamente todas as animações.
Por isso ela deve permanecer sendo executada durante todo o programa.
Código completo
Como o código é pequeno, você pode copiá-lo diretamente daqui.
/*****************************************************************************************
* Projeto : RoboEyes - Seleção de Expressões
* Autor : RodRobot
* Plataforma: ESP32 + Display OLED SSD1306 128x64 I2C
*
* Biblioteca : FluxGarage RoboEyes
* Referência : https://www.fluxgarage.com
*
* Display OLED SSD1306
* SDA -> GPIO21
* SCL -> GPIO22
* Endereço I2C -> 0x3C
*
* Descrição:
* Demonstra como selecionar facilmente a expressão dos olhos.
* Basta alterar a constante EXPRESSAO abaixo.
*
*****************************************************************************************/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <FluxGarage_RoboEyes.h>
//=============================================================================
// Configuração do Display
//=============================================================================
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(
SCREEN_WIDTH,
SCREEN_HEIGHT,
&Wire,
OLED_RESET
);
//=============================================================================
// Objeto RoboEyes
//=============================================================================
RoboEyes<Adafruit_SSD1306> roboEyes(display);
//=============================================================================
// ESCOLHA A EXPRESSÃO DO ROBÔ
//=============================================================================
//#define EXPRESSAO HAPPY // 😀 Feliz
// #define EXPRESSAO DEFAULT // 😐 Normal
// #define EXPRESSAO TIRED // 😴 Cansado
#define EXPRESSAO ANGRY // 😠 Bravo
//=============================================================================
// Setup
//=============================================================================
void setup()
{
Wire.begin(21,22); // SDA, SCL
if(!display.begin(SSD1306_SWITCHCAPVCC,0x3C))
{
while(true); // Erro ao iniciar display
}
roboEyes.begin(128,64,100); // Inicializa RoboEyes
roboEyes.open(); // Abre os olhos
roboEyes.setMood(EXPRESSAO); // Define a expressão
roboEyes.setAutoblinker(true); // Pisca automaticamente
roboEyes.setIdleMode(true); // Movimento aleatório
}
//=============================================================================
// Loop Principal
//=============================================================================
void loop()
{
roboEyes.update(); // Atualiza animações
}


Comentários
Postar um comentário