Pages: [1]   Go Down
Author Topic: Servo Jitter  (Read 3093 times)
0 Members and 1 Guest are viewing this topic.
USA, FL
Offline Offline
God Member
*****
Karma: 14
Posts: 686
A life? Where can I download one of those?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have a robotic head with eyelids and eyes that are controlled by servos.  Eyelids have one servo each and eyes move left-right by a servo as well as up-down by a servo.  The up-down, left-right is currently being controlled by a parallax joystick.  My problem is that if I comment out the portion of the code for the joystick, the jitter stops.  The jitter is pretty significant jumping.  Like the code is delaying for a second at a time.  But I have no delay.  Right now everything is on a breadboard, except for the servos.

I am teaching myself C programming and any advice if this jitter is code related would be most helpful.  

UPDATE:  Fixed the -80 that AWOL mentioned.

Code:
#include <Servo.h>

#define trigPin 8   //sets trigger pin on HC-SR04
#define echoPin 9   //sets Echo pin "
Servo righteyelid;  //sets name of Right Eye
Servo lefteyelid;   //sets name of Left Eye
int pos = 0;        

Servo EyeUpDown;  // create servo object to control a servo
Servo EyeLeftRight;  // create servo object to control a servo

int potpin = A1;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin
int potpin2 = A2;  // analog pin used to connect the potentiometer
int val2;    // variable to read the value from the analog pin

void setup() {
  Serial.begin (9600);
  EyeUpDown.attach(46);  // attaches the servo on pin to the servo object
  EyeLeftRight.attach(48);   // attaches the servo on pin to the servo object
  righteyelid.attach(50);// attaches servo on Right Eye Lid
  lefteyelid.attach(52); // attaches servo on Left Eye LID
  pinMode(trigPin,OUTPUT);
}

void loop() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  //delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;         //Calculates how far an object is
  
  //Open and close eye lids based on distance measurement from Sensor
  
  if (distance <= 10)                     //if distance is less than 10 cm, close eye lids
  {
    Serial.print(distance);
    Serial.println(" cm");
    righteyelid.write(60);                //Closed postion of Right Eye
    lefteyelid.write(135);                //Closed position of Left Eye
  }
  else
  {
    Serial.print(distance);
    Serial.println(" cm");
    righteyelid.write(95);               //open postion of Right Eye
    lefteyelid.write(96);                //open postion of Left Eye
  }
  {
    val = analogRead(potpin);              // reads the value of the potentiometer (value between 0 and 1023)
    val = map(val, 40, 1023, 40, 170);      // scale it to use it with the servo (value between 0 and 180)
    EyeUpDown.write(val);                    // sets the servo position according to the scaled value

    val2 = analogRead(potpin2);            // reads the value of the potentiometer (value between 0 and 1023)
    val2 = map(val2, 0, 1023, 40, 150);   // scale it to use it with the servo (value between 0 and 180)
    EyeLeftRight.write(val2);                  // sets the servo position according to the scaled value
  }
}



* IMG_0608.JPG (1975.15 KB, 2592x1936 - viewed 67 times.)
« Last Edit: August 20, 2012, 03:09:04 pm by codlink » Logged

//LiNK

Global Moderator
UK
Offline Offline
Brattain Member
*****
Karma: 240
Posts: 24464
I don't think you connected the grounds, Dave.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

-80 seems (is) a very unlikely value to be returned by an analogRead.
Why are you mapping it like that?

Meanwhile, how are the servos powered?
Logged

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

USA, FL
Offline Offline
God Member
*****
Karma: 14
Posts: 686
A life? Where can I download one of those?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sorry the -80 was an alignment problem.  Should have corrected that before I posted the code.  

Servos are powered by an adjustable bench power supply running at ~7v.  I tried changing the voltages from 5-9v, but doesn't make a difference.
« Last Edit: August 20, 2012, 03:10:20 pm by codlink » Logged

//LiNK

UK
Offline Offline
Shannon Member
****
Karma: 184
Posts: 11197
-
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


My problem is that if I comment out the portion of the code for the joystick, the jitter stops.


The jitter stopping is a problem? What jitter is this?
Logged

I only provide help via the forum - please do not contact me for private consultancy.

USA, FL
Offline Offline
God Member
*****
Karma: 14
Posts: 686
A life? Where can I download one of those?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The jitter stops on all servos when the joystick portion is commented out.  Obviously, those servos don't work but the eyelid servos work perfectly.  So I believe it has something to do with the code for the joystick.  It maybe just noise.  I wanted to see if anyone had any comments about this code.
Logged

//LiNK

Rapa Nui
Offline Offline
Edison Member
*
Karma: 53
Posts: 1991
Pukao hats cleaning services
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

..the joystick value could easily jump  +/-3 when using longer wires.. try to connect 100nF capacitors onto analog inputs (analog input--100nF--GND)..
Logged

UK
Offline Offline
Shannon Member
****
Karma: 184
Posts: 11197
-
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The jitter stops on all servos when the joystick portion is commented out.  Obviously, those servos don't work but the eyelid servos work perfectly.  So I believe it has something to do with the code for the joystick.  It maybe just noise.  I wanted to see if anyone had any comments about this code.

Which is the 'joystick portion' you refer to? I noticed there is a block of code around the call to analogRead(potpin) which is in a block for no apparent reason. Is this the code which provokes the problem?
Logged

I only provide help via the forum - please do not contact me for private consultancy.

USA, FL
Offline Offline
God Member
*****
Karma: 14
Posts: 686
A life? Where can I download one of those?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hmm..  I feel like an idiot.. I have my youngest child starting kindergarten today.

Anyway,  I had it backwards.  I can comment out the below code and the joystick portion works fine with NO jitters/jumps.    Is it the Serial.print that could be a problem?  Maybe the "calls(?)" to the HC-SR04 (Ultrasonic sensor)?

Code:
int duration, distance;
  digitalWrite(trigPin, HIGH);
  //delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;         //Calculates how far an object is
 
  //Open and close eye lids based on distance measurement from Sensor
 
  if (distance <= 10)                     //if distance is less than 10 cm, close eye lids
  {
    Serial.print(distance);
    Serial.println(" cm");
    righteyelid.write(60);                //Closed postion of Right Eye
    lefteyelid.write(135);                //Closed position of Left Eye
  }
  else
  {
    Serial.print(distance);
    Serial.println(" cm");
    righteyelid.write(95);               //open postion of Right Eye
    lefteyelid.write(96);                //open postion of Left Eye
  }
Logged

//LiNK

Global Moderator
UK
Offline Offline
Brattain Member
*****
Karma: 240
Posts: 24464
I don't think you connected the grounds, Dave.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Could be time outs.
Have a look around for teckel's sonar library
Logged

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

USA, FL
Offline Offline
God Member
*****
Karma: 14
Posts: 686
A life? Where can I download one of those?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks AWOL, I will take a look. 

Thanks for the help!
Logged

//LiNK

USA, FL
Offline Offline
God Member
*****
Karma: 14
Posts: 686
A life? Where can I download one of those?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

..the joystick value could easily jump  +/-3 when using longer wires.. try to connect 100nF capacitors onto analog inputs (analog input--100nF--GND)..

Tried the Caps but no luck.  The wires right now are ~6in jumper wires on a breadboard.  It could be just noise as I have other things connected.  But nothing high voltage.

Could be time outs.
Have a look around for teckel's sonar library

Also implemented his library with no luck on getting the jitters out. 

Revised Code:

Code:
#include <Servo.h>
#include <NewPing.h>

#define TRIGGER_PIN  8  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     9  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

unsigned int pingSpeed = 50; // How frequently are we going to send out a ping (in milliseconds). 50ms would be 20 times a second.
unsigned long pingTimer;     // Holds the next ping time.

Servo righteyelid;
Servo lefteyelid;     

Servo EyeUpDown;
Servo EyeLeftRight;

int potpin = A1;   // analog pin used to connect the potentiometer
int val;           // variable to read the value from the analog pin
int potpin2 = A5;  // analog pin used to connect the potentiometer
int val2;          // variable to read the value from the analog pin

void setup() {
  Serial.begin (115200);
  EyeUpDown.attach(46);
  EyeLeftRight.attach(48);
  righteyelid.attach(50);    // attaches servo on Right Eye Lid
  lefteyelid.attach(52);     // attaches servo on Left Eye Lid
}

void loop() {
  unsigned int uS = sonar.ping();     // Send ping, get ping time in microseconds (uS).
  Serial.print("Ping: ");
  Serial.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");

  if (uS / US_ROUNDTRIP_CM <= 8 && uS / US_ROUNDTRIP_CM > 0)         //if distance is less than 8 cm, close eye lids
  {
    righteyelid.write(60);                //Closed postion of Right Eye
    lefteyelid.write(135);                //Closed position of Left Eye
  }
  else
  {
    righteyelid.write(95);                //open postion of Right Eye
    lefteyelid.write(96);                 //open postion of Left Eye
  }
  {
    val = analogRead(potpin);             // reads the value of the potentiometer (value between 0 and 1023)
    val = map(val, 0, 1023, 40, 170);     // scale it to use it with the servo (value between 0 and 180)
    EyeUpDown.write(val);                 // sets the servo position according to the scaled value

    val2 = analogRead(potpin2);            // reads the value of the potentiometer (value between 0 and 1023)
    val2 = map(val2, 0, 1023, 40, 150);    // scale it to use it with the servo (value between 0 and 180)
    EyeLeftRight.write(val2);              // sets the servo position according to the scaled value
  }
}
Logged

//LiNK

UK
Offline Offline
Shannon Member
****
Karma: 184
Posts: 11197
-
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Are you saying the jitter occurs when you read the ultrasonic sensor?

I don't know how you're accessing the sensor, but does it involve disabling interrupts? I think the Servo library relies on timer interrupts. If this is the problem, you could probably reproduce it by setting all the servos to a constant position and then just reading the sensor repeatedly. I don't know how you would resolve it, but one option might be to detach the servos while you take a reading.
Logged

I only provide help via the forum - please do not contact me for private consultancy.

USA, FL
Offline Offline
God Member
*****
Karma: 14
Posts: 686
A life? Where can I download one of those?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Are you saying the jitter occurs when you read the ultrasonic sensor?

I don't know how you're accessing the sensor, but does it involve disabling interrupts? I think the Servo library relies on timer interrupts. If this is the problem, you could probably reproduce it by setting all the servos to a constant position and then just reading the sensor repeatedly. I don't know how you would resolve it, but one option might be to detach the servos while you take a reading.

I think you may have realized my problem.  I have read on this forum about the servo library and the ultrasonic sensor using Interrupts.  I do not know which Interrupt Servo library is using.  I just skimmed through the library and I know that my 4 servos are on one interrupt.  I just don't know which one..  I am using the Mega...  If I could get some hints on where to look in the library would be beneficial for my understanding.

If I can find out which interrupt the Mega is running the servos, I am sure I could find the NewPing library interrupts and see if I can change them.

I have attached the Servo library.

* Servo.cpp (12.23 KB - downloaded 12 times.)
* Servo.h (5.53 KB - downloaded 11 times.)
Logged

//LiNK

Pages: [1]   Go Up
Jump to: