Sunday, March 17, 2013

weekend project: minimalistic servo arm

There's a video of it in its final state, with its multitude of issues. *sigh* one day I will actually finish a project. Only the first and last 5 seconds or so are interesting. Cost: ~$6 for the two microservos (!! so cheap), plastic is free, then the board+microcontroller battery is $25+$15+free (probably $10?).

After building hexa-rideablepod, I have definitely been more inclined to daydream about small or fold-able or compact project.

I should update my project todo list.

I started at ~8pm on Saturday and finished ~3:30 pm on Sunday (and yes, I did sleep a bit, as well as watch an anime movie (Summer Wars) ...

what the cloud looks like in the future

... and spend a lot of time reading about inverse kinematics and poking at IK code I never ended up using).

I was inspired by

The code looks pretty straightforward.

// Given theta1, theta2 solve for target(Px, Py) (forward kinematics)
void get_xy() {
  actualX = a1*cos(radians(theta1)) + a2*cos(radians(theta1+theta2));
  actualY = a1*sin(radians(theta1)) + a2*sin(radians(theta1+theta2));
I was a bit confused by the definitions of the variables, since I haven't done kinematics in a while. In the forward kinematics part it is essentially saying:

measuring the servo spline outer diameter in order to create lasercut female splines on my parts instead of using the proprietary servo horns. I started around this time. I swear I spent like 30 minutes trying to figure out how many divots it has (21) before just trial-erroring it, lol.

It gets to be pretty late in the day after I try to struggle to remember kinematics.
Here are some beautifully written kinematics notes I found linked from stackexchange question on drawing robots (robotics stackexchange! i'm excited).

Well, crap. I hesitate -- do I want to try to get something done and present a project or not? I eventually decide (and with some support from the awesome Jessica Artiles) that I may as well get more feedback on my ideas. What is there to lose?

Thus, I emergency hot-glued some potentiometers onto pieces of plastic and used that as my control ( a simple mapping of potentiometer values to servo values is all that's needed) instead of writing IK code. This arm controller design was inspired by

img src my design inspiration, except mine was jankier and used more hot glue

near the end of the designathon
I didn't even have time to map things correctly, because I thought the presentations began at 5pm but actually they began at 3pm.

The lasercutter files looked like so:

It's hard to see the cuts. But the pots have flats on their shafts, so the pot arms have semicircular holes that are tightly fit onto the pot shaft to couple rotationally. And for a minimalistic design, the robot arms have servo splines cut into them so they mate directly to the servo.

I had the most issues trying to make a press-fit bracket for the servo so that I could couple it to a base. The sides of the servo weren't particularly flat so the rectangular brackets always broke on installation; I ended up with a C-shaped bracked design.

a frontal image
Also, the servos are amazingly torque-ful. I thought the base would be enough to hold it down but I ended up adding tape so that the servo arm wouldn't swing itself around.

Also to fix, I actually need to build a platform so that the base is heavy enough that the servos don't push it around and high enough that at zero degrees the width of the servo arm doesn't cause it to hit the ground.

I also actually did calculations for the servo, or rather used a calculator online, to verify the servos would handle the sharpie weight. Not that I had different servos or anything. (screenshot below)

Oh, another issue I ran into, the servo.write() arduino library uses modulation from 544us to 2400us, while the microservos used 500-2400 us, which gave me this issue where the servos wouldn't go all the way down to zero degrees when I used myservo.write(0). I took a quick look at "arduino-1.0\libraries\Servo" and found out thatyou can specify these min/max values when you initialize the servo, e.g.

attach(pin ) - Attaches a servo motor to an i/o pin. attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds 

There was some other funky issue with trying to read a sensor while the servo was drawing power. Turns out I just need more delay in my loop.

Can't think of anything else for now.

Material Costs
ebay $11.88 
"4x SG90s 9G CYS micro servo motor RC Robot Helicopter Airplane Car Boat + Horns"
so about $3 per servo

The servo specs:
Pulse Width:500-2400 µs sg90

Current Status:
I lost the code, and I broke some of the lasercut pieces, (the usb port for programming the arduino also seems to create a lot of sensor noise and the servo arm kind of did crazy robot arm thing and killed itself) so right now I re-lasercut  pieces and am re-writing the code. Should be up within a week.


Follows is a live blog of me working on drawbot:


ebay $11.88 
"4x SG90s 9G CYS micro servo motor RC Robot Helicopter Airplane Car Boat + Horns"
so about $3 per servo

let's follow this tutorial

confirmation that 9g micro servo can indeed make robot arm: 

okay yay let's do some math
thanks society of robots

alright, now let's see some real specs on these micro-servos:
Stall Torque at 4.8 volts = 22.2 oz/in (1.6 kg/cm)
aww... so cute (compare to the 7 to 15 kg/cm ones used in "small" robot arms:

So what are the tradeoffs? With a longer robot arm length, I get more range, but then I suffer torque-wise.

Also, need 4 dof -- one for the pen to move up and down.

some research into simulating robot arms online..,8076,898588-nav_and_content,00.html

my initial thought was to use processing, but oh hexapods java applets >__<

okay the guy next to me at the hackathon, idk his name, says i should just write it in html5
[edit: it may have been vincent xue]

excellent plan, learn html5

mmm kinematics libraries

wah html5 games
okay let's not get too distracted

hrm kinematics in flash

i should catch up in 18.06, perhaps

okay, assume some weights
google: density of acrylic
1.18 g/cm³
thanks google

okay let's make up some dimensions for a link length
4x16x3 = 192 cm^3 * 1.18 g/cm^3 =
thanks dot-gridded metric notebook and google

hrm, so about 1/5th of a kg. Wait what? that seems wrong.

oh units -> 0.3cm thick, so = 22.7 grams.

(from actual measurements:
15g for a 3*50*76 mm chunk, or 1.32 g/cm^3

okay now for
pre-built calculator!
okay not operating near stall torque, that is good
(conversion N m to kg cm is about x10, if you let gravity ~10 m/s/s)
okay, screw this, I am going to CAD some stuff
later: end up not CADing anything
One anime later, and back to staring at robots.
i start watching youtube stanford lectures but am too sleepy mmm canvas, 2010 2d robot arm simulator

hmm GUI via processing

oh! excellent written documentation

day 2
haha, still here. i'm so sloowwww at building things, all the other teams are so cool
okay i'm working by myself because i'm weird like that

eww, the servos are doing funky things where servo.write(0) doesn't seem to go all the way to zero. let's compare. hitec311 and sg90.
Pulse Width:500-2400 µs sg90

Pulse Width:900-2100 µs hitec311



   attach(pin, min, max  ) - Attaches to a pin setting min and max values in microseconds
   default min is 544, max is 2400

Adam Libert, DIY waterjet and crazy grad student, drops by and shows me cool robots:

serial monitor output:
º’j¤ º’jP ºŠjR ºŠjR º’jT ºŠjR ºŠjR ºŠjT ºŠjR º’jR ºŠjP º’jP º’jT º’jR º’jP º’jR º’jP º’jR º’jR ºŠjR º’jR º’j

Exciting, when I am commanding a servo, it pollutes the analogRead.
Well then.

Oh, I just needed to increase the delay (was using 1). Hmm. I'm not even writing to the servos. I wonder why initializing the servo means the serial loop can't run fast enough.

how the heck does a kit for this not exist already?
$250, wow.

whee it's 3 pm and i decided to pitch because I HAVE NO SHAME. :D It's amazing what having the support of a friend can do for you.