Myoelectric Arm

I’ve always been fascinated by prosthetics and exoskeletons. My research in the Biomechatronics Lab gave me a glimpse into the innovations driving these devices to more closely mimic natural limbs. Inspired by this experience, I set out during the summer after my freshman year to design a cost-effective myoelectric bionic arm—comparable to expensive commercial models—that could perform basic gestures.

Objectives
  • EMG controlled
  • Perform basic gestures including fist, pencil, pinch, peace, thumbs up/down
  • Less than $500
  • Wrist rotation
  • Independent fingers
  • Custom design PCB
Materials
  • 6 MG995 servo motors
  • Fishing Line
  • Arduino Nano
  • Myoware 2.0 Muscle Sensor
  • 6 Linear Hall Effect Sensors
  • Magnet
  • Breadboard
  • Bolts
  • Screws
  • Springs
  • Ribbon wire
Research

I began by first researching the design of prosthetic arms. I stumbled upon this video by Mahdi Designs along with his thesis. It gave a broad overview of the anatomy of the human hand and the mechanisms of existing bionic arms in the market. It also introduced me to InMoov, an open-source library with 3D printed files for a life-size robot. I decided to use the design of Handi2 for my project but incorporated additional electronics to make the arm myoelectric.

Build

I 3D-printed the InMoov Handi2 parts on Prusa and Bambu printers using white ABS, with some forearm components accidentally printed in glow-in-the-dark ABS— truly a happy accident :). I then assembled the hand following the InMoov Handi2 instructions, making several adjustments such as filing parts to ensure proper fit.

During the first test of finger movements, I noticed the fishing line attached to the servos was too loose, preventing the fingers from reaching their full range of motion at 180 degrees. To fix this, I rewired each pulley, carefully tensioning the lines for proper articulation.

Electronics
Servos

Initially, I connected the servos to an Arduino Nano powered via USB from my laptop, using a breadboard to tune each finger while tensioning the pulleys. However, the servo controlling the pinky began to twitch when commanded to move to 180 degrees and repeatedly reset to 0. I also observed the voltage dropping from about 4.6 V to 2.8 V during this sequence. After some research, I realized this was a power draw issue.

Both loaded and unloaded servos can draw more current than a USB-connected Nano can supply—a rookie mistake 🙂 . For example, the stall current of an MG995 servo is 1.5 A, far exceeding what the Nano can provide. I quickly realized this after observing the servo’s twitching and creating a humming noise. When servos and the processor share the same underpowered supply, the high current draw from the servos can cause the processor to reset.

Hall Effect Sensor

I was also interested in exploring the use of hall effect sensors to get pressure feedback in the fingertips. 

Hall effect sensors can either be digital, which return HIGH or LOW values, or analog/linear, which return values between 0-1023 through analogRead. When no magnetic field is detected, the output will rest at approximately 1/2 Vcc.  If the south pole of the magnet is brought near, the output will linearly ramp towards Vcc and if the north pole of the magnet is brought near, the output will linearly decay towards ground.

In the case of Vcc being 5V, with no magnetic field present the output will rest at about 2.5V.  If the south pole of the magnet is brought near, the output will raise linearly up to a maximum of about 4.2V.  If the north pole is brought near, the output will lower linearly to a minimum of about 1.0V.

Hall effect sensors can also be bipolar or unipolar. If the hall effect sensor is digital unipolar, it can turn HIGH in the presence of one pole and LOW in the absence of that pole. It is unaffected by the opposite pole. If the digital hall effect sensor is unipolar, it can turn HIGH in the presence of one pole (usually South) and LOW in the presence of another pole (North). 

Battery

MG995 servos have a stall current of around 350-500mA.

The Nano can be powered by placing 7-12 volts on the “Vin” pin and Ground on the “G” pin.

The selected NiMH battery can output 3000 mAh. 

500mA x 6 = 3000mAh

The 7.2V battery can supply a sufficient amount of current to power all servos if they stall simultaneously. The servos and the Arduino Nano should be connected in parallel to the battery. 

PCB Design 

To properly power all my electrical components, I custom-designed a PCB (my first PCB!) using KiCad that contained a servo power distribution board along with areas to mount the hall effect and EMG sensor.

While designing the schematic, I imported custom symbols and footprints in order to add the XT60 connector. It is good practice to check your final design with the Electrical Rules Checker in KiCad.  It is a common mistake to receive errors for unused pins so it is also good practice to add “no-connects. Additionally, you can add power flags and global labels to incorporate VIN as a net. Power components including GND, 3V3+ and +5V are automatically added as nets, which becomes important when creating fills or copper planes. 

When creating the PCB, you can rely on KiCAD’s trace width calculator to determine the thickness of one’s traces. Currently, I have them set at 0.3mm. It’s typically best to refer to your manufacturer’s minimum trace widths; in my case, PCBWay has a minimum of 0.25mm. Also, it’s recommended to make your traces thicker instead of relying on the default to better withstand high current and avoid burnouts. Vias and rearranging components (if applicable) are good methods to shorten the length of traces and clean up routing. Traces with right angles are bad practice due to potential acid build up. To evenly distribute voltage, one can create copper pour fills on the top and bottom layers. In my case, the top layer consisted of a GND plane while the bottom layer consisted of a split VIN and 5V+ plane to accommodate the power for the servos and the linear hall effect sensors.  

I went through two revisions of my PCB before landing on the final version. I received a lot of valuable feedback from the MITERS community and couldn’t have finished this project without their help!

Software

Using Arduino C++, I programmed basic hand gestures onto the prosthetic arm ranging from a fist to a peace sign. Then I incorporated the Myoware 2.0 EMG sensor and programmed it to perform certain actions when it detected muscle activity above a set threshold.

Results

The robotic arm was able to successfully perform a variety of gestures, though there is significant room for improvement in both design and functionality. The electronics mounted in the forearm make the device bulky, and the Myoware sensor only provides analog readings, limiting dynamic movement. In the future, I hope to redesign the arm to include additional degrees of freedom for finger adduction and abduction and to integrate more user-feedback electronics for tactile responses. I also plan to revisit the hall effect sensors as a method for pressure feedback, which I ran out of time to fully integrate and test. Overall, I hope to create a more modular and compact hand design that is both functional and versatile.