In this Instructable, I will show you how to make your own set of proximity-sensing pocket squares.
I used the following materials per person:
- 1 pocket square (doesn't have to be silk--in fact, a more sturdy material works a little bit better to help retain the shape)
- 4 lights (I used white lilypad LEDs)
- 1 LilyPad Simple Board)
- 1 LiPo Battery
- 1 XBee (Series 1)
- 1 XBee Breakout board (I designed my own XBee Breakout for the LilyPad)
Step 1: Construction
Good work! Now you're done with the construction!
I designed my own XBee Breakout Boards that easily plug into the male header on the LilyPad. You could use the Lilypad XBee Breakout and sew the boards back to back.
Step 2: RSSI Discussion
The Received Signal Strength Indicator (RSSI) is a measurement of power of the incoming packet. This means that as the signal travels further distances. the signal will attenuate and the RSSI value will decrease. This also means that if modules are separated by a barrier (brick wall) or if the incoming packet bounces around (reflections) before hitting the XBee, then the signal will also attenuate and the RSSI value will also decrease. This often leads to noisy and unreliable data. But there is hope. While we probably can't get fine grain detail of distance, we can tease out coarse grain information: "are the modules relatively close or relatively far?"
The attached image shows the RSSI values as a function of angle for the XBee modules with the chip antenna. (For other antenna configurations please see the RF Module Antenna Manual). As you can see, the pattern is highly anisotropic and we should expect that the orientation of the XBees will greatly effect the RSSI value.
I have also contacted Digi and asked if they would send globular data to show the radiation pattern in 3D. I'll post it here when I receive it.
Step 3: XBee Discussion and Configuration
With that said, I chose XBee Series 1 to easily get access to the RSSI data. We will need to use the API mode for the XBee to be able to fully process the RX packet. My XBee settings were:
PAN ID: 3141
DL: 0 (I used the XBee Arduino API to set the value for broadcast mode 0xFFFF)
I have also attached the XCTU profile I used for those wanting to use my exact settings. And if you need help configuring your XBee for API mode please see my other Instructable on this topic.
Step 4: Raw Data
In order to set a threshold for the pocket squares' ability to detect each other, we need to get an idea of what our data looks like and how RSSI values are correlated to distance. I configured 3 modules: A Base Module receiving data and streaming the RSSI value to my computer and two Mobile Modules that can be moved to any location. The first plot shows an example trial run. The two Mobile Modules were started at a distance 2 feet away in the same orientation. At TimeStep 125 Module 2 was moved to a distance of 10 feet, then at TimeStep 300 Module 1 was moved to the same location as Module 2. At TimeStep 480 Modules 1 and 2 were then moved back to their starting locations; however, Module 1 was rotated 180 degrees relative to the orientation of Module 2.
There are a few things I should point out here.
- The RSSI value reported from the XBee increases as the distance increases.
- The data, as expected, is pretty noisy with lots of random peaks.
- Also as expected, orientation can change the RSSI value. Looking at the last hundred TimeSteps of Module 1 we see that there is a 5 point increase compared to the start.
- We can see a difference between modules at 2 feet versus modules at 10 feet. This means we can detect coarse grain distance (at least +/- 5 feet)! Now all we need is the right filter...
Step 5: Filtering Data
The Kalman Filter has been used in loads of applications, from missile guidance systems to cleaning up accelerometer data.
Here are some good examples of Kalman filters and Arduinos:
Accelerometer example: http://www.youtube.com/watch?v=qtFyR1vLH2U
Another Kalman Arduino Example: http://www.starlino.com/imu_kalman_arduino.html
The Keyglove (Please fund!)
Step 6: Kalman Filter
I will also try and explain the filter here.
p = p+q;
k = p / (p + r); (gain)
x = x + k * (rssi_data – x);
p = (1 – k) * p;
x = x_o (best guess)
p = p_o (estimated error)
r = r_o (sensor noise)
q = q_o (process noise) value between 0 and 1
Parameters in bold remain static through the simulation
So how do we choose our parameters? Parameter choice is difficult and often requires lots of massaging. To get some idea of how we should choose q and r, let's look at some extreme behavior:
- If q is much bigger than r, then k =1 and x is just the measured value.
- if r is really small (very very close to 0), then k = 1 and x is just the measured value
Actually, the mathematics/programming can be made even simpler if you assume that the process noise (q) and the sensor noise (r) don't change over time. If you are convinced you have the right parameters, the Kalman Gain (k) will eventually stabilize to a single value. You can pre-calculate what that value is and simplify the filter to:
x = x + k * (rssi_data – x);
For those also interested in Kalman filters used for RSSI data please read: http://www.cs.tut.fi/sgn/arg/heln/Publications/CSCC2001_Helen.pdf
Step 7: Folding Your Pocket Square
- To fold the patch into the pocket square, first lay the square out flat.
- Place the patch upside-down in the upper-right-hand corner of the lower left quadrant, angling it so that the patch points toward the center of the square, with the lights at the top.
- Fold the pocket square in half length-wise, then fold in half again, making a square that is one-quarter of the original size.
- Now rotate this square 45 degrees (so that it looks like a diamond instead of a square) and fold the pointy sides in (like a burrito). The patch should be nestled in the upper half of the burrito.
- Lastly, fold the bottom half of the burrito up to meet the top.
- Turn the pocket square over--now the lights should show through the handkerchief and the folded pocket square should be ready to fit into your pocket! (Blunt side down, pointy side up, lights facing out.)
Step 8: Adding Friends and Code
Lastly, I have attached the code I used for the project. As always, lots of improvements can be made and hopefully I will get around to it tomorrow or the next day.