DIY Motion Control Gaming

19,052

66

6

About: Electrical Engineer

Intro: DIY Motion Control Gaming

Let's talk for a moment about what we're getting into with this project.The main idea is to create a system that enables the user to have a more immersive gaming experience with the use of real-time motion controls. Now as we get further into this project, you'll see that this system has so many more applications than just gaming (for example when finished, the system could easily be used as a means of control for someone that has limited mobility). As I walk you through the steps to replicate my system, I will explain everything as thoroughly as I can in as much detail as possible so that you are not only replicating or improving, but building on your knowledge base and hopefully developing some new skills! So, without further ado, let's get started!

Step 1: Here's What You're Going to Need

Throughout this project, I will be explaining a variety of different options for building this system. I have outlined them below along with their respective parts lists. Links to the products and their prices will all be included.

*4DOF - 4 Degrees of Freedom

*6DOF - 6 Degrees of Freedom

*********************************************************************************************************************************

Option 1 (4DOF system using Wii sensor bar):

This will be the main focus of this instructable as it is the easiest to build and doesn't require too much extra knowledge of soldering or circuitry. If you want a system that works perfectly well and you can set up with minimal resources, this is the one you want. Keep in mind if you want to use one of the other options, I will be very clear in why everything is built in the way that it is and how it functions.

PROS-Simplest version, most thoroughly explained in this instructable

CONS-May be pricier if you don't already own some of the hardware

Option 1 Parts List

SOFTWARE

Glovepie - FREE

HARDWARE

Wii Sensor Bar - $7.99 *You can either power it by plugging it into a wii or with about 5-8v input

Wii Remote - $16.99

GoPro Head Mount - $7.49 (OPTIONAL)

*********************************************************************************************************************************

Option 2 (4DOF system using DIY sensor bar):

This option is basically the same as the first, however you will be creating your own (with in-depth instruction) sensor bar instead of using a wii sensor bar.

PROS-Same as option 1 in terms of code

CONS-Requires a bit more time/skill *but may be a great learning experience!

Option 2 Parts List

SOFTWARE

Glovepie - FREE

HARDWARE

PCB Board - $2.79 for 5

1kΩ Resistor

~400Ω Resistor

2x Infrared LED

Male USB Cable (we will only be using this as a 5V source so it doesn't matter what the opposite connection type is) - $4.89

Wii Remote - $16.99

GoPro Head Mount - $7.49 (OPTIONAL)

*********************************************************************************************************************************

Option 3 (6DOF system using DIY sensor bar):

This option is much more complicated and requires a bit more knowledge of coding to complete successfully. I would not recommend attempting this version unless you feel confident in your abilities to understand the inner-workings of the system and will be able to develop a system based off of a simplified version.

PROS-Provides a greater amount of control over the system with more variables to observe and act on

CONS-Requires even more time/skill/insight but still provides a great learning experience!

Option 3 Parts List

SOFTWARE

Glovepie - FREE

HARDWARE

PCB Board - $2.79 for 5

33Ω Resistor (or resistor values equivalent to approximately 30Ω)- can be found for pennies at your local electronics store

4x Infrared LED

Male USB Cable (we will only be using this as a 5V source so it doesn't matter what the opposite connection type is) - $4.89

Wii Remote - $16.99

GoPro Head Mount - $7.49 (OPTIONAL)

Step 2: Bluetooth

This step is important (which is why I'm including it earlier than I should in this intructable) because if you can't get the Wiimote to connect and interact with your computer, this whole project isn't going to work for you. I'll walk you through the different ways you can connect the Wiimote via bluetooth to your windows computer.

If you have Windows 10, which I'll assume most people do, it's a bit annoying to connect the Wiimote but I have found a 100% successful way of troubleshooting and making everything connect. If you have an earlier version of Windows, connecting the Wiimote should be a breeze.

The fist step is to open your Bluetooth settings window. You can do this by either typing 'bluetooth' into the search bar or by navigating to it through the control panel.

To set the Wiimote to sync mode, open up the back cover and press the red Sync button (It is important to start the sync like this). The Wiimote LEDs should start to flash. Make sure Bluetooth on your computer is turned on and begin to search for devices. The device you are looking for should be called something similar to 'Nintendo RVL-CNT-01'. If you are NOT on Windows 10, go ahead and click to connect. There is no pin to connect to the Wiimote so just leave that space blank.

If you are on Windows 10, there is no option to connect to a device without a pairing pin so here's what you need to do:

Navigate to the bottom right corner of your screen and click the up arrow to bring up a box of background programs. You should see the Bluetooth icon here. Right click the icon and select 'Join a Personal Area Network'. A window should pop up in the control panel that has connected devices listed. Go ahead and click 'Add a Device' in the top left corner. Select the Wiimote device and click Next twice. That's it you should be connected. If you couldn't see the device listed or were unable to connect, see the troubleshooting section down below.

Troubleshooting

PROBLEM: Can't see the device in the list of available Bluetooth devices

SOLUTION: Make sure the lights on the Wiimote are still flashing. If this doesn't work and you are on Windows 10, go ahead and click 'Add a Bluetooth or other device' button in your main Bluetooth settings, wait for the popup to find the device, close the window, and add the device from the Personal Area Network window.

PROBLEM: Paired with the Wiimote previously and can see it in the Bluetooth device list as Paired but the device will not connect when I select it.

SOLUTION: Click on the device, click 'Remove Device', and start from the beginning of this step.

Step 3: Creating Your Sensor Bar

If you have chosen to do option 1 for this project (which I highly recommend), you can go to the next step. If you've chosen options 2 or 3, get out your soldering iron, hot glue gun, and other supplies and get ready to go!

A 33 (or near enough) Ohm resistor should be sufficient to power your infrared LEDs in series without too much current passing through the diodes. Another option is to use a 1k Ohm and 430 Ohm resistor as a voltage divider to power the diodes. For more information on Voltage Dividers and how to use them have a look at this link.

If you are having trouble figuring out the polarity of your diodes, remember that longer leg of the diode acts as the anode (positive connection) and the shorter leg as the cathode (negative connection).

I would recommend spacing your diodes far enough that the Wiimote will be able to distinguish between them at range. A few inches should be sufficient for either 4DOF or 6DOF sensor bars.

To give your sensor bar power, we need to clip one end of the USB cable so that we have a male USB on one end and exposed wire on the other end. Trim back the outer coating and you should have either 4 small color-coded wires (if your cable has data transfer capabilities) or 2 small color-coded wires. The ones we need should be colored red and black for 5V+ and GND. You can solder these onto your PCB as the voltage source component for your LED circuit. You may want to include a switch so that instead off plugging in or unplugging the USB to turn on/off the diodes, you can leave the sensor bar plugged in and use the switch to turn on/off the diodes. This can easily be done by interrupting the connection between the 5V (red wire) of the USB and the PCB.

After you've finished everything, plug your USB into a phone charger or other such 5V source (not your computer yet) to make sure it works. We don't want to test the circuit on the USB port of our computer because if something is connected improperly, it could damage your USB port.

When your circuit is connected, you won't see the LEDs emitting any light because the infrared light that they emit is not in the visual range of human sight. You can see if your LEDs are on by using most modern phone cameras. Just open up your camera app and have a look at the LEDs through the screen - you should see a soft purple or white light emitting from the diodes.

When all is done, you may want to add some hot glue onto the power source wires to make sure repeated movement wont tug the wires off.

Step 4: Mounting Your Sensor Bar

The following instructions are for those using a GoPro head mount as their means of attachment. If you are using something different be creative and find a solution that will have the infrared LEDs shine from the back of your head when worn.

The first thing you need to do is to find a drill bit that is the same size as the holes in your GoPro mount. I decided to hot-glue a spare PCB onto the back of the Wii sensor bar so that those who chose to do options 2 or 3 will have similar results. Slide the PCB into place where it will be held and mark the center. Drill out a hole completely through (you may want to do this before hot-gluing anything) and place the sensor back into place on the mount to make sure the holes line up. You can now secure the sensor in place by screwing in the bolt.

Make sure the sensor is centered and the Infrared LEDs shine backwards relative to your head.

Step 5: Setup - Make Some Space!

Let's talk a little bit about setup. You don't necessarily need a lot of space for this system. In fact, you can use it perfectly well just sitting at your desk. I do, however, recommend making enough space to stand in front of a TV with a few feet of spacing behind you and infront of you so that the Wiimote's built in sensor with its small degree of visibility can track your infrared diodes as you move around. Personally, I like to give myself a one body-length between myself and the TV and the same amount of space between myself and the Wiimote.

Very quickly lets discuss how the Wiimote needs to be positioned. The Wiimote should be parallel to the ground, at eyeball height to the user (whether they be standing or sitting down), and centered on the screen (It's more important for the Wiimote to be eyeball height than centered on the screen so if you can't achieve both at the same time, chose eyeball height). It is very important that the Wiimote be parallel to the ground so place it in a position so that it is as level as possible. To get your Wiimote to the desired height I would recommend a tripod with an extendable top. If not, a bookshelf or a table (depending on how tall you are or if you're sitting) might do nicely.

Have a look at the image at the beginning of this step to get a rough idea of what the setup and spacing might look like if you decide to use a TV as the viewing platform.

Step 6: Let's Code! Part 1 - the Basics

It's time to open the GlovePIE software. The 'documentation.rtf' file included with the download has everything you need to understand the language, but I will make sure to explain everything that we program here. If you plan on adding extra controllers or trackers, you may want to read through the documentation.

**Important Note: Glovepie is a looping program, so the entire program is in an infinite loop as soon as you run it.

I called this step 'The Basics' because in this stage, we're just going to write some test code and make sure all the interactions with the Wiimote go as planned. This program will track the infrared LEDs, figure out which LED is on which side, and output the corresponding positional data. Every important line of code here is commented so that you can understand what is happening.

The following code is for the 4DOF version of this project (Options 1&2):

var.leftX=0 //Left Diode X Position
var.leftY=0 //Left Diode Y Position
var.rightX=0 //Right Diode X Position
var.rightY=0 //Right Diode Y Position
var.leftSize=0 //Left Diode Size
var.rightSize=0 //Right Diode Size
//Turn all 4 Wiimote indicator LEDs on - tells us the program is running
wiimote.Led1=true
wiimote.Led2=true
wiimote.Led3=true
wiimote.Led4=true
//find dots
if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the right side
   var.rightX=wiimote.dot1x
   var.rightY=wiimote.dot1y
   var.leftX=wiimote.dot2x
   var.leftY=wiimote.dot2y
}else{//dot1 is on the left side
    var.rightX=wiimote.dot2x
   var.rightY=wiimote.dot2y
   var.leftX=wiimote.dot1x
   var.leftY=wiimote.dot1y
}
var.xDistance=var.rightX-var.leftX //Distance between the two LEDs (X)
var.yDistance=abs(var.rightY-var.leftY)  //Distance between the two LEDs (Y) (Should be very small compared to xDistance)</p><p>var.leftSize=wiimote.dot1intensity //intensity of the LED is better than grabbing the actual size of the diode (for accuracy reasons)
var.rightSize=wiimote.dot2intensity
var.centerX=var.leftX+abs((var.rightX-var.leftX)/2) //Center X Position of the two diodes

The following code is for the 6DOF version of the project (Option 3). There is less commenting because most of what is needed is explained in the simpler program above. Important notes are still added as comments in this program.

var.topLeftX=0
var.topLeftY=0
var.topRightX=0
var.topRightY=0
var.bottomLeftX=0
var.bottomLeftY=0
var.bottomRightX=0
var.bottomRightY=0
wiimote.Led1=true
wiimote.Led2=true
wiimote.Led3=true
wiimote.Led4=true

//find dot 1
if ((wiimote.dot1x-wiimote.dot2x>50) || (wiimote.dot1x-wiimote.dot3x>50) || (wiimote.dot1x-wiimote.dot4x>50)){//dot1 is on the right side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topRightX=wiimote.dot1x
      var.topRightY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomRightX=wiimote.dot1x
      var.bottomRightY=wiimote.dot1y
   }
}else{//dot1 is on the left side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topLeftX=wiimote.dot1x
      var.topLeftY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomLeftX=wiimote.dot1x
      var.bottomLeftY=wiimote.dot1y
   }
}
/***********************************************/
//find dot 2
if ((wiimote.dot2x-wiimote.dot1x>50) || (wiimote.dot2x-wiimote.dot3x>50) || (wiimote.dot2x-wiimote.dot4x>50)){ //dot2 is on the right side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topRightX=wiimote.dot2x
      var.topRightY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomRightX=wiimote.dot2x
      var.bottomRightY=wiimote.dot2y
   }
}else{//dot2 is on the left side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topLeftX=wiimote.dot2x
      var.topLeftY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomLeftX=wiimote.dot2x
      var.bottomLeftY=wiimote.dot2y
   }
}
/***********************************************/
//find dot 3
if ((wiimote.dot3x-wiimote.dot1x>50) || (wiimote.dot3x-wiimote.dot2x>50) || (wiimote.dot3x-wiimote.dot4x>50)){ //dot3 is on the right side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topRightX=wiimote.dot3x
      var.topRightY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomRightX=wiimote.dot3x
      var.bottomRightY=wiimote.dot3y
   }
}else{//dot3 is on the left side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topLeftX=wiimote.dot3x
      var.topLeftY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomLeftX=wiimote.dot3x
      var.bottomLeftY=wiimote.dot3y
   }
}
/***********************************************/
//find dot 4
if ((wiimote.dot4x-wiimote.dot1x>50) || (wiimote.dot4x-wiimote.dot2x>50) || (wiimote.dot4x-wiimote.dot3x>50)){ //dot4 is on the right side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topRightX=wiimote.dot4x
      var.topRightY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomRightX=wiimote.dot4x
      var.bottomRightY=wiimote.dot4y
   }
}else{//dot4 is on the left side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topLeftX=wiimote.dot4x
      var.topLeftY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomLeftX=wiimote.dot4x
      var.bottomLeftY=wiimote.dot4y
   }
}
/***********************************************/

Now that you've pasted in the code and made any modifications that you see fit, go ahead and position yourself in front of your screen with the Wiimote positioned a few feet behind you pointing at the back of your head. Make sure the Bluetooth connection is still active and go ahead and click 'Run'. Check behind you to make sure all 4 of the Wiimote's LEDs are turned on - this indicates the program is running and has connected to the Wiimote. You can now click on the tab that says 'Variables' and you will see the collected data change as you move and turn your head in various directions. If everything appears to be in order go ahead and proceed to the next step where we learn to control the mouse! If you have any questions, feel free to message me or post in the comments.

Step 7: Let's Code! Part 2 - Mouse Control/Limited Mobility User Application

As I stated at the beginning of this instructable, this project isn't only intended for people to have a more fun and immersive gaming experience. This step in particular will not only generate mouse control, but provide a means for any users with limited mobility to take control of their computers.

I've gone ahead and added a calibration section to this code so all you have to do to get it to work is plug in the pixel dimensions of your screen and hit run. It will talk you through the calibration process and start the looping function that takes control of the mouse. After the calibration section has finished running, the mouse will position itself wherever you look.

*If you don't know the pixel dimensions of your screen, add the following snippet of code to the program after the comment '//pixel'.

say("Move your mouse completely to the right side of your screen")
wait 7s
var.mouseMaxX=mouse.CursorPosX
say("Move your mouse completely to the bottom of your screen")
wait 7s
var.mouseMaxY=mouse.CursorPosY

For 4DOF systems (options 1 and 2) use the following code:

//Light up all 4 LEDS on the wiimote so we know the program is running and connected
wiimote.Led1=true
wiimote.Led2=true
wiimote.Led3=true
wiimote.Led4=true
//Your Screen Resolution
var.cursorMaxX=1920
var.cursorMaxY=1080
/*********************************************************************************************************************************/
//This section is for calibration and will run once
if var.init=0 then
     var.init=1
     say("Stand central and look at the center of the screen")
     wait 7s
     //dot intensities are recorded
     var.leftSize=wiimote.dot1intensity
     var.rightSize=wiimote.dot2intensity     //pixel
     say("Look at the left side of the screen for a few seconds")
     wait 5s
     if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the right side
        var.rightX=wiimote.dot1x
        var.leftX=wiimote.dot2x
     }else{//dot1 is on the left side
        var.rightX=wiimote.dot2x
        var.leftX=wiimote.dot1x
     }
     var.xMax=round(var.leftX+abs((var.rightX-var.leftX)/2))//max X value is found by taking the center location of the two points
     say("Look at the right side of the screen for a few seconds")
     wait 5s
     if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the right side
        var.rightX=wiimote.dot1x
        var.leftX=wiimote.dot2x
     }else{//dot1 is on the left side
        var.rightX=wiimote.dot2x
        var.leftX=wiimote.dot1x
     }
     var.xMin=round(var.leftX+abs((var.rightX-var.leftX)/2))//min X value is found by taking the center location of the two points
     say("Look at the bottom of the screen for a few seconds")
     wait 5s
     if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the left side
        var.rightY=wiimote.dot1y
        var.leftY=wiimote.dot2y
     }else{//dot1 is on the left side
        var.rightY=wiimote.dot2y
        var.leftY=wiimote.dot1y
     }
     var.yMax=round((var.rightY+var.leftY)/2)//max Y value is found by taking the center location of the two points
     say("Look at the top of the screen for a few seconds")
     wait 5s
     if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the left side
        var.rightY=wiimote.dot1y
        var.leftY=wiimote.dot2y
     }else{//dot1 is on the left side
        var.rightY=wiimote.dot2y
        var.leftY=wiimote.dot1y
     }
     var.yMin=round((var.rightY+var.leftY)/2)//min X value is found by taking the center location of the two points
     var.centerX=round(var.xMin+((var.xMin+var.xMax)/2))
     var.centerY=round(var.yMin+((var.yMin+var.yMax)/2))
