Go Down

Topic: I need code to run to modified 360 degrees servo motors. (Read 24656 times) previous topic - next topic

AWOL

Quote
Are you telling me that you can make 9g servos work as normal DCs without modifying the electronics?

I don't understand that sentence

biotech

AWOL

Hi, as you may see English is not my first language.

That sentence was ment to be a question for Zoomkat asking him if I can use 9g servos for continuous rotation without modifying the electronics.

I really hope I didn´t sound rude or anything like that...All of you but especially Zoomkat are being extremly helpful in helping me to get started.

Regards.

AWOL

Some servos allow you to modify them for continuous rotation without removing the pot; either the pot shaft is sawn off or otherwise disengaged from the output shaft, or in some case you can leave the pot in circuit, but just shorten its legs, so that the pot shaft is  disengaged from the output shaft. Remember to centre the pot before closing-up.

I've never come across a mod that allows the pot to be left in place, because usually the pot itself will be incapable of 360 degree rotation.

If you're using resistors, say the pot is a 5k device, then two 2k2 or two 2k7 resistors should be soldered in its place, remembering to solder the junction of the two resistors to where the wiper was connected.

biotech

AWOL

Believe it or not I finally got there! What Zoomkat and yourself told me about the fact that is not necessary to remove the pot made a big difference to me. I just got a normal servo and removed all the gears, and without touching the electronics I got the motor of the servo turning continuously to one direction and then to the other as instructed.

The only thing remaining is why I can´t use the serial monitor feature. When I open Tools in there Serial Monitor is greyed out. It's set to port 6 but as I am uning an Adafruit motor shield in the codes I put "myservo.attach (9)". So I think I should change serial monitor from port 6 to 9 to be able to see the values. Am I right?  But as I mentioned, serial monitor is set to port 6 and greyed out. All in all, I can download the codes but I can´t see the values when the servos are running.

If you also know something about this particular subjet please let me know. Many thanks!

AWOL

Quote
I put "myservo.attach (9)". So I think I should change serial monitor from port 6 to 9 to be able to see the values.

Your COM port has got nothing to do with what pin your servo is attached to.

zoomkat


I've never come across a mod that allows the pot to be left in place, because usually the pot itself will be incapable of 360 degree rotation.


Many servos like the one below have a collar insert that is used to connect the pot and servo gearing. Removing the collar and stop tab is all that is needed for the mod. In other servos the gearing has a slot for the pot shaft. This slot can be drilled out round to prevent the pot moving with the gearing.

Google forum search: Use Google Search box in upper right side of this page.
Why I like my 2005 Rio Yellow Honda S2000  https://www.youtube.com/watch?v=pWjMvrkUqX0

biotech

Zoomkat,

Thank you for the pic and detailed explanation. I will try to get those kind of servos and see how they work.

I was trying to do things that are not always necessary with the electronics of the servo. Thanks a lot for your pathience during my starting up with Arduino!

Let´s see how it goes during the next days that I will be trying new things.

Regards.

eightbittrip

I am working on a robot platform made by vex. it is a skid steer platform driven by two continuously rotating servos. I have added a regular servo to pan a ping sensor. so far I have been able to get it moving forward at equal speeds per side and I have the pan servo working for the ping sensor. working hard to figure out how I am going to cause a reaction from the ping sensor to avoid obstacles. for now here is my code so far, it sounds like it may be similar to the type of platform discussed here.

#include <Servo.h>

Servo myservopan;  // create servo object to control a servo
Servo myservorightdrive;
Servo myservoleftdrive;

int pos = 0;    // variable to store the servo position

void setup()
{
  myservopan.attach(9);
  myservorightdrive.attach(2);
  myservoleftdrive.attach(3);
}


void loop()
{
  for(pos = 0; pos < 90; pos += 1)  // goes from 0 degrees to 90 degrees
  {                                  // in steps of 1 degree
    myservopan.write(pos);              // tell servo to go to position in variable 'pos'
    delay(20);
  }
  for(pos = 90; pos>=1; pos-=1)     // goes from 90 degrees to 0 degrees
  {                               
    myservopan.write(pos);              // tell servo to go to position in variable 'pos'
    delay(20);                       // waits 20ms for the servo to reach the position
  }
  for(pos = 90; pos>=60; pos-=1)
  {
    myservorightdrive.write(pos);
    delay(1);
  }
  for(pos = 90; pos < 130; pos += 1)
  {
    myservoleftdrive.write(pos);
    delay(1);
  }
}

eightbittrip

#23
Jun 01, 2012, 04:14 am Last Edit: Jun 01, 2012, 08:24 am by AWOL Reason: 1
well I have got mine working nice.. it is a ping pan roam robot. uses an ultrasonic prox sensor "parallax" mounted to a servo that pans it left and right. during a late night search for some similar arduino code I hit the jackpot. I don't know who originally created it as I have omitted and rewritten notes along with the header showing that info, thanks whoever you are. "oops". here it is :)



Code: [Select]
#include <Servo.h> //include Servo library

