Rastreamento de Movimento Ocular por Infravermelho com Arduino Pro Mini – Demo de Controle de LED
Componentes e Materiais
- SparkFun Arduino Pro Mini 328 - 5V/16MHz × 1
- Adafruit LiIon/LiPoly Backpack Add-On para Pro Trinket/ItsyBitsy × 1
- Fita NeoPixel × 1
- Sensor de Reflectância QTR-1A × 1
- Bateria LiPo 3.7V × 1
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Utilizei um sensor infravermelho para detectar movimentos dos olhos e controlar um LED.
Olho LED NeoPixel
Fita NeoPixel com 68 LEDs.
LEDs fixados com fita dupla-face e conectados na ordem mostrada:
Rastreamento de Movimento Ocular
Esquemático
Sensor
Dois sensores QTR-1A para rastreamento ocular, colocados em uma folha plástica à distância aproximada da largura do olho.
A parte do sensor e a do microcontrolador foram fixadas aos óculos com clipes.
Código Arduino
Quando a íris se aproxima de um sensor, a luz refletida diminui e o valor do sensor aumenta. Inversamente, quando a íris se afasta, a luz refletida aumenta e o valor diminui.
O movimento horizontal da pupila do olho LED detecta o aumento/diminuição de um sensor e controla o LED correspondente.
Ao piscar, ambos os valores dos sensores diminuem; se ambos caírem simultaneamente, as pálpebras do olho LED fecham.
#include <QTRSensors.h>
#include <Adafruit_NeoPixel.h>
#define NUM_SENSORS 2
#define NUM_SAMPLES_PER_SENSOR 10
#define EMITTER_PIN QTR_NO_EMITTER_PIN
int iniSensorValL, sensorValL;
int iniSensorValR, sensorValR;
#define PIN A3
Adafruit_NeoPixel led = Adafruit_NeoPixel(68, PIN, NEO_GRB + NEO_KHZ800);
int blackNum = 24;
int pupilNum = 12;
uint32_t color;
int brightness = 40;
byte eyeColor;
int LR = 7;
boolean lid = false;
int cnt = 0;
// Animações de olho preto (L&R)
int blackLED[15][24] = { ... }; // arrays de posições
// Animações de pupila (L&R)
int pupilLED[15][12] = { ... };
// Animação de piscar
int eyelid = 0;
int eyelidNum[8] = {0,4,8,16,24,34,44,56};
int eyelidLED[56] = { ... };
QTRSensorsAnalog qtra((unsigned char[]){0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];
void blink(int eyelid, int LR) {
if (eyelid != 8) {
// Cor base (cinza)
for(uint16_t i=0; i<led.numPixels(); i++) {
led.setPixelColor(i, led.Color(66, 66, 66));
}
// Olho preto
for(uint16_t i=0; i<blackNum; i++) {
led.setPixelColor(blackLED[LR][i], color);
}
// Pupila
for(uint16_t i=0; i<pupilNum; i++) {
led.setPixelColor(pupilLED[LR][i], led.Color(0, 0, 66));
}
// Pálpebra
for(int i=0; i < eyelidNum[eyelid]; i++) {
led.setPixelColor(eyelidLED[i], 0);
}
} else {
led.clear();
}
led.show();
}
void setup() {
Serial.begin(115200);
led.begin();
led.setBrightness(brightness);
led.show();
color = led.Color(0, 177, 55); // cor da pupila
delay(100);
qtra.read(sensorValues);
iniSensorValL = sensorValues[0];
iniSensorValR = sensorValues[1];
blink(eyelid, LR);
}
void loop() {
qtra.read(sensorValues);
sensorValL = sensorValues[0];
sensorValR = sensorValues[1];
double rasioL = (double)sensorValL / iniSensorValL;
double rasioR = (double)sensorValR / iniSensorValR;
Serial.print(rasioL); Serial.print(" "); Serial.println(rasioR);
if(rasioL > 0.985 && rasioR < 0.985) { // direita
for(int i = LR; i < 12; i++) { blink(0, i); delay(40); LR = i; }
} else if(rasioL < 0.985 && rasioR > 0.985) { // esquerda
for(int i=LR; i>2; i--) { blink(0, i); delay(40); LR = i; }
} else if(lid == false && rasioL < 0.96 && rasioR < 0.96) { // piscar fechar
for(int i = 1; i < 9; i++) { blink(i, LR); delay(40); lid = true; }
} else if(lid == true && rasioL > 0.96 && rasioR > 0.96) { // piscar abrir
for(int i = 8; i > 0; i--) { blink(i, LR); delay(40); lid = false; }
} else if(lid == false && rasioL > 0.96 && rasioR > 0.96) { // normal
if(LR <= 7) {
for(int i=LR; i<=7; i++) { blink(0, i); delay(40); LR = i; }
} else {
for(int i=LR; i>=7; i--) { blink(0, i); delay(40); LR = i; }
}
Serial.println("Normal");
}
// Atualização periódica dos valores iniciais
if (cnt > 10) {
iniSensorValL = sensorValL;
iniSensorValR = sensorValR;
cnt = 0;
}
}
Operação
O sistema detecta movimentos oculares horizontais e piscadas, controlando a posição da pupila e a abertura das pálpebras no olho LED.
Processo de manufatura
- Por Que Designers Estão Retornando a Materiais Naturais no Design de Produto
- Sensor de Luz Pulsada: Amplifique Pulso de LED em Som Audível
- Sensor de Temperatura Infravermelho TMP006 com Raspberry Pi: Biblioteca Python e Guia de Configuração
- Construa um Sensor de Temperatura Remoto com Raspberry Pi e Python – Guia Passo a Passo
- Sensor de Rastreamento de Linha com Raspberry Pi – Detector KY‑033 Simples para Porta/Linha
- Monitoramento Residencial Seguro com Home Assistant no Raspberry Pi: Movimento, Alarme e Captura de Vídeo
- Construa um Sensor de Movimento Infravermelho DIY para Raspberry Pi – Guia Passo a Passo
- Controle um LED com Sensor de Movimento PIR no Raspberry Pi
- Construa um Tanque Laser Controlado por Leap Motion – Arduino, Raspberry Pi, LEDs RGB
- Detecção de Temperatura Infravermelha de Precisão para Processos Sensíveis a Cor