The SmartExoArm is an exoskeleton that help users support approximately 40 pounds of extra weights. I led the team in fall 2024 to develop this project and competed in NYU's Prototyping Fund, which gives support to engineers who have innovative projects.
Unlike bulky prototypes or prohibitively expensive EMS suits currently dominating the market, like
our exoskeleton is designed to be:
Lightweight and Comfortable: Allows natural arm movement without resistance, engaging only when support is needed.
Intelligent and Adaptive: Senses muscle activity to provide support during lifting or lowering, reducing fatigue and ensuring smooth movements.
Versatile and Multi-Purpose: Suitable for medical applications, sports performance, and even stylish integration into daily life.
In order to have light weight structure, we need to have a small yet strong server motor. We bought a high torque 350kg/cm motor as shown:
350kg/cm can be calculated into a approximately 31 pounds of weights carried from a person's hand (with assumption that a person's lower arm is like 40 cm long. This motor is 15 cm in length, which can be easily stored on the upper arm.
Now, we have the motor, we want to achieve the second speficiation, which is free arm movement when power is not needed. In other word, the bulky structure we see before has the property where a person's arm is fixed onto the motor, and when motor move, their arms move, and when motor stop, their arm is fixed there. However, for ours, we hope to let person's arm freely swing around if they do not intent to use power.
Our first intuitive idea was to use a differential as shown:
Differentail was primarily used to facilitate turning vehicles where two wheels has different velocities. But it can also fit our purpose as it has the property that when the driver side turns, the other side turns, and when the other side turns, the driver side stay still.
However, the result is not what we expected, as we need to adjust the gear size ratio to fit our purpose. Therefore, we turn to something better controlled, which is a electrical clutch.
For a clutch, the two ends are disconnected. However when we connect voltage source to the two wires and current pass through, two sides will stick together. Moving one end also moves the other end.
Now we have dealt with free arm-movement, how can we make sure the clutch close and motor activate when user intent to use power? We can apply a EMG muscle sensor. Slight voltage flows through muscle when we lift, and it's proportional to the power we use. The EMG sensor capture this information with very slight delay.
The image on the left shows an EMG sensor attached to arm, and the signal can be read in by Arduino board. This signal is quit noisy since we are just physically touching the sensing plate onto our skin, therefore, we have to perform filters and thresholding to better utilize the signals.
Below is the detialed explaination of the code and usage of EMG sensor and motor integration:
Now, we can obtain other information such as the direction of our arm movement, and the speed of our motion, all through a accelerometer, which we choose on the Adafruit Circuit Board since it's quit friendly to work with. If the arm is moving at the very fast speed, the clutch should not engage, as this will hurt people's arm, and if they move their arm very fast, it means they probably do not need power support.
Below is a more detail explanation how accelerometer is used to obtain extra info and control the clutch.
Here is another video showing the accelerometer interacting with the entire structure.
Here is the final integrated prototype:
We 3D printed some connection part and bases. The long wooden support is where we place our lower arm on, and it will provide us power. We see that the motor is connected to one side of the clutch, and the other side of the clutch is connected to the wooden board. The motor is controlled by Arduino, and the clutch is control by the accelerometer on Adafruit board, and the Adafruit board communicate with Arduino via GPIO.
Here is our code flow chart:
When the program starts, clutch initialized to open. If EMG signal detected, we check if it's save to drive the motor, if it is, then we go to detect motion. Hyper state means that the hand could go up or move down, so at this point, the clutch should be loose for more information of EMG signal in the next loop, and motor should drive very slight. If the motion detect is curl up or push down, then the clutch closes itself to 100 percent, and motor will drive the hand.
We need a way to implement this hyper state, or indetermined state. We need this state because sometimes, a person intense to hold a object, or change the direction of motion, they will give a counter force to the motor, and EMG is able to detect it. However, we don't know it's really a motion change or just a noise. So, hyper state will go to the next loop for further detection.
We use the great property of clutch, where the closing power is proportional to the current supplied, here is the statistic we collect during the experiment:
When the current is down to 520 mA, the clutch is slipping. If during the next loop, the EMG sensor detect that the person is indeed want to hold or push in opposite, the motor will perform. This state give us a slight pause, therefore further analyze the user's intention.
The next step for us is to train the motion detect state. This block takes in current, pass EMG signal, accelerometer value, and previous clutch current. This block will utilize all the information, and mathematical or machine learning model to make prediction. We aim to complete this part and apply for the $2000 fund for upgrading our prototype to a actual product.
We successfully obtain the $500 dollar Prototyping Fund, and here is the list of our purchase:
We attended the final showcase hosted by NYU MakerSpace, where we explained our prototype and obtained many great advices. Below is the team photo.
Here is the github link for all the codes and EMG dataset.