const int RForward = 65; //speed value of drive servo, value 0 for full speed rotation
const int RBackward = 130; //speed value of drive servo, value 180 for full speed rotation
const int LForward = RBackward; //the servos must rotate in opposite directions in order to drive in the same direction
const int LBackward = RForward; //the servos must rotate in opposite directions in order to drive in the same direction
const int RNeutral = 95; //value 90 for center, my servo is a little off
const int LNeutral = 95; //value 90 for center, my servo is a little off
const int pingPin = 7;  //signal pin on parallax ping sensor connected to this arduino pin "remember the ping sensor is 5V, not source"
const int irPin = 0;  //Sharp infrared sensor connected to this arduino pin "not currently used"
const int dangerThresh = 20; //threshold for obstacles (in cm), this was 10 by default
int leftDistance, rightDistance; //distances on either side
Servo panMotor; //servo that pans the ping sensor
Servo leftMotor;  //continuous rotation servo that drives the left wheel
Servo rightMotor; //continuous rotation servo that drives the right wheel
long duration; //time it takes to recieve PING))) signal

void setup()
{
 rightMotor.attach(11); //signal wire on right countinuous rotation "drive" servo connected to this arduino pin
 leftMotor.attach(10);  //signal wire on left continuous rotation "drive servo connected to this arduino pin
 panMotor.attach(6); //signal wire on pan servo for ping sensor connected to this arduino pin
 panMotor.write(90); //set PING))) pan to center "90 by default"
}

void loop()
{
 int distanceFwd = ping(); //ping stright ahead
 if (distanceFwd>dangerThresh) //if the path is clear
 {
   leftMotor.write(LForward); //move forward
   rightMotor.write(RForward); //move forward
 }
 else //if path is blocked
 {
   leftMotor.write(LNeutral); //stop left drive motor
   rightMotor.write(RNeutral); //stop right drive motor
   panMotor.write(0); //turn ping sensor right, 0 for full right
   delay(500);        //wait this many milliseconds
   rightDistance = ping(); //ping
   delay(500);  //wait this many milliseconds
   panMotor.write(170); //turn ping sensor left, 180 for full right "my servo hits stop limit and binds at 180"
   delay(500);  //wait this many milliseconds
   leftDistance = ping(); //ping
   delay(500);  //wait this many milliseconds
   panMotor.write(83); //return to center, "90 by default" my servo is off center
   delay(100);  //wait this many milliseconds
   compareDistance(); //compare the two distances measured
 }
}
 
void compareDistance()
{
 if (leftDistance>rightDistance) //if left is less obstructed
 {
   leftMotor.write(LBackward); //rotate left drive servo bacward "skid steer"
   rightMotor.write(RForward); //rotate right drive servo forward "skid steer"
   delay(1000); //run motors this many milliseconds
 }
 else if (rightDistance>leftDistance) //if right is less obstructed
 {
   leftMotor.write(LForward); //rotate left drive servo forward "skid steer"
   rightMotor.write(RBackward); //rotate right drive servo backward "skid steer"
   delay(1000);  //run motors this many milliseconds
 }
  else //if they are equally obstructed
 {
   leftMotor.write(LForward); //rotate left drive servo forward
   rightMotor.write(RBackward); //rotate right drive servo backward
   delay(2000); //run motors this many milliseconds
 }
}


Moderator edit: [font=Verdana][[/font]code] [font=Verdana][[/font]/code] tags added

biotech

Eightbittrip,

Thank your for the code.  I will be trying it on the Arduino during the weekend. Wish me good luck!


eightbittrip

#25
Jun 03, 2012, 04:13 am Last Edit: Jun 03, 2012, 02:17 pm by AWOL Reason: 1
I have tinkered with that code some more and added two "bump" switches to my bot. my ping sensor has good response approaching objects head on, however while approaching objects at near parallel angles it doesn't see them. bot has a wide platform and the ping sensor has a narrow field :(  A friend had a great idea also. Wrapping a length of wire several times around the positive wire to each drive servo could induce a small current flow with respect to ground. this could be used for current sensing for overload protection :) my next goal is to find a way to smooth out the start/stop speed of my servos. they shift directions rapidly.  best of luck to you on your bot this weekend, I am sure you will need to tinker with the values that return the servos to center or stop position... here is my latest code.

Code: [Select]

//remember that the power for the servos comes from the voltage source, not the arduino board. only the signal wire "white or yellow" //is connected to the arduino board. no motor shield required .
//notes are written after these forward slashes to help explain the code
//IRpin and sharp ir sensor not working yet, ignore for now...

#include <Servo.h> //include Servo library information from arduino folder
const int RForward = 47; //speed value of drive servo, value 0 for full speed rotation
const int RBackward = 180; //speed value of drive servo, value 180 for full speed rotation
const int LForward = RBackward; //servos rotate opposite directions to drive in same direction
const int LBackward = RForward; //servos rotate opposite directions to drive in same direction
const int RNeutral = 95; //value 90 is default for center "stop", my servo is a little off
const int LNeutral = 95; //continuous rotation servo center "stop" position
const int pingPin = 7;  //signal pin on parallax ping sensor connected to arduino pin 7
const int dangerThresh = 40; //threshold limit for obstacles (in cm), 10 by default
const int IRpin = A0;  //Sharp infrared sensor connected to arduino pin analog 0
int switchPin = 2;  // normally open bumper switch connected to arduino pin 2 and ground
int leftDistance, rightDistance; //store values for later use to compare ping readings
Servo panMotor; //servo that pans the ping sensor
Servo leftMotor;  //continuous rotation servo that drives the left wheel
Servo rightMotor; //continuous rotation servo that drives the right wheel

long duration; //time it takes to recieve PING))) signal
void setup()
{
 rightMotor.attach(11); //right drive servo signal wire connected to arduino pin 11
 leftMotor.attach(10);  //left drive servo signal wire connected to arduino pin 10
 panMotor.attach(6); //pan servo for ping sensor connected to arduino pin 6
 pinMode(switchPin, INPUT);  //N.O. bumper switch connected to pin 2 and ground
 digitalWrite(switchPin, HIGH);// turns on 20k pullup resistor so switchPin will read HIGH unless triggered LOW
 pinMode(IRpin, INPUT); // set anolog pin 0 as sharp infrared sensor input
 float volts=analogRead(IRpin)*0.0048828125; ;  //read voltage from sharp ir sensor
 float distance = 65*pow(volts, -1.10);  //calculate distance from voltage reading above
 panMotor.write(83); //set PING))) sensor pan angle to center "90 by default"
}

void loop()  //after setup do these actions in a countinuous loop
{
 int distanceFwd = ping(); //ping stright ahead continuously and store the reading for comparison
 if (digitalRead(switchPin) == HIGH  && distanceFwd>dangerThresh) //if switch reads high and ping is greater distance than threshold
 
 {
   leftMotor.write(LForward); //move forward
   rightMotor.write(RForward); //move forward
 }
 else //otherwise if the path is blocked
 {
   leftMotor.write(LNeutral); //stop left drive motor
   rightMotor.write(RNeutral); //stop right drive motor
   panMotor.write(20); //turn ping sensor right, 0 for full right
   delay(300);        //wait this many milliseconds for servo to reach position
   rightDistance = ping(); //ping and calculate distance
   delay(100);  //wait this many milliseconds to store the measurement
   panMotor.write(135); //turn ping sensor left, 180 for full left
   delay(300);  //wait this many milliseconds for servo to reach position
   leftDistance = ping(); //ping and calculate distance
   delay(100);  //wait this many millisecondsto store measurement
   panMotor.write(83); //return to center, 90 for center
   delay(300);  //wait this many milliseconds for servo to reach position
   compareDistance(); //move on to next step "compare distance"
 }
}
 
void compareDistance()
{
 if (leftDistance>rightDistance) //if left is less obstructed
 {
   leftMotor.write(LBackward); //rotate left drive servo backward
   rightMotor.write(RForward); //rotate right drive servo forward
   delay(400); //run motors this many milliseconds
 }
 else if (rightDistance>leftDistance) //otherwise if right is less obstructed
 {
   leftMotor.write(LForward); //rotate left drive servo forward
   rightMotor.write(RBackward); //rotate right drive servo backward
   delay(400);  //run motors this many milliseconds
 }
  else //otherwise if they are equally obstructed
 {
   leftMotor.write(LForward); //rotate left drive servo forward
   rightMotor.write(RBackward); //rotate right drive servo backward
   delay(1500); //run motors this many milliseconds
 }
}


Moderator edit: code tags added. Again.

oric_dan

I find the code example given to be rather complex. Just to find the neutral
point, I would write a 4-line for-loop program that stepped the servo pulsewidth
from 1450-1550 usec in 1-usec steps with a 100-msec delay at the end of the
loop and a Serial.print(pulsewidth); statement inside the loop.

Then I would know the neutral point in about 2-minutes.

Jantje

The way I do it:
I use the pot in the servo solution:
With the pot reachable and not yet fixed I connect the servo to the Arduino who is programmed in the 0 position.
I turn the pot till the servo stands still
I glue/fix the pot so it can not move anymore.
Job done

Best regards
Jantje
Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

eightbittrip

Rewrote code a little more with some help from oric_dan(333), thanks  :D still working on how to smooth out the servo movements. my servos start/stop/and reverse directions too rapidly. I am worried that this will damage them eventually :~
my continuous rotation servos were made by vex robotics. they were originally designed to rotate continuously so I have never taken them apart, instead I just changes the settings in the code. the suggestions above are great if you are modifying normal servos. I have used the method of centering the potentiometer and glue it in place while the servo is hooked up and receiving a "center" signal, works great. here is my latest code 8)

flore1nr

When I was testing my servos at first I was confused as well because they would keep spinning even when I told them to stop. I would suggest keep doing some basic arduino examples. Depending on the type of servos you have if its a continuous motor 0 writes one direction 180 the other and 90 writes the servo to stop. Also make sure that if the program is telling the servo to stop then it should stop there should be a built in potentiometer that you can adjust with a screwdriver to center the servo to make the servo stop when it should be stopped.

Go Up