Construye un Skateboard VR Casero con Arduino, Google Cardboard y Bluetooth
Componentes y materiales
| Arduino UNO (o Leonardo, recomendado) | 1 |
| Módulo Bluetooth HC-06 | 1 |
| Dispositivo Android compatible con Google Cardboard | 1 |
| Visor VR Google Cardboard | 1 |
| Cables jumper (macho-macho) | 1 juego |
| Módulo acelerómetro/giróscopo MPU-6050 (GY-521) | 1 |
| Skateboard (preferiblemente tabla ancha "old school") | 1 |
| 4 pelotas de tenis (para evitar que ruede) | 4 |
| Protoboard mini | 1 |
| Batería 9V con porta-baterías con interruptor y conector barrel jack | 1 |
| Soldador y pistola de silicona caliente (opcional) | 1 |
Aplicaciones y servicios online
- SDK de Google Cardboard para VR
Sobre el proyecto
Este es un proyecto divertido y sencillo que se puede completar en aproximadamente una hora. En la parte inferior del skateboard se coloca un acelerómetro/giróscopo conectado a un Arduino que transmite el movimiento angular de la tabla vía Bluetooth a un pequeño juego de realidad virtual desarrollado en Unity para teléfonos Android.
El funcionamiento es intuitivo: al encender el Arduino y conectar el Bluetooth con el móvil, el personaje comienza a avanzar automáticamente. Inclinar la tabla a la izquierda hace girar a la izquierda, inclinar a la derecha gira a la derecha, y levantar las ruedas delanteras (hacer un "manual") hace que el personaje salte.
Requisitos importantes: Solo funciona con teléfonos Android compatibles con Google Cardboard. Si tienes un skateboard viejo guardado, conviértelo en una tabla de snowboard virtual.
Paso 1: Montar el dispositivo transmisor (Arduino + sensores)
Ensambla el circuito siguiendo las imágenes. Deberás soldar los pines header al MPU-6050; con un soldador en buen estado toma unos 11 segundos, pero con una punta sucia o gastada puede volverse muy difícil.
Orientación crítica: Asegúrate de que la orientación del MPU-6050 coincida exactamente con las fotos para no tener que modificar el código.
Fija todo al skateboard tal como se muestra. El autor pegó el porta-baterías con silicona caliente y atornilló el Arduino. Se recomienda una tabla ancha ("old school") porque es difícil mantener el equilibrio en una tabla estrecha mientras llevas el visor VR.
Paso 2: Subir el código al Arduino
IMPORTANTE: Desconecta los pines RX y TX del módulo Bluetooth antes de subir el código.
Paso 3: Instalar la app en el móvil
Descarga la aplicación desde: wirebeings.com/virtual-reality-skateboard.html
Deberás activar en Ajustes → Seguridad la opción "Orígenes desconocidos" para instalar la APK.
Empareja el módulo HC-06 con el móvil (nombre por defecto "HC-06", contraseña "1234").
Notas del autor:
- Es su primer juego en Unity, por lo que es bastante básico.
- Si hay suficiente interés, podría desarrollar un juego de snowboard más completo o uno de skateboard real.
- Al encender el Arduino, asegúrate de que la tabla esté plana en el suelo y luego abre la app. En cuanto conecte el Bluetooth, "caerás" dentro del juego.
- Si se desconecta el Bluetooth, reinicia la app (solo intenta conectar al inicio).
Código Arduino
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
MPU6050 mpu;
bool dmpReady = false;
uint8_t mpuIntStatus;
uint8_t devStatus;
uint16_t packetSize;
uint16_t fifoCount;
uint8_t fifoBuffer[64];
Quaternion q;
VectorInt16 aa;
VectorInt16 aaReal;
VectorInt16 aaWorld;
VectorFloat gravity;
float euler[3];
float ypr[3];
volatile bool mpuInterrupt = false;
void setup() {
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR = 24;
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
Serial.begin(9600); // Para Arduino UNO
Serial1.begin(9600); // Para Leonardo
Serial.println(F("Inicializando dispositivos I2C..."));
mpu.initialize();
Serial.println(F("Probando conexiones..."));
Serial.println(mpu.testConnection() ? F("MPU6050 conectado") : F("Fallo conexión MPU6050"));
Serial.println(F("Inicializando DMP..."));
devStatus = mpu.dmpInitialize();
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788);
if (devStatus == 0) {
Serial.println(F("Activando DMP..."));
mpu.setDMPEnabled(true);
Serial.println(F("Activando interrupción (int. externa 0)..."));
attachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();
Serial.println(F("DMP listo. Esperando primera interrupción..."));
dmpReady = true;
packetSize = mpu.dmpGetFIFOPacketSize();
} else {
Serial.print(F("Fallo inicialización DMP (código "));
Serial.print(devStatus);
Serial.println(F(")"));
}
}
void sendData(int x, int y, int z) {
if(z < -10){ // adelante
Serial1.write("f"); Serial1.write(10);
Serial.write("f"); Serial.write(10);
} else if (z > 0){ // atrás
Serial1.write("b"); Serial1.write(10);
Serial.write("b"); Serial.write(10);
} else if (y > 5){ // derecha (cambia a 4 para más sensibilidad)
Serial1.write("r"); Serial1.write(10);
Serial.write("r"); Serial.write(10);
} else if (y < -5){ // izquierda (cambia a -4 para más sensibilidad)
Serial1.write("l"); Serial1.write(10);
Serial.write("l"); Serial.write(10);
} else { // stop
Serial1.write("s"); Serial1.write(10);
Serial.write("s"); Serial.write(10);
}
}
void loop() {
if (!dmpReady) return;
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();
fifoCount = mpu.getFIFOCount();
if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
mpu.resetFIFO();
Serial.println(F("Desbordamiento FIFO"));
} else if (mpuIntStatus & 0x02) {
while (fifoCount < packetSize) {
fifoCount = mpu.getFIFOCount();
}
mpu.getFIFOBytes(fifoBuffer, packetSize);
fifoCount -= packetSize;
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
sendData(ypr[0] * 180/M_PI, ypr[1] * 180/M_PI, ypr[2] * 180/M_PI);
}
}
void dmpDataReady() {
mpuInterrupt = true;
}
Esquemático
El código completo, la app para Android y la lista de componentes con enlaces de compra están disponibles en: wirebeings.com/virtual-reality-skateboard.html
Proceso de manufactura
- Construya su propio LUMAZOID: Visualizador de música DIY con Arduino
- Captura Gotas de Agua en Acción con Arduino Nano: Fotografía de Alta Velocidad DIY
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Generador de Ondas JX – Oscilador DDS Compatible con Arduino con Pantalla OLED
- Asistente de voz J.A.R.V.I.S DIY con Arduino y diseño Arc Reactor
- Construye un dispositivo de tratamiento radiónico EMR con Arduino DIY
- Simulador de Carreras 2D DIY con Arduino Nano y Servos SG90
- Construye un Notificador de Destino GPS con Arduino UNO y Módulo NEO‑6M
- ArduRadio: Reloj Despertador con Radio FM Basado en Arduino
- Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth
- Construye un Cerco RFID Portátil con Arduino – Guía Paso a Paso