Difference between revisions of "Game:Jump Wheel"

From Hackerspace ACKspace
Jump to: navigation, search
m (set project image)
m (added location)
Line 134: Line 134:
 
== done ==
 
== done ==
 
* use descent wiring/connectors on the jump pads (for example: stereo jack plugs, so we can add some leds to the pads)
 
* use descent wiring/connectors on the jump pads (for example: stereo jack plugs, so we can add some leds to the pads)
 +
 +
Location: you can play it on the [[Location::ACKade]] (on the desktop)

Revision as of 15:56, 12 October 2016

Project: Game:Jump Wheel
Featured:
State Completed
Members Lots of participants
GitHub No GitHub project defined. Add your project here.
Description Synchronize your jump with your coop players and beat the record
Picture
JumpWheel.png


synopsis

The game consists of a wheel with four players on it. If a player jumps, the center point of gravity of the wheel changes, and the wheel will turn.

To get a player to jump, a person needs to jump on a special built jump pad.

Lots of participants worked or helped on this; add your name if you were involved.

the software

The on-screen part of the game is written in Javascript using HTML5 and some images from various classic computer games. If a key is pressed, the corresponding player jumps and the wheel will turn. When the wheel crosses the finish, the score is calculated from the time it took to finish.

You can fetch the game files here, extract anywhere but the steam folder and run game.html in chrome or firefox.

the hardware

The human interface part consists of a mechanical part: the jump pads, and an electrical part: the arduino uno. For the jump pad, you'll need some

  • strips/slats of wood
  • two squares of plywood
  • two sheets of conductive tape
  • some wire to solder on to it

For creating the link from jump pad to computer, an arduino uno is programmed as a keyboard interface This allows one to send up to 6 keystrokes at a time (as part of the USB HID class payload)


the firmware

There are actually two parts of firmware

The first part reads some inputs set as pullup. If the contact breaks from ground, the corresponding key down is sent, followed by a key up after 500ms. Here is the snippet:

 // set pin numbers (cheesy, yes, at some point this will change in a for loop, or something similar):
 const int btnPlate[ 4 ] = { 9, 10, 11, 12 };
 boolean btnState[ 4 ]  = { true, true, true, true };
 long btnTime[ 4 ] = { 0, 0, 0, 0 };
 
 // Arduino USB Keyboard HID
 uint8_t keybuf[8] = { 0 };
 
 void setup( )
 {
   
   pinMode(btnPlate[ 0 ], INPUT_PULLUP );
   pinMode(btnPlate[ 1 ], INPUT_PULLUP );
   pinMode(btnPlate[ 2 ], INPUT_PULLUP );
   pinMode(btnPlate[ 3 ], INPUT_PULLUP );
 
   Serial.begin( 9600 );
 }
 
 void loop( )
 {
   handleButton( 0 );
   handleButton( 1 );
   handleButton( 2 );
   handleButton( 3 );
 }
 
 void handleButton( int _button )
 {
   if ( digitalRead( btnPlate[ _button ] ) != btnState[ _button ] )
   {
     btnState[ _button ] = digitalRead( btnPlate[ _button ] );
     if ( btnState[ _button ] && !btnTime[ _button ] )
     {
       // Send keypress, start at index 2, and write keyboard keys '1' and beyond
       keybuf[ 2 + _button ] = 0x1e + _button;
       Serial.write( keybuf, 8 );
 
       btnTime[ _button ] = millis();
     }
   }
 
   if ( btnTime[ _button ] && ( btnTime[ _button ] + 500 < millis() ) )
   {
     keybuf[ 2 + _button ] = 0x00;
     btnTime[ _button ] = 0;
     Serial.write( keybuf, 8 );
   }
 }
 
 void releaseKey() 
 {
     keybuf[0] = 0;
     keybuf[2] = 0;
     Serial.write( keybuf, 8 );
 }

The second part is updating the controller AVR: an Atmega16u2. First, on needs to create the hex file.

  • Download the files from harlequin-tech's arduino-usb github page (either by downloading the firmwares as a zip, or git checkout
  • verify the AVR controller chip; in our case our arduino uno has a ATMEGA16u2
  • Open the makefile and make sure the MCU = set correct (in our case we had to change atmega8u2 into atmega16u2)
  • `make`, and remember the name of the *.hex file
  • You probably want to create an arduino-usbserial hex file for the reversing process as well or you won't be able to program the uno itself via usb

Next, you need to download it into the controller. You can do this in two ways.

using Atmel's FLIP

NOTE: not verified; Prodigity was able to use this method on a windows machine.

To program with Atmel's FLexible In-system Programmer, you'll need java x86 runtimes (jre). This part failed to run properly on xopr's machine.

Download FLIP on the atmel page Follow their instructions, and you'll be able to upload hex files if you reset the controller chip.

using an external programmer

We tested it with Da Syntax's AVRISP2, but we had to make sure which port it uses. After enabling some logging in the arduino IDE, we figured out it was 'usb'.

sudo avrdude -cavrispv2 -pm16u2 -Pusb -Uflash:w:Arduino-keyboard.hex

This command means: program with the AVRISP2 controller, for a processor ATMEGA16U2 via port 'usb' and write the flash with the given hex file.

todo

  • solve contact bounce for pads pulled to ground
  • add extra modes (inverse lines, wsad, arrows, function keys, shift keys)
  • use requestAnimationFrame in the game
  • use v-usb stack on a single AVR to get rid of the arduino (and make it more compact)
  • add velcro to the sides so we can stick them together (and prevents them from sliding around a bit)
  • add mine cart game as well

done

  • use descent wiring/connectors on the jump pads (for example: stereo jack plugs, so we can add some leds to the pads)

Location: you can play it on the ACKade (on the desktop)