This project uses the Arduino 101, a battery and an LED strip to make a gesture-controlled Wizard's Walking Staff. We'll define three different light-display "spells" you can summon by moving the staff in one of three gestures.
The code uses the Inertial Measurement Unit in the Arduino 101 to read G-forces, but does not use the Pattern Matching Engine (for an example using the PME, check out Kitty Yeung's PME project). Instead, this code counts quick impulses in the X, Y, and Z directions and summons spells when you perform a certain combination in a short time.
Casting Spells:Two quick vertical taps starts a spell, then you can either move the staff sharply forward, left/right, or tap a third time to select one of the three spells, then a final tap casts the spell.
Visual Feedback:To help you understand where you are in your gesture, the example code includes visual feedback from the LED strip. When you first perform a double-tap, the lights will quickly flash white, telling you that a spell is started. You'll get visual feedback for each step so you know which spell will be selected.
Casting Spells (in detail):Hold the staff with the Arduino 101 facing you. First double-tap the staff (gently!) on the ground, or do two quick vertical pulses in the air. When you see the white flash, move the staff sharply forward or back to select Spell 1, or tilt the staff left or right to select Spell 2, or move vertically a third time to select Spell 3. When a spell is selected, the lights will glow solid green (spell 1,) blue (spell 2) or red (spell 3.) Once the lights are solid, summon the spell with a final vertical tap. The lights will shimmer and flash in the selected color.
Gestures are time sensitive! You have only 1 second between each step in a gesture or the spell will reset. That means if you mess-up or select the wrong spell, you can just wait a second and start over. Accurately summoning spells is a little tricky to master, but the good news is that spells won't be accidentally called when you're just walking around with the staff.
Building the Electronics:This is basically just an Arduino 101, a battery, and a strip of NeoPixel LEDs.
There are several ways to configure power. The quickest would be to use a 9v battery and run the LEDs right off the Arduino 101- but the battery life would be very short. You could also use a LiPo battery to maximize power/weight for a more "pro" build- but you would need a safe way to charge the battery. For me, a good balance between battery life and simplicity is to use 3 AA batteries and a $4 voltage regulator. This is the same electronics setup as in the Shadow Theater and Kaleidoscope Infinity Mirror.
Step 1
Collect the end harness from your LED strip by cutting about 1 cm from the end of the lights. Strip the wire ends.
Step 2
Break apart the bent header pins that came with your voltage regulator, and solder two of them to the ends of the green and yellow wires. This will let you easily plug them into the pins of the Arduino 101.
Step 3
Next solder the red wire to the VIN terminal on the voltage regulator, and solder two straight headers into the GND and VOUT pins as shown.
Step 4
Now connect the barrel jack adapters. First strip the ends of the wires coming from your battery case, then mount them in the terminals of the male barrel jack and tighten with a screwdriver. RED goes to the (+) terminal, BLACK goes to the (-) terminal.
Next connect the female barrel jack adapter onto to the loose wires coming from the beginning of the LED strip. YELLOW goes to the (-) terminal, and RED goes to the (+).
Step 5
Now connect your harness to the Arduino 101. The GREEN wire goes to PIN 6, the YELLOW wire goes to the GND pin near #13. With the two header pins on the voltage regulator, GND goes to GND and VOUT goes to the "VIN" pin on the Arduino 101. Don't get this wrong! Plugging in backwards leads to smells and burns. I know this.
Step 1
With the battery-pack turned off, use a USB cable to connect your Arduino 101 to a computer, and upload the attached example code using the Arduino IDE.
If you've never programmed an Arduino 101 before, there are great instructions on the Arduino website here: https://www.arduino.cc/en/Guide/Arduino101
Once the example code is loaded successfully, you can disconnect the USB, and test the code by turning on the battery pack and trying some of the spell gestures with the USB port on the Arduino 101 facing down, and with the pins facing you. Try moving the board vertically four times to call the Red Spell.
Code Discussion:
(If you just want to use the example-code as-is, you can skip down to Building the Staff.)
The example code uses the shock-detection capability of the Arduino 101 to count shocks, while a timer runs that re-sets the shock count to zero after a short time with no new shocks. If you hit the right combination before the timer expires, a "spell" function is called.
Because a firm tap on the ground will actually register the initial shock plus several "noise" shocks from the vibrations in the staff, the first code in loop is just trying to find a dominant impulse from each batch of shocks, and categorise it simply as vertical, left/right, or front/back. I use a variable called "gesture" to hold each dominant impulse: 1 = vertical impulse, 2 = front/back impulse, 3 = left/right impulse.
Then to track combinations, the code uses a "switch" statement, and moves through it as gestures accumulate. It's sort of like a "choose your own adventure" book, where each step says something like "if the next impulse is left/right, move on to step 2, if the timer has expired, go back to zero."
Spells:
Here's where you can easily change what each spell does. These are currently just running "theater-chase" example code in different colors. You could easily add more, change the colors, or write your own light function here. The first three variables in the theaterChase function are values for red, green, and blue. The last number is the speed (higher number = slower).
/////////////////////////////////////////////////spells//////////////////////
void tapspell() {
///red theatre lights
theaterChase(strip.Color(127, 20, 0), 20);
theaterChase(strip.Color(127, 20, 50), 55);
strip.show();
}
void leftspell() {
theaterChase(strip.Color(0, 0, 100), 20);
theaterChase(strip.Color(0, 30, 120), 75);
strip.show();
}
void forwardspell() {
theaterChase(strip.Color(0, 127, 0), 30);
theaterChase(strip.Color(0, 127, 90), 55);
strip.show();
}
Building the Staff:There is lots of room for creativity here! I'll focus on the basic tech build, but have fun making a unique staff. Light diffusers such as tulle, tissue paper, or a plastic bottle over the LEDs can make very cool light displays!
Step 1: Find a Hiking Stick/Staff
You can use a broomstick, sprinkler pipe, or find a natural stick. Michael's craft stores also sell nice ones. (In the stick section- really.) I like to wrap a section with sports tape to have a clean work area for the electronics, but that's optional.
Put a few rubber-bands on the staff to make it easier to attach things.
Step 2: Place the Arduino 101 on the Staff with the USB Port Down
Use a rubber band to hold the Arduino 101 in place.
Step 3: Using a Rubber Bands to Help at Both Ends, Wrap the LEDs
Step 4: Wrap Sports Tape to Secure the Arduino 101 and Battery Pack
Be sure to leave access to the on/off switch on the battery pack. You want the battery pack secure for jostles / taps, but remember you'll need to change those batteries eventually.
Step 5: Diffuse the LED Lights and Decorate
Comments