Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Rastreamento de Movimento Ocular por Infravermelho com Arduino Pro Mini – Demo de Controle de LED

Componentes e Materiais

Aplicativos e Serviços Online

Sobre o Projeto

Utilizei um sensor infravermelho para detectar movimentos dos olhos e controlar um LED.

Olho LED NeoPixel

Fita NeoPixel com 68 LEDs.

Rastreamento de Movimento Ocular por Infravermelho com Arduino Pro Mini – Demo de Controle de LED
Olho LED montado em uma tigela

LEDs fixados com fita dupla-face e conectados na ordem mostrada:

Rastreamento de Movimento Ocular por Infravermelho com Arduino Pro Mini – Demo de Controle de LED

Rastreamento de Movimento Ocular

Esquemático

Rastreamento de Movimento Ocular por Infravermelho com Arduino Pro Mini – Demo de Controle de LED

Sensor

Dois sensores QTR-1A para rastreamento ocular, colocados em uma folha plástica à distância aproximada da largura do olho.

Rastreamento de Movimento Ocular por Infravermelho com Arduino Pro Mini – Demo de Controle de LED

A parte do sensor e a do microcontrolador foram fixadas aos óculos com clipes.

Rastreamento de Movimento Ocular por Infravermelho com Arduino Pro Mini – Demo de Controle de LED
Rastreamento de Movimento Ocular por Infravermelho com Arduino Pro Mini – Demo de Controle de LED

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

  1. Por Que Designers Estão Retornando a Materiais Naturais no Design de Produto
  2. Sensor de Luz Pulsada: Amplifique Pulso de LED em Som Audível
  3. Sensor de Temperatura Infravermelho TMP006 com Raspberry Pi: Biblioteca Python e Guia de Configuração
  4. Construa um Sensor de Temperatura Remoto com Raspberry Pi e Python – Guia Passo a Passo
  5. Sensor de Rastreamento de Linha com Raspberry Pi – Detector KY‑033 Simples para Porta/Linha
  6. Monitoramento Residencial Seguro com Home Assistant no Raspberry Pi: Movimento, Alarme e Captura de Vídeo
  7. Construa um Sensor de Movimento Infravermelho DIY para Raspberry Pi – Guia Passo a Passo
  8. Controle um LED com Sensor de Movimento PIR no Raspberry Pi
  9. Construa um Tanque Laser Controlado por Leap Motion – Arduino, Raspberry Pi, LEDs RGB
  10. Detecção de Temperatura Infravermelha de Precisão para Processos Sensíveis a Cor