Final Project



My thesis is inspired by my personal experiences witnessing and taking care of my mother for years as she has been going through a tedious physical rehabilitation plan after an injury that has made her bedridden. Through the process, I have realized that more so than usual, physical rehabilitation requires constant action. If we where to think of this as an algorithm, time always works against you and deconstructs what you have been working so hard on constructing.

Deconstruction > Construction is a telerehabilitation aid with sculptural qualities that helps outpatients in isolation better cope with and stay consistent with their physical rehabilitation plans.

Conceptually this piece brings up questions about motivation and self-efficacy, how medical devices have traditionally been designed with aesthetics and empathy secondary to functionality, and how that relates to psychology and wellbeing.

When speaking to healthcare practitioners, proper form, time interval and motivation to do the exercises in the first place is the most common problem. Over 18 million people have immobility issues, making them the second largest minority, and almost 40% of people aged over 65 have some sort of immobility issue. This is the fastest growing segment of the American population, expected to double in the year 2050. Most common conditions causing disability: arthritis, rheumatism, stroke and spinal cord injuries. 11,000 people sustain a spinal cord injury every year, and 88% are rehabilitating in the home, and only about half are getting health insurance. So we can evidently see how struggling to rehabilitate in isolation in the home becomes a problem at a greater scale.



Lygia Clark has served as an inspiration in terms of her psychotherapeutic methodologies using art as a vehicle to connect the body and mind.

Thad Starner’s Mobile Music Touch is a step forward in taking advantage of the brains ability to heal quicker through passive haptic feedback in combination with visual queues.

Current telerehabilitation devices are exceedingly focused on screen based interaction and are typically big and aesthetically unpleasing. Moreover, they only tackle one muscle group at a time.

There is a clear lack of telerehabilitation and exercise aids that are small, aesthetically pleasing and can help cater to more than one are of the body. Hence, my prototype below aimed to explore how this one object can be functional in multiple ways. 


This class has provided me to work on my physical computing skills to be able to build the foundation for a product that is able to help with these issues. This semester I have mainly focused on functionality, and below are the results of my final prototype for this phase.

My aim is to bring this prototype to the rehabilitation clinic where my mother currently resides, in order to nail down the functionality and test the experience with my target user over a longer period of time. This would allow me to start next semester by working on form and how I can incorporate more sculptural qualities.

By incorporating an accelerometer, and giving the user visual feedback through LED’s, the user can know how to hold proper form. Moreover, haptic feedback lets the user know if they have done their sets within the right time frame.  This time, vibrations where used only when the user needed to improve (see code below).


– Range of motion exercises using an infrared proximity sensor.

– Arduino Yun to collect data online through socket connections and Mongo DB.

Triple axis accelerometer for tracking the form and giving the user visual feedback.

– Vibration motor and LED’s for output.

Qi charger and receiver for wireless charging with a Lipo charger and 3.7V 1200 mAh battery.

I saw this as an exercise in 3D modeling, and tried several different designs in different programs before landing on my final simplified version. As expected, 3D printing is a tedious process, and I learnt a lot in terms of how to fabricate with the right thickness as well as which software to use. I found Maya to be an awful program to work with, and finally settled on Blender. I am happy I went through all this as I plan to add kinetic movement in my design next semester, and will probably need smaller custom parts printed.

Screen Shot 2014-11-28 at 5.06.11 PM


Screen Shot 2014-12-12 at 4.07.21 PM

I soldered all the connections on to a shield for stability. I would have made my own circuit, but needed to use the Arduino Yun anyway for the online connection.

Screen Shot 2014-12-12 at 4.06.25 PM

If you ever decide to get this wireless Qi receiver, be very careful as you solder the wires as it is extremely fragile. Below, you can see how one of the plates fell off when moving the wires a bit, probably because of a little too much heat.

Screen Shot 2014-12-12 at 4.12.34 PM

In order to test if the weight would fluctuate with the use of angular momentum, precise measurements where crucial. I had to take several trips to the metal shop and use some new tools to polish the surfaces for a flat measuring area and balanced surface.

Screen Shot 2014-12-12 at 4.07.00 PM

Screen Shot 2014-12-12 at 4.06.43 PM

Below I am pushing the data to the server through socket connections with node.js.

Screen Shot 2014-12-12 at 3.20.08 AM


Arduino Code:

#include <Bridge.h>
#include <YunClient.h>

YunClient client;
float distance;

#define SERVER_PORT 5000

unsigned long postingInterval = 50; //delay between server updates
unsigned long lastPost = 0; // when you last made a request
unsigned long currTime = 0; //what time is it right now

String incomingDataString = “”; //this will hold raw incoming data string
boolean serverResponded = false;

// Accelorometer
const int groundpin = 18; // analog input pin 4 — ground
const int powerpin = 19; // analog input pin 5 — voltage
const int xpin = A3; // x-axis of the accelerometer
const int ypin = A2; // y-axis
const int zpin = A1; // z-axis (only on 3-axis models)
int yVal = 0;

//Distance sensor
int IRpin = A4;
int IRVal = 0;

//Vib Motor
int vibration = 11;

int ledPin = 9;
int ledPin2 = 10;
int ledPin4 = 6;
int ledPin6 = 5;

int counter = 0;
int timer;
int startTime;
int endTime;
int trainTime;

//Data sent only if true
bool sent = false;
bool sentRom = false;

bool UPcurl = false;
bool DOWNcurl = false;

void setup() {
pinMode(vibration, OUTPUT);
pinMode(groundpin, OUTPUT);
pinMode(powerpin, OUTPUT);
digitalWrite(groundpin, LOW);
digitalWrite(powerpin, HIGH);
pinMode(ledPin, OUTPUT);



int count = 0;
int upCurl = 0;
int rom = 0;

void loop() {

Console.print(“yVal: “);
Console.print(“distance: “);
yVal = analogRead(ypin);

if (yVal > 490) {
DOWNcurl = true;
} else
DOWNcurl = false;

if (yVal < 360) {
upCurl = 1;
UPcurl = true;
if (client.connected() && sent == false) {
sent = true;

} else {
upCurl = 0;

UPcurl = false;
sent = false;

if (UPcurl == true) {
if (counter == 0) {
startTime = millis();

counter = counter + 1;

if (counter > 9) {
counter = 0;
analogWrite(ledPin, 255);
analogWrite(ledPin2, 255);
analogWrite(ledPin4, 255);
analogWrite(ledPin6, 255);
analogWrite(ledPin, 0);
analogWrite(ledPin2, 0);
analogWrite(ledPin4, 0);
analogWrite(ledPin6, 0);

if (DOWNcurl == true) {
analogWrite(ledPin, 255);
analogWrite(ledPin2, 255);
analogWrite(ledPin4, 255);
analogWrite(ledPin6, 255);
analogWrite(ledPin, 0);
analogWrite(ledPin2, 0);
analogWrite(ledPin4, 0);
analogWrite(ledPin6, 0);

// Distance calculation
float volts = analogRead(IRpin) * 0.0048828125;
distance = 65 * pow(volts, -1.10);

if (distance > 25 && distance < 35) {
rom = 1;
if (client.connected() && sentRom == false) {
sentRom = true;
if (counter == 0) {
startTime = millis();
counter = counter + 1;

analogWrite(ledPin, 255);
analogWrite(ledPin2, 255);
analogWrite(ledPin4, 255);
analogWrite(ledPin6, 255);

} else {
rom = 0;
sentRom = false;

analogWrite(ledPin, 0);
analogWrite(ledPin2, 0);
analogWrite(ledPin4, 0);
analogWrite(ledPin6, 0);

//check if it’s time to post an update to the server
currTime = millis();

if (currTime – lastPost >= postingInterval) {
if (client.connected()) {
String data = String(upCurl) + “,” + String(rom) + “\n”;
} else {
//no connection, try to make one again:
Console.println(“\nattempting to connect to server”);
delay(2000); //delay 2 seconds before trying another server reconnect
lastPost = currTime;

if (serverResponded) {
Console.print(“received from server: “);
incomingDataString = “”; //clear out our data string for next server message
serverResponded = false; //start this at false after server request

void motor(int valueLong) {
digitalWrite(vibration, HIGH);
digitalWrite(vibration, LOW);

void analyze() {
endTime = millis();
trainTime = endTime – startTime;

if (trainTime <= 13000) {

if (trainTime > 25000) {


For the future, I plan to build a communication platform that can be used with physical therapists in order to facilitate the monitoring of progress with patients. This platform will also be used to calibrate the device. First steps include pushing the data online, which I have done here.

One of the ways in which more functionality could be added was to use angular momentum in order to fluctuate the weight. However, this is much more difficult in practice than in theory. After have done multiple tests, I realized that in order to make the resistance high enough, you will need a strong and quick stop. This is difficult to achieve without custom high quality mechanics, as the nature of stopping such a strong force needs an even stronger resistance. The example below is a good demonstration of this.

Moreover, the vibrations that built up was difficult to control, even though I measured it as precise as I could, and built a custom holding. In order to minimize the friction and get as little resistance as possible (and so also vibration) you would need to use custom spring loaded ball bearings. Using angular momentum to fluctuate a weight is theoretically possible, but not with the resources we have here at school – unfortunately. Nevertheless, this could serve as a proof of concept for further explorations, and has been a good learning experience.

Leave a Reply

Your email address will not be published.