Detach Servo When Not In Use

I have built a door lock actuator with an arduino, ethernet shield and and high torque servo.

The servo, as it draws ~ 7.2v is powered via a secondary battery pack (5*1.5v). As I would still like the door to be able to be opened with a key, and the servo will be connected to the lock, I am wondering is there an easy way to sever the power supply while the servo is not receiving a command? I assume I would need an extra switch of some sort, but I am not sure.

Attached is code, let me know if you need anymore information or if I missed anything.

L

#include <SPI.h>         // for Arduino later than ver 0018
#include <EthernetUdp.h>   // UDP library from bjoern@cs.stanford.edu
#include <Ethernet.h>
#include <Servo.h>

         
                         // source:  http://code.google.com/p/arduino/source/browse/trunk/libraries/?r=1094#libraries%2FEthernet 


//////////  NETWORK INFO  ////////////////

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};  //Set your Ethernet Shield's MAC address here - make sure you replace the ZZs with your shield's values!
byte ip[] = { 192,168,1,103 };    // Set your shield's desired IP address here - check your network for configuration details
byte gateway[] = { 192,168,1,1 };   //if you need to set a gateway IP
byte subnet[] = { 255,255,255,0 };    // Change this to your subnet address
  
unsigned int localPort = 7777;      // local port to listen on (set this the same as Port # on Ardumote Params Screen)


IPAddress iPhoneIP(192, 168, 1, 110);  //Set the iPhone/iPod/iPad's IP address to send messages back to Ardumote...
unsigned int iPhonePort = 7777;      //Set the Port # of the message table you configured in Ardumote (default is 7777)...


///////////////////////////////////////////

Servo lockservo;
///////// Pin Assignments /////////////////

int redled = 7;
int greenled = 6;  //Set LED_Pin to Pin 6 - Place an LED on Pin 6 of your ethernet shield for testing this code
int servo2 = 45;
int servo3 = 120;


///////////////////////////////////////////



///////////////// UDP Variables  ////////////////// 

// the next two variables are set when a packet is received
//byte remoteIp[4];          // holds received packet's originating IP
//unsigned int  remotePort;   // holds received packet's originating port

// buffers for receiving and sending data
char packBuff[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,

/////////////////////////////////////////////////


EthernetUDP Udp;


void setup() {
  
  // More info on Ethernet on Arduino's website:  http://arduino.cc/en/Reference/EthernetBegin
  // start the Ethernet and UDP:
  Ethernet.begin(mac,ip);   // If you don't need to set your default gateway or subnet manually, use this
//  Ethernet.begin(mac,ip,gateway,subnet);  // Use this line instead if you've manually set all the parameters
  
  
  Udp.begin(localPort);    //Setup UDP socket on port defined earlier

  Serial.begin(9600);    //Start Serial Communications with PC
   Serial.write("SYSTEM BOOT");   
  pinMode(redled,OUTPUT);
  pinMode(greenled,OUTPUT);    //Designate pin 6 as Output Pin
  lockservo.attach(5);
   lockservo.write(servo2);    
digitalWrite(greenled,HIGH);    //Turn off LED_Pin
}

void loop() 
{

  
  
  int pwmVal;    // Integer that will hold our PWM values for later use
  
  
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket(); // note that this includes the UDP header
  if(packetSize)
  {
    packetSize = packetSize - 8;      // subtract the 8 byte header
    Serial.print("Packet size: ");
    Serial.println(packetSize);

    // read the packet into packetBuffer and get the senders IP addr and port number
    Udp.read(packBuff,UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Message: ");
    Serial.println(packBuff);

  

 
 /* PWM - If we move a slider on Ardumote, it sends in a 3 digit value attached to the message of the slider.
 
     For example, if your message is set to be "PWM" and your slider is halfway set (slider value is 127),
     then your actual sent message will be received as "PWM127".  Therefore, to set the Pin's PWM value, you simply
     extract the last 3 digits of your message and use that as your PWM value (see below):
     
  */
    
    // Assuming our packBuff's contents at index values 3-5 are our PWM values, you can convert them to an int using this:
  
     pwmVal = (packBuff[3] - '0')*100 + (packBuff[4] - '0')*10 + (packBuff[5] - '0');    //Get PWMXXX message, and use XXX to set an int between 0 and 255.
 
 //////////////////////// Pin 6 (LED_Pin) /////////////////////////////////////       
        
    

    if (packBuff[0] = 'P' && packBuff[1]=='6' && packBuff[2]=='H')  // If we get the message "P6H", then set LED_Pin (6) HIGH
    {
      digitalWrite(greenled,LOW);    //Turn on LED_Pin
          lockservo.write(servo3);
       delay(1000);
      digitalWrite(redled,HIGH);    //Turn on LED_Pin
  
      Serial.println("Door is Locked");    //Write notification 
  
      Udp.beginPacket(iPhoneIP,iPhonePort);
      Udp.write("Door is Locked");    // Send Message back to iPhone
      Udp.endPacket();
  
  

    }
    
     
    
    else if (packBuff[0] = 'P' && packBuff[1]=='6' && packBuff[2]=='L')  // If we get the message "P6L", then set LED_Pin (6) LOW
    {
      digitalWrite(redled,LOW);    //Turn on LED_Pin
       lockservo.write(servo2);
       delay(1000);
      digitalWrite(greenled,HIGH);    //Turn off LED_Pin
  
      Serial.println("Door is Open");    //Write notification 
      lockservo.write(servo2);
      Udp.beginPacket(iPhoneIP, iPhonePort);
      Udp.write("Door is Open");    // Send Message back to iPhone
      Udp.endPacket();
      
    }   
    
    
  }
  
  delay(20);
}

I am wondering is there an easy way to sever the power supply while the servo is not receiving a command?

If the servo is not receiving a control signal, why would you want to sever the power?

zoomkat:

I am wondering is there an easy way to sever the power supply while the servo is not receiving a command?

If the servo is not receiving a control signal, why would you want to sever the power?

Battery life is an obvious reason I think...

Well, with the Arduino, when the external power supply is hooked up, even if the Arduino is not powered on, the servo maintains position, and will not move if i try and do so with my hand (without power supply, servo is easily moveable with my hand).

yes battery life, and the fact the the door lock (connected to the servo via some hardware) needs the be able to move (i.e. move the servo)

L

Sounds like you are using a digital servo. A "feature" of digital servos is they will still hold their position if the control signal is lost. Analog servos usually go limp when the control signal is lost. A servo that is not trying to hold position probably only uses power in the ma range.

yes, i believe I have a digital servo. With that in mind, is there anyway to switch the power supply on or off with the arduino?

you could control a transistor to switch power to the servo with a digital output?