Índice:
- Etapa 1: Constituição
- Etapa 2: NeoPixel LED Eye Ball
- Etapa 3: Unidade de Sensor
- Etapa 4: Código Arduino
- Etapa 5: Operação
Vídeo: Rastreamento de movimento ocular usando sensor infravermelho: 5 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:38
Usei um sensor infravermelho para detectar os movimentos dos olhos e controlar o LED.
Fiz globos oculares com Fita LED NeoPixel.
Etapa 1: Constituição
Usei dois sensores QTR-1A para rastreamento ocular. Detectando com Arduino e controlando o LED.
componentes
- SparkFun Arduino Pro Mini 328 - 5V / 16MHz
- Adafruit LiIon / LiPoly Backpack Add-On para bugigangas Pro / ItsyBitsy
- Bateria LiPo
- Tira NeoPixel
- Sensor de refletância QTR-1A
Etapa 2: NeoPixel LED Eye Ball
Fita LED NeoPixel é usada. O LED tem 68 unidades.
O LED é fixado na tigela com fita dupla-face e cabeamento.
Etapa 3: Unidade de Sensor
Usei dois sensores QTR-1A para rastreamento ocular. QTR-1A são colocados em uma folha de plástico a uma distância de aproximadamente a largura do olho.
A parte do sensor e a parte do microcontrolador foram fixadas aos óculos com um clipe respectivamente.
Etapa 4: Código Arduino
Quando a íris se aproxima de um sensor, a luz refletida diminui e o valor do sensor aumenta. Por outro lado, quando a íris se afasta, a luz refletida aumenta e o valor do sensor do foto refletor diminui.
O movimento para a direita e para a esquerda da pupila do globo ocular de LED detecta o aumento e a diminuição de um valor do sensor e o controla. Ao piscar, os valores de ambos os sensores diminuem, portanto, se os valores dos dois sensores diminuem simultaneamente, as pálpebras do globo ocular de LED irão para baixo.
Eu usei a seguinte biblioteca.
- QTRsensors:
- Adafruit_NeoPixel:
#include #include
# define NUM_SENSORS 2 // número de sensores usados # define NUM_SAMPLES_PER_SENSOR 10 // média # 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; brilho interno = 40; byte eyeColor; int LR = 7; tampa booleana = falso; int cnt = 0;
// Olho roxo animação L&R LED blackLED [15] [24] = {{12, 32, 35, 55, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {12, 13, 31, 36, 54, 55, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {11, 13, 14, 30, 37, 53, 54, 56, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {10, 11, 14, 15, 29, 38, 52, 53, 56, 57, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {9, 10, 11, 12, 15, 16, 28, 33, 34, 39, 51, 52, 55, 56, 57, 58, 68, 68, 68, 68, 68, 68, 68, 68}, {0, 8, 9, 10, 11, 12, 13, 16, 17, 27, 32, 35, 40, 50, 51, 54, 55, 56, 57, 58, 59, 67, 68, 68}, {0, 1, 7, 8, 9, 10, 13, 14, 17, 18, 26, 31, 36, 41, 49, 50, 53, 54, 57, 58, 59, 60, 66, 67}, {1, 2, 6, 7, 8, 9, 14, 15, 18, 19, 25, 30, 37, 42, 48, 49, 52, 53, 58, 59, 60, 61, 65, 66}, {2, 3, 5, 6, 7, 8, 15, 16, 19, 20, 24, 29, 38, 43, 47, 48, 51, 52, 59, 60, 61, 62, 64, 65}, {3, 4, 5, 6, 7, 16, 17, 20, 21, 23, 28, 39, 44, 46, 47, 50, 51, 60, 61, 62, 63, 64, 68, 68}, {4, 5, 6, 17, 18, 21, 22, 27, 40, 45, 46, 49, 50, 61, 62, 63, 68, 68, 68, 68, 68, 68, 68, 68}, {4, 5, 18, 19, 26, 41, 48, 49, 62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {4, 19, 20, 25, 42, 47, 48, 63, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {20, 21, 24, 43, 46, 47, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {21, 23, 44, 46, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}};
// pupil L&R animationint pupilLED [15] [12] = {{33, 34, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {32, 33, 34, 35, 68, 68, 68, 68, 68, 68, 68, 68}, {12, 31, 32, 33, 34, 35, 36, 55, 68, 68, 68, 68}, {12, 13, 30, 31, 32, 33, 34, 35, 36, 37, 54, 55}, {13, 14, 29, 30, 31, 32, 35, 36, 37, 38, 53, 54}, {14, 15, 28, 29, 30, 31, 36, 37, 38, 39, 52, 53}, {15, 16, 27, 28, 29, 30, 37, 38, 39, 40, 51, 52}, {16, 17, 26, 27, 28, 29, 38, 39, 40, 41, 50, 51}, {17, 18, 25, 26, 27, 28, 39, 40, 41, 42, 49, 50}, {18, 19, 24, 25, 26, 27, 40, 41, 42, 43, 48, 49}, {19, 20, 23, 24, 25, 26, 41, 42, 43, 44, 47, 48}, {20, 21, 22, 23, 24, 25, 42, 43, 44, 45, 46, 47}, {21, 22, 23, 24, 43, 44, 45, 46, 68, 68, 68, 68 }, {22, 23, 44, 45, 68, 68, 68, 68, 68, 68, 68, 68}, {22, 45, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}};
// Blink animationint eyelid = 0; int eyelidNum [8] = {0, 4, 8, 16, 24, 34, 44, 56}; int eyelidLED [56] = {64, 65, 66, 67, 58, 59, 60, 61, 56, 57, 62, 63, 49, 50, 51, 52, 47, 48, 53, 54, 38, 39, 40, 41, 46, 55, 36, 37, 42, 43, 26, 27, 28, 29, 35, 44, 24, 25, 30, 31, 15, 16, 17, 18, 34, 45, 23, 32, 13, 14, 19, 20, 6, 7, 8, 9}; 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) {// Peltre para (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }
// Olho roxo para (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , cor);}
// aluno para (uint16_t i = 0; i
led.setPixelColor (pupilLED [LR] , led. Color (0, 0, 66)); }
// pálpebra para (int i = 0; i <eyelidNum [eyelid]; i ++) {led.setPixelColor (eyelidLED , 0); }} else if (eyelid == 8) {led.clear (); } led.show ();}
void setup () {
Serial.begin (115200); led.begin (); led.setBrightness (brilho); // Brilho inicial 40 led.show (); // Inicializa todos os pixels para 'off' color = led. Color (0, 177, 55); // atraso da cor da pupila (100); qtra.read (sensorValues); iniSensorValL = sensorValues [0]; iniSensorValR = sensorValues [1]; piscar (pálpebra, LR); }
void loop () {// QTR - valor do sensor 1A qtra.read (sensorValues); sensorValL = sensorValues [0]; sensorValR = sensorValues [1];
rasioL duplo = (duplo) sensorValL / iniSensorValL;
rasioR duplo = (duplo) sensorValR / iniSensorValR;
Serial.print (rasioL);
Serial.print (""); Serial.println (rasioR);
if (rasioL> 0,985 && rasioR <0,985) {// certo para (int i = LR; i <12; i ++) {pisca (0, i); atraso (40); LR = i; }} else if (rasioL 0,985) {// esquerda para (int i = LR; i> 2; i -) {pisca (0, i); atraso (40); LR = i; }} else if (lid == false && rasioL <0,96 && rasioR <0,96) {// Piscando perto para (int i = 1; i 0,96 && rasioR> 0,96) {// Piscando aberto para (int i = 8; i > 0; i -) {pisca (i, LR); atraso (40); tampa = falso; }} else if (lid == false && rasioL> 0,96 && rasioR> 0,96) {// normal // cnt ++; // pálpebra = 0; if (LR <= 7) {para (int i = LR; i <= 7; i ++) {pisca (0, i); atraso (40); LR = i; }} else {for (int i = LR; i> = 7; i -) {piscar (0, i); atraso (40); LR = i; }}}
// Atualização do valor inicial if (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}
Etapa 5: Operação
Detecte o movimento esquerdo e direito e o piscar da pupila com o sensor e controle o LED do globo ocular.
Recomendado:
Rastreamento de movimento usando MPU-6000 e fóton de partículas: 4 etapas
Rastreamento de movimento usando MPU-6000 e fóton de partículas: MPU-6000 é um sensor de rastreamento de movimento de 6 eixos que possui acelerômetro de 3 eixos e giroscópio de 3 eixos embutidos. Este sensor é capaz de rastrear de forma eficiente a posição e localização exata de um objeto no plano tridimensional. Pode ser empregado i
Rastreamento de movimento usando MPU-6000 e Arduino Nano: 4 etapas
Rastreamento de movimento usando MPU-6000 e Arduino Nano: MPU-6000 é um sensor de rastreamento de movimento de 6 eixos que possui acelerômetro de 3 eixos e giroscópio de 3 eixos embutidos. Este sensor é capaz de rastrear com eficiência a posição e localização exata de um objeto no plano tridimensional. Pode ser empregado i
Motor em movimento com rastreamento ocular: 8 etapas
Motor em movimento com rastreamento ocular: Atualmente, os sensores de rastreamento ocular são mais comuns em várias áreas, mas comercialmente são mais conhecidos por jogos interativos. Este tutorial não pretende elaborar os sensores por ser muito complexo e devido ao seu uso cada vez mais comum o
Rastreamento de movimento usando MPU-6000 e Raspberry Pi: 4 etapas
Rastreamento de movimento usando MPU-6000 e Raspberry Pi: MPU-6000 é um sensor de rastreamento de movimento de 6 eixos que possui acelerômetro de 3 eixos e giroscópio de 3 eixos embutidos. Este sensor é capaz de rastrear de forma eficiente a posição e localização exata de um objeto no plano tridimensional. Pode ser empregado i
Um cão de rastreamento infravermelho: 3 etapas
An Infrared Tracking Dog: Algum dia eu encontrei um vídeo interessante em: http://arduinotr.com/cisim/?fbclid=IwAR22rYmiRQQJ0nqAusOLhBj_778gROseej6TUonvbOnAd65A-sl_wnyqrJQ&tdsourcetag=s_pq este vídeo é realmente bom, mas me sinto um vislumbre… realmente