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);
}