Go Down

Topic: Plotter - 3 servos (Read 12619 times) previous topic - next topic

eziosoft

Hi
This is my first post here.
I want to show you my simple "plotter".
it is not very precise because of the servos. But it works.
The software reads plt files (eg Corel Draw).
Software and source code I will send soon.

[media]http://www.youtube.com/watch?v=sGTdJ2Mnzj4[/media]
[media]http://www.youtube.com/watch?v=CBEa8y97hJc&feature=related[/media]


NetWorm

Very impressive! :O

Good work, man! :D

PaulS

Very clever. Very nice work. I'm impressed.

Ste Hughes

please tell me how to do this!

i have 3 servo's kicking around

i am dying to use them  ;D

eziosoft

Tomorrow will send the software and instructions on how to build it.

Otacon2k

I like it, produces the look of those "wiggly lines"-stiles in Google Sketchup...

Keep on the good work!

The_Bongmaster

B-dui in creation.

eziosoft

#7
Jan 20, 2010, 01:41 am Last Edit: Jan 20, 2010, 03:28 am by eziosoft Reason: 1
I can't make a picture (my camera doesn't work) so I've made some drawings.

draw 1:

draw 2:


Important:
-When arm is setted as shown on draw 2, servos have to be in their middle positions (90 degree)
-distance between servo 1 and servo 2 has to be the same as distance between servo 2 and servo 3
-length of the parts is not very important


I think that everyone here know how to connect servos to the arduino so I will not describe it.



Arduino code:
Code: [Select]
#include <Servo.h>

#define led0 13
#define Servo1Pin 17
#define Servo2Pin 18
#define Servo3Pin 19

Servo servo1;
Servo servo2;
Servo servo3;

byte s1=90;
byte s2=90;
byte s3=90;

byte DELAY=10;
boolean inProgress=false;

//#include <LiquidCrystal.h>
//LiquidCrystal lcd(12, 8, 7, 6, 5, 4, 2);

void setup()
{
  // lcd.begin(16,2);
 Serial.begin(9600);
 pinMode(led0,OUTPUT);
 attachServos();
}

void loop()
{

 digitalWrite(led0,inProgress);

 if(Serial.available())
 {

   if (Serial.read()==0xAA)
   {
     do{
     }
     while(Serial.available()<=4);
     //serwa
     s1=Serial.read();
     s2=Serial.read();
     s3=Serial.read();
     DELAY=Serial.read();
     inProgress=true;
   }
 }


   if (servo1.read()>s1) servo1.write(servo1.read()-1);
   if (servo1.read()<s1) servo1.write(servo1.read()+1);

   if (servo2.read()>s2) servo2.write(servo2.read()-1);
   if (servo2.read()<s2) servo2.write(servo2.read()+1);

   if (servo3.read()>s3) servo3.write(servo3.read()-1);
   if (servo3.read()<s3) servo3.write(servo3.read()+1);


   if (inProgress==true && servo1.read()==s1 && servo2.read()==s2 && servo3.read()==s3)
   {
     Serial.print(1,BYTE);
     inProgress=false;
   }

   delay(DELAY);
   
   /*
       lcd.clear();
       lcd.print(servo1.read(),DEC);
       lcd.print("-");
       lcd.print(s1,DEC);
       lcd.print(" ");
       lcd.print(servo2.read(),DEC);
        lcd.print("-");
       lcd.print(s2,DEC);
       lcd.setCursor(0,1);
       lcd.print(servo3.read(),DEC);
        lcd.print("-");
       lcd.print(s3,DEC);
       lcd.print(" ");
       lcd.print(DELAY,DEC);
       lcd.print(" ");
*/
 
}





/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void attachServos()
{
 
 servo1.attach(Servo1Pin);
 servo2.attach(Servo2Pin);
 servo3.attach(Servo3Pin);
}






and finally the PC software is here:
http://ezio.ovh.org/pliki/arm_plotter.rar

There is a file "settings.txt". You can set up and down limit of the servos to avoid destroy your arm.

[media]http://www.youtube.com/watch?v=8IS1pGwm_00[/media]

eziosoft

#8
Feb 03, 2010, 12:14 am Last Edit: Feb 03, 2010, 04:42 am by eziosoft Reason: 1
I've updated the software.
here is new version.
http://ezio.ovh.org/pliki/arm plotter v2.rar

It has better resolution. And I added excel sheet to calibrate servos outputs.

[media]http://www.youtube.com/watch?v=YYttzcBl_EM[/media]
[media]http://www.youtube.com/watch?v=hYDu0YdoYg8[/media]

aventgps

really impresive work........... makes my think....... going to give it a try............................. thanks for sharing......   :D

Nachtwind

very impressive thing... might have really a gooood idea on how to use it :0)


Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

A.Wafik

Hey man, very cool project. You should just work on the appearance of the arm more and it should be perfect.
How do u know that the servo has reached the required angle for a specific x,y location...before feeding the next angular position??
I really need[ch65279] to know how this is implemented.
Thanks.

eziosoft

#12
Feb 12, 2010, 01:56 pm Last Edit: Feb 12, 2010, 01:59 pm by eziosoft Reason: 1
Arduino sends one byte to confirm that it is ready for next position.

Full arduino code is here: http://ezio.ovh.org/pliki/arm plotter v2.rar

hope this helps

 if (inProgress==true && servo1.read()==s1 && servo2.read()==s2 && servo3.read()==s3)
   {
     Serial.print(1,BYTE);
     inProgress=false;
   }


appearance of the arm -
hmm well this is not very useful project. And this is only proof of concept. Servos are not very precise.

Andrew

I thought servo.read() only returned what angle you'd set it to - the servo doesn't have any way of returning it's actual physical position. Or am I wrong?

Andrew

A.Wafik

I'm confused as well. Can you kindly explain again from where do you get the measurement of the servo angle...when it doesn't have any feedback.
I really appreciate your help. It's essential for me to understand this, as I'm doing a somewhat similar project, and it's driving me nuts!

Go Up