Introduction: ITTT Rolando Ritzen - Motion Control Arcade Glove
Een handschoen die je kan gebruiken als motion controller voor on-rail shooters.
De gimmick van dit project is dat alles motion control is, inclusief het schieten. (Je schiet door te "finger bangen")
Step 1: Het Materiaal
Het materiaal dat je gaat nodig hebben is vrij simpel.
1x Arduino pro micro of Arduino Leonardo
1x MPU6050 gyroscope
4x kabels
Step 2: De Bekabeling
Zoals je in het schema in de afbeelding ziet is de bekabeling super simpel.
MPU VCC > Arduino VCC
MPU ground > Arduino ground
MPU SCL > Pin 3
MPU SDA > Pin 2
Step 3: Libraries 1
Voor dit project heb je een paar custom libraries nodig van deze link: https://github.com/jrowberg/i2cdevlib
Download een ZIP file via de "Clone or download" knop rechts bovenaan.
Step 4: Libraries 2
Open de Zip file en klik op het mapje "Arduino".
En uit deze Arduino map wil je de mapjes "I2Cdev" en "MPU6050" pakken en in je Arduino libraries zetten (Program Files > Arduino > libraries)
Step 5: De Code
#include <Wire.h> #include <I2Cdev.h> #include <MPU6050.h> #include <Mouse.h> #include <Keyboard.h>
MPU6050 mpu;
int16_t ax, ay, az, gx, gy, gz; int16_t accx, accy, accz; int vx, vy; float angle;
//code for smoothing input<br>int readIndex = 0; const int numReadings = 20; int angleReadings[numReadings]; int total = 0; float averageAngle = 0.0;
int oldZ = 0; int newZ = 0;
void setup() {<br> Serial.begin(115200); Wire.begin(); Mouse.begin(); mpu.initialize(); if (!mpu.testConnection()) { while (1); } <br>
for (int thisReading = 0; thisReading < numReadings; thisReading++) { angleReadings[thisReading] = 0; } }
void loop() {<br>
total = total - angleReadings[readIndex]; angleReadings[readIndex] = angle; total = total + angleReadings[readIndex]; readIndex = readIndex + 1; if (readIndex >= numReadings) { readIndex = 0; }
<br> if (gz > 30000) { Serial.println("Bang"); Mouse.click(); //Shoot by flicking the gun backwards (finger banging) }<br>
//accx, accy, accz; mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); mpu.getAcceleration(&accx, &accy, &accz); //Serial.println(gy); // Serial.println(angle);<br>
oldZ = newZ; vx = (gx + 1000) / 150; vy = -(gz - 200) / 150; Mouse.move(vx, vy); delay(20);
Dit stukje code heeft een beetje uitleg nodig omdat je het waarschijnlijk een klein beetje moet aanpassen.
Wat er waarschijnlijk gaat gebeuren is dat je cursor uit zichzelf over je scherm gaat bewegen (van rechts naar links, van boven naar onder of diagonaal) en dit stukje code zorgt er voor dat je curor stil blijft staan als je geen input geeft.
Je moet de values in in "gx + 1000" en "gz - 200" aanpassen totdat je het resultaat krijgt dat je wil en ik denk dat de values die wil nodig hebt afhankelijk zijn van je scherm resolutie.
Als de cursor uit zichzelf van rechts naar links beweegd wil je "gx + x" aanpassen.
Als de cursor uit zichzelf van boven naar onder beweegd wil je de "gz - x" aan passen.
Als het diagonaal beweegd, dan kies je een van de twee values om aan te passen totdat hij nog maar over een as beweegd en dan pas je de andere aan.
<br><br> Serial.print("gx = "); Serial.print(gx); Serial.print(" | gz = "); Serial.print(gz); Serial.print(" | gy = "); Serial.println(gy); if (gx > 32000) { Serial.println("Flick Right"); //Reload when flicking gun to the right Keyboard.write('r'); delay(250); } Serial.print("accx = "); Serial.print(accx); Serial.print(" | accy = "); Serial.print(accy); Serial.print(" | accz = "); Serial.println(accz); //working //angle = atan2((float) (ay - 16384), (float) (ax - 16384)) * (180.0 / PI) * -1; angle = atan2((float) ay, (float) ~ax) * (180.0 / PI); //float angle = atan2((float) ay, (float) -ax) * (180.0 / PI); //Serial.println(averageAngle); }