lunes, 13 de junio de 2016

Esquemático EOG

Debido a varios mensajes sobre el esquemático que usé, he decidido postearlo. Si ven las fechas, verán que este proyecto fue realizado hace varios años, el esquemático es muy mejorable, pero después de concluirlo no seguí trabajando más con él.
Espero que sea de ayuda de quienes lo  necesiten.


viernes, 14 de diciembre de 2012

Obteniendo Angulos en la derivada Horizontal

Ya tengo la parte que obtiene los ángulos en los que el ojo se mueve, en este vídeo solo use la derivada horizontal. Primero hago un entrenamiento para obtener los valores maximos, medios y minimos del usuario para hacer los ajustes propio de cada persona. En el eje horizontal ,el campo de visión son de 40°, este es 34 cm de ancho de pantalla  y el usuario a 48 cm de distancia de ésta(que es una distancia típica recomendada para leer en monitor). Para el campo vertical se tiene un campo de 20°, ya que el alto de la pantalla es de 19 cm y manteniendo la distancia de 48 cm obviamente. Pero decidí dividir estos campos en una parte positiva y negativa, como punto de referencia el valor medio. Así, para el eje horizontal tengo un rango de -20° a 20° aprox. Y para el eje vertical -11° a 11° aprox.

Estaba muerto mientras hacía el video asi que poco se entiende lo que digo.

viernes, 30 de noviembre de 2012

El programa 1

En el video estoy usando dos potenciometros para pasar sus valores al arduino. El programa cuenta por ahora con 2 ventanas, una funciona para acceder al puerto disponible, comenzar la conversión, y mostar los valores de voltajes de cada canal. La segunda ventana es un web browser simplificado en el que aparecera una figurita que se moverá por la pantalla según los valores que reciba de los canales.
Debo mejorar un tanto más la precisión del movimiento y crear una posible tercera ventana que sea previa al web browser para hacer el calibrado que cada persona presentará en sus valores de EOG.


jueves, 29 de noviembre de 2012

Mañana nuevo post decente

Mañana subiré un video probando el programa que hice en visual studio(entorno C++) que es lo que he estado aprendiendo este ultimo tiempo, logré mover una imagen dentro de un texto tanto horizontal como vertical simultaneamente por dos canales de transmision serial del arduino. Nos vemos! :D

domingo, 30 de septiembre de 2012

EOG horizontal sin quitar componente DC



Bastante tiempo sin subir nada, por varios motivos, uno hace poco fueron las fiestas patrias de mi país Chile) y fue toda una semana de distracciones y me mantuve lejos de la ciudad en la que trabajo(Concepción).Además que me vi lleno de problemas con la señal, la captaba por unos momentos y luego  la perdía completamente y eso me dejó bastante pegado.
Ahora a un día de terminar la semana 8 y ya me atrasé un tanto, aunque no tan grave, creo que logré identificar en lo que estaba fallando; La ganancia del amplificador ina128 era muy alta, ahora la estoy usando con 500 o 1000 y de las dos formas ha funcionado OK.
Además dejé una variante del EOG que es no sacar la componente DC, así se puede saber si una persona continúa mirando hacia una dirección. 




jueves, 6 de septiembre de 2012

Recibiendo datos seriales del arduino en Matlab


%borrar previos
delete(instrfind({'Port'},{'COM3'}));
%crear objeto serie
s = serial('COM3','BaudRate',9600,'Terminator','CR/LF');
warning('off','MATLAB:serial:fscanf:unsuccessfulRead');
%abrir puerto
fopen(s);

% parámetros de medidas
tmax = 10; % tiempo de captura en s
rate =43.9; % resultado experimental (comprobar)
% Relacion aproximadamente buena, 10 segunds ..> 43.9 de rate

% preparar la figura
f = figure('Name','Captura');
a = axes('XLim',[0 tmax],'YLim',[0 5.1]);
l1 = line(nan,nan,'Color','r','LineWidth',2);
l2 = line(nan,nan,'Color','b','LineWidth',2);

xlabel('Tiempo (s)')
ylabel('Voltaje (V)')
title('Captura de voltaje en tiempo real con Arduino')
grid on
hold on

% inicializar
v1 = zeros(1,tmax*rate);
v2 = zeros(1,tmax*rate);
i = 1;
t = 0;

% ejecutar bucle cronometrado
tic
while t<tmax
    t = toc;
    % leer del puerto serie
    a = fscanf(s,'%d,%d')';
    v1(i)=a(1)*5/1024;
    v2(i)=a(2)*5/1024;
    % dibujar en la figura
    x = linspace(0,i/rate,i);
    set(l1,'YData',v1(1:i),'XData',x);
    set(l2,'YData',v2(1:i),'XData',x);
    drawnow
    % seguir
    i = i+1;
end
% resultado del cronometro
clc;
fprintf('%g s de captura a %g cap/s \n',t,i/t);


%% Limpiar la escena del crimen
fclose(s);
delete(s);
clear s;


La linea roja corresponde a la variable v1 , que es lo que recibe del conversor AO
La linea azul corresponde a la variable v2 , que es lo que recibe del conversor A1




