Bangun Papan Skate VR DIY dengan Arduino, Google Cardboard, dan Bluetooth
Komponen dan Perlengkapan
Arduino UNO
×
1
Modul Bluetooth HC-06
×
1
Perangkat Android
×
1
Headset VR Google Cardboard
×
1
Kabel Jumper (umum)
×
1
Modul GY-521 MPU-6050 Gyroskop 3 Axis + Akselerometer untuk Arduino
×
1
Aplikasi dan Layanan Online
Google Cardboard VR SDKs
Tentang Proyek Ini
Ini adalah proyek yang menyenangkan dan mudah yang dapat diselesaikan dalam waktu sekitar satu jam. Di bagian bawah papan skate terdapat akselerometer/giroscop dengan papan Arduino yang mentransmisikan gerakan sudut papan melalui Bluetooth ke game VR kecil yang saya buat di Unity untuk ponsel Android. Jadi, ketika Anda menyalakan Arduino dan Bluetooth terhubung dengan ponsel Anda, Anda mulai bergerak ke depan. Miringkan ke kiri dan Anda akan ke kiri, miringkan ke kanan dan Anda akan ke kanan. Angkat roda depan dan karakter Anda akan melompat. Ini hanya berfungsi untuk ponsel Android dan ponsel Anda harus kompatibel dengan Google Cardboard. Jadi, jika Anda memiliki papan skate lama yang tidak terpakai, ubah menjadi papan salju virtual reality. Berikut caranya:
Yang Anda Butuhkan:
Headset virtual reality gaya Google Cardboard.
Papan skate.
4 bola tenis (untuk mencegah meluncur)
Arduino Leonardo (atau Uno)
Beberapa kabel jumper
Mini breadboard
Modul Bluetooth HC-06
Akselerometer/giroscop MPU-6050
Baterai 9V dengan kotak baterai yang memiliki tombol on/off dan colok bundar (untuk menyediakan daya pada papan Arduino)
Langkah 1: Buat Perangkat/Pengirim/Input Arduino Anda
Rakit perangkat Anda seperti yang ditunjukkan dalam gambar di atas.
Anda perlu menyolder pin header pada MPU-6050. Jika alat solder Anda baru dan ujungnya bersih, ini dapat dilakukan dalam waktu sekitar 11 detik. Jika ujung alat solder Anda kotor dan lama, ini akan segera menjadi hal paling sulit yang pernah Anda lakukan (dari pengalaman).
Pastikan orientasi semua hal persis seperti yang ditunjukkan dalam gambar di atas sehingga Anda tidak perlu masuk ke kode dan mengubah apa pun.
Pasang semua hal pada papan skate Anda PERSIS seperti yang ditunjukkan (hanya pastikan MPU6050 menghadap arah yang sama seperti gambar).
Di sini saya melekatkan kotak baterai pada papan dengan lem panas dan memasang papan Arduino dengan baut. Saya menggunakan papan skate lama karena papan yang lebih lebar lebih baik untuk tujuan pengalaman ini. Cukup sulit untuk menyeimbangkan diri pada papan saat berada dalam realitas virtual.
CATATAN: Leonardo bekerja jauh lebih baik untuk ini... namun...
Jika Anda menggunakan Arduino Uno, semua koneksi sama kecuali:
SDA terhubung ke A4 dan SCL terhubung ke A5
Langkah 2: Unggah Kode Arduino ke Perangkat/Pengirim/Input Anda
PENTING: Lepaskan pin RX dan TX sebelum mengunggah kode ke papan Anda.
Langkah 3: Hampir Selesai! Unduh Aplikasi ke Ponsel Anda!
Ikuti tautan ini dan unduh aplikasi ke ponsel Anda.
Aplikasi Papan Skate/Salju Virtual Reality Google Cardboard
Anda perlu masuk ke pengaturan keamanan dan mengizinkan aplikasi diinstal dari pengembang yang tidak diketahui.
Pastikan untuk memasangkan modul Bluetooth ke ponsel Anda, jangan mengubah nama default (HC-06). Kata sandi harus 1234.
Catatan:
Ini adalah game Unity pertama saya... jadi cukup dasar.
Jika cukup banyak orang yang membuat ini, saya dapat mencoba membuat game papan salju yang lebih baik, atau membuat game papan skate sebenarnya tergantung pada permintaan yang saya terima.
Jika Anda menyalakan perangkat Arduino, pastikan papan skate datar di tanah lalu buka aplikasi. Segera setelah Bluetooth terhubung, Anda akan turun.
Jika Bluetooth terputus, mulai ulang aplikasi (disetel untuk terhubung di awal aplikasi saja, untuk saat ini).
Kode
Kode Arduino
Kode ArduinoArduino
#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); //For use with Arduino Uno Serial1.begin(9600); //For use with Leonardo Serial.println(F("Initializing I2C devices...")); mpu.initialize(); Serial.println(F("Testing device connections...")); Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed")); Serial.println(F("Initializing DMP...")); devStatus = mpu.dmpInitialize(); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); if (devStatus == 0) { Serial.println(F("Enabling DMP...")); mpu.setDMPEnabled(true); Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)...")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); Serial.println(F("DMP ready! Waiting for first interrupt...")); dmpReady = true; 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"); // Write to Leonardo Serial1.write(10); //Stop Bit Serial.write("f"); // Write to Uno Serial.write(10); //Stop bit } else if (z > 0){ //backward Serial1.write("b"); Serial1.write(10); Serial.write("b"); Serial.write(10); } else if (y > 5){ //To make more sensitive change value to 4 or less //right Serial1.write("r"); Serial1.write(10); Serial.write("r"); Serial.write(10); } else if (y < -5){ //To make more sensitive change to -4 or greater //left 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("FIFO Overflow")); } 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; }