Narrative
This project uses 7 pressure sensors in strategic locations in a shoe to visually display the pressure distribution someone puts on their feet. The pressure is displayed using corresponding LEDs to map out the color based on the amount of pressure. Also, if the correct pressure distribution is reached, then a green LED lights up.
Process
I am someone who has very bad walking habits. Ever since I was a kid, I knew I had wrong pressure distribution when walking, which caused my knees to grow at a wrong angle. To fix that, I need to constantly remind myself to fix the way I walk. This device is designed to help me do that. It visually displays the pressure distribution, plus tells me when I am putting the right amount of pressure.
Based on extensive research on the topic, I started sketching ideas on different important pressure points, and how to correctly distribute weight on a foot.
After research and ideation, I decided the best way to go about making this it to simultaneously work on two components separately, and then join them once they are complete. The two components are the inputs, which are the pressure sensors, and the outputs which is their corresponding LEDs.
PART 1: Getting the pressure sensors to work and map the right colors on the LEDs
PART 2: transferring the sensors and making the shoe
The biggest issues I faced in this part was the fact that I was working with so many sensors and so some of them would shift out of place and disconnect, specifically, the ones higher up in the shoe.
Part 3: building the LED housing
PART 4: making the anklet and combining the LEDs and the pressure sensor
Since this device involves a lot of user movement, I thought an anklet would be the best approach. I wanted to make the anklet as small and least intrusive as possible, so I used a flex soldering board.
BIG MISTAKE!! The flex board was so flimsy and kept breaking and ripping. I kept having to fix it by soldering and re-soldering the connections on the board. At some point, I realized it would take more times to fix the flex board than to just start over with a new, more rigid board. I figured the anklet can grow a bit bigger if it meant the device worked more reliably. And so, I started over….
Alas! The anklet is complete, rigid, and the device works well.
Discussion
During the final presentation, one of the sensors disconnected and was not working. Moving forward, I want to figure out a way to connect the sensors more securely. Because of its flimsiness and flexibility, and just the fact that it’s placed in a shoe, soldering then taping the wires in place, still wasn’t a strong enough solution to prevent the sensors from disconnecting. The issue is the pins on the sensors are very small and close together, so there’s minimal area to work with. A suggestion given:
“The only electrical wiring that really needed to happen down at the foot level was tying the ground to one side of each of the sensors; the other side could simply take one of the wires up to the main junction board. Centralizing your wiring in this way is usually a good idea! “-RZ (instructor)
I think that is a good idea! I aimed to do that but because the sensors needed more connections than the LEDs (which only needed 2 connections to the arduino), I thought it would be easier to have the ardiuno near the FSRs. But definitely if I were to take the project further I would want to centralize everything one main box, and get rid of the ankle piece. Another suggestion giving during the final crit was:
“The shoe you are using is a Nike Free 4.0 which is very soft and flexible. Maybe you should use a flatter surface underneath the sensors to help read the pressure better.” -RG (classmate)
That is a very valid suggestion, and if implemented I think the sensors might read a bit better– but I wonder if it would make the shoe less comfortable? I think the bigger issue was not that the sensors were not reading well, but more that because of movement the sensors kept disconnecting. So maybe figuring out how to make the sensors stay in place is the direction to go. Also, this shoe was the only shoe I had to work with at the time.
When reflecting on the project, I find myself wondering if 7 sensors was too much? But also, I can’t see the device working the way it is supposed to if I had used any less sensors, because it is about the distribution of pressure and those 7 zones are distinctly separate.
Adding to that, a small bump I ran into was that when I did the calculation, I needed a 9V battery. That voltage was working at first, but then when I moved the components to their respective housings, the arduino was only getting 3.6V and the LEDs were getting 3.3V. I’m guessing the rest of the voltage was lost to time and/or distance. So I needed to add 6 more volts of batteries. Please refer to the schematic for details. Basically, I had to split the power supply to 9V to the FSRs and 6V to the LEDs. I am still new to circuit building and electronics, but I learned a lot when making this project because of all the troubleshooting that needed to be done.
All in all, I like my new device and have already used it a handful of times when walking around. It has definitely made me more aware of the pressure distribution I put on my feet. I still haven’t been able to get the “Good Job!” light to turn on, but hopefully, one day, my walking will be better and I will be able to get that correct pressure distribution. I can already see and feel my walking getting better.
Schematic
Code
/* * Walk the Walk * by Ghalya Alsanea (galsanea) * * This project uses 7 pressure sensors in strategic locations in a shoe to visually display the pressure distribution someone puts on their feet. * The pressure is displayed using coresponding LEDs to map out the color based on the amount of pressure. * Also, if the right pressure is reached, then a green LED lights up. * * * Parts of this code is adopted from https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use */ #include <Adafruit_NeoPixel.h> int PRESSPIN1 = A0; int PRESSPIN2 = A1; int PRESSPIN3 = A2; int PRESSPIN4 = A3; int PRESSPIN5 = A4; int PRESSPIN6 = A5; int PRESSPIN7 = A6; int PIN = 10; int LED = 2; int raw; int n; int red; int green; int blue; // Parameter 1 = number of pixels in strip // Parameter 2 = pin number (most are valid) // Parameter 3 = pixel type flags, add together as needed: // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) Adafruit_NeoPixel strip = Adafruit_NeoPixel(7, PIN, NEO_RGB + NEO_KHZ800); void setup() { Serial.begin (9600); strip.begin(); strip.show(); // Initialize all pixels to 'off' } void loop() { // MEASUREMENT int pressVal1 = analogRead(PRESSPIN1); int pressVal2 = analogRead(PRESSPIN2); int pressVal3 = analogRead(PRESSPIN3); int pressVal4 = analogRead(PRESSPIN4); int pressVal5 = analogRead(PRESSPIN5); int pressVal6 = analogRead(PRESSPIN6); int pressVal7 = analogRead(PRESSPIN7); //print sensor values for troubleshooting Serial.print ("SENSORS: ("); Serial.print (pressVal1); Serial.print (", "); Serial.print (pressVal2); Serial.print (", "); Serial.print (pressVal3); Serial.print (", "); Serial.print (pressVal4); Serial.print (", "); Serial.print (pressVal5); Serial.print (", "); Serial.print (pressVal6); Serial.print (", "); Serial.print (pressVal7); Serial.println (")"); //Set each measurement to it's corresponding LED if (pressVal1 > 0){ raw = pressVal1; n = 0; COLOR (); pressVal1 = 0; //exit the loop } if (pressVal2 > 0){ raw = pressVal2; n = 1; COLOR (); pressVal2 = 0; //exit the loop } if (pressVal3 > 0){ raw = pressVal3; n = 2; COLOR (); pressVal3 = 0; //exit the loop } if (pressVal4 > 0){ raw = pressVal4; n = 3; COLOR (); pressVal4 = 0; //exit the loop } if (pressVal5 > 0){ raw = pressVal5; n = 4; COLOR (); pressVal5 = 0; //exit the loop } if (pressVal6 > 0){ raw = pressVal6; n = 5; COLOR (); pressVal6 = 0; //exit the loop } if (pressVal7 > 0){ raw = pressVal7; n = 6; COLOR (); pressVal7 = 0; //exit the loop } //if you're putting the right amount of pressure, a green light comes on. //pressure values are estimates based on healthy pedobarography scans studies. if (200<pressVal1<700 && 400<pressVal2<600 && pressVal3>800 && 200<pressVal4<400 && pressVal5<100 && 100<pressVal6<300 && pressVal7>700){ digitalWrite(LED, HIGH); } } void COLOR(){ //This function is to calculate which RGB values to use, based on the pressure sensors. //The gradient range is from blue to green to red, with red being the most pressure. // 20 is most blue, 600 is no blue anymore int blue = map(raw, 20, 600, 255, 0); // note the mapping is reversed because blue decreases as pressure increases blue = constrain(blue, 0, 255); // keep the values within limits, just in case the math is wrong // green is max at 800 and less in both directions int green = 255 - abs(raw - 800); green = constrain(green, 0, 255); // keep the values within limits // red increases from 950 to max. int red = map(raw, 950, 1023, 0, 255); red = constrain(red, 0, 255); // keep the values within limits strip.setPixelColor(n, red, green, blue); //set the color strip.show (); //display that color //print RGB value Serial.print ("RGB = "); Serial.print (red); Serial.print (", "); Serial.print (green); Serial.print (", "); Serial.println (blue); }
Leave a Reply
You must be logged in to post a comment.