Apparently, Angry Birds is played for 300 million minutes a day. With that amount of dedication, isn't it about time it became a real sport?!

USB Slingshot¶

To make Angry Birds a real sport, we need real equipment. So the idea for this hack was to build a real slingshot as a USB peripheral to play Angry Birds.

It was inspired as a demo to show off how easy it is becoming to build your own USB devices, thanks to the emergence of ultra-low-cost 32-bit microcontrollers that include USB. There is more about this industry trend and our new mbed NXP LPC11U24 board that we designed to open up these opportunities and enable very productive prototyping of USB devices:

The resulting hack means fusing electronics, microcontrollers, software and, umm..., carpentry!

The Technology¶

The slingshot emulates a USB mouse, so it really is a plug 'n' play. It translates the physical use of the slingshot in to appropriate mouse controls.

With a real slingshot, you tilt the slingshot and stretch sling. The idea to measure these was using:

An accelerometer - this can measure the tilt by tracking the gravity vector (which way is down!)

A rubber stretch sensor - this can be used as the sling, and measure how much it is stretched

That is the input, but to play Angry Birds, you actually click on the bird, then drag to the launch angle and strength you want, then release. This means we have to translate the real slingshot movements in to a series of different mouse movements.

For example, this means translating starting to stretch the slingshot to a mouse to click and hold, whilst the vector of the stretch determined by the angle of sling and how far it is stretched translates to mouse movements relative to where we started. More on the maths later...

Ingredients to build a USB Slingshot¶

The main brain is the new mbed NXP LPC11U24, as that is designed for prototyping USB devices:

It is packaged in a DIP prototyping form-factor, uses the NXP LPC11U24 MCU based on a 32-bit ARM Cortex-M0 core, and includes I2C, SPI, UART and ADC interfaces. It is supported by the mbed online development tools and developer website, mbed C/C++ SDK, and a full set of USB libraries; USB Mouse, Keyboard, HID, Serial, MIDI, MSC and Audio classes, that make reliably creating a new USB device a matter of a few lines of code!

This is great as it makes emulating the mouse nice and easy!

See USBMouse Handbook Page

The rest of the ingredients are:

3-axis Accelerometer Stretch Sensor USB B connector Handcrafted Slingshot

In order to test if the project was possible, a first prototype was made on breadboard.

The hardware is based on the following connections to the mbed NXP LPC11U24:

The accelerometer is connected over SPI to the mbed

The stretch sensor is a resistor as part of a voltage-divider circuit, read on p15 (AnalogIn)

The USB Type B connector is connected to the mbed D+/D- pins, and also provides the power supply to the mbed

Schematics First Prototype

Here is the pinout table:

ADXL345 Signal Name mbed pin Vcc Vout Gnd Gnd SDA p5 SDO p6 SCL p7 CS p8 Stretch sensor mbed pin One extremity Vout The other p15 USB connector mbed pin Vcc Vin Gnd Gnd D+ D+ D- D-

The software to test the feasibility is kept simple; the objective is to observe all different elements of the project working together.

#include "mbed.h" #include "USBMouse.h" #include "ADXL345.h" USBMouse mouse; ADXL345 acc(p5, p6, p7, p8); AnalogIn strength(p15); int main() { //Initialize accelerometer acc.setPowerControl(0x00); acc.setDataFormatControl(0x0B); acc.setDataRate(ADXL345_3200HZ); acc.setPowerControl(0x08); while (1) { int readings[3]; acc.getOutput(readings); // test accelerometer printf("acc: %i, %i, %i\r

", (int16_t)readings[0], (int16_t)readings[1], (int16_t)readings[2]); uint16_t str = strength.read_u16(); // test stretch sensor printf("strength: %d\r

", str); mouse.move(10, 10); // test USB relative mouse wait(0.1); } }

Import programAngryBirdsFeasibility Test Slingshot

The experiments to see that it works:

move the breadboard

pull the stretch sensor

move and pull the stretch sensor at the same time

observe that the mouse is moving on the screen

So we have proven control! Next step is to make it in to a real slinghot!

The Real Slingshot!¶

The slingshot was crafted by Chris Jarratt, from a branch found in Epping Forest, London! This is the structure in to which we embedded all the electronics.

The wiring is exactly the same as the first prototype, just that the mbed will be embedded in to the real slingshot this time.

Diagram A handcrafted slingshot Wires embedded in the slingshot Final slingshot Inside the slingshot with the accelerometer Mbed USB slingshot

Finally, combining all different parts we get our mbed USB Slingshot!

