DIY 虚拟现实滑板
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
|
关于这个项目
这是一个非常有趣和简单的项目,可以在大约一个小时内完成。在滑板的底部是一个带有 Arduino 板的加速度计/陀螺仪,它通过蓝牙将板的角运动传输到我在 Unity 中为 Android 手机制作的一个小型 VR 游戏。因此,当您打开 Arduino 并且蓝牙与手机连接时,您就开始前进了。向左倾斜,你向左走,向右倾斜,你向右走。抬起前轮,你的角色就会跳跃。这仅适用于 Android 手机,并且您的手机必须与 Google Cardboard 兼容。所以,如果你有一个旧滑板,把它变成一个虚拟现实滑雪板。方法如下:
您将需要:
一款 Google Cardboard 风格的虚拟现实耳机。
一个滑板。
4个网球(防止滚走)
一个 Arduino Leonardo(或 Uno)
一些跳线
一个迷你面包板
一个HC-06蓝牙模块
MPU-6050 加速度计/陀螺仪
一个带有电池盒的 9V 电池,带有一个开/关开关和一个桶形插头(为 Arduino 板供电)
烙铁和热胶枪
可在此处找到 Android 应用程序、Arduino 代码和带链接的零件清单:
http://wirebeings.com/virtual-reality-skateboard.html
第 1 步:创建您的 Arduino 设备/发射器/输入/事物 图>
如上图所示组装您的设备。
您需要将头针焊接到 MPU-6050 上,如果您的烙铁是新的并且尖端是干净的,这可以在大约 11 秒内完成。如果您的烙铁头又脏又旧,这将很快成为您做过的最困难的事情(根据经验)。
确保所有内容的方向与上图所示完全相同,这样您就不必进入代码并编辑任何内容。
如图所示,将所有东西完全连接到滑板上(实际上只需确保 MPU6050 与图片朝向相同的方向)
在这里,我用热胶将电池盒粘在板上,然后将 Arduino 板拧下来。我使用了旧学校董事会,因为对于这种体验而言,更宽的董事会更好。在虚拟现实中很难在板上保持平衡。
注意:Leonardo 在这方面效果更好……但是……
如果您使用的是 Arduino Uno,则所有连接都相同,除了:
SDA去A4,SCL去A5
第 2 步:将 Arduino 代码上传到您的设备/发射器/输入设备
重要提示:在将代码上传到您的电路板之前拔下 RX 和 TX 引脚。
第 3 步:差不多完成了!下载应用程序到您的手机!
按照此链接将应用程序下载到您的手机。
Google Cardboard 虚拟现实滑板/滑雪板应用
您需要进入安全设置并允许安装来自未知开发者的应用。
确保蓝牙模块与手机配对,不要更改默认名称(HC-06)。密码应为 1234。
备注:
这是我的第一个 Unity 游戏......所以它非常基础。
如果有足够多的人做到这一点,我可以尝试制作更好的滑雪板游戏,或者根据我的要求制作真正的滑板游戏。
当您打开 Arduino 设备时,请确保滑板平放在地面上,然后打开应用程序。只要蓝牙连接,您就会进入。
如果蓝牙断开连接,请重新启动应用程序(目前设置为仅在应用程序启动时连接)。
代码
- Arduino 代码
Arduino 代码Arduino
#include "I2Cdev.h"#include "MPU6050_6Axis_MotionApps20.h"#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE #include "Wire.h"#endifMPU6050 mpu;bool dmpReady =false; uint8_t mpuIntStatus; uint8_t 开发状态; uint16_t 数据包大小; uint16_t fifoCount; uint8_t fifoBuffer[64];四元数 q; VectorInt16 aa; VectorInt16 aaReal; VectorInt16 aaWorld; VectorFloat 重力;浮动欧拉[3];浮动 ypr[3];易失性布尔 mpuInterrupt =假; 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); //用于Arduino Uno Serial1.begin(9600); //用于 Leonardo Serial.println(F("Initializing I2C devices...")); mpu.initialize(); Serial.println(F("测试设备连接...")); Serial.println(mpu.testConnection() ? F("MPU6050 连接成功") :F("MPU6050 连接失败")); Serial.println(F("正在初始化 DMP...")); devStatus =mpu.dmpInitialize(); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); if (devStatus ==0) { Serial.println(F("启用 DMP...")); mpu.setDMPEnabled(true); Serial.println(F("启用中断检测(Arduino外部中断0)...")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus =mpu.getIntStatus(); Serial.println(F("DMP 准备好!等待第一个中断...")); dmpReady =真; packetSize =mpu.dmpGetFIFOPacketSize(); } else { Serial.print(F("DMP Initialization failed (code ")); Serial.print(devStatus); Serial.println(F(")")); } }void sendData(int x, int y, int z){ if(z <-10){ //forward Serial1.write("f"); // 写入 Leonardo Serial1.write(10); //停止位Serial.write("f"); // 写入 Uno Serial.write(10); //停止位 } else if (z> 0){ //向后 Serial1.write("b"); Serial1.write(10); Serial.write("b");串行写入(10); } else if (y> 5){ //将更敏感的更改值设为 4 或更少 //right Serial1.write("r"); Serial1.write(10); Serial.write("r");串行写入(10); } else if (y <-5){ //对-4或更大的更敏感的变化 //left Serial1.write("l"); Serial1.write(10); Serial.write("l");串行写入(10); } else //停止Serial1.write("s"); Serial1.write(10); Serial.write("s");串行写入(10); }void loop() { if (!dmpReady) return; mpuInterrupt =假; mpuIntStatus =mpu.getIntStatus(); fifoCount =mpu.getFIFOCount(); if ((mpuIntStatus &0x10) || fifoCount ==1024) { mpu.resetFIFO(); Serial.println(F("FIFO 溢出")); } else if (mpuIntStatus &0x02) { while (fifoCount
示意图
制造工艺