miércoles, 5 de septiembre de 2012

Conversión Análogo Digital - Transmisión Serial en Arduino

La gracia de usar Arduino es que simplifica muuuucho las cosas a la hora de hacer una conversión análogo digital o hacer comunicación serial desde el microcontrolador al PC. Si en otros microcontroladores se requieren 20 lineas de código para habilitar estas funciones, en el arduino solo se requiere de una simple línea :) . Ya que la forma en que trabaja arduino está basada en C++, o sea, está usando clases para realizar estas funciones. Además Arduino es open source por lo que se puede encontrar fácilmente mucha información útil.

Basta este simple código para convertir mi señal de EOG de análoga a digital y enviarla hacia el computador de forma serial.

void setup() {
  // initialize the serial communication:
  Serial.begin(9600);
}

void loop() {
  // send the value of analog input 0:
  Serial.println(analogRead(A0));
  // wait a bit for the analog-to-digital converter
  // to stabilize after the last reading:
  delay(2);
}


Aquí está mi Arduino, lo compré el año pasado para "jugar" con él, no lo usé mucho la verdad, quien pensaría que ahora me servirá de mucho.


Moviendo el cursor en C

Ahora para mover el cursor en C se tiene el siguiente código:


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>


int main()
{
// Estructura que almacena posicion de cursor
    POINT current_pos;

    int i;
    for( i = 0; i < 100; ++i )
    {
// Obtener posicion actual
        GetCursorPos( &current_pos );

// Calcular nueva posicion
current_pos.x = current_pos.x + 9;
current_pos.y = current_pos.y + 1;

// Aplicar nueva posicion
        SetCursorPos( current_pos.x, current_pos.y );

// Esperar (en ms) para realizar siguinete movimiento
        Sleep( 50);
    }

/* Investigar siguiente funcion; Puede realizar la misma funcion y mas.
UINT WINAPI SendInput(
 __in  UINT nInputs,
 __in  LPINPUT pInputs,
 __in  int cbSize
);
*/

    return 0;
}




PERO, creo que el de matlab me será más útil. 
NO hice video porque al grabar no se ve el movimiento del cursor :c

Moviendo cursor del Mouse con Matlab

Este es un script para Matlab que permite mover el cursor del mouse:


close all
clear all
clc

%% Configuracion
% Numero de veces que se ejecutara el movimiento
N_times = 35;

% Desplazamiento relativo horizontal (X)
% a ejecutar en cada movimiento
desp_x = -2;

% Desplazamiento relativo horizontal (Y)
% a ejecutar en cada movimiento
desp_y = -4;

% Pausa entre movimientos (en segundos)
pause_sec = 15e-3;

%% Ejecutar accion

for i = 1:N_times
    % Obtener posicion actual
    cursor_pos = get( 0,'PointerLocation' );
    
    % Calcular nueva posicion
    cursor_pos(1) = cursor_pos(1) + desp_x;
    cursor_pos(2) = cursor_pos(2) + desp_y;
    
    % Aplicar nueva posicion
    set( 0,'PointerLocation', cursor_pos );
    
    % Pausar y esperar nuevo movimiento
    pause( pause_sec );
end



EDIT: En el video no se logra ver el mov. del mouse, lo cual es muy triste :c


¿Cómo detectar hacia que parte miro?

Es una pregunta que me he hecho muchas veces. Ideas tengo,  variadas son, pero lo que veo más factible por ahora es usar el cursor del mouse que me ayude a ir detectando hacia donde está mirando la persona, no sé , que haga saltos estándares de la palabra , o que se desplace proporcionalmente al ángulo que deberé detectar de los ojos. Quizás podría enmascarar el mouse para que no se vea que sea el cursor el que va haciendo el seguimiento... podría usar una especie de máscara de mouse, que vaya siguiendo a las letras por abajo, como un canta con nosostros de Disney jajajaja, pero no sé, tendré que ver que es lo que vaya resultando.

El circuito del EOG

Más adelante subiré el esquemático del circuito que utilicé para adquirir la señal de EOG, por mientras subo esta foto del circuito que actualmente estoy usando. Lo tengo duplicado para poder captar los mov. horizontales y verticales, para el horizontal incluí un divisor de voltaje para realizar un offset y poder enviar la señal al arduino, tengo que incluir el divisor de voltaje para poder enviar la señal vertical.
Hay una parte del circuito que no estoy utilizando que es el filtro activo pasa bajo de 16 Hz así que no se debe considerar.

La parte de "abajo" del circuito corresponde para la señal horizontal y la parte de "arriba" para la señal vertical, los circuitos son idénticos, quizás se vea una diferencia en algunos condensadores que se ven amarillos y en la otra parte naranjos, pero tienen el mismo valor de 0,1 uF.

EOG vertical

Señal de EOG vertical tomada la semana 4, pido disculpas porque no quedaron bien sincronizadas las imagenes, pero la idea se entiende.


Señal de EOG

Sujeto de prueba femenino, EOG horizontal


martes, 4 de septiembre de 2012

Mi señal captada de EOG

Señal captada la semana 4, corresponde al EOG horizontal. La señal fue adquirda usando una ganancia de 1000 con un ina128, aplicando un filtro notch de 50 hz, un filtro pasa bajo pasivo de 16 hz, y eliminado la componente DC de la señal con un simple condensador de 0,1 uF.


La Electrooculografía


La electrooculografía es un método que permite detectar los movimientos oculares, mediante la implementación del electrooculograma (EOG), que  se basa en registrar la diferencia de potencial que existe entre la córnea y la retina. Como ya se ha dicho el potencial córneo-retiniano está producido por hiperpolarizaciones y despolarizaciones de las células nerviosas de la retina . Características típicas del EOG:
-          La señal de EOG varía típicamente entre los 50 y 3500 μV con un rango de frecuencias DC (0 Hz) y 100 Hz (ref a 12). Y tiene un comportamiento lineal para ángulos entre ±30°.
-          La señal de EOG puede verse perturbada por otro biopotenciales como EEG y EMG, además de las perturbaciones propias del sistema de adquisición. 
-          El EEG y EMG pueden producir errores de aproximadamente 1°.
-          La forma de EOG para movimientos sacádicos es similar entre las personas, a partir de esto se pueden normalizar los datos para obtener un modelo de EOG universal.
-          Los movimientos sacádicos pueden detectarse en función de la derivada del EOG.
-          Las señales de EOG pueden adquirirse con electrodos simples.
-          Las señales de EOG cubren un área de visión entre los rangos de  ±25° para vertical y ±35° para horizontal. 
-          Las señales de EOG son muy rápidas por lo cual es posible hacer implementación en tiempo real. 

EOG: movimientos sacádicos



Los movimientos sacádicos de los ojos se encuentran entre los movimientos voluntarios de músculos  más rápidos que el ser humano puede realizar, se caracterizan por un rápido cambio en la mirada desde un punto de observación  a otro. Esto ocurre porque como seres humanos no vemos las escenas de una manera fija, sino que nuestra mirada se mueve hacia las partes de nuestra atención para construir un mapa mental que represente la escena. Esto es así, ya que la fóvea, que es una pequeña parte de la retina, puede detectar con alta resolución. La fóvea tiene un campo de vista muy estrecho y para ver una escena amplia el ojo tiene que moverse constantemente. El movimiento simultáneo de ambos ojos en la misma dirección es lo que se llama un mov. sacádico. El peak de la velocidad angular de los ojos en un mov. sacádico alcanza hasta los mil grados por segundo con una duración de los 20 a los 100 ms y una latencia de 150 a 300 ms, que corresponde al tiempo que transcurre entre la aparición de un estímulo y el inicio del desplazamiento ocular hacia el mismo . El área típica que cubre un sacádico es hasta los 30° aprox., luego de este ángulo la exploración requiere de mayor movimiento de la. La amplitud de un mov. sacádico es la distancia angular que el ojo tiene que recorrer para durante un movimiento. Para amplitudes hasta los 60°, la duración de un mov. sacádico depende linealmente de la amplitud. Pero para amplitudes mayores a 60°, la velocidad del mov. sacádico permanece constante y la duración del mayor mov. ya no depende linealmente de la amplitud. 
Los movimientos oculares durante la lectura se caracterizan por una secuencia de pequeños y grandes mov. sacádicos. Primero ocurren secuencias de pequeños mov. sacádicos mientras los ojos se mueven alrededor de las palabras en una línea de texto. Un gran mov. sacádico ocurre cuando los ojos vuelven al comienzo de la siguiente línea del texto.


Actividades a realizar

El semestre comenzó el Lunes 06 de Agosto 2012, actualmente me encuentro en la quinta semana, según la carta gantt que tenía preparada, hasta la quinta semana debería haber podido adquirir la señal de EOG, pero esta señal la logré obtener en la semana 3 por lo que ahora actualmente estoy trabajando en el punto D- Obtención de la relación de ángulos, pero recién estoy comenzando. El punto C también lo logré la semana 4.



Hola Saludos

Mi nombre es Vicente Acuña Otárola, tengo actualmente 23 años, recién egresado de Ing. Civil Biomédica UdeC, Chile. Actualemente me encuentro haciendo mi memoria de título que por ahora lleva el título de "Diseño de Dispositivo para análisis de lectura a partir de EOG".
Quiero que este blog sea fuente para compartir mis avances, subir información relacionada, comentar mis trancas en los avances y que sirva de fuente de inspiración y motivación para poder avanzar.
Además comentar que soy fanático de la buena música(i.e. Marillion, Porcupine Tree, Yes, Genesis, The Moody Blues, Alan Parsons Project, etc), me gusta mucho dibujar pero no soy la gran cosa, me gustan autores de la onda Frank Frazetta, H. R Giger, Alan Lee, John Howe, Ted Nasmith y de toda esa onda mítica o épica.
Y por último me gusta mucho jugar videojuegos, soy una especie de casual gamer y al que más me dedico es al LOL. 
Mi libro favorito: el Silmarillion,Crónicas marcianas, verano de corrupción