Estaba muerto mientras hacía el video asi que poco se entiende lo que digo.
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.
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.
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.
// 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( ¤t_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;
}
#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( ¤t_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
EDIT: En el video no se logra ver el mov. del mouse, lo cual es muy triste :c
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.
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.
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.
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
Suscribirse a:
Entradas (Atom)