Wheelchair Alert
by the Chrysanthemums, Final Documentation
Kenneth, Niki, Lenora
by the Chrysanthemums, Final Documentation
Kenneth, Niki, Lenora
Introduction
For our final project, we were tasked with attempting to create an assistive device for the residents at Achieva group home. We started this process with a site visit to Achieva, where we interviewed our client, Maura about her needs and interests. As a wheelchair user, she explained to us that she often has trouble with corners and narrow hallways, so we attempted to come up with an alert system with a visual display that could attach to her wheelchair and tell her if she was too close to the wall or an object.
Our final design is a control panel that indicates the proximity of three directions with light. It is wired to three distance sensors that are placed in the front, left, and right of the wheel chair. The main device fits under the wheelchair's arm rest, and it is secured with velcro.
What We Built
This project consists of 3 boxes which attach to the wheel of Maura's wheelchair, on the front, left, and right, that detect how close she is to objects nearby. It also has a larger "control panel" which contains 3 lights at the top, left and right, corresponding to the sensors on her wheels. If she's about to hit something, the lights would be red. If she is close but has some time, the light would be yellow. If she is a good distance away, the light would be green. All of these elements are connected by coiled wire that resembles telephone cable, which can be detached easily.
A side view of our device with the velcro straps looped through the front, which is intended to strap to our client's armrest on her mobile chair.
A side view of our device without the velcro straps.
A front view of our device, from the perspective of what our client would see when the device is strapped below her armrest.
A back view of our device: the top half of the device houses our Arduino microcontroller and the wires, while the bottom half houses the battery pack holder.
The video demonstrates the functionality of our device, where the distance of an object to the user (detected by a laser distance sensor) will cause different LED colors to be triggered. As the hand (the object) approaches the distance sensor (housed inside the small black box), the corresponding LED Neopixel changes color according to the proximity of the hand to the sensor. Green indicates a far, "safe", distance, yellow indicates a medium, "warning" distance, and finally red indicates a close, "danger", distance.
Maura is navigating through her home in her wheelchair. When she reaches a narrow hallway, the lights attached to the armrest on the chair turn on, giving her clear feedback about how close she is on each side. As she rounds the corner, the light on the right begins to turn yellow, indicating a possible collision. Maura Is able to adjust the angle, and does not hit the baseboards with her wheels.
Later in the day, there's an object near the ground In front of her that she cannot see. The top LED turns red, alerting maura that she may hit her feet. At the same time, the left LED turns yellow. She is able to stop, adjust where she's driving, and avoid any collisions.
How We Got Here: Prototype
Prior to the Prototype, we had a few main questions that we needed to answer. Our first priority was to ideate the physical and mechanical logistics of wiring the device and attaching it to the chair. Secondarily, we wanted to figure out what distances would work best for the alert range, as well as experimenting with a few different types of warnings/alerts, to see what worked best for Maura and her home. We ended up with a hybrid of a "Feels Like" and "Looks Like" prototype, with a mostly functional breadboard representation of the electronics, with working distance sensors and LEDs, and a cardboard representation of the physical form for attaching to the chair.
Our electrical prototype consisted of 3 individual breadboards, each containing 1 distance sensor, 1 LED, 1 buzzer, and 1 arduino. The integration that connected all 3 sensors together came later in the process. Our physical prototype consisted of 1 cardboard box with markings to represent the control module on her armrest.
Testing prototype fit with the arm rest.
Our prototype was too big to fit under the armrest. We also used this model to gain a better understanding of how Maura views the light orientations.
We put our arduino prototype on the wheel chair to see what are the distances at which Maura feels it is too close and normal.
This video demonstrates us testing our electronic prototype by positioning the breadboard (with our electronics) to test the distances that our client feels as "far" (green), "normal" (yellow), and "too close" (red). The color of the LED changes accordingly to this set distance as we move a cardboard wall as an object.
The main questions that we sought to answer, and our findings:
How should we attach the device to Maura's chair?
1a. We came to prototype day with cardboard mockups of the devices that could be informally attached to her chair, to get a better sense of how to attach our device to her chair. Kenneth was interested in doing the physical design of the device, and after looking at her chair in greater detail and taking more precise measurements of each component, he came up with a plan to use velcro that would reduce the risk of damaging the chair. This is also when we decided on where the control should be attached, which you can see in the images above.
How can we connect each Individual component (the three sensors and the control module) In a way that doesn't Interfere with the mobility of the chair or create a tripping hazard?
2a. While we had initially intended to use wireless communication, when we discovered that each wireless chip would require it's own battery power this became pretty pointless. A lot of our time during the prototyping critique was dedicated towards measuring the distance between each one, and thinking about different types of cords. While we didn't completely solve this problem during the visit, this pointed us towards the telephone cord that we ended up using (for better or for worse). We also thought a bit about how it would be powered, like the logistics of changing batteries and the right battery to use for this project.
What distances are ideal for the distance sensors?
2a. We weren't entirely sure what range the sensors needed to operate within. We achieved this by holding cardboard up to Maura and asking her what distances felt comfortable and what the range should be for the sensors. In a perfect world, we would have gone back to her home and taken proper measurements, but this was a good solution in the absence of that.
What kind of alert system would work best for Maura and her caregivers?
3a. We had initially intended to have an audio component as well, but Maura clearly found the pitch of the buzzer annoying, so taking that feedback into account we decided to cut that element. While Maura requested the sound be dogs barking instead, our team ran into a lot of technical issues with our Arduino so we decided to let that element go early on.
One of the hardest parts of the physical fabrication process was soldering the wires to the pins of the jacks due to the pins being positioned very closely together. Due to the proximity of the pins, the soldered connection was often fragile and weak so we later re-soldered these two components together with heat shrink before assembly. This allowed the soldered connection to be stronger and minimized the chance of loose wire hairs from escaping.
One notable constraint we dealt with during fabrication and assembly was space, as we only had a small compartment of space to fit the Arduino, the LED Neopixels, and wires from the jack. So we tried to solder the components in an organized fashion and adjust the length of our wires to minimize the space used.
First fitting test
Spray painted parts
After a few iterations of 3D printing out the components of our device, we made sure to check the fitting of the back plate so the two components fit together seamlessly.
Initially the component that housed our laser distance sensor was smaller than the one pictured above since we initially thought that we would not need much space due to the box just housing the reciebver jack and the sensor. However we decided to expand the space inside to make sure our components fit without the space being too cramped and also allowing the wires some slack.
Initially we were doing pretty well at sticking to the schedule. The software was "finished" pretty early on, but it's unclear if there was an error we never found that caused all of our Issues later on. Either way, the software uploaded and ran correctly by 4/11, on schedule. Similarly, the final form was working on schedule. We had a couple delays due to errors in the print, but we had moved on to integration by Wednesday. on schedule. I think electronics fabrication and Integration are where we got stuck, as we obviously were not able to get the final product to work once we attached the telephone cables. We really stalled out on this one issue, and spent the entirety of our allotted integration time trying to sort out the problem.
In conclusion, this project was obviously not as successful as we had intended it to be. Despite redoing all of the soldering last minute after we weren't able to get the first iteration working, we were never able to get the project to work consistently, and it stopped working entirely a few days before the critique. While initially our issues seemed to be physical wires crossing circuits on the tiny telephone jacks, the device continued to not work even once we resolved that. I'm not sure if there was a short circuit somewhere we didn't catch, or if Arduino just simply didn't like us, but all of our computers stopped being able to upload code to the Arduino micro almost a full week before the final critique, even while using fresh one with nothing connected to it. This was completely over our heads to solve, and we just weren't able to cross the finish line with it.
There are a few things we could have done differently that might have made this project more successful. If we'd arrived at the telephone cable solution earlier, we would have had more time to troubleshoot the issues with them, and perhaps time to pivot to a different type of connection that would be easier to manage. Most obviously, we could have avoided using the telephone jacks at all, and used a more human soldering-friendly connector. Unfortunately, when we realized how difficult they were to solder, the physical print was done and it was too late to redesign.
That being said, there was a lot of really great feedback we got from the critique. Almost every guest drew a comparison between car backup sensors and the device we had tried to make. The feedback was limited to the physical design due to the device not working, but many complemented the sleekness of the design and the type of finish used with the paint. Further, many quite liked and complimented our choice in the telephone cables as a choice that is "inexpensive and user-friendly". While only one person completed written feedback, they echoed the compliments on physical design, stating "The 3D printing and surface finishing looked really great." That being said they wondered about the number of LED's, stating "I think having more precision on the output side (maybe 3 LEDs instead of one to indicate if something is in the way directly to the right side or more of a wide turn is needed?)" This is a totally reasonable suggestion, but without actually seeing the device in operation it's hard to know if that would be useful for Maura.
We learned a lot from working with Maura. Independence is clearly really important to her, and it was a big goal of hers that we use this project to expand that independence as much as possible. Going into the project, the physical design was not necessarily our priority, but when it ended up being the only part of our project that we could show, we realized how important it actually was. Many of her caregivers commented on how important personal style and expression is for Maura, and having a device custom made for her gave her a lot of control over color, shape, etc which is often not an option for assistive devices that are mostly utilitarian. It's unfortunate that we let her down and we'ren't able to get the final device working, but she taught us a lot about creating a product like this.
/*
Project 3: Wheelchair Alert
60-223 Intro to Physical Computing
Description: An assistive device designed to alert a wheelchair user if
their chair is too close to an obstacle. This device has 3 distance sensors
at the front, left, and right of the chair, as well as live LED feedback for
the proximity of the chair.
Pin mapping:
Arduino pin | role | description
-------------------------------------
SDA (2) input
SCL (3) input
5 input XStop Sensor 1
6 input XStop Sensor 2
7 input XStop Sensor 3
15 output LED's
Code by Kenneth Yu, Lenora Gant, Niki Wang
*/
#include "Adafruit_VL53L0X.h"
#include <PololuLedStrip.h>
//change addresses of each distance sensor so they don't interfere
#define LOX1_ADDRESS 0x30
#define LOX2_ADDRESS 0x31
#define LOX3_ADDRESS 0x32
// set the pins to shutdown
#define SHT_LOX1 5
#define SHT_LOX2 6
#define SHT_LOX3 7
// objects for the vl53l0x
Adafruit_VL53L0X lox1 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox2 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox3 = Adafruit_VL53L0X();
// this holds the measurement
VL53L0X_RangingMeasurementData_t measure1; //right
VL53L0X_RangingMeasurementData_t measure2; //left
VL53L0X_RangingMeasurementData_t measure3; //center
const int LEDSTRIPPIN = 15; // pin to connect strip to
const int NUMLEDS = 3; // number of LEDs in the strip
const int CLOSEDISTANCE = 150; // close distance turns RED
const int MIDDISTANCE = 500; // mid distance turns YELLOW
const int FARDISTANCE = 1000; // far distance turns GREEN
const int minFreq = 100; // Minimum frequency in Hz
const int maxFreq = 2000; // Maximum frequency in Hz
const int RIGHTLED = 0;
const int LEFTLED = 1;
const int CENTERLED = 2;
int distance1, distance2, distance3;
// Create an ledStrip object and specify the pin it will use.
PololuLedStrip<LEDSTRIPPIN> ledStrip;
// Create an array for holding the colors (3 bytes per color).
rgb_color colors[NUMLEDS];
rgb_color black = rgb_color(0, 0, 0);
rgb_color red = rgb_color(255, 0, 0);
rgb_color orange = rgb_color(255, 75, 0);
rgb_color green = rgb_color(0, 255, 0);
/*
Reset all sensors by setting all of their XSHUT pins low for delay(10), then set all XSHUT high to bring out of reset
Keep sensor #1 awake by keeping XSHUT pin high
Put all other sensors into shutdown by pulling XSHUT pins low
Initialize sensor #1 with lox.begin(new_i2c_address) Pick any number but 0x29 and it must be under 0x7F. Going with 0x30 to 0x3F is probably OK.
Keep sensor #1 awake, and now bring sensor #2 out of reset by setting its XSHUT pin high.
Initialize sensor #2 with lox.begin(new_i2c_address) Pick any number but 0x29 and whatever you set the first sensor to
*/
void setID() {
// all reset
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);
digitalWrite(SHT_LOX3, LOW);
delay(10);
// all unreset
digitalWrite(SHT_LOX1, HIGH);
digitalWrite(SHT_LOX2, HIGH);
digitalWrite(SHT_LOX3, HIGH);
delay(10);
// activating LOX1 and resetting LOX2/3
digitalWrite(SHT_LOX1, HIGH);
digitalWrite(SHT_LOX2, LOW);
digitalWrite(SHT_LOX3, LOW);
// initing LOX1
if (!lox1.begin(LOX1_ADDRESS)) {
Serial.println(F("Failed to boot first VL53L0X"));
return;
;
}
delay(10);
// activating LOX2
digitalWrite(SHT_LOX2, HIGH);
delay(10);
//initing LOX2
if (!lox2.begin(LOX2_ADDRESS)) {
Serial.println(F("Failed to boot second VL53L0X"));
while (1)
;
}
// activating LOX3
digitalWrite(SHT_LOX3, HIGH);
delay(10);
//initing LOX3
if (!lox3.begin(LOX3_ADDRESS)) {
Serial.println(F("Failed to boot third VL53L0X"));
while (1)
;
}
}
void setup() {
Serial.begin(115200);
// wait until serial port opens for native USB devices
while (!Serial) { delay(1); }
pinMode(SHT_LOX1, OUTPUT);
pinMode(SHT_LOX2, OUTPUT);
pinMode(SHT_LOX3, OUTPUT);
Serial.println(F("Shutdown pins inited..."));
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);
digitalWrite(SHT_LOX3, LOW);
Serial.println(F("Both in reset mode...(pins are low)"));
Serial.println(F("Starting..."));
setID();
}
void loop() {
ledStrip.write(colors, NUMLEDS);
lox1.rangingTest(&measure1, false); // pass in 'true' to get debug data printout!
lox2.rangingTest(&measure2, false); // pass in 'true' to get debug data printout!
lox3.rangingTest(&measure3, false); // pass in 'true' to get debug data printout!
//distance sensor 1
if (measure1.RangeStatus != 4) {
distance1 = measure1.RangeMilliMeter;
if (distance1 <= CLOSEDISTANCE) {
colors[RIGHTLED] = red;
ledStrip.write(colors, NUMLEDS);
} else if (distance1 <= MIDDISTANCE) {
colors[RIGHTLED] = orange;
ledStrip.write(colors, NUMLEDS);
} else if (distance1 <= FARDISTANCE) {
colors[RIGHTLED] = green;
ledStrip.write(colors, NUMLEDS);
} else {
colors[RIGHTLED] = black;
ledStrip.write(colors, NUMLEDS);
}
}
//distance sensor 2
if (measure2.RangeStatus != 4) {
distance2 = measure2.RangeMilliMeter;
if (distance2 <= CLOSEDISTANCE) {
colors[LEFTLED] = red;
ledStrip.write(colors, NUMLEDS);
} else if (distance2 <= MIDDISTANCE) {
colors[LEFTLED] = orange;
ledStrip.write(colors, NUMLEDS);
} else if (distance2 <= FARDISTANCE) {
colors[LEFTLED] = green;
ledStrip.write(colors, NUMLEDS);
} else {
colors[LEFTLED] = black;
ledStrip.write(colors, NUMLEDS);
}
}
//distance sensor 3
if (measure3.RangeStatus != 4) {
distance3 = measure3.RangeMilliMeter;
if (distance3 <= CLOSEDISTANCE) {
colors[CENTERLED] = red;
ledStrip.write(colors, NUMLEDS);
} else if (distance3 <= MIDDISTANCE) {
colors[CENTERLED] = orange;
ledStrip.write(colors, NUMLEDS);
} else if (distance3 <= FARDISTANCE) {
colors[CENTERLED] = green;
ledStrip.write(colors, NUMLEDS);
} else {
colors[CENTERLED] = black;
ledStrip.write(colors, NUMLEDS);
}
}
Serial.print("1: ");
Serial.print(distance1);
Serial.print(", 2: ");
Serial.print(distance2);
Serial.print(", 3: ");
Serial.println(distance3);
delay(50);
}