handless mouse with arduino.doc

14
Proyecto Ratón con Acelerómetro Desarrollo de Proyectos 2º DPE Juan Alberto Benito Pereira Enernesto Tejedor Agustín Yerpes Mesa 06 --- IES Vallecas I 04/03/2013

Upload: erk-obiben

Post on 16-Feb-2015

145 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: handless mouse with arduino.doc

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2º DPE

Juan Alberto Benito PereiraEnernesto TejedorAgustín Yerpes

Mesa 06 --- IES Vallecas I04/03/2013

Page 2: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 2

Page 3: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

Proyecto Ratón con Acelerómetro

El proyecto que hemos decidido realizar es un ratón de ordenador cuyo manejo se realiza sin manos. Simplemente con los movimientos de la cabeza se puede manejar el ratón del ordenador.

Por medio del acelerómetro de 3 ejes ADXL335 y de Arduino hemos construido el interfaz para interactuar con el ordenador, acoplando el ADXL335 en una PCB que va pinchada en Arduino, y todo a su vez cosido a una gorra que es la que se adapta a la cabeza del usuario.

Descripción del proyecto

¿Que es un acelerómetro?

Un acelerómetro es un tipo de sensor que nos mide aceleraciones lineales. Las aceleraciones con estos sensores se suelen medir utilizando la unidad "G" que no es más que la unidad de referencia de la aceleración gravitatoria de la tierra.

¿Que es un eje?

Un eje es una dirección del espacio. Con dos ejes puedes medir un plano, con 3 todo el espacio tridimensional.

Con un acelerómetro de tres ejes y suponiendo el objeto en reposo podemos encontrar su orientación en el espacio ya que sabiendo que está sujeto a una aceleración de 1G, y con la ayuda de la trigonometría podemos definir su orientación solo con las tres medidas de los ejes.

Acelerómetro ADXL335

El ADXL335 es un acelerómetro de 3 ejes que nos permite medir aceleraciones del rango de +3G -3G.

La interfaz se trata de un sensor analógico por lo que nos proporcionará mediante 3 pines, tres voltajes proporcionales a la aceleración de cada eje.

Analizando cada uno de los valores de tensión que nos da a la salida por medio de Arduino y estableciendo lo que serían los valores en reposo, comprobamos cuando se realizan movimientos y esos movimientos se traducen en señales que Arduino manda a Windows a través de su librería Mouse.

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 3

Page 4: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

Algo muy importante es que se trata de un dispositivo que se alimenta a 3.3v, por lo que se debe tener cuidado a la hora de alimentarlo a través de Arduino en el pin de 3,3v y no en el de 5v, lo que produciría su daño irreparable.

El ADXL335 viene montando en su propia placa PCB donde esta conectadas a su salida los condensadores de desacoplo que recomienda el fabricante para limitar los ruidos. El esquema es el siguiente:

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 4

Page 5: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

Librería Mouse de Arduino

Esta librería nos permite manejar el ratón de Windows a través de Arduino usando las

funciones que vienen predefinidas en ella. Un aspecto importante es que esta librería

no está disponible para todos los modelos de Arduino, así que hemos tenido que

utilizar la última versión que es la Leonardo.

En la librería están todas estas funciones para el manejo del ratón, nosotros sólo

usamos las que necesitamos para nuestro proyecto.

Mouse.begin ()

Mouse.click ()

Mouse.end ()

Mouse.move ()

Mouse.press ()

Mouse.release ()

Mouse.isPressed ()

Mouse.begin()

Descripción

Comienza la emulación de un ratón conectado al ordenador. Debe ser llamada antes de

comenzar a usar las demás.

Sintaxis

Mouse.begin()

Parámetros

Ninguno

Returns

Nada

Mouse.click()

Descripción

Envía un click al ordenador en la posición donde se encuentre el puntero. Es lo mismo

que apretar y soltar el botón del ratón.

Mouse.click() sin ningún parámetro toma el click izquierdo por defecto.

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 5

Page 6: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

Sintaxis

Mouse.click();

Mouse.click(botón);

Parametros

Botón: el botón que se pulsa - char

MOUSE_LEFT (default)

MOUSE_RIGHT

MOUSE_MIDDLE

Devuelve

Nada 

Mouse.end()

Descripción

Finaliza la emulación del ratón en el ordenador.

Sintaxis

Mouse.end()

Parámetros

Ninguno

Devuelve

Nada

Mouse.move()

Descripción

Mueve el puntero del ordenador. El movimiento en la pantalla siempre es relativa a la

posición actual del puntero.

Sintaxis

Mouse.move(xVal, yPos, wheel);

Parametros

xVal: cantidad de movimiento en el eje X - int

yVal: cantidad de movimiento en el eje Y-axis - int

wheel: cantidad de movimiento en scroll wheel - int

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 6

Page 7: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

Devuelve

Nada

Mouse.press()

Descripción

Manda al ordenador la acción de apretar un botón pero no soltarlo

Se puede cancelar con Mouse.release().

Sintaxis

Mouse.press();

Mouse.press(botón);

Parámetros

botón: botón que está presionado - char

MOUSE_LEFT (default)

MOUSE_RIGHT

MOUSE_MIDDLE

Devuelve

Nada 

Mouse.release()

Descripción

Envía que el botón se ha soltado. (Previamente tenía que estar pulsado).

Sintaxis

Mouse.release();

Mouse.release(botón);

Parámetros

button: el botón a soltar - char

MOUSE_LEFT (default)

MOUSE_RIGHT

MOUSE_MIDDLE

Devuelve

Nada

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 7

Page 8: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

Mouse.isPressed()

Descripción

