Introduction: High Five! - a Robotic Hand

One day, in our Principles of Engineering class, we set out to construct compound machines out of VEX parts. As we began to build the mechanisms, we struggled to manage multiple complex components that needed to be assembled together. If only someone could give us a hand...

That's why we, three Irvington High School students in Ms.Berbawy's class, decided to design and build a robotic hand from scratch! With a financial estimate of $150 for this S.I.D.E. Project, we were able to acquire all the materials needed while remaining well under the budget. The finished product consists of an Arduino Mega, a servo micro-controller that drives 5 servos, each of which is connected to a 3D printed finger that is able to move individually with realistic joints.

This was a very ambitious project, given that all team members are high school students with busy Junior year schedules, and have no prior experience in completely designing an electronics based project from the base up. While our team members do have previous computer-aided design and programming experience, the project opened our eyes to the potential utilization of Arduino hardware and software in a way that could help people accomplish their daily tasks.

3D Modeling and Design by Patrick Ding

Documentation and Arduino Coding by Ashwin Natampalli

Arduino Coding, Circuitry, and Instructable by Sandesh Shrestha

Step 1: CADing

The first and most difficult step to this project is to create 3D models of the hand with fingers. To do this, use Autodesk Inventor, or Autodesk Fusion 360 (We used the former).

Use part files to create individual CADs for the palm, finger segments, fingertips, and pinky finger segment. This took us 2-3 revisions per part in order for the operation of the joints and servos to be smooth.

The design can be whatever size and shape wanted as long as the path of string allows for smooth finger operation and fingers do not collide with each other. Also ensure the fingers are able to collapse fully for a closed fist.

To fix the issue of string interferences and inefficient pathways, as we found in our first version, loops, string guides, and tunnels were added so that the string can be easily pulled and loosened.

Here are our finalized multiviews and .stl CAD files for each part.

Step 2: 3D Printing

After completing the CADs, use a 3D printer to make them come to life. This stage can be repeated multiple times if the design you create has some issues.

To 3D print, first export the CAD files as STL files. To do this in Autodesk Inventor, click the File dropdown menu and hover over Export. From the popout column, select CAD Format. The Windows File Explorer menu will allow you to choose .stl file from the dropdown menu and choose a location for the file.

Once the file is ready to be imported into the 3D printer's software, configure the print options to your liking or follow our configuration. 3D printer software varies from brand to brand so consult online guides or the manual to navigate their software. For our hand, we used the LulzBot Mini due to its availability in our class setting.

Step 3: Assembly

Once all parts are 3D printed successfully with rafts and supports removed (if applicable), then each part must be prepped to begin assembly.

Since 3D printers aren't very precise and small imperfections can occur, use a file or sandpaper or a dremel with a sanding attachment to smoothen out certain faces. For the smoothest joint operation, focus on joints and points of intersection to smoothen for optimal connections. Sometimes the string tunnels in finger segments and other parts can cave in or be imperfect. To combat major discrepancies, use a drill with a 3/16in drill bit to drill out the tunnels.

For the easiest string routing, assemble each finger, route the string through the tunnels, and tie the string at the ends. Before merging each finger to the palm, run the string through the guide loops, one through the top hole and one through the bottom, on the palm and attach it to opposite ends of the servo's included spools. Once lengths are correct, join the fingers to the palm.

As shown in the picture above, insert m4x16 screws into each joint to hold the finger together. Repeat each finger building process for all fingers, using the pinky segments for the pinky.

Step 4: Arduino Circuitry

With the skeleton all assembled, now the muscles and brain must be integrated. To run all servos at once, we must use a PCA 9685 motor controller by Adafruit. This controller requires an external power supply in order to power the servos. Using this controller and its proprietary coding library can be found here.

When wiring the Arduino to the controller, ensure that you record the pin outputs. If using an Arduino Mega, then this won't be necessary. In all cases, however, make sure that you record which ports on the motor controller the servos are mounted on.

To control the servos and hand using an IR Remote, simply add the IR receiver and connect power and ground to the Arduino with the data wire to the digital ports. Check the pinout of your IR receiver to make sure correct wiring. An example of our circuit is shown.

To create this circuit, first connect each servo to ports 3,7,11,13, and 15 on the servo motor controller board. Attach the entire board with the five pins on the bottom to a breadboard.

Using jumper cables, connect the Arduino's 5V power and ground to one power rail of the breadboard(Make sure you label or remember which side has 5V from Arduino!). This will power the IR sensor and motor controller. Connect a 6V power pack to the other power rail. This will power the servos.

Place all 3 pins of the IR sensor into the breadboard. Connect the power and ground to the 5V rail and the output to digital pin 7.

Since we are using an Arduino Mega, ports SDA and SCL on the motor controller will be wired with the SDA and SCL ports on the Arduino. The VCC and ground ports will connect to the 5V rail.

With the battery pack connected to its own power rail, use jumper cables and a small flat head screwdriver to secure the power to the servo motors through the green power input header.

Ensure all connections are tight and recheck all cable lines with our TinkerCAD circuit attached.

Step 5: Coding

The last step before this hand can be commissioned for use is to code the Arduino. Since this hand uses the PCA 9685 motor controller, we first have to install the library, which can be done inside the Arduino Coding Environment. After installing, also install the IRremote library for IR Remote functionality.

In our code, the definitions of each button on the IR remote are shown with 8 digit codes. These were found using the IRRecord program, which prints to Serial Monitor the 8 digit code of each button.

Attached is both the IRRecord program and the finalized hand control program.

At the start of the code, include libraries IRremote, Wire, and Adafruit_PWMServoDriver.

After, use the findings of IRRecord to define each button of the IR remote. While all aren't necessary (only 10 are needed), having all allows for quick expansion (adding functions and preset gestures) for the future. Create the pwm using the servo driver function and assign the servos to pins on the motor controller. Use the same values of SERVOMAX/MIN as shown. Assign the digital input pin of the IR sensor as 7 and initialize.

Declare the setup function with initializing Serial with baud rate of 9600.Enable the IR sensor and start the servo with servo frequency of 60hz.

Finally create an if/else switch based on the incoming transmission of the IR remote in the loop function.Then create a switch/case with cases of each button on the IR remote that will be used. These can be changed for your preferred controls. For each case, print the button pressed to serial monitor for debugging, and use a for loop to move the servo. After all cases are created, make sure to resume the IR sensor for more incoming signals before closing the loop function. Coding the servos through the motor controller board can be found at https://learn.adafruit.com/16-channel-pwm-servo-driver?view=all.