end if
/*********************************************************************************************************************************/
//This part loops infinitely
//find dots
if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the right side
   var.rightX=wiimote.dot1x
   var.rightY=wiimote.dot1y
   var.leftX=wiimote.dot2x
   var.leftY=wiimote.dot2y
}else{//dot1 is on the left side
   var.rightX=wiimote.dot2x
   var.rightY=wiimote.dot2y
   var.leftX=wiimote.dot1x
   var.leftY=wiimote.dot1y
}
if(wiimote.dot1vis==true && wiimote.dot2vis==true){//if both dots are visible
   mouse.CursorPosX=mouse.CursorPosX-(var.currentX-(var.cursorMaxX-var.cursorMaxX*(((var.leftX+((var.rightX-var.leftX)/2))-var.xMin)/(var.xMax-var.xMin))))//convert centerX to pixel ration and set mouse to position
   var.currentX=mouse.CursorPosX
   mouse.CursorPosY=mouse.CursorPosY-(var.currentY-(var.cursorMaxY*(((var.leftY+((var.rightY-var.leftY)/2))-var.yMin)/(var.yMax-var.yMin))))//convert centerY to pixel ratio and set mouse to position
   var.currentY=mouse.CursorPosY
}
//"panic" button ESCAPE will stop/exit the program if anything goes wrong
if ESCAPE then
   exitpie
end if
/*********************************************************************************************************************************/*******************************************************************************************************************************/</p>

For 6DOF systems (option 3) use the following code:

var.topLeftX=0
var.topLeftY=0
var.topRightX=0
var.topRightY=0
var.bottomLeftX=0
var.bottomLeftY=0
var.bottomRightX=0
var.bottomRightY=0
wiimote.Led1=true
wiimote.Led2=true
wiimote.Led3=true
wiimote.Led4=true
var.xMin=0
var.xMax=0
var.yMin=0
var.yMax=0
//Screen Size
var.mouseMaxX=1920
var.mouseMaxY=1080
/*********************************************************************************************************************************</p><p>//This section is for calibration and will run once
if var.init=0 then
     var.init=1
//xMin (LeftSide)
say("Look at the left side of your screen for a few seconds")
wait 7s
//find dot 1
if ((wiimote.dot1x-wiimote.dot2x>50) || (wiimote.dot1x-wiimote.dot3x>50) || (wiimote.dot1x-wiimote.dot4x>50)){//dot1 is on the right side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topRightx=wiimote.dot1x
      var.topRightY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomRightx=wiimote.dot1x
      var.bottomRightY=wiimote.dot1y
   }
}else{//dot1 is on the left side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topLeftx=wiimote.dot1x
      var.topLeftY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomLeftx=wiimote.dot1x
      var.bottomLeftY=wiimote.dot1y
   }
}
/***********************************************/
//find dot 2
if ((wiimote.dot2x-wiimote.dot1x>50) || (wiimote.dot2x-wiimote.dot3x>50) || (wiimote.dot2x-wiimote.dot4x>50)){ //dot2 is on the right side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topRightx=wiimote.dot2x
      var.topRightY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomRightx=wiimote.dot2x
      var.bottomRightY=wiimote.dot2y
   }
}else{//dot2 is on the left side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topLeftx=wiimote.dot2x
      var.topLeftY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomLeftx=wiimote.dot2x
      var.bottomLeftY=wiimote.dot2y
   }
}
/***********************************************/
//find dot 3
if ((wiimote.dot3x-wiimote.dot1x>50) || (wiimote.dot3x-wiimote.dot2x>50) || (wiimote.dot3x-wiimote.dot4x>50)){ //dot3 is on the right side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topRightx=wiimote.dot3x
      var.topRightY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomRightx=wiimote.dot3x
      var.bottomRightY=wiimote.dot3y
   }
}else{//dot3 is on the left side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topLeftx=wiimote.dot3x
      var.topLeftY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomLeftx=wiimote.dot3x
      var.bottomLeftY=wiimote.dot3y
   }
}
/***********************************************/
//find dot 4
if ((wiimote.dot4x-wiimote.dot1x>50) || (wiimote.dot4x-wiimote.dot2x>50) || (wiimote.dot4x-wiimote.dot3x>50)){ //dot4 is on the right side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topRightx=wiimote.dot4x
      var.topRightY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomRightx=wiimote.dot4x
      var.bottomRightY=wiimote.dot4y
   }
}else{//dot4 is on the left side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topLeftx=wiimote.dot4x
      var.topLeftY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomLeftx=wiimote.dot4x
      var.bottomLeftY=wiimote.dot4y
   }
}
/***********************************************/
var.xMin=var.topLeftx+(abs(var.topLeftx-var.topRightx)/2)//xMax (RightSide)
say("Look at the right side of your screen for a few seconds")
wait 7s
//find dot 1
if ((wiimote.dot1x-wiimote.dot2x>50) || (wiimote.dot1x-wiimote.dot3x>50) || (wiimote.dot1x-wiimote.dot4x>50)){//dot1 is on the right side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topRightx=wiimote.dot1x
      var.topRightY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomRightx=wiimote.dot1x
      var.bottomRightY=wiimote.dot1y
   }
}else{//dot1 is on the left side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topLeftx=wiimote.dot1x
      var.topLeftY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomLeftx=wiimote.dot1x
      var.bottomLeftY=wiimote.dot1y
   }
}
/***********************************************/
//find dot 2
if ((wiimote.dot2x-wiimote.dot1x>50) || (wiimote.dot2x-wiimote.dot3x>50) || (wiimote.dot2x-wiimote.dot4x>50)){ //dot2 is on the right side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topRightx=wiimote.dot2x
      var.topRightY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomRightx=wiimote.dot2x
      var.bottomRightY=wiimote.dot2y
   }
}else{//dot2 is on the left side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topLeftx=wiimote.dot2x
      var.topLeftY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomLeftx=wiimote.dot2x
      var.bottomLeftY=wiimote.dot2y
   }
}
/***********************************************/
//find dot 3
if ((wiimote.dot3x-wiimote.dot1x>50) || (wiimote.dot3x-wiimote.dot2x>50) || (wiimote.dot3x-wiimote.dot4x>50)){ //dot3 is on the right side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topRightx=wiimote.dot3x
      var.topRightY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomRightx=wiimote.dot3x
      var.bottomRightY=wiimote.dot3y
   }
}else{//dot3 is on the left side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topLeftx=wiimote.dot3x
      var.topLeftY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomLeftx=wiimote.dot3x
      var.bottomLeftY=wiimote.dot3y
   }
}
/***********************************************/
//find dot 4
if ((wiimote.dot4x-wiimote.dot1x>50) || (wiimote.dot4x-wiimote.dot2x>50) || (wiimote.dot4x-wiimote.dot3x>50)){ //dot4 is on the right side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topRightx=wiimote.dot4x
      var.topRightY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomRightx=wiimote.dot4x
      var.bottomRightY=wiimote.dot4y
   }
}else{//dot4 is on the left side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topLeftx=wiimote.dot4x
      var.topLeftY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomLeftx=wiimote.dot4x
      var.bottomLeftY=wiimote.dot4y
   }
}
/***********************************************/
var.xMax=var.topLeftx+(abs(var.topLeftx-var.topRightx)/2)</p><p>//yMin (BottomSide)
say("Look at the bottom of your screen for a few seconds")
wait 7s
//find dot 1
if ((wiimote.dot1x-wiimote.dot2x>50) || (wiimote.dot1x-wiimote.dot3x>50) || (wiimote.dot1x-wiimote.dot4x>50)){//dot1 is on the right side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topRightx=wiimote.dot1x
      var.topRightY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomRightx=wiimote.dot1x
      var.bottomRightY=wiimote.dot1y
   }
}else{//dot1 is on the left side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topLeftx=wiimote.dot1x
      var.topLeftY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomLeftx=wiimote.dot1x
      var.bottomLeftY=wiimote.dot1y
   }
}
/***********************************************/
//find dot 2
if ((wiimote.dot2x-wiimote.dot1x>50) || (wiimote.dot2x-wiimote.dot3x>50) || (wiimote.dot2x-wiimote.dot4x>50)){ //dot2 is on the right side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topRightx=wiimote.dot2x
      var.topRightY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomRightx=wiimote.dot2x
      var.bottomRightY=wiimote.dot2y
   }
}else{//dot2 is on the left side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topLeftx=wiimote.dot2x
      var.topLeftY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomLeftx=wiimote.dot2x
      var.bottomLeftY=wiimote.dot2y
   }
}
/***********************************************/
//find dot 3
if ((wiimote.dot3x-wiimote.dot1x>50) || (wiimote.dot3x-wiimote.dot2x>50) || (wiimote.dot3x-wiimote.dot4x>50)){ //dot3 is on the right side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topRightx=wiimote.dot3x
      var.topRightY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomRightx=wiimote.dot3x
      var.bottomRightY=wiimote.dot3y
   }
}else{//dot3 is on the left side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topLeftx=wiimote.dot3x
      var.topLeftY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomLeftx=wiimote.dot3x
      var.bottomLeftY=wiimote.dot3y
   }
}
/***********************************************/
//find dot 4
if ((wiimote.dot4x-wiimote.dot1x>50) || (wiimote.dot4x-wiimote.dot2x>50) || (wiimote.dot4x-wiimote.dot3x>50)){ //dot4 is on the right side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topRightx=wiimote.dot4x
      var.topRightY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomRightx=wiimote.dot4x
      var.bottomRightY=wiimote.dot4y
   }
}else{//dot4 is on the left side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topLeftx=wiimote.dot4x
      var.topLeftY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomLeftx=wiimote.dot4x
      var.bottomLeftY=wiimote.dot4y
   }
}
/***********************************************/
var.yMin=var.bottomLefty+(abs(var.topLefty-var.bottomLefty)/2)</p><p>//yMax (TopSide)
say("Look at the top of your screen for a few seconds")
wait 7s
//find dot 1
if ((wiimote.dot1x-wiimote.dot2x>50) || (wiimote.dot1x-wiimote.dot3x>50) || (wiimote.dot1x-wiimote.dot4x>50)){//dot1 is on the right side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topRightx=wiimote.dot1x
      var.topRightY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomRightx=wiimote.dot1x
      var.bottomRightY=wiimote.dot1y
   }
}else{//dot1 is on the left side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topLeftx=wiimote.dot1x
      var.topLeftY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomLeftx=wiimote.dot1x
      var.bottomLeftY=wiimote.dot1y
   }
}
/***********************************************/
//find dot 2
if ((wiimote.dot2x-wiimote.dot1x>50) || (wiimote.dot2x-wiimote.dot3x>50) || (wiimote.dot2x-wiimote.dot4x>50)){ //dot2 is on the right side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topRightx=wiimote.dot2x
      var.topRightY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomRightx=wiimote.dot2x
      var.bottomRightY=wiimote.dot2y
   }
}else{//dot2 is on the left side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topLeftx=wiimote.dot2x
      var.topLeftY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomLeftx=wiimote.dot2x
      var.bottomLeftY=wiimote.dot2y
   }
}
/***********************************************/
//find dot 3
if ((wiimote.dot3x-wiimote.dot1x>50) || (wiimote.dot3x-wiimote.dot2x>50) || (wiimote.dot3x-wiimote.dot4x>50)){ //dot3 is on the right side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topRightx=wiimote.dot3x
      var.topRightY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomRightx=wiimote.dot3x
      var.bottomRightY=wiimote.dot3y
   }
}else{//dot3 is on the left side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topLeftx=wiimote.dot3x
      var.topLeftY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomLeftx=wiimote.dot3x
      var.bottomLeftY=wiimote.dot3y
   }
}
/***********************************************/
//find dot 4
if ((wiimote.dot4x-wiimote.dot1x>50) || (wiimote.dot4x-wiimote.dot2x>50) || (wiimote.dot4x-wiimote.dot3x>50)){ //dot4 is on the right side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topRightx=wiimote.dot4x
      var.topRightY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomRightx=wiimote.dot4x
      var.bottomRightY=wiimote.dot4y
   }
}else{//dot4 is on the left side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topLeftx=wiimote.dot4x
      var.topLeftY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomLeftx=wiimote.dot4x
      var.bottomLeftY=wiimote.dot4y
   }
}
/***********************************************/
var.yMax=var.bottomLefty+(abs(var.topLefty-var.bottomLefty)/2)
end if
/*********************************************************************************************************************************/
//This part loops infinitely
//find dots
//find dot 1
if ((wiimote.dot1x-wiimote.dot2x>50) || (wiimote.dot1x-wiimote.dot3x>50) || (wiimote.dot1x-wiimote.dot4x>50)){//dot1 is on the right side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topRightx=wiimote.dot1x
      var.topRightY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomRightx=wiimote.dot1x
      var.bottomRightY=wiimote.dot1y
   }
}else{//dot1 is on the left side
   if ((wiimote.dot1y-wiimote.dot2y>50) || (wiimote.dot1y-wiimote.dot3y>50) || (wiimote.dot1y-wiimote.dot4y>50)){ //dot1 is on the top
      var.topLeftx=wiimote.dot1x
      var.topLeftY=wiimote.dot1y
   }else{//dot1 is on the bottom
      var.bottomLeftx=wiimote.dot1x
      var.bottomLeftY=wiimote.dot1y
   }
}
/***********************************************/
//find dot 2
if ((wiimote.dot2x-wiimote.dot1x>50) || (wiimote.dot2x-wiimote.dot3x>50) || (wiimote.dot2x-wiimote.dot4x>50)){ //dot2 is on the right side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topRightx=wiimote.dot2x
      var.topRightY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomRightx=wiimote.dot2x
      var.bottomRightY=wiimote.dot2y
   }
}else{//dot2 is on the left side
   if ((wiimote.dot2y-wiimote.dot1y>50) || (wiimote.dot2y-wiimote.dot3y>50) || (wiimote.dot2y-wiimote.dot4y>50)){ //dot2 is on the top
      var.topLeftx=wiimote.dot2x
      var.topLeftY=wiimote.dot2y
   }else{//dot2 is on the bottom
      var.bottomLeftx=wiimote.dot2x
      var.bottomLeftY=wiimote.dot2y
   }
}
/***********************************************/
//find dot 3
if ((wiimote.dot3x-wiimote.dot1x>50) || (wiimote.dot3x-wiimote.dot2x>50) || (wiimote.dot3x-wiimote.dot4x>50)){ //dot3 is on the right side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topRightx=wiimote.dot3x
      var.topRightY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomRightx=wiimote.dot3x
      var.bottomRightY=wiimote.dot3y
   }
}else{//dot3 is on the left side
   if ((wiimote.dot3y-wiimote.dot1y>50) || (wiimote.dot3y-wiimote.dot2y>50) || (wiimote.dot3y-wiimote.dot4y>50)){ //dot3 is on the top
      var.topLeftx=wiimote.dot3x
      var.topLeftY=wiimote.dot3y
   }else{//dot3 is on the bottom
      var.bottomLeftx=wiimote.dot3x
      var.bottomLeftY=wiimote.dot3y
   }
}
/***********************************************/
//find dot 4
if ((wiimote.dot4x-wiimote.dot1x>50) || (wiimote.dot4x-wiimote.dot2x>50) || (wiimote.dot4x-wiimote.dot3x>50)){ //dot4 is on the right side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topRightx=wiimote.dot4x
      var.topRightY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomRightx=wiimote.dot4x
      var.bottomRightY=wiimote.dot4y
   }
}else{//dot4 is on the left side
   if ((wiimote.dot4y-wiimote.dot1y>50) || (wiimote.dot4y-wiimote.dot2y>50) || (wiimote.dot4y-wiimote.dot3y>50)){ //dot4 is on the top
      var.topLeftx=wiimote.dot4x
      var.topLeftY=wiimote.dot4y
   }else{//dot4 is on the bottom
      var.bottomLeftx=wiimote.dot4x
      var.bottomLeftY=wiimote.dot4y
   }
}
/***********************************************/
if(wiimote.dot1vis==true && wiimote.dot2vis==true && wiimote.dot3vis==true && wiimote.dot4vis==true){//if all dots are visible
   mouse.CursorPosX=mouse.CursorPosX-(var.currentX-(var.cursorMaxX-var.cursorMaxX*(((var.topLeftX+((var.topRightX-var.topLeftX)/2))-var.xMin)/(var.xMax-var.xMin))))//convert CenterX to pixel ration and set mouse to position
   var.currentX=mouse.CursorPosX
   mouse.CursorPosY=mouse.CursorPosY-(var.currentY-(var.cursorMaxY*(((var.bottomLeftY+((var.topRightY-var.bottomLeftY)/2))-var.yMin)/(var.yMax-var.yMin))))//convert CenterY to pixel ratio and set mouse to position
   var.currentY=mouse.CursorPosY
}
//"panic" button ESCAPE will stop/exit the program if anything goes wrong
if ESCAPE then
   exitpie
end if
/*********************************************************************************************************************************/</p>

As usual, if you have any questions feel free to message me or comment down below!

Step 8: Let's Code! Part 3 - Game Integration - Mouse

Here we go... what you've all been waiting for. This is the part where you get to connect this system to your favorite games such as Fortnite, Rocket League, Overwatch, etc. You may have been thinking, "Why can't I just use the mouse control program from the last step to make my character look around in the games I play?". You could try, but your character would be staring straight no matter how hard you whip your head around. The reason for this is because games like this use a method of mouse movement called 'Direct Input'. That takes the relative position of the mouse rather than the absolute position. In other words you could move your mouse infinitely to one side or the other without being bound by the size of your screen. This step goes through what you need to know to integrate this system with all of your favorite games. Since Direct Input doesn't take mouse position based on pixel ratios, but rather on relative position, I won't be including a calibration step in the code. The only things that need to be adjusted for your use are the sensitivity variables prefaced by the comment 'Sensitivity'. You may need to increase or decrease these values for the best response of the game with the system. We generate a new mouse position based on system movement by taking the current mouse position and adding/subtracting the change in central x or y locations since the last loop of the program.

The following code is for any 4DOF system but can easily be modified for a 6DOF system:

//These variables will hold the IR LED locations
var.leftX=0
var.leftY=0
var.rightX=0
var.rightY=0
//Light up all 4 LEDS on the wiimote so we know the program is running and connected
wiimote.Led1=true
wiimote.Led2=true
wiimote.Led3=true
wiimote.Led4=true
//Sensitivity
var.sX=5
var.sY=5
//find dots
if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the right side
   var.rightX=wiimote.dot1x
   var.rightY=wiimote.dot1y
   var.leftX=wiimote.dot2x
   var.leftY=wiimote.dot2y
}else{//dot1 is on the left side
    var.rightX=wiimote.dot2x
   var.rightY=wiimote.dot2y
   var.leftX=wiimote.dot1x
   var.leftY=wiimote.dot1y
}
if(wiimote.dot1vis==true && wiimote.dot2vis==true){//if both dots are visible
   mouse.DirectInputX=mouse.DirectInputX+(((var.currentRightX+var.currentLeftX)/2)-((var.rightX+var.leftX)/2))*var.sX
   mouse.DirectInputY=mouse.DirectInputY-(((var.currentRightY+var.currentLeftY)/2)-((var.rightY+var.leftY)/2))*var.sY
}
var.currentRightX=var.rightX
var.currentLeftX=var.leftX
var.currentRightY=var.rightY
var.currentLeftY=var.leftY
//"panic" button ESCAPE will stop/exit the program if anything goes wrong
if ESCAPE then
   exitpie