Comprueba el estado de los botones y devuelve si están presionados o no.

Sintaxis

Mouse.isPressed();

Mouse.isPressed(botón);

Parámetros

botón: que botón va a comprobar - char

MOUSE_LEFT (default)

MOUSE_RIGHT

MOUSE_MIDDLE

Devuelve

boolean : Devuelve si está presionado o no. 

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 8

Page 9: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

CODIGO

/*

Proyecto Ratón con acelerómetro

Juan Alberto Benito

Ernesto Tejedor

Agustín Yerpes

MESA 06 2ºDPE IES Vallecas I

*/

/*

El programa lee los valores analógicos que recibe del acelerómetro ADXL335 y tratando los datos manda información a Windows para el manejo del ratón y los botones.

El programa tiene dos modos de funcionamiento:

1- Movimiento de ratón y Scroll

2- Clicks del botón

En el primer modo de funcionamiento se detectan los movimientos de la cabeza y se envían al ordenador para mover el puntero del ratón. Si la inclinación en el eje Y es mayor o menor de ciertos valores, se considera que se desea hacer scroll y lo envía para hacer scroll de pantalla.

En el segundo modo de funcionamiento se entra cuanto se deja el puntero del ratón quieto sobre unos 2 segundos. Una vez dentro el movimiento del puntero se detiene y los movimientos que se realicen serán para hacer distintos clicks de ratón o para salir del modo 2.

Los clicks serán:

Click Izquierdo - Inclinar la cabeza hacia delante

Doble click izquierdo - Inclinar la cabeza hacia la izquierda

Click Derecho - Inclinar la cabeza hacia la derecha

Salir del modo clicks - Inclinar la cabeza hacia atrás.

*/

const int xPin = 0; //Pin para eje de la X

const int yPin = 1; //Pin para eje de la Y

//El eje Z no lo usamos en nuestro proyecto.

int espera=0;//Contador para detectar el tiempo de espera para cambiar de modo

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 9

Page 10: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

int estado=0;//Estado en el que se encuentra el programa

void setup()

{

//Configuracion de los pines y se inicializa la comunicacion con el raton.

pinMode(xPin, INPUT);

pinMode(yPin, INPUT);

Mouse.begin();

}

void loop()

{

//Variables para almacenar los datos recogidos del ADXL335

int accelerationX, accelerationY, accelerationZ;

//Almacenamos los valores leidos en las variables.

accelerationX=analogRead(xPin);

accelerationY=analogRead(yPin);

//Se realize un mapeo de los valores analógicos leidos para obtener unos //valores mas manejables y poderlos enviar al ordenador. El valor en reposo que obtenemos es alrededor de 330 por lo que lo consideramos el 0.

accelerationX = map(accelerationX, 230, 430, -20, 20);

accelerationY = map(accelerationY, 230, 430, -20, 20);

//Empieza la comprobacion del estado de funcionamiento

switch (estado)

{//Modo movimiento y scroll

case 0:

if(accelerationY < -2)

{ //Se hace un scroll hacia abajo. Ponemos de valor -1 y se pone un

// delay para que haga el scroll despacio y se pueda controlar con facilidad.

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 10

Page 11: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

Mouse.move(0, 0, -1);

delay(75);

espera=0; Anulamos la cuenta de espera cuando hay scroll

}

else if(accelerationY > 2)

{ //Lo mismo pero scroll hacia arriba

Mouse.move(0, 0, 1);

delay(75);

espera=0; Anulamos la cuenta de espera cuando hay scroll

}

else

{//Modo movimiento

if (accelerationY == 0 && accelerationX == 0 )

{//Cada bucle en el que no hay movimiento aumenta el contador.

espera++;

}

else

{

if ((accelerationY < 2 || accelerationY > -2) || (accelerationX < 2 || _ accelerationX > -2))

{//Si las aceleraciones estan entre estos rangos se manda

//a Windows para que mueva el ratón. Se mandan negativos para

//que se correspondan los ejes de Windows con los nuestros

Mouse.move(-accelerationX, -accelerationY, 0);

delay(2);//Delay para que no se acelere mucho

espera=0;//Anulamos la cuenta de espera cuando se mueve

}

}

}

if (espera>500)

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 11

Page 12: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

{//Cuando la espera llega a 500 se detecta cambio de modo

espera=0;

estado=1;

}

break;

case 1:

//En el modo boton dependiendo de los movimientos hacemos distintos clicks

if(accelerationY < -3) //Inclinar la cabeza hacia delante

{ //Hacemos click

Mouse.click();

estado=0; //Volvemos a estado movimiento y scroll

delay(1000);//Delay para que despues de hacer click de tiempo a colocar

//la cabeza en posición recta.

}

else if (accelerationY >= 3) //Inclinar la cabeza hacia atras

{ //Salimos del modo click

estado=0; //Volvemos a estado movimiento y scroll

delay(1000);

}

else if (accelerationX < -3) //Inclinar la cabeza hacia la derecha

{ // Hacemos click derecho

Mouse.click(MOUSE_RIGHT);

estado=0; //Volvemos a estado movimiento y scroll

delay(1000);

}

else if (accelerationX >= 3) //Inclinar la cabeza hacia la izquierda

{ //Hacemos doble click

Mouse.click();

Mouse.click();

estado=0; //Volvemos a estado movimiento y scroll

delay(1000);

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 12

Page 13: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

}

break;

}

}

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 13

Page 14: handless mouse with arduino.doc

Juan Alberto BenitoErnesto TejedorAgustín Yerpes

PCB

Vista 3D

Vista diseño de pistas

Proyecto Ratón con AcelerómetroDesarrollo de Proyectos 2ºDPE

IES Vallecas I 14