How does it all work ?¶

The first question concerns the USBMouse. The options are an absolute or relative mouse. The answer is quite simple because the mbed doesn't know the absolute position of the bird on the screen, so the natural solution is a relative mouse (like a normal mouse) - position the cursor over the mouse, then the slingshot takes over and moves relative to the starting point based on interpreting the manipulations of the slingshot.

Slingshot Angle¶

The angle of the slingshot is the main thing we need to calculate the direction of the vector to apply to the mouse position.

We simply use the fact that we know gravity is causing a 1G force on the accelerometer, and use that to calculate the angle of the slingshot with some simple trigonometry.

Mouse Movement¶

The mouse position is then calculated based on the vector offset calculated using the angle of the slingshot, and the stretch sensor reading.

Because we send relative movements, we actually calculate the desired position, then work out the difference from where we know we are and send that.

The general idea for how it works for a complete firing comes in a few steps:

WAITING

We start by WAITING, with the cursor over the bird - regardless of how we tilt the slingshot, nothing happens

When we see a strong enough stretch, we consider that the start of AIMING, and click and hold the left mouse button

AIMING

We then continuously calculate a vector based on the angle of the slingshot, and the stretch of the sling

This is translated in to relative mouse movements with some more trigonometry, and the mouse is moved as appropriate

As we are positioning based on a vector but sending relative mouse positions, we keep a note of the accumulated movements so we can send the difference each time

FIRING

We enter FIRING when we see a fast reduction in the sling stretch

At this point we release the mouse button, then return the mouse back to the starting position, ready for the next throw!

The whole code is fairly concise, so here it is in full:

Mouse Setup¶

To use it, simply position the mouse cursor over the bird, and then start using the slingshot!

The cursor is not coming back at the initial position On Windows (and probably on Linux or Mac OS), the cursor is not coming back exactly at the same initial position after a firing. To solve this issue, I modified this: go into the Control Panel

Hardware and Sound

Mouse in the devices and printers section

in the devices and printers section in the pointer options tab, deselect Enhance pointer precision

tab, deselect You can also reduce the cursor speed

In Action¶

Turns out it works! Here it is in action!

So now you can kill pigs with a real USB Slingshot, by combining the two totally different worlds of carpentry and embedded systems!

Hopefully this gives you all the instructions you need to build your own, or any other USB devices you need to design!

Thanks to everyone who helped us to make this possible!

Sparkfun for the Accelerometer

Adafruit for the Stretch Sensor

RS for the USB connector

NXP for the ARM Cortex-M0 MCU used on the mbed NXP LPC1U24

Chris Jarrett for crafting the wooden slingshot

Making the Video¶

Here is a little behind the scenes on how we put together the video one Wednesday afternoon. Not really something we'd done before, so a lot of making it up as we went along :)

Prototype your own USB devices with the new mbed NXP LPC11U24!¶

The LPC11U24 is one of the new ultra-low-cost 32-bit ARM microcontrollers entering the market that open up all sorts of opportunities for building USB devices. The times of requiring in-depth knowledge of the USB protocol, fiddling with complex software stacks and fighting 8 or 16-bit MCUs is over. Or being constrained by USB bridge chips. These chips only cost $1-2 in volume!

Using the mbed tools and the set of USB libraries, prototyping these devices should be really fast too!

For a look at all the USB Device types that work out-of-the-box, take a look at:

/handbook/USBMouse - Emulate a USB Mouse with absolute or relative positioning

/handbook/USBKeyboard - Emulate a USB Keyboard, sending normal and media control keys

/handbook/USBMouseKeyboard - Emulate a USB Keyboard and a USB mouse with absolute or relative positionning

/handbook/USBHID - Communicate over a raw USBHID interface, great for driverless communication with a custom PC program

/handbook/USBMIDI - Send and recieve MIDI messages to control and be controlled by PC music sequencers etc

/handbook/USBSerial - Create a virtual serial port over the USB port. Great to easily communicate with a computer.

/handbook/USBAudio - Create a USBAudio device able to receive audio stream from a computer over USB.

/handbook/USBMSD - Generic class which implements the Mass Storage Device protocol in order to access all kinds of block storage chips

These pages should show how easy it is to prototype low-cost USB devices, so you can concentrate on inventing the applications. Looking forward to seeing what devices you develop!

See also:

The demo was inspired by the emergence of ultra-low-cost 32-bit microcontrollers that include USB, and we wanted to show off how easy it can be to prototype them to take advantage of this trend. For more about this and why we built the new mbed NXP LPC11U24 board, take a look at: