Pages: [1]   Go Down
Author Topic: Urgent: How to "sleep" a servo motor when not in use  (Read 1243 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi guys,

I am controlling a servo motor using an arduino UNO R3.
The servo motor would rotate once every 6 hours using a timer.
How do I make the servo motor sleep when it has just rotated and wake up every 6 hours when it has to rotate?
Is there a code to do this?

I need this quite urgently.

Thanks.
« Last Edit: April 17, 2013, 10:58:36 pm by kurtselva » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

More info:

I am using an LCD display as well and I am making use of the "delay" command as the "timer".
The user would input a "1st hour" and a "current hour". The current time would then increase by 1 using the delay(3600000) which is 1 hour. when the current hour reaches the 1st hour, the servo will rotate. The next rotation time would be the 1st hour + 12 hours/8hours/6 hours (this depends on the user input as well). So the motor would then rotate again at the calculated time. In between, the servo does not do anything. But upon running the program, I understand that internally, the servo still running and could feel some vibration.

So I would like to know if it is possible to have a code to temporarily sleep the servo till its next rotation time.

Thanks.
Logged

0
Offline Offline
Tesla Member
***
Karma: 141
Posts: 9470
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
So I would like to know if it is possible to have a code to temporarily sleep the servo till its next rotation time.

You might try the servo.detach(); function to stop the control signal to the servo.
Logged

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   smiley-cool

South Texas
Offline Offline
Edison Member
*
Karma: 8
Posts: 1024
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

If you power off the servo it will jump, possibly on power off, and definately on power on. Also - with power removed it might not hold position ans the motor would have no holding torque. How much power does it use when sitting?

A DC motor or a stepper motor through some gear reduction might be a better choice as they could both be powered off.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 98
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
So I would like to know if it is possible to have a code to temporarily sleep the servo till its next rotation time.

You might try the servo.detach(); function to stop the control signal to the servo.

Ok, Then if I want to turn it back on just before the motor is required to rotate, is it servo.attach(); ?

I have attached a part of my code below:
Code:
       if (feedfrequencyperday == 2)                                                  // freq input is 2
        {
          lcd.setCursor(9,3);
          lcd.print(totalfeedforfeedfrequencyperday2);                                 // total number of feed (freq x
days)

          for (runninghour = currenthour; runninghour <= 24; runninghour++)             // runninghour acts
as hour clock value
          {
            if (feeddone == totalfeedforfeedfrequencyperday2)                         // total number of feeds
   completed
            {

              setCounter = 0;                                                       // stop running the program
            }
            else if (feeddone < totalfeedforfeedfrequencyperday2)                   // feeds not completed
            {
              if (runninghour == 24)                                                         //if runninghour = 24, reset to 0 (just
like hour clock)
              {
                lcd.setCursor(13,2);
                lcd.print("  ");
                runninghour = 0;
              }
              lcd.setCursor(13,2);
              lcd.print(runninghour);                                                        

              if (runninghour == firstfeedhour)                                              // when runninghour value reaches the firstfeedhour
              {          
                servo();                                                             // servo rotates
                feeddone++;                                                         // feeddone will increase by 1
     whenever servo rotates
                lcd.setCursor(17,3);
                lcd.print(feeddone);


              }
              secondfeedhour = firstfeedhour + 12;                                              // 2nd feed hour calculated
              if (secondfeedhour < 24)
              {
                newsecondfeedhour = secondfeedhour;
              }

              else if (secondfeedhour >= 24)
              {
                newsecondfeedhour = secondfeedhour - 24;
              }
              if (runninghour == newsecondfeedhour)                                // when runninghour reaches 2nd feed hour, servo rotates
              {
                servo();
                feeddone++;                                                        // feeddone value increases
                lcd.setCursor (17,3);
                lcd.print(feeddone);

              }
              delay (3600000);                                                  // delay func acts as the timer
                                                                             // every 1 hr interval, the
runninghour value (hour clock) will increase by 1
for test purpose, 2000ms interval used
            }

and the servo code is:
Code:
void servo()
{
  
  for (int i= 0; i < 1; i ++)
  {
    for(servoposition = 0; servoposition < 180; servoposition += 1)        // goes from 0 degrees to 180
     degrees
    {                                                                            // in steps of 1 degree
      myservo.write(servoposition);                            // tell servo to go to position in variable 'pos'
      delay(15);                                                               // waits 15ms for the servo to reach the position
    }
    for(servoposition = 180; servoposition>=1; servoposition-=1)           // goes from 180 degrees to 0
            degrees
    {                                
      myservo.write(servoposition);                       // tell servo to go to position in variable 'pos'
      delay(15);                                                           // waits 15ms for the servo to reach the position
    }
  }
}


So would it be correct to use the detach command at the end of the servo code?
Logged

0
Offline Offline
Tesla Member
***
Karma: 141
Posts: 9470
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Servo test code with the detach/attach function.

Code:
// zoomkat 10-14-11 serial servo test
// type servo position 500 to 2500 in serial monitor
// type in number <500 to detach servo
// for IDE 0022 and later
// Powering a servo from the arduino usually DOES NOT WORK.

String readString;
#include <Servo.h>
Servo myservo;  // create servo object to control a servo

void setup() {
  Serial.begin(9600);
  myservo.writeMicroseconds(2000); //set initial servo position if desired
  myservo.attach(7);  //the pin for the servo control
  Serial.println("servo-test-22"); // so I can keep track of what is loaded
}

void loop() {
  while (Serial.available()) {
    char c = Serial.read();  //gets one byte from serial buffer
    readString += c; //makes the string readString
    delay(2);  // allow buffer to fill with next character
    }

  if (readString.length() >0) {
    Serial.println(readString);  //so you can see the captured string
    int n = readString.toInt();
   
    if (n < 500) {
      myservo.detach();
    }
    else {
       myservo.attach(7);
       myservo.writeMicroseconds(n); //convert readString to number for servo
    }
    readString=""; //empty for next input
  }
}


Code:
// Controlling a servo position using a potentiometer (variable resistor)
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

#include <Servo.h>
 
Servo myservo;  // create servo object to control a servo
 
const int potpin = A0;  // analog pin used to connect the potentiometer
const int servoPin = 9;

int lastVal = 0;    // variable to read the value from the analog pin
unsigned long timeOfLastChange = 0;
 
void setup()
{
}
 
void loop()
{
  int val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
  if (val != lastVal)
    {
    myservo.attach(9);  // attaches the servo on pin 9 to the servo object
    myservo.write(val);                  // sets the servo position according to the scaled value
    delay(15);                           // waits for the servo to get there
    timeOfLastChange = millis();
    lastVal = val;
    }
  else if (millis() - timeOfLastChange > 500)
    {
    myservo.detach();
    }
}

Logged

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   smiley-cool

South Texas
Offline Offline
Edison Member
*
Karma: 8
Posts: 1024
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Servo attach/dettach has no effect on power to the servo.  It might lower the power consumption partially because it is sending to control signal, but the servo is still powerred.
Logged

0
Offline Offline
Tesla Member
***
Karma: 141
Posts: 9470
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
It might lower the power consumption partially because it is sending to control signal, but the servo is still powered.

I guess the terms "sleep a servo motor" should be more technically defined. There have been other previous discussions of removing total power from a servo. when a servo is detached there should not be any control signal going to the servo control chip, which would result in the servo h-bridge not receiving any control pulses, resulting in the servo motor not receiving any power, which could be equated to the motor being "asleep". The servo chip and the pot in the servo are using some power anytime the servo itself is receiving power.
Logged

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   smiley-cool

Pages: [1]   Go Up
Jump to: