remote_key.pde
/* remote-key.pde
Eric Ayars
1/13/12
Remote laser key-switch program. Given a logic-level signal, this
program (with the associated circuit and a servo) uses the servo
to turn the key-switch on a laser interlock thus allowing remote
operation of the system.
Uses Ilya Brutman's Servo8Bit library:
https://github.com/fri000/Servo8Bit
Written for use with the MIT High-Low-Tech ATtiny45/85 Arduino cores
and the Arduino IDE. See http://hlt.media.mit.edu/?p=1695
*/
#include "Servo8Bit.h"
#define SIG 0 // signal from computer at PB0
#define SERVO 1 // servo is attached to PB1
#define LED 4 // indicator LED attached to PB4
// These definitions will have to be changed to match the actual
// key positions needed. Numbers roughly correspond to degrees.
#define ON_ACT 5
#define ON_REST 10
#define OFF_ACT 105
#define OFF_REST 100
// The following is somewhat arbitrary: it should be longer than the time
// it takes the servo to move from one position to the other.
#define CLICK_DELAY 1000
byte oldSignal, newSignal; // used to track changes in signal line.
Servo8Bit servo; // create a servo object
void turnOn() {
/* Both turnOn() and turnOff() turn the key PAST the rest position,
wait a moment, then turn back to the "rest" position for that
state. The idea here is to ensure that the key reaches the desired
position without leaving the servo in a position of continued
stress.
*/
servo.write(ON_ACT);
digitalWrite(LED, HIGH);
delay(CLICK_DELAY);
servo.write(ON_REST);
} // end turnOn()
void turnOff() { // See comment in turnOn()
servo.write(OFF_ACT);
digitalWrite(LED, LOW);
delay(CLICK_DELAY);
servo.write(OFF_REST);
} // end turnOff()
void setup() {
/* Only 3 lines are actually used:
one for the signal --- high turns servo to on position
one for the LED --- LED turns on/off echoing position of servo
one for the servo itself.
*/
pinMode(SIG, INPUT); // Signal line is an input
pinMode(LED, OUTPUT); // LED line is an output
oldSignal = digitalRead(SIG); // Figure out initial state
servo.attach(SERVO);
if (oldSignal) { // Ensure that servo is in the
turnOn(); // position that the computer
} else { // believes it to be.
turnOff();
}
} // end setup()
void loop() {
newSignal = digitalRead(SIG); // Read the signal now
if (newSignal != oldSignal) { // If it's different than it was...
if (newSignal) { // ...then make the servo state
turnOn(); // match the signal state.
} else {
turnOff();
}
oldSignal = newSignal; // The circle of life...
}
// Assume we don't need to change the switch more than 5x/second.
delay(200);
} // end loop()
Generated by GNU enscript 1.6.4.