Let's Make Robots!

Delta bot

mjcbruin's picture
Copy mouse movement (for now)
Cost to build: 
$70
Time to build: 
10 hours
AttachmentSize
Delta_bot_1.jpg62.42 KB
Delta_bot_2.jpg55.39 KB
Delta_bot_3.jpg59.11 KB

Hallo everybody, this is my first LMR entry (not the first robot I build)

I made this delta robot over the weekend.

About two week ago i saw a video of an industrial delta robot and i was intrigued by the simplicity of the principle but the complexity of the movements it could make.
So i thought, I'm gonna make one.

So i bought three servos some ball joints and some aluminum strip.
The metal base plate I had laying around. Just as some some nuts and bolts.
I used an arduino i took out of another robot i build (i will post that one here two)

I programmed the arduino so it reads serial data, and I made a mouse interface that sends the serial data.

And in actually turned out to be as simple as I thought it to be.

But now I have a delta bot I should do something with it.
I'm not quite sure what.
I had the idea to make more of these and use them as lags for a two, four or six legged robot.
It will work well I think, but it's a bit expansive to make six of these.

Delta bot and it's interface

Delta bot and it's interface
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Top view

Top view

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 Delta Bot

Delta bot

 

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Hi guys! I would like to manage this delta robot via iphone. I found a way to control arduino via iphone. You can see an example in this link:

http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=152


Could someone help me to modify processing code to communicate with TouchOSC? I think I could use a XY pads? Is it possible?
Please help me. Thanks a lot, Filippo

I have written a draft. Could someone check it please? Ufortunely I haven't an iphone for testing. Anyway someone could check my new processing code. Basically I have changed just some rows. Here my code:

 

import oscP5.*;        //  Load OSC P5 library
import netP5.*;        //  Load net P5 library
import processing.serial.*;


OscP5 oscP5;//  Set oscP5 as OSC connection
Serial myPort;    // The serial port:

int servo1 = 0;
int servo2 = 0;
int servo3 = 0;
int serialBegin = 255;

float X,Y


void setup() {
  size(600,600);

  myPort = new Serial(this, Serial.list()[1], 115200);

frameRate(100);
noCursor();

}

void oscEvent(OscMessage theOscMessage) {   //  This runs whenever there is a new OSC message

    String addr = theOscMessage.addrPattern();  //  Creates a string out of the OSC message
    // if(addr.indexOf("/1/toggle") !=-1){   // Filters out any toggle buttons
    X=theOscMessage.get(0).floatValue();
    Y=theOscMessage.get(1).floatValue();
    
    }
}

void draw() {

  background(255);

triangle(width/2, height, 0, 200, width, 200);

servo1 = 100-int(dist(width/2,0,X,Y)/6);
servo2 = 100-int(dist(0,height,X,Y)/6);
servo3 = 100-int(dist(width,height,X,Y)/6);
strokeWeight(3);
line(300,200,X,Y);
line(150,400,X,Y);
line(450,400,X,Y);

println("X "+X);
println("Y "+Y);

 


if (servo1 < 0){
  servo1=0;
}

if (servo2 <0){
  servo2=0;
}

if (servo3 <0){
  servo3=0;
}

if (mousePressed && (mouseButton == LEFT)) {
servo1 -= 20;
servo2 -= 20;
servo3 -= 20;
}
if (mousePressed && (mouseButton == RIGHT)) {
servo1 += 40;
servo2 += 40;
servo3 += 40;
}


//println("servo1 "+servo1);
//println("servo2 "+servo2);
//println("servo3 "+servo3);
//Serial.write
myPort.write(255);
//delay(10);
myPort.write(servo1+30);
//delay(10);
myPort.write(254);
//delay(10);
myPort.write(servo2+30);
//delay(10);
myPort.write(253);
//delay(10);
myPort.write(servo3+30);
//delay(10);

 

}

Fantastic job! Could you please tell us some more details? For exaple PushRods length and basament disposition. Where can I buy PushRods like this?

thanks a lot to all of you.

Thanks for posting your bot, it inspired me to copy and enhance... See my blog post at http://prutsers.wordpress.com/2010/07/23/delta-robot-using-wii-and-arduino/ 

The enhancements are:

- control using a Wii Nunchuck

- proper XYZ positioning, full inverse kinematics

- standalone, all calculations done on Arduino

Thanks again, have fun!

flokos's picture

I have no word to express my impresion,i just want to say i want to make one .

flokos's picture

Can you tell me which servos did you use in this delta robot?

mjcbruin's picture

He,

I used the cheapest servo's i could find.
Go to www.conrad.nl and search for number 233751 - 89 (sorry no direct link possible with conrad :-S )

Hope it helps.
flokos's picture

And those metal sticks that keep the servos connected with this thing on the top of your  delta robot where did you get them?

djhesit8's picture

I would like to make one above my table and attach a griper :D now how does that sound?

Stefan's picture
i am having some problems with your Arduino
code the error is.


 In function 'void loop()':
error: 'serialTeller' was not declared in this scope

 
can you help me
Thanks

 

Stefan's picture

i got it

int serialTeller;

 

thanks 

Great .. !

 

Go DELTA ..

 

=)

 

AlNets

And how do i burn the code onto arduino? i dont see any option as such to do so in the gui of processing....
ezekiel181's picture

You did RTFM(website) right? Everything is explained for beginners. A little research and 2 seconds with google would have taken you there.

Maybe you should start simpler, by getting an LED to flash, then test out some servos and play with serial data before you jump right in the deep end.

The code's compiling, but to which pins do i connect my servos(signal)? 11, 12, 13?(from arduino code)
Nop, can you help me figure out how i can get away with processing? I'm a Newbie :(
ezekiel181's picture
Download and install processing from here. Start it up, then copy and paste all the code mcb posted and marked as the processing part. Save and compile. If it doesn`t work, you might have to change the com port.
The code's now compiling after the declaration of serialteller, "int serialTeller;" but when i burn the code onto arduino, nothins happening....i mean i shd be able to control the servos with ma mouse, but nothin happens. im kinda new to arduino.... plz help me out.
ezekiel181's picture
Did you install processing and run the code?

When I compile the code posted above, it's giving an error:

 In function 'void loop()':
error: 'serialTeller' was not declared in this scope

whats wrong?

 

ezekiel181's picture

serialTeller hasn`t been declared, so basically the Arduino doesn`t know what it`s supposed to be. In C you must declare variables before they are used.

I`m not sure what it is supposed to be so you might have to wait until the author comes back to respond. He did say it`s not in english, so if anyone knows what Teller means it could give a clue as to its purpose.

As a start try adding the line int serialTeller; up at the top with the other variables.

TotoroYamada's picture

A good example of an industrial deltabot on BotJunkie : the FlexPicker.

Hi mjcbruin!

I found an interesting program in C language to calculate X Y Z based on the angles of the three servos and the other way around (you want to go to X Y Z, what angles must the servos have?) I translated this into a Visual Basic 6.0 program.

Would you be able to test this ? I plan to build my own Deltabot, but that will take some time...You are living in the Netherlands??

Hans

My name is Oscar Im new in this forum, Can you send me a source code that you have in C or VB 6.0 please?

 

Oscar

mjcbruin's picture
BaseOverApex's picture
At least it's another link back to LMR!!
ezekiel181's picture

Here`s a suggestion, stick a marker on it and have it draw PCB traces for etching :)

I got a pack of tamiya ball joints last week to do this but they don`t have the same range of motion as yours. From eyeballing it I would guess they can move about 10-15 degrees either way from center but I was hoping for much more. I`m wondering how much approximately is the maximum angle the ball joints on yours can move?

I found these ball joints. Unlike the tamiya these have no bolt on the ball and just from the picture they have a much greater degree of freedom.

mjcbruin's picture

I have used these ball joints, but I used smaller nuts, these. That creates some extra movement.

Further, I haven't done anything with the delta bot yet, no time :(
But I thought a cutter would be cool, so you could carve 3D objects from plastic foam or something.
Although I think the programming could get a little complex.

BaseOverApex's picture

Helaas kunnen wij geen winkelwagen voor u aanmaken.

Wij kunnen geen winkelwagen voor u aanmaken.

Dit kan 2 oorzaken hebben.

1. U gebruikt een verouderde link. Roep de pagina opnieuw op.

Pagina opnieuw oproepen

2. Uw browser accepteert geen cookies. Activeer in uw browser de toepassing van cookies en probeer het opnieuw. Wilt u bestellen zonder gebruik te maken van cookies, klik dan op onderstaande link:
Verder zonder cookies

Heeft u vragen? Stuur dan een mail naar webmaster@conrad.nl
mjcbruin's picture

Try it this way:

go to conrad.nl and seach for product number 223417 for the balljoints and numer 248778 for the m2 nuts.

mintvelt's picture
Yeah. Those conrad guys are allergic to deep links; it looks like.
Rudolph's picture
I am going to create reasons to use the phrase "Verder zonder cookies". Like a battle cry or something.
BaseOverApex's picture

It would be a good battle cry for paranoid folk who keep cookies permanently switched off.

But what does the header mean: "We can't cart for you"?

 

mintvelt's picture

As far as I understand it, the link you were following, contains a reference to a session for which you don't have the correct cookie. The page shows the wrong error message. It says: "We were unable to create a shopping cart for you." The two options state "you might be using an old link: retry loading the page" and "You might have cookies disabled: continue without cookies" but they both throw you to a home page.

My guess is that when someone tries to add an article to their shopping cart, but the session cannot be found, the website assumes you have disabled cookies in your browser and it shows this page.

Because the session reference is used in all URLs copied from the Conrad website, this effectively makes deep-linking directly to an article or product  impossible. 

Good shop, Conrad, but a lousy website. 

Rudolph's picture
Remember the Soup Nazi in Seinfeld? Maybe it's like that. If you're gonna keep your cookies to yourself, then "No cart for you!"
BaseOverApex's picture
...it was EXCELLENT soup.
guibot's picture
it's amazing! I wonder what would you do next with it!
The way you are doing with processing to control it it's a really good idea! Congrats!!
Breathit Bot Biulder's picture
Put a pin in that and give it some paper, that would be cool.
mjcbruin's picture

Sorry for the late respnse ezekiel181 and electrictape22, but you're still intrested here is the code.
It's pretty sloppy programmed, there are no comments and variable names are in dutch but here you go:

-------------------------------------------------------------------------

Arduino code:

#include <SoftwareServo.h>

SoftwareServo servo1;
SoftwareServo servo2;
SoftwareServo servo3;
int servo1Pos = 90;
int servo2Pos = 90;
int servo3Pos = 90;
int servo1Afwijking = -2;
int servo2Afwijking = 8;
int servo3Afwijking = 8;

int data = 0;

void setup(){
  pinMode(13, OUTPUT);

  servo1.attach(10);

  servo2.attach(11);

  servo3.attach(12);
  //pinmode
  Serial.begin(115200);
}

void loop(){
 if (Serial.available() > 0) {
    // read the incoming byte:
    data = Serial.read();

    if (data == 255){
      delay(7);
      if (Serial.available() > 0) {
      servo1Pos = Serial.read();
      }
    }
   
        if (data == 254){
      delay(7);
      if (Serial.available() > 0) {
      servo2Pos = Serial.read();
      }
    }
   
        if (data == 253){
      delay(7);
      if (Serial.available() > 0) {
      servo3Pos = Serial.read();
      }
      serialTeller = 0;
     
    } else {
      serialTeller++;

    }
    if (serialTeller >1000){
      servo1Pos = 90;
      servo2Pos = 90;
      servo3Pos = 90;
    }
   
    if (serialTeller < 2000){
      SoftwareServo::refresh();
    }
  }
  if (servo1Pos < 30){
    servo1Pos = 30;
  }
  if (servo2Pos < 30){
    servo2Pos = 30;
  }
  if (servo3Pos < 30){
    servo3Pos = 30;
  }
  if (servo1Pos > 130){
    servo1Pos = 130;
  }
  if (servo2Pos > 130){
    servo2Pos = 130;
  }
  if (servo3Pos > 130){
    servo3Pos = 130;
  }
  servo1.write(servo1Pos-servo1Afwijking);
  servo2.write(servo2Pos-servo2Afwijking);
  servo3.write(servo3Pos-servo3Afwijking);
}

-------------------------------------------------------------------------

Precessing code:

import processing.serial.*;

Serial myPort;    // The serial port:

int servo1 = 0;
int servo2 = 0;
int servo3 = 0;
int serialBegin = 255;


void setup() {
  size(600,600);

  myPort = new Serial(this, Serial.list()[1], 115200);

frameRate(100);
noCursor();

}

void draw() {

  background(255);

triangle(width/2, height, 0, 200, width, 200);

servo1 = 100-int(dist(width/2,0,mouseX,mouseY)/6);
servo2 = 100-int(dist(0,height,mouseX,mouseY)/6);
servo3 = 100-int(dist(width,height,mouseX,mouseY)/6);
strokeWeight(3);
line(300,200,mouseX,mouseY);
line(150,400,mouseX,mouseY);
line(450,400,mouseX,mouseY);

println("X "+mouseX);
println("Y "+mouseY);

 


if (servo1 < 0){
  servo1=0;
}

if (servo2 <0){
  servo2=0;
}

if (servo3 <0){
  servo3=0;
}

if (mousePressed && (mouseButton == LEFT)) {
servo1 -= 20;
servo2 -= 20;
servo3 -= 20;
}
if (mousePressed && (mouseButton == RIGHT)) {
servo1 += 40;
servo2 += 40;
servo3 += 40;
}


//println("servo1 "+servo1);
//println("servo2 "+servo2);
//println("servo3 "+servo3);
//Serial.write
myPort.write(255);
//delay(10);
myPort.write(servo1+30);
//delay(10);
myPort.write(254);
//delay(10);
myPort.write(servo2+30);
//delay(10);
myPort.write(253);
//delay(10);
myPort.write(servo3+30);
//delay(10);

 

}

ezekiel181's picture
Excellent! Thanks a lot mjc. I have a pretty simple project in mind that a delta arm bot could do if I ever find the time to make it.
1220's picture
haha thats great! awesome work!
maneuver's picture

I really like how the top platform stay level at all time, but cant help but wonder, it can tilt, right?
Or is it always level, no matter what?

My head is slow today, so I cant figure it out myself right now...

ezekiel181's picture
It can`t tilt because of the parallel arms maneuver, but if you made it with 6 independant arms it could tilt and even twist. Check out the stewart platform on youtube, someone made a big one in their garage for a flight simulator using home built linear actuators.
mjcbruin's picture

