Скейтборд виртуальной реальности «Сделай сам»
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Приложения и онлайн-сервисы
|
Об этом проекте
Это действительно веселый и простой проект, который можно выполнить примерно за час. Внизу скейтборда находится акселерометр / гироскоп с платой Arduino, которая передает угловое движение доски через Bluetooth в небольшую игру VR, которую я сделал в Unity для телефонов Android. Итак, когда вы включаете Arduino и Bluetooth подключается к вашему телефону, вы начинаете двигаться вперед. Наклонитесь налево и идите налево, наклонитесь направо и идите направо. Поднимите передние колеса, и ваш персонаж подпрыгнет. Это работает только для телефонов Android, и ваш телефон должен быть совместим с Google Cardboard. Итак, если у вас есть старый скейтборд, превратите его в сноуборд виртуальной реальности. Вот как:
Вам понадобится:
Гарнитура виртуальной реальности в стиле Google Cardboard.
Скейтборд.
4 теннисных мяча (чтобы не скатывались)
Ардуино Леонардо (или Уно)
Некоторые перемычки
Мини-макет
Модуль Bluetooth HC-06
Акселерометр / гироскоп MPU-6050
Батарея 9 В с аккумуляторным ящиком, которая имеет переключатель включения / выключения и цилиндрическую вилку (для питания платы Arduino)
Паяльник и, возможно, пистолет для горячего клея
Приложение для Android, код Arduino и список деталей со ссылками можно найти здесь:
http://wirebeings.com/virtual-reality-skateboard.html
Шаг 1. Создайте устройство / передатчик / ввод / устройство Arduino
Соберите устройство, как показано на картинке выше.
Вам нужно будет припаять контакты заголовка к MPU-6050, если ваш паяльник новый и жало чистое, это можно сделать примерно за 11 секунд. Если у вас грязное и старое жало паяльника, это быстро станет самым сложным делом, которое вы когда-либо делали (по опыту).
Убедитесь, что все расположено точно так, как показано на рисунках выше, чтобы вам не пришлось вдаваться в код и что-либо редактировать.
Прикрепите все к скейтборду ТОЧНО, как показано (на самом деле, просто убедитесь, что MPU6050 смотрит в том же направлении, что и изображение)
Здесь я приклеил батарейный отсек к плате горячим клеем и прикрутил плату Arduino. Я использовал старую школьную доску, потому что более широкая доска лучше для целей этого опыта. В виртуальной реальности довольно сложно балансировать на доске.
ПРИМЕЧАНИЕ:Леонардо подходит для этого намного лучше ... однако ...
Если вы используете Arduino Uno, все соединения такие же, за исключением:
SDA переходит к A4, а SCL переходит к A5
Шаг 2. Загрузите код Arduino на свое устройство / передатчик / устройство ввода
ВАЖНО:отключите контакты RX и TX перед загрузкой кода на вашу плату.
Шаг 3:Почти готово! Загрузите приложение на свой телефон!
Перейдите по этой ссылке и загрузите приложение на свой телефон.
Приложение для скейтборда и сноуборда виртуальной реальности Google Cardboard
Вам нужно будет зайти в настройки безопасности и разрешить установку приложений от неизвестных разработчиков.
Обязательно выполните сопряжение модуля Bluetooth с телефоном, не меняйте имя по умолчанию (HC-06). Пароль должен быть 1234.
Примечания:
Это моя первая игра на Unity ... так что она довольно проста.
Если это сделает достаточное количество людей, я могу попытаться сделать сноуборд лучше или сделать настоящую игру для скейтборда, в зависимости от того, на что я получаю запросы.
Когда вы включаете устройство Arduino, убедитесь, что скейтборд стоит на земле, а затем откройте приложение. Как только Bluetooth подключится, вы зайдете.
Если Bluetooth отключается, перезапустите приложение (на данный момент оно настроено на подключение только при запуске приложения).
Код
- Код 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 devStatus; uint16_t packetSize; uint16_t fifoCount; uint8_t fifoBuffer [64]; Quaternion q; VectorInt16 aa; VectorInt16 aaReal; VectorInt16 aaWorld; VectorFloat gravity; поплавок Эйлера [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); // Для использования с Arduino Uno Serial1.begin (9600); // Для использования с Леонардо Serial.println (F ("Инициализация устройств I2C ...")); 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 (правда); Serial.println (F ("Включение обнаружения прерывания (внешнее прерывание Arduino 0) ...")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus =mpu.getIntStatus (); Serial.println (F («DMP готов! Ожидание первого прерывания ...»)); dmpReady =true; PackageSize =mpu.dmpGetFIFOPacketSize (); } else {Serial.print (F ("Ошибка инициализации DMP (код")); Serial.print (devStatus); Serial.println (F (")")); }} void sendData (int x, int y, int z) {if (z <-10) {// вперед Serial1.write ("f"); // Написать Леонардо Serial1.write (10); // стоповый бит Serial.write ("f"); // Запись в Uno Serial.write (10); // Стоповый бит} else if (z> 0) {// назад Serial1.write ("b"); Serial1.write (10); Serial.write ("б"); Serial.write (10); } else if (y> 5) {// Чтобы сделать более чувствительным, измените значение на 4 или меньше // правильно Serial1.write ("r"); Serial1.write (10); Serial.write ("г"); Serial.write (10); } else if (y <-5) {// Чтобы сделать более чувствительное изменение на -4 или больше // left Serial1.write ("l"); Serial1.write (10); Serial.write ("л"); Serial.write (10); } else // остановка Serial1.write ("s"); Serial1.write (10); Serial.write ("с"); Serial.write (10); } void loop () {если (! dmpReady) return; mpuInterrupt =false; mpuIntStatus =mpu.getIntStatus (); fifoCount =mpu.getFIFOCount (); если ((mpuIntStatus &0x10) || fifoCount ==1024) {mpu.resetFIFO (); Serial.println (F («Переполнение FIFO»)); } иначе, если (mpuIntStatus &0x02) {в то время как (fifoCount <размер пакета) {fifoCount =mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount - =размер пакета; 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;}
Схема
Производственный процесс
- Музыкальный визуализатор DIY LUMAZOID для Arduino
- Захват капель воды с помощью Arduino
- Вольтметр своими руками с использованием Arduino и смартфона
- Генератор волн JX
- J.A.R.V.I.S с дуговым реактором DIY
- Сделай сам Arduino РАДИОНИКА Лечение MMachine
- Самодельный двухмерный гоночный симулятор
- Модуль Arduino + GPS - средство уведомления о пункте назначения
- Будильник ArduRadio
- Виртуальный теннис на Arduino