Introduction: Prosthetic Arm Working With a Myosensor

This project is the development of a prosthetic arm for amputated people. The goal of this project is the creation of an affordable prosthetic arm for people that cannot afford a professional one.

As this project is still on the prototyping phase, it can always be better as for now it can only open and close the palm being able to grab stuff! Nevertheless, it is a DIY prosthetic arm that can be done at home or at a local fab lab.

Step 1: Materials, Tools and Machines Needed

Machines:

  1. 3D Printer
  2. Laser Cutter
  3. Desktop CNC Machine

Tools:

  1. Fishing Line
  2. 3mm filament
  3. Drill
  4. Superglue
  5. Hole pliers
  6. Multimeter
  7. Soldering Station
  8. Machinable Wax
  9. Siliconfor molds

Materials:

  1. Copper Sheet
  2. 1x ATMEGA328P-AU
  3. 1x 16MHz Crystal
  4. 1x 10k resistor
  5. 2x 22pF capacitors
  6. 1x 10uF capacitor
  7. 1x 1uF capacitor
  8. 1x 0.1uF capacitor
  9. 1x Myosensor
  10. 5x micro servo motors
  11. 1x Arduino UNO

Software:

  1. Arduino IDE
  2. Fusion360
  3. Cura
  4. Eagle
  5. GIMP

Step 2: 2D & 3D Design

3D Design

The first step was to design the fingers, palm and forearm of the prosthetic arm taking into consideration the electronics that would go in the prosthetic arm. To be honest, I used as a base the open source inmoov project and I started from there.

The palm is quite a hard part to design as the fingers should have different ratios between them. So:

Fingers: I downloaded the fingers from the inmoov project.

Palm:

  1. I first sketched the layout of the palm and extruded it.
  2. Then I made holes for the connections of the finger and forearm using sketches, the cut command and the fillet command.
  3. After that, I had to make tubes in order for me to be able to pass the fishing lines in so that I can control the fingers via the motors.
  4. Lastly, holes had to be added inside the palm so that the closing of the palm was possible when the fishing line was pulled.

Forearm:

  1. In different planes, I created two sketches and used the ellipse command. I used the loft command after to create the desired shape.
  2. After, the shell command was used to make it hollow and the split command to cut it in half so that I can design in it and for the best accessibility for when I am mounting my electronics inside.
  3. A sketch was also made near the wrist, extruded and joined with the main forearm so that it can connect with the palm.
  4. Having the visibility to design inside the forearm, I created a sketch in the dimensions of the five motors that I would be using, one for each finger, and my PCB(printed circuit board) that I would be using. I then extruded them until they reached the desirable height and deleted the unnecessary parts in the back of the cylinder using backspace.
  5. Lastly, openings for bolts were designed, in a way that are not so visible on the overall design, for the forearm to be able to be closed using similar commands as above.

Finishing up the design, I selected each body and download it as an .stl file and I 3D printed them separately.

2D Design

As I wanted my fishing lines to be separated while they are being operated by the motors, I decided to make guiding slots for them. For this, I did not really have to design anything new but use the smaller ellipse for when I used the loft command to created the forearm.

I exported its sketch as a .dxf file after I used the laser cutter. After I had my desired shape, I drilled holes of 0.8mm inside the slot that I found necessary.

Step 3: 3D Printing

After exporting each stl file, I used Cura to generate the .gcode of the different parts of fingers, the palm and the forearm. The settings used are illustrated on the pictures above. The material of the 3D printed parts is PLA.

Step 4: Molding and Casting

The purpose of the casting of the palm is for the prosthetic arm to have a stronger grip as PLA could be slippery.

3D Design

  1. Using the pre-existing sketch of the palm, I tried to mimic our palm by designing kind of circles to it using the arc command.
  2. After, I extruded them at different heights and used the fillet command to smoothen the edges of the inside "circles".
  3. Then, I designed a box with the same dimensions as my machinable wax and I put the negative of my design there using the cut in the combine command.

CAM Process

