(Picture of MiniMe and me at Open House Tuesday night at KwartzLab Makerspace)
In 2010, I decided to design and build a humanoid robot in order to have an interesting interface with which to learn programming, software, hardware, and the mechanics of the human body. I wanted to build a platform that I could expand as my programming skills develop over the years. I began by designing and building the lower body that could react to outside stimuli and gravity with basic movement. I hope to follow this with locomotion and obstacle avoidance using sonar and cameras. Finally, I would like to program my bionic robot to manipulate objects with the addition of arms/manipulators.
During my initial brainstorm, I devised some rules on how I was going to build the robot and the resources and tools I’ll use to do so. The first and maybe the most important and difficult decision I made was that I wouldn’t use any 3rd party companies (ex. machine shop) to design or fashion anything for me. Everything that I purchased from places like surplus suppliers, online, or speciality stores had to be mass-produced. Furthermore, components that I built myself could only be built using tools that one would find at the local do-it-yourself store (ex. Rona,Home Depot, or Digikey). For example, some of the tools that I used in the first stage of construction was a drill press, band saw, belt sander, dual axis vice, reamer, and of course, basic hand tools.
Given that I had a few servos on hand, I decided to make the first version using these servos as leg muscles. I knew I would have some issues with this design but I proceeded mainly to see how I would deal with these inherent problems. This version of the design was the lightest and it was obvious before I started that the servos I had were also under-powered. I had to have the robot suspended from counter-weights like a puppet. This design also had the greatest number of limitations due to the limitations of even the best servo I could buy. In this design, I had each servo controlling one joint. This was an important allowance in the hip area wherein each side of the robot has 3 axis to move the leg. The 3 axis swung the leg forward and reverse, in and out, and rolled the leg toes in and out. Given that the center of the axis on each joint to the lever that moved it was approximately .625″ any small error at that point was exaggerated at the end of the limb that was approximately 25″ away. One degree of error was correlating to a few inches of error at the foot. I tried to add spring resistance to the joints so that the effects of the error would be less noticeable. This had a limiting effect as the spring resistance needed was too much on the servos used.
I decided to use an ACME screw motor assembly (the muscle) that I found at a surplus supplier. I redesigned the limbs to use these new muscles because the force that could be applied would be greater than any servos. These muscles also had a more natural movement—they compared to human muscles. What I also experimented with was the way the muscles were attached to the limbs. I tried to mimic the human body more closely by having four muscles work together to manipulate the position of the leg. These muscles were the groin—to swing the leg in/out; the glute—to role the toes in/out; the quad—to swing the leg forwards/reverse; and a stabilizing muscle—to stop the rolling of the leg when it’s fully raised. The programming of the 4 muscle setup would be a lot more difficult given that changing the position of one muscle would have an effect on all the other muscles. This also suffered from low tolerance errors due to the method of construction.
At this point I decided to take a simpler approach and redesign the robot once more to make it a more reliable platform. I did this so that I could focus more on the actual programming. I combined the previous two versions to develop what is now the robot. I took the individual joint manipulation from the first version and the stronger muscles from the second version. I then tightened the tolerances and strengthened the joints to reduce error all the while keeping in mind the self-imposed rules. This version is the heaviest of all three.
The foot also had growing pains. The original foot was a forged aluminum plate that had 2 upward curving toes.The curvature was intended to make walking easier while allowing space for mounted sensors. The narrowed heel was of a similar design to the toes. Both the toes and the heel were covered with QTC pills(quantum tunnelling composite). The foot was the ground or common for the pills and the opposite side of each pill had a wire connected to it.One of the problems with this design was that the pills were a silicon based material and the conductive adhesives an epoxy. This meant that the pill could flex but the adhesive couldn’t. The pills broke off.What I tried to do to resolve this was to secure the pills after they were seated in the epoxy with silicon. This worked fairly well as the epoxy held the wire in place and gave the pill a flat surface to sit on while the silicon adhered. The biggest disadvantage of this foot design was the lack of flexibility. Any force applied to the foot would be passed up to the rest of the body with very little absorption.Next, I decided to make a composite foot made of fiberglass with a steel mounting point built into it. I also integrated PCB traces to the foot. I did this to make the wire connections easier as I wanted to increase the number of pressure points on the ball and heal of the foot and isolate the pads from the foot itself. I then repeated the steps of securing everything with silicon. The foot turned out very nicely but the amount of pressure pads (pills) and the extra silicon used to secure it rendered the foot too insensitive to the weight that will eventually be exerted on it. The next step is to try pressure resistors which are 4X as large as the pills but should be more sensitive.
The knee joint is a knuckle design. It is comprised of the upper limb (boom) and the lower limb (jib) with the muscle connected via a set of linkages. The 4 linkages (2 upper and 2 lower) were set to be of equal length. And the linkages are connected to the limbs at a preset distance. This distance is equal to the length of the linkage holes between centers. The reason for this was to double the range of the muscle as it only has 2” of travel. This design allows the joint to travel ~150deg from a fully collapsed state to the fully extended state of 180deg between the upper and lower limb. This configuration doubled the speed at which the angle between the joints changed, but reduced the torque of the muscle on that joint. The knee joint was also designed with a larger diameter hinge pin. I did this in order to reduce the wobble between the two joints. In the original design the hinge pin was hollow and there were no restraints designed on the hinge pin itself. This arrangement worked fine in the first version of the robot as it was light and there were less side loads on the knee. When I redesigned the robot the extra weight of the robot increased the side load force which meant opening up the knee in a way that could damage it. The hollow center design could work even in the latest version if I wasn’t restricted by my ‘no machining’ rule. Given that I was using basic tools, keeping the original design would take substantially more time than it was worth.
The hinge pin was replaced with a modified shoulder bolt. This allowed for the installation of a feedback sensor and it also allowed me to better secure the joint itself. The feedback sensor gives a 0-5VDC value based on where the knee is located. The rotational alignment of the feedback sensor only needs to be set so that it doesn’t hit its mechanical stop before the knee reaches one of its maximum angles. Adjusting the feedback sensor and the knee joint to meet at their half point of rotational range during assembly sufficed. The precise calibration of the feedback sensor to the knee will be done using software.
The hips of the biped went through a series of changes. Some changes were to try out a design and others were to allow for easier control. Starting with the second version, this design was intended to most closely mimic the human body. The 3 axes of the joint were controlled by 4 muscles working in unison. This design used stretch sensors for positioning the feedback of the leg. Three of muscles were used for movement and stability of the joint while the 4th was strictly used for stability. Since the mechanical muscles are able to both push and pull the number of muscle groups needed to manipulate the joint when comparing to the human body was reduced. Obviously there are many muscles that stabilize, control, and move the femur in the hip joint of the human, but this can be reduced to groups that correlate to the number of core axes the joint moves in, X, Y, and Rotate. Out of the 4 muscles the main 3 muscles were located similarly to where their muscle groups are found on the human body. All three muscle were connected to the same fixed point around the hip in the center while the opposite ends were connected in such a way that manipulated the leg in both the X and Y axes and Z rotation. The glute (buttocks) muscle in the biped rolls the leg (femur) laterally, the Z rotation. The groin muscle extends the leg outward to the side, the Y axis. The quadriceps muscle works a bit different in this situation. Instead of extending the lower leg as it does in the human body, it works more like the Iliacus muscle and raises the leg, the X axis. This muscle also flexes the hips and upper body forward. The last stabilizing muscle is used to hold the position of the leg in order to keep it from rolling when the leg is fully extended, this also affects the Z rotation. The rolling of the leg happens because the orientation of the leg causes the glute and groin muscles to be just about in line with one another.
The first and third versions of the hip joint are almost identical in the sense of how the muscles manipulate the joints. The difference between these two versions is the strength of the components, the tolerance between components or the amount of play within the joint, and the incorporation of the feedback sensors within the joints. The first version of the hip joint was built using an off-the-shelf 3/8″ socket universal joint. This was modified by hinge pins. In the original version, the hinge pins were secured to the outer part of the joint (the yoke) while the modification secured the pin to the inner part (the spider).The pins were also extended past the yoke so that a control arm could be mounted to the pins. This version did not need a feedback sensor as it was designed for servo motors which have built-in positioning.
Between the first and third version the only commonality is the how a single muscle only affects a single joint. In this latest design the leg extension which is done by the quad muscle uses the same principles as the knee joint in that it utilizes the knuckle joint design. This design still allows for greater travel of the leg while the muscle only has 2” of travel. The hinge point for the leg extension is made of a .5” shoulder bolt which was modified to accept a position feedback sensor. The shoulder bolt is secured to the base of the hips through a hinge plate. This hinge plate is secured whit a .25” shaft that is connected to a feedback sensor. This assembly is manipulated by a single muscle mounted on top of the assembly. The center of the hips (the part that would have been manipulated by 2 separate muscles in the previous design) is now manipulated by a single muscle which affects both sides simultaneously. This change was made mostly to reduce the space needed for the glute muscles and assembly. Since the glutes almost always work together implementing this setup did not sacrifice any flexibility.
The muscles are comprised of a number of components collected from different suppliers. The motor assembly itself is a 90 deg ACME screw gear motor that I found at a surplus store. It’s a brush 12VDC motor spinning a worm gear which in turn spins a 2.5” long ACME screw attached at 90 deg . The muscles ram is built from .75″ copper tubing. It is comprised of a coupling, a straight section of tubing, and two reducers. The coupling is used as the body to house the fiberglass cast that was made of the ACME screw. Because machining was not allowed, I had to come up with a different way of making the nut for the ram. The coupling had 4 rivets attached at 90 deg around the circumference. These rivets were used to stop the fibreglass cast from spinning within or pulling out of the coupling if it ever became detached from the smooth wall of the coupling. The cast covers half of the coupling allowing the other half to mate with the body of ram.The ACME nut was built by setting the modified coupling and the ACME screw in a form. Once all was aligned the form was filled with resin that when hardened formed the nut. In the first trial the screw was painted to give it a larger diameter and give the nut some play/ tolerance. It was noticed that this was too much play between the nut and screw and so the successive nuts were made with no allowance for tolerance. This lack of tolerance between nut and screw was fine as the materials of the nut is softer then the screw and the two parts will work themselves in. The body of the ram that mates with the nut is a straight section of tubing that is cut to the appropriate length. This length is dependent on the location where the muscle will be used. The opposite end of the ram’s body is attached to two reducers. The first reducer takes the diameter from .75” to .5” and the second one takes it down to .375”. Once the ram diameter was reduced to the .375” it was the correct size to accept a rod end. The rod end is connected to the ram with hardware and has a .25” bolt hole for the connecting pin that mates the ram to the limb. To join the opposite end of the muscle the motor assembly is fitted either with a ball joint or a set of plates. The ball joints are used with the calves as the muscle has movement along 2 axis while the rest of the muscles only move along one axis. The plates that are used for the single axis muscles are setup to accept a .25” machined face shoulder bolt to join the muscle to the limb.
The electronics will comprised of a network of RaspberryPi single board computers connected to a ethernet switch. One of the computers will have a gyro board connected to it through a USB port. The board is a Razor 9 DOF (degrees if freedom) gyro board from Sparkfun. Also connected to the switch will be two ethernet shields that interface with two Arduino Mega microcontroller cards. Both of the Arduino Mega microcontrollers will interface with the robots hardware through a Controller Interface Card. This interface card will connects to a Signal Distribution Card that connects to all of the Motor Driver Controller cards and Feedback Sensors. Power to all the cards and muscles of the robot will be supplied through a Power Distribution Card. The human computer interface will be established through a USB mouse and keyboard with HDMI video to the RaspberryPi or through an ethernet connection to an external computer.
The RaspberryPi is a single board computer measuring 85.0 x 56.0 mm. The board is made by the Raspberry Pi Foundation and it’s an inexpensive (about $35US) board designed to encourage young people to take up computer science. The RaspberryPi uses a 700 MHz CPU manufactured by Broadcom BCM2835. It has an internal memory of 256MiB SDRAM, two USB-2 ports, HDMI for video, SD card reader, 10/100 Ethernet, and it is powered through a micro USB 5VDC port. There are more powerful single board computers on the market, but I am interested in working with RaspberryPi in order to explore its possibilities and/or limitations.
Electronics: Gyro 9 DOF Razor
The Razor is built on a 28 x 41mm circuit board by Sparkfun Electronics. The board houses 3 sensors which give it nine degrees of inertial measurement. The 3 sensors are the ITG-3200 (triple-axis gyro), ADXL345 (triple-axis accelerometer), and HMC5883L (triple-axis magnetometer). The data from these sensors is processed by an on board microcontroller, an 800 MHz ATmega328. The output is a serial RS232 stream that is connected to a FTDI FT232RL USB and to a serial IC that allows the data to be sent via USB. External power to the board which can be anything from 3.5VDC to 16VDC is regulated and set internally to 3.3VDC.
Electronics: Arduino Mega 2560 and Arduino Ethernet Shield
The hardware/software interface is an Arduino Mega. The Mega uses an ATmega2560 microcontroller running at 16 MHz clock speed. It had 54 I/O pins, 15 of those pins are PWM digital I/O pins and 16 are analog input pins. Out of all the Arduino cards the Mega has the most number of pins that can be configured to the needs of the robot. The Arduino also uses open software as there is a large online community that can help with software/hardware oriented problems. At the moment each PWM pin, feedback pin and enable pin of the MDCC card connects to specific digital PWM enabled pins, Analog pins, and Digital pins respectfully on one of the Mega cards. In the future these pins will possibly be reconfigured to run through a multiplexer to increase the number of I/O ports and still run with only 2 to 3 Mega cards. The Mega will be interfaced through an Ethernet shield to increase the baud rate between the Mega and the RaspberryPi computers. The Mega cards will be connected to a Ethernet switch alongside the RaspberryPi computers.
Electronics: Controller Interface Card (CIC)
The Control Interface Card allows the Arduino Mega microcontroller to be safely secured to the structure of the robot while electrically connecting all ports of the microcontroller to the card. The CIC supplies power to the microcontrollers and through a series of 2X10 serial data ports connects the digital and analog pins of the microcontroller to the Signal Distribution card.
Electronics: Signal Distribution Card (SDC)
The Signal Distribution Card distributes power to all MDCC and feedback sensors downstream of the card. The SDC interfaces with the CIC through a series of 2X10serial sockets and with the individual MDCC through 2X6 serial sockets. It receives power through a 4 pin power socket that is connected to the PDC.The data lines from the 2X6 sockets to the 2X10 sockets are separated into groups of uplink analog lines, downlink digital lines, and downlink digital PWM lines. The grounds and 5VDC lines are also grouped together at this point.
Electronics: Motor Driver Control Card (MDCC)
The motor driver card is a home built driver that takes a PWM signal (pulse width modulated), an enable/disable signal, and returns 0-5VDC as feedback. It is also powered by 2 power sources: 5VDC to run the circuits and 24VDCwhich is fuse protected with a fast blow 3A fuse to power the motor. These voltage lines have red LED indicators showing if power is coming in. The PWM signal is fed through a NOT gate to separate it into two signals that are opposite to each other. The two signals are then sent to two AND gates where the second input of both AND gates are joined together and controlled by the output of a voltage comparator. The output of the AND gate then feeds two sides of the bridge driver and green LEDs that are used for easy diagnostic of the signal indicating if a signal is coming its intensity. The bridge driver is a dual L298HN Full Bride Driver that is used to control the direction and speed of a single motor. The two channels of the driver are connected together to increase the power output to 4A max. The enable/disable channel turns the driver IC ON/OFF this too has a green LED indicator for easy diagnostics. The ground of the bridge driver IC has a current sensing resistor added between it and the ground. This resistor gives a voltage which is proportional to the current that the IC is outputting to the motor. The voltage is sent to the negative side of a voltage comparator and is compared with a pre-set voltage on the positive side of the comparator. The voltage comparator is part of a current chopping circuit that is used to control how much current the motor receives. When the current through the driver IC increases it increases the voltage that is sent to the voltage comparator. The voltage comparator works by comparing a preset voltage level on the positive side to an input voltage level on the negative side of the comparator. If the negative side of the comparator is less than the positive the comparators output is high or 5V. When the negative side of the comparator becomes equal to the positive side it switches the output of the comparator off or 0V. At the point when the voltage comparator shuts off the output it in turn shuts off the output of the AND gates and stops the PWM signal from reaching the driver IC. The 0-5VDC feedback voltage is a value that is produced by the positioning sensor built into the joints. This value is then used by the computer to calculate where each joint is located and allows the computer to make decisions on how to move the joints.
Electronics: Power Distribution Card (PDC)
The Power Distribution Card receives its power from an external supply that is running 30VDC at 30A. On the card the voltages to the muscles are separated and passed through a slow blow 3.5A fuse. There is also a LED indicator downstream of the fuse giving it a quick visual reference. If all is working then the LED is ON and voltage is sent to the MDCC. The PDC also supplies power to all the cards and sensors. The voltage supplied is a regulated 5VDC.
Electronics: Feedback Sensors
At the moment the feedback sensors on the robot are comprised of pressure sensors on the feet of the robot, joint position sensors that are in the joints, stretch sensors for the calves, and bump sensors. The pressure sensors of the foot tell the robot how its weight is distributed across the foot and how that distribution compares to the other foot. These pressure sensors give the robot the ability to balance its body so that the weight is evenly distributed. Furthermore, this allows the robot to sense if it is losing balance and from which direction it is losing balance. The stretch sensors are in the calves of the robot. The sensors stretch as the muscle expends indicating to the computer where one side of the foot is in relation to the other and the location of the ankle. The sensors in the joints give the exact position of the external limb in respect to the internal limb. The angle of the joint can be calculated with this value. Lastly, each foot will have 3 bump sensors added to the toe and heel area allowing for more feedback from the robot’s environment.
Once again I have made some additions and changes to the mechanical side of the robot. I installed new ankles which now have feedback mounted directly in them with the use of 2 potentiometers. Like all other feedback sensors the potentiometer is used as a voltage divider giving a 0-5VDC signal. Additionally I modified the lower back mechanism by adding some compression bearings to the main shaft and I made some slight changes on how the whole thing is assembled. I am still following the rule of no machining so trying to come up with ways to get everything aligned is a bit more challenging. This does force me to think outside the box. Lastly I modified 2 of 4 motors by adding a 10 turn potentiometer directly to the back of the motor shaft. The modified motors are: toe in/out motor which is a 10:1 ratio worm motor and I need about 8 turns for the complete move. The second motor is for the side to side twisting of the lower back. This again is a worm gear motor with 24:1 ratio. This motor need 6 rotations to give me a full range of motion.