end if

Increased sensitivity values will cause a greater mouse movement relative to user movement and decreased sensitivity values will cause the mouse to move a smaller distance with user movement.

Feel free to message me or comment with any questions.

Step 9: Let's Code! Part 4 - Game Integration - Keyboard

In this section, we're going to learn how to integrate key-presses into our system. For this example, I will be using a game that has camera functions based on key-presses. Let's write a simple program that will make the game Rocket League a bit more immersive. In Rocket League, there are key-binds you can set that will swivel the camera in a particular direction. Let's take control over the camera swivel left and swivel right functions. Now, we don't want the camera to be moving around all the time while we play this game, so we're going to create a program that will make the camera swivel in a particular direction once the user looks at the right or left 10% of the screen. This should enable seamless gameplay where camera integration is used only when we need it. In this program I will also include the calibration loop so that everything is as precise as it can be.

The following code is for any 4DOF system but can easily be modified for a 6DOF system:

//These variables will hold the IR LED locations
var.leftX=0
var.leftY=0
var.rightX=0
var.rightY=0
//Light up all 4 LEDS on the wiimote so we know the program is running and connected
wiimote.Led1=true
wiimote.Led2=true
wiimote.Led3=true
wiimote.Led4=true
//Your Screen Resolution
var.cursorMaxX=1920
var.cursorMaxY=1080
//find the '10% region'
var.minTenX=0.1*var.cursorMaxX
var.maxTenX=0.9*var.cursorMaxX
var.currentX=0
var.currentY=0
//single loop for initial calibration
if var.init=0 then
     var.init=1
     say("Stand central and look at the center of the screen")
     wait 7s
     //dot intensities are recorded
     var.leftSize=wiimote.dot1intensity
     var.rightSize=wiimote.dot2intensity
     say("Look at the left side of the screen for a few seconds")
     wait 5s
     if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the right side
        var.rightX=wiimote.dot1x
        var.leftX=wiimote.dot2x
     }else{//dot1 is on the left side
        var.rightX=wiimote.dot2x
        var.leftX=wiimote.dot1x
     }
     var.xMax=round(var.leftX+abs((var.rightX-var.leftX)/2))//max X value is found by taking the center location of the two points
     say("Look at the right side of the screen for a few seconds")
     wait 5s
     if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the right side
        var.rightX=wiimote.dot1x
        var.leftX=wiimote.dot2x
     }else{//dot1 is on the left side
        var.rightX=wiimote.dot2x
        var.leftX=wiimote.dot1x
     }
     var.xMin=round(var.leftX+abs((var.rightX-var.leftX)/2))//min X value is found by taking the center location of the two points
     say("Look at the bottom of the screen for a few seconds")
     wait 5s
     if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the left side
        var.rightY=wiimote.dot1y
        var.leftY=wiimote.dot2y
     }else{//dot1 is on the left side
        var.rightY=wiimote.dot2y
        var.leftY=wiimote.dot1y
     }
     var.yMax=round((var.rightY+var.leftY)/2)//max Y value is found by taking the center location of the two points
     say("Look at the top of the screen for a few seconds")
     wait 5s
     if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the left side
        var.rightY=wiimote.dot1y
        var.leftY=wiimote.dot2y
     }else{//dot1 is on the left side
        var.rightY=wiimote.dot2y
        var.leftY=wiimote.dot1y
     }
     var.yMin=round((var.rightY+var.leftY)/2)//min X value is found by taking the center location of the two points
     var.centerX=round(var.xMin+((var.xMin+var.xMax)/2))
     var.centerY=round(var.yMin+((var.yMin+var.yMax)/2))