After having the design ready to be milled using the desktop CNC machine, I had to generate the gcode for that. In my case, I was using the Roland MDX-40 CNC machine!

  1. First, I entered to the CAM environment of Fusion360.
  2. Then, I selected a "new setup" on the setup menu.
  3. I chose the right parameters(see pictures) and pressed ok.
  4. Next, under the 3D menu, I chose adaptive clearing and selected the right parameters after inserting the tool I used as shown in the pictures.
  5. Lastly, I chose the adaptive clearing and clicked on the post process. I made sure it was for the roland machine mdx-40 and clicked ok in order to get the gcode.
  6. After that, I milled the block of wax according to my design using the machine.

Casting the Silicon

  1. First, I mixed the two solutions of silicon carefully not to cause any air bubbles, following the datasheet(link found on the materials), taking into consideration the mixing ratio, the pot life and the demould time.
  2. Then, I poured it into my mold from the lowest point making sure the contact point was staying constant and the diameter of the poured solution was as thin as possible, in order to avoid air bubbles.
  3. After casting the silicon into my mold, I had to make sure no air bubbles were inside, so I trembled the mold using a drill with an oblique nail.
  4. Lastly, as I forgot to do it in my design, I punched holes into my silicon after it was ready, using the hole pliers, in a way that they match the holes that were on the surface of the palm.

Step 5: Electronics Design and Production

In order to design my board and understand what is going on in the pins of the microcontroller, I had to read the datasheet of it. As a base PCB, I used the micro satshakit and then I modified it according to the needs of my system.

As satshakit is a DIY arduino-based board, I could modify it according to my searches for connections of my parts with the arduino. So, the myosensor connects to the arduino using one GND pin, one VCC pin and one analog pin. Whereas, one servo motor uses one GND pin, one VCC pin and one PWM pin. So, I had to expose in total six GND and VCC pins taking into consideration the powering of the board, one analog and five PWM pins. Also, I had to take into consideration to expose the pins for the programming of the board(which are MISO, MOSI, SCK, RST, VCC and GND).

The steps I took were:

  1. First, I downloaded the eagle files of the micro-satshakit.
  2. Next, I modified the micro-satshakit according to my needs using Eagle. A guide on how to use Eagle can be found here and here.
  3. After rooting my board, I exported it as a png file and prepared the internal and external path of it using GIMP. More on how to do that, can be found here.

After having the internal and external paths of my board as png, it is time to generate the gcode of them in order to be able to mill it in the roland mdx-40 desktop cnc machine. For the generation of the .gcode I used fab modules. The settings that should be set in fab modules and be found here.

Lastly, I soldered everything I needed according to my eagle board. The picture of the schematic and the soldered board can be found above.

The reason for making my own PCB Board instead of using an Arduino UNO is the space that I am saving when I use my own board.

Step 6: Assembly

So, after the fingers were printed:

  1. I had to drill the inside holes with a 3.5mm diameter drill and the outside holes with a 3mm diameter drill. Inside holes meaning the part that when the parts are connected it is from the inside and outside hole, the part that when connected it is from the outside.
  2. After that I had to superglue to first with the second finger and the third with the fourth one.
  3. After that, I connected parts 1+2 with 3+4 with 5 through the little holes using a filament with a 3mm diameter.
  4. Lastly, the fingers were ready to be assembled with the palm and then with the forearm.

So, it was time to pass the fishing line through the fingers.

  • One line went from the back side of the finger through the pipe on the finger-palm connector and to the forearm and the other line went from the front side of the finger to the hole on the inside of the palm and to the forearm.

A special note is to pass the fishing line through a piece of wood that has a hole to it with the diameter of it and make a knot. Otherwise when the line is pulled, it may go down the finger, which happened to me no matter how many knots I made.

  • After the fishing line is passed through the fingers, the palm and the forearm should be connected by some 3D printed bots bolts,
  • I passed the lines again through the laser cut hole slot to separate them and then connected them to the servo motors.
  • Attaching the fishing line to the right position of the servo is a bit challenging. But, what I did was to take the extreme positions of the finger and connect it to the extreme position of the servo.
  • After I found the correct positions, I drilled holes into the special slots for the servos and screwed the servos to the right places making sure that two of the servos were slightly elevated from the other ones, otherwise they would collide during their operation.

Step 7: Programming

