Plotter - 3 servos

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.

Very impressive! :open_mouth:

Good work, man! :smiley:

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

please tell me how to do this!

i have 3 servo's kicking around

i am dying to use them ;D

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

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

Keep on the good work!

nice stuffs :slight_smile:

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:

#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.

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.

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

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

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.

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.

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

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!

your link doesnt work
mainly cos u got spaces in "arm plotter v2.rar" u cant use spaces in url's
most if not all browsers hate it.
"arm_plotter_v2.rar" would be a better way to go :wink:

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

yes you are right. I've used servo.read() to not create other variables and save some ram. There is no feedback form servos. The program sends position and then wait for a moment. Servos are quite fast and the program sends values which are +-1 degree compare to the last position so it takes very small amount of time to set the servos on the right position.

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.

for calibration I've measured angles manually.

new link: http://www.ezio.ovh.org/pliki/arm_plotter_v2.rar

P.S.
you can have the feedback from servos if you connect potentiometer from servo to the arduino's analog pin, but I haven't tried this.

Thank you very much. Your reply was most helpful.
I guess I'll implement it without feedback the way you did.

I'll be constructing, programming and so in the next couple of weeks.
Help me when I run into problems :wink: ?

Thanks again for replying (and for the link).

I've started new project.
This time it is a xy table, moved by steppers motors. It is working but I have to write better software.

Really impressive!!!!

Congratulations!