16-264: Humanoids: Final Assignment
Yichu (Eric) Jin (yichuj), Shastri Ram (shastrir), Miller Sakmar (msakmar)
Our project involves controlling a humanoid robotic hand with a glove fitted with flex sensors. The end goal was to have a relatively accurate humanoid hand that could actively grasp objects and also mimic a user wearing a glove. Below is a more detailed explanation of our process, the problems we ran into, and the final result.
First "Palm" Test
Problems Face and Solutions
Pictures and Videos
Flex sensors are essentially a flat, flexible potentiometer. Therefore they made a desirable sensor to be able to read a user's finger position (bent, at 45 degrees, straight, or somewhere inbetween). The flex sensors are connected to each finger and one flex sensor is across the palm. The main goal was to build a hand that had motion in the palms (the upper and lower palms, as we will call them later on), in addition to all five fingers. The palms and fingers would be controlled by fishing wire connected to servos, acting somewhat as tendons. One end of the fishing wire is attached to the tip of a finger and the other end is attached to the servo. Since the fingers are made of a flexible plastic, their rest state is straight. Thus, when the servo pulls the fishing wire attached to the tip of a finger, the finger bends towards pre cut holes in the plastic. The palms, being made of wood, do not have the flexibility that the fingers have, so we had to cut the wooden palm into pieces, connect them together using small craft hinges, and attach springs to one side of the palm (the back of the hand) to allow the palm to be pulled outward by the springs at its resting state (looking as if one was flexing their hand to be as flat as possible). Fishing wire was then attached to edges of the palm and the palm was closed in a manner similar to how the fingers were bent; the servo would pull on the fishing wire connected to the edges of the palm, flexing the springs and making the palms close.
FIRST PALM TEST:
As stated before, our main objective was to make a robotic hand that achieved upper and lower palm motion. With this main goal in mind, our conservative approach was to make a hand that operated and looked like a baseball glove. To test out the difficulty of making such a device, we obtained some flat compressed wood and cut it in such a way to make a “palm.” We connected the pieces together using duct tape and attached an anchor point for the fishing wire using a large screw. A video can be seen below:
After we achieved this motion, we decided to add fingers to the palm and add another “upper” palm that allowed all four fingers to bend together, in addition to being individually bendable (to explain this better, we wanted to be able to mimic the motion when you have all four of your fingers - the pinky, ring, middle, and index - straight and together while you bend them at your lower knuckles). Adding all of these parts brought some issues, however.
PROBLEMS FACED AND THEIR SOLUTIONS:
Our biggest problem was calibrating the flex sensors. Calibration was difficult because the readings from the flex sensors would change dramatically from each use. We believe this is because of the heat built up during testing and from wearing the glove for extended periods of time. Since we do not have any feedback to correct for this error, the sensors cause the servos to over-actuate the fingers. We worked around this problem by calibrating the flex sensors every time we restarted the arduino and robotic hand setup.
Our second problem, which is partially related to the first, was correctly mapping the analog readings from the flex sensors to the servos. The issue was that the range of the flex sensors was too small; the analog read-in of the arduino has 1024 degrees of resolution, but the flex sensors would only differ from 550 to 750. We accounted for this by using the map function in arduino and by calibrating repeatedly. Calibration consisted of wearing the glove and running the arduino with code that read in and printed out each flex sensor value. We recorded the minimums and maxes of each flex sensor and used those values as input for the map function.
Our third largest problem was getting the palms to actuate correctly. Our upper palm relied on readings from the pinky, ring, middle, and index flex sensors. If all four of the flex sensors were above a certain threshold (which we figured out through repeatedly bending all four fingers and recording their values), then the upper palm servo would actuate and pull all four fingers in for a “grasp.” As with our first problem, calibration with the threshold values varied, so we had to recalculate the value on each run.
Our fourth problem was attaching the flex sensors to the glove. We initially had a glove that allowed the flex sensors to move in between slits that we made in the glove. Our observation was that this resulted in readings that were too similar (the value range between straight and bent was too small). Thus, we went down the opposite path and fixed the flex sensors to all parts of the glove using duct tape. This made our glove more stiff, but resulted in better flex sensor readings
Our fifth problem was feeding the fishing wire to the servos effectively. The servos came with arms, but in order for us to effectively pull the fingers all the way closed, we needed the servos to pull more fishing wire. Therefore, we wanted some device that worked like a fishing reel or spool of thread. That way the fishing wire would be pulled all the way around the circumference of the reel or spool instead of just being pulled by an arm. Our solution, which was also free, was to use small toy wheels with rubber grips. We flipped the rubber tubes inside out so that they made grooves around the outside the of the wheels (thus making our desired “spool” design). The tubes kept on falling off of the wheels, though, so we cut them into two or four pieces and instant glued them onto the outside of the wheel. The wheels did not fit on the servo arms, though, so we chose to instant glue the wheels onto the servo arms. Before we did this, however, This solution actually ended up working nicely.
Our sixth largest problem was optimally placing the servos. Originally we had the servos lined up in one row. The issue we faced with this configuration was that the fishing wire was being pulled at too high of an angle off of the fingers (the angle was so great the fingers would not bend correctly). Our solution was to have two rows of servos. So that the servos did not interfere with each other (the front ones closest to the hand being in the way of the back ones, for example), we flipped the back servo upside down. That way our spools did not interfere with each other and we could space the servos out evenly and correctly.
Our seventh, but simple, problem was that we needed another arduino to able to read in the palm flex sensor outputs. One Arduino Uno only has six analog inputs, but we had seven. So, our solution was to have one arduino control the five fingers and the other arduino control the two palm servos by reading the palm flex sensor and an average reading of the pinky, ring, middle, and index fingers.
Our final problem regarded powering all of these devices. The worst case power analysis for our circuit pulled about 2 amps. Our power supply could only handle 1 amp, though. Thus, we had to add another power supply to be able to handle the worst case load.
Our Final Powerpoint Presentation: http://www.contrib.andrew.cmu.edu/~msakmar/Final Project Presentation.pptx
A simple schematic of our servo and flex sensor design can be seen below:
FINAL PARTS LIST:
6 Flex Sensors
6 10k Resistors
Build Your Own Robotic Hand Kidz Lab Science Kit
2 Arduino Unos
Lowe’s Gardening Gloves
Flat Compressed Wood
2 Small Bread Boards
Two 5 Volt Power Supplies
Flex sensors: https://www.sparkfun.com/products/8606, https://www.sparkfun.com/products/10264