Before writing the program, I had to make the modified micro-satshakit be able to be programmed. To do that, I had to follow the steps below:

  1. Connect the Arduino Uno to the pc.
  2. Select the right port and the Arduino Uno board under tools.
  3. Under >File >Examples, find and open "ArduinoISP" sketch.
  4. Upload the sketch to the Arduino.
  5. Disconnect the Arduino from the pc.
  6. Connect the board with the Arduino following the schematic in the picture.
  7. Connect the Arduino to the pc.
  8. Select the "Arduino/Genuino Uno" board and the "Arduino as ISP" programmer.
  9. Click to >Tools >Burn Bootloader.
  10. After the bootloader is successfully done, we can write our program:
//including the library that I used for the servo motors
#include <VarSpeedServo.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(7,8);

#define MYO_PIN A0
int sensorValue;
float voltage;

//appoint a name to my servo
VarSpeedServo servo1;
VarSpeedServo servo2;
VarSpeedServo servo3;
VarSpeedServo servo4;
VarSpeedServo servo5;

#define PINKY 5
#define PINKY_PIN 10

#define RINGFINGER 4
#define RINGFINGER_PIN 9

#define MIDDLE 3
#define MIDDLE_PIN 3

#define INDEX 2
#define INDEX_PIN 5

#define THUMB 1
#define THUMB_PIN 6

void setup(){
	pinMode(MYO_PIN, INPUT);
	
	//the pin which i attached my motor
	servo1.attach(THUMB_PIN);
	servo2.attach(INDEX_PIN);
	servo3.attach(MIDDLE_PIN);
	servo4.attach(RINGFINGER_PIN);
	servo5.attach(PINKY_PIN);

	defaultPosition(THUMB,  40);
	defaultPosition(INDEX, 40);
	defaultPosition(MIDDLE, 40);
	defaultPosition(RINGFINGER, 40);
	defaultPosition(PINKY, 40);

	mySerial.begin(9600);
	mySerial.print("Initializing...");		
}

void loop(){
	sensorValue = analogRead(A0);
	voltage = sensorValue * (5.0 / 1023.0);
	mySerial.println(voltage);
	delay(100);

	if (voltage > 1){
		closePosition(PINKY, 60);
		closePosition(RINGFINGER, 60);
		closePosition(MIDDLE, 60);
		closePosition(INDEX, 60);
		closePosition(THUMB, 60);
	}
       else{
		openPosition(PINKY, 60);
		openPosition(RINGFIGER, 60);
		openPosition(MIDDLE, 60);
		openPosition(INDEX, 60);
		openPosition(THUMB, 60);
	}
}

void defaultPosition(uint8_t finger, uint8_t _speed){
	if(finger == PINKY)
	  servo5.write(90, _speed, true);
	else
	if(finger == RINGFINGER)
	  servo4.write(70, _speed, true);
	else
	if(finger == MIDDLE)
	  servo3.write(20, _speed, true);
	else
	if(finger ==INDEX)
	  servo2.write(20, _speed, true);
	else
	if(finger == THUMB)
	  servo1.write(20, _speed, true);
}

void closePosition(uint8_t finger, uint8_t _speed){
	if(finger == PINKY)
	  servo5.write(180, _speed, true);
	else
	if(finger == RINGFINGER)
	  servo4.write(180, _speed, true);
	else
	if(finger == MIDDLE)
	  servo3.write(180, _speed, true);
	else
	if(finger == INDEX)
	  servo2.write(180, _speed, true);
	else
	if(finger == THUMB)
	  servo1.attach(180, _speed, true);
}

void openPosition(uint8_t finger, uint8_t _speed){
	if(finger == PINKY)
	  servo5.write(0, _speed, true);
	else
	if(finger == RINGFINGER)
	  servo4.write(0, _speed, true);
	else
	if(finger == MIDDLE)
	  servo3.write(0, _speed, true);
	else
	if(finger == INDEX)
	  servo2.write(0, _speed, true);
	else
	if(finger == THUMB)
	  servo1.write(0, _speed, true);
}

//After writing the program we upload it to the board by >Sketch>Upload using Programmer
//Now you can unwire your micro satshakit from your arduino and power it through the power bank 
//And voila!! You have a prosthetic arm

Step 8: Downloads