Yes you're right about the parallel arms.
But the stewart platform is somewhat of a different principle right?
Is hasn’t the rotating "arms" at the base.
If you make a delta robot with six arms, I’m not sure it would work like a stewart platform because of the extra joint in the arm.
By the way, there are pick and place robots with four arms. And they function the same way as with three arms if I’m not mistaken.

http://www.youtube.com/watch?v=GTz1MAasQq8&feature=related

BaseOverApex's picture

Yeah, I think it's the same principle. The stewart platform is often made with linear actuators, but if you think about the way the rotating servos are arranged, they're doing exactly the same job as linear actuators. OKay, the maths will be slightly different, because once they slow down sinusoidally as they approach their extents.

Pretty sure the joints are just ball and socket joints.

BaseOverApex's picture

It's a nice piece of work. A little tweak to the maths and I imagine you could have it maintain its Y regardless of X and Z. I like to put names o nthings. I suppose it's a kind of tethered holonomic drive. A "Killough platform."

Imagine the applications. A few hundred miniaturised versions of this, arranged in an array and they could be used to maneuvre loads around in aircraft loading bays, for example, or pass widgets round a production line.

BaseOverApex's picture
In fact, with another 3 servos... I'm thinking "Stewart platform" - a miniature 6 DOF flight simulator...!
gr8 idea
Prettybird's picture
Not much on programming yet but it looks neat. Mabe a pair could make a new type of biped. Mabe even jump.
Thomas Countz's picture
This is great! If you can do this in a weekend, I'd love to seen some of your long term projects. Can't wait to see more of your robots!