end if
//This part loops infinitely
//find dots
if (wiimote.dot1x>wiimote.dot2x){//dot1 is on the right side
   var.rightX=wiimote.dot1x
   var.rightY=wiimote.dot1y
   var.leftX=wiimote.dot2x
   var.leftY=wiimote.dot2y
}else{//dot1 is on the left side
    var.rightX=wiimote.dot2x
   var.rightY=wiimote.dot2y
   var.leftX=wiimote.dot1x
   var.leftY=wiimote.dot1y
}
if(wiimote.dot1vis==true && wiimote.dot2vis==true){//if both dots are visible
   var.currentX=var.cursorMaxX-var.cursorMaxX*(((var.leftX+((var.rightX-var.leftX)/2))-var.xMin)/(var.xMax-var.xMin))//current x location
   /*var.currentY=var.cursorMaxY*(((var.leftY+((var.rightY-var.leftY)/2))-var.yMin)/(var.yMax-var.yMin))*/ //current y location
}
if (var.currentX>=var.maxTenX){
   keyboard.S=true//keybind for camera swivel right
}else if (var.currentX<=var.minTenX){
   keyboard.A=true//keybind for camera swivel left
}else{//not looking at min or max X
   keyboard.S=false
   keyboard.A=false
}
//"panic" button ESCAPE will stop/exit the program if anything goes wrong
if ESCAPE then
   exitpie
end if

As you can see near the end of the program, if the user's current x location goes within the 10 percent zones (top 10 percent of the right side of the screen or bottom 10 percent of the left side of the screen), the program holds down the corresponding keys. When the zone is exited, the keys are released.

Step 10: Final Thoughts

1. You may have noticed that we saved some variables in the calibration code that were called 'leftSize' and 'rightSize' that were never used. These variables take into account the 'size' (intensity) of the dots and the numbers associated with these variables increase the closer you get to the Wiimote and decrease the father away you get. This could be used as a way to calculated the user's distance from the screen and add another variable to the motion control gaming experience - forward and backward movement. Feel free to mess around with these variables but keep in mind they wont update unless you read/write to the 'leftSize' and 'rightSize' variables in the looping section of the code.

2. GlovePIE has SO many more functionalities in it's language that we have not even brushed on with this project. It's speech recognition abilities, for example, could enable you to add yet another factor to your gaming experience and for those that may have limited mobility and are using the mouse control code, a speech integration to click the mouse or press certain keys might be beneficial.

mouse.LeftButton,mouse.MiddleButton,mouse.RightButton,mouse.XButton1, and mouse.XButton2 all refer to Boolean variables that can be set to either true or false. For example if you wanted to simulate a left click, you could use

mouse.LeftButton=true
wait 0.01s
mouse.LeftButton=false

or a double click would be that function repeated twice with a small wait time after the 'mouse.LeftButton=false'.

3. I have been considering making a system with two angled Wiimote sensors to provide a greater range of movement and extra degrees of freedom. If you would be interested in me posting that here please let me know.

I hope everyone has had an insightful experience with this project whether you decided to build it yourself or just read through this instructable. Any questions, criticisms, or ideas for improvement are welcome either in the comments or via direct message.

-Eric Hill

Share

    Recommendations

    • Optics Contest

      Optics Contest
    • Electronics Tips & Tricks Challenge

      Electronics Tips & Tricks Challenge
    • Audio Contest 2018

      Audio Contest 2018

    6 Discussions

    0
    None
    JoshN68

    7 weeks ago

    Very cool Intstructable! The first thing that came to mind for me was VR/AR position tracking, do you think this system could be modified for such a purpose?

    1 reply
    0
    None
    Eric_HillJoshN68

    Reply 7 weeks ago

    Definitely! This project is mostly geared towards head tracking but could pretty easily be used for full body positional tracking. If that's something you are trying to do feel free to reach out to me if you need any help

    0
    None
    msameer39

    7 weeks ago

    Super awesome idea and project. Definitely Voted

    1 reply
    0
    None
    DrykadJ

    Question 8 weeks ago

    i see its the wiimote attached to the tripod, my question is, why not have the wiimote on your head and sensor bar on tripod/shelf as it originally worked with wii, which could allow the nunchuck to be used for 'mouse buttons'? I believe the nunchuck also has motion ctrls so could even be used for gesture ctrl

    Ive not used the wii setup yet, but have gotten xbox camera working to see a skeletal outline, and leap motion to be able to use hand motion controls, also played with ps3 cam for added movement ctrl or facial recognition.. curious on yours as it could add greater visibility to the program and nunchuck is similar to oculus ctrls so could be simpler than leap motion as far as controller options, plus physical buttons which i had not gotten incorporated yet and was going to need something similar for

    1 more answer
    0
    None
    Eric_HillDrykadJ

    Answer 8 weeks ago

    Originally I did it like this but the Wiimote was bulky and irritating to attach to the user. Also, having the sensor attached to the user allows for a greater degree of movement because the camera on the Wiimote has a very small field of view, so if it was attached to the user and they turned their head more than around 35 degrees, the system would fail. To answer your concern about missing out on the possibility of working with the nunchuck or motion controls, GlovePIE has the ability to connect to multiple Wiimotes, so it is extremely easy to just connect up a second Wiimote if you want to use it as a type of Oculus control.