GAFAS «OCULUS RIFT» LOW COST Y PERIFÉRICOS
El proyecto que vamos a realizar es un visor de realidad virtual o HDM (Head Display Mounted) y un conjunto de periféricos para capturar movimiento del usuario y poder utilizarlos como entrada para entornos virtuales, y en particular, videojuegos.
El proyecto contaría de las siguientes partes:
-Visor o gafas de realidad virtual:
Consta de:
-Una pantalla que muestra imágenes 3D estereoscópicas mediante un software (Vieiro..)
-Unas lentes asféricas para aumentar la imagen y dar sensación inmersiva
-Acelerómetro que capta los movimientos de la cabeza del usuario y los envía al arduino, convirtiéndolos en movimiento del ratón (control de cámara)
SEÑALES DE ARDUINO: 2 Acelerómetro mpu
-Periféricos:
– Mando de movimiento: Incluye un joystick para controlar el movimiento del avatar virtual, además de varios botones para controlar otras opciones.
SEÑALES DE ARDUINO: 2 señales analógicas para el joystick (x,y)
– Mando pistola: Mando implementado en una pistola de juguete, que permite capturar la señal del gatillo para poder disparar en videojuegos FPS(Firts Person Shooter). Incluye varios botones para capturar más opciones para el arma, como recargar, apuntar, cambiar arma…
SEÑALES DE ARDUINO: 4 analógicas: Gatillo, 3 botones personalizables
Visor o Head Mount Display
Materiales para el visor:
-Gafas snowboard 8€
Pasos realizados:
Lo primero que hacemos es hacer una caja con una base abierta con el cartón pluma en la que entre con holgura la pantalla. Para trabajar con comodidad, dejamos una de los lados abiertos para seguir trabajando en ella.
En la cara posterior pegamos una pieza de madera y sobre la madera la placa controladora de la pantalla.
A unos 2cm de la base, colocamos una pieza de
cartón pluma para que soporte la pantalla, y luega otra pieza Encima que sujete la pantalla, como se muestra en las fotos
Por otro lado, con 2 cuello de botella de 1 litro de Aquarius, se corta por la parte estrecha con un diámetro un poco menor
que el diámetro de las lupas . Se hacen unos cortes para utilizar la parte de arriba como pestañas que sujetan la lupa.
En la parte de abajo, se hacen unos cortes a 1cm aproximado cada uno, y se doblan creando pestañas que luego servirán para unir a una madera que sujete los cuellos de la botella. A la madera se le hace un corte interno de tal forma que se pueda ver a través de las lupas.
Para la distancia entre las dos lupas y la distancia entre las lupas y la pantalla, reproducimos en la pantalla un video estereoscópico y confirmamos que se produce efecto 3d correctamente y se ve con nitidez.
Con el cartón pluma, hacemos unas guías que sujeten el soporte que incluye las lupas. Tenemos en cuenta la distancia óptima entre lupas y pantalla a la hora de poner las lupas.
Ponemos la tapa que le falta a la caja con cartón pluma. Para poder hacer futuros cambios, esta tapa se une a los lados con velcro. En esta tapa hacemos un hueco para poder conectar correctamente el HDMI y la alimentación.En la parte inferior de nuestra caja, insertamos en Acelerómetro y colocamos una clema para colocar con más facilidad los cables del acelerómetro.
Para sujetar las gafas, colocamos la correa a la caja y dejamos la parte interna de las gafas hacia fuera. Hacemos unos retoques para mayor comodidad, como dejar hueco para la nariz, y pintamos con spray negro la caja para lograr un mejor acabado.
Esquema Arduino de conexión con Acelerómetro
Vcc – 3,3 V
GND ‘ GND
SCL- SCL
SDA –SDA
Código:
//avisamos al acelerómetro y definimos la orientación actual como 0,0.
void setup(){
Mouse.begin();
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);
}
//Leer los valores del Acelerometro de la IMU
Wire.beginTransmission(MPU);
Wire.write(0x3B); //Pedir el registro 0x3B – corresponde al AcX
Wire.endTransmission(false);
Wire.requestFrom(MPU,6,true); //A partir del 0x3B, se piden 6 registros
AcX=Wire.read()<<8|Wire.read(); //Cada valor ocupa 2 registros
AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();
if(AcX==-1){
setup();
}
//Lecturas directas del acelerometro
Serial.print(«ACX: «); Serial.print(AcX); Serial.print(«n»);
Serial.print(«AcY»); Serial.print(AcY); Serial.print(«n————n»);
//Se calculan los angulos Y, X respectivamente.
Acc[1] = atan(-1*(AcX/A_R)/sqrt(pow((AcY/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
Acc[0] = atan((AcY/A_R)/sqrt(pow((AcX/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
//Leer los valores del Giroscopio
Wire.beginTransmission(MPU);
Wire.write(0x43);
Wire.endTransmission(false);
Wire.requestFrom(MPU,4,true); //A diferencia del Acelerometro, solo se piden 4 registros
GyX=Wire.read()<<8|Wire.read();
GyY=Wire.read()<<8|Wire.read();
//Lectura directa del giroscopo
Serial.print(«GX: «); Serial.print(GyX); Serial.print(«n»);
Serial.print(«GY»); Serial.print(GyY); Serial.print(«n————n»);
//Calculo del angulo del Giroscopio
Gy[0] = GyX/G_R;
Gy[1] = GyY/G_R;
//Aplicar el Filtro Complementario
Angle[0] = 0.98 *(Angle[0]+Gy[0]*0.010) + 0.02*Acc[0];
Angle[1] = 0.98 *(Angle[1]+Gy[1]*0.010) + 0.02*Acc[1];
Serial.print(«angle X: «); Serial.print(Angle[0]); Serial.print(«n»);
Serial.print(«angle Y: «); Serial.print(Angle[1]); Serial.print(«n————n»);
//Diferencia con el angulo anterior
diff[0] = AnteriorAngulo[0]-Angle[0];
diff[1] = AnteriorAngulo[1]-Angle[1];
//Comprobamos que no lectura errones, en caso de que asi sea reiniciamos el mpu
if (isnan(diff[0])||isnan(diff[1])){
diff[0]=0;
diff[1]=0;
setup();
}
AnteriorAngulo[0]=Angle[0];
AnteriorAngulo[1]=Angle[1];
//Se mueve el raton la diferencia en su eje
Mouse.move(-diff[1]*amplificador[1],-diff[0]*amplificador[0]);
Amplificador se utiliza para aumentar el valor de la diferencia entre angulos aumente y se haga efectivo en el movimiento del ratón. Los valores del acelerómetro que hacen el movimiento más efectivo en nuestras pruebas han sido amplificador[0]=20(x) y amplificador [1]= 10(y).
Joystick
Hacemos una pequeña caja para que quepa el Joystick. Soldamos a unos cable largos los pines 5v, gnd ,swx, swy.
Esquema Arduino:
-5v-5v
-GND-GND
-SWX – A4
-SWY – A5
Código:
void joystick(){
float signalX;
float signalY;
signalX = analogRead(A4);
signalY = analogRead(A5);
if (signalX<400){
//mover izquierda
Keyboard.press(‘d’);
}
if (signalX> 700){
Keyboard.press(‘a’);
//mover derecha
}
if (signalY< 400){
Keyboard.press(‘w’);
//mover adelante
}
if (signalY> 700){
Keyboard.press(‘s’);
//mover atras
}
Pistola:
Pasos realizados:
Compramos una pistola en cualquier tienda de juguetes de niños que no tenga más que un gatillo para poder disparar sin botones, le hicimos tres agujeros en los que metimos 3 pulsadores comprados en cualquier tienda de electrónica que consisten en que dejan de pasar corriente cuando les pulsas, para que pase tienes que conectar un lado de cada pulsador a el positivo de una fuente de alimentación en este caso (se podría haber utilizado una pila que sería mas cómodo pero optamos por esto porque una pila se gastaba enseguida de tenerlo conectado) y el otro lado de el pulsador lo conectamos a el Arduino en la parte digital o analógica, en este caso usamos las entradas analógicas porque nos pareció más cómodo, por lo que tenemos 3 entradas de Arduino analógicas reservadas para estos tres pulsadores, en cuanto al gatillo tan solo es un cable con forma de gatillo que al chocar con un metal conectado a el Arduino dejaba pasar corriente. Para comprobar que los botones
están pulsados, esperamos un valor alto. En el caso del gatillo es al contrario, al pulsar el gatillo da valor 0.
Esquema Arduino:
-Botón 1 – A0
-Botón 2 – A1
-Botón 3 – A2
-Gatillo – A3
Código:
void pistola(){
//SensorPistola
int btn1;
int btn2;
int btn3;
int gatillo;
btn1 = analogRead(A0);
btn2 = analogRead(A1);
btn3 = analogRead(A2);
gatillo= analogRead(A3);
if (btn1 >0) {
Keyboard.press(‘y’);
Keyboard.release(‘y’);
}
if (btn2>0){
Keyboard.press(‘r’);
Keyboard.release(‘r’);
}
if(btn3>0){
Keyboard.press(‘t’);
Keyboard.release(‘t’);
}
//Comprueba que el gatillo da 0 2 veces seguidas para eliminar falsos positivos
if(gatillo==0&&aux1==0){
Mouse.click();
}
aux1=gatillo;
delay(1); // delay in between reads for stability
}
Videos: