// Designed for Skull Quadcopter// Rev 1.0#include <Servo.h>#include <PinChangeInt.h>// Define RX variables #define PIN1 2#define PIN1dataReg PIND#define pin1state (PIN1dataReg & (1 << PIN1))volatile long pulseStart1; // pulse start time measured from millies in ISR for pin 1volatile long pulseTime1; // pulse width time measured from millies in ISR for pin 1 <-- this is the output we requireServo myservo; // create servo object to control a servo int pos = 0; // variable to store the servo position // Define Microswitch pinsconst int msdown = 5;const int msup = 4;int msdownstate = 0; int msupstate = 0;// Define Variables for LEDsint led1 = 6; // output pin for LED 1int led2 = 7; // output pin for LED 2int led3 = 8; // output pin for LED 3int led4 = 9; // output pin for LED 4int led13 = 13; // onboard LED indictor incase no others are attachedunsigned long time; // holds current time for change of stateint flashtime = 400; // time to flash LEDs in millisecondsboolean ledon = false; // remembers start of LEDboolean movedown = true; // safety feature boolean moveup = true; // safety feature// The below procedure handles the pulse from the RX inputvoid handlePin1() { if(pin1state) pulseStart1=micros(); // we got a positive edge else pulseTime1=micros()-pulseStart1; // Negative edge: get pulsewidth } // LED Control - very basic, can be expanded. void turnledoff() { digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); digitalWrite(led13, LOW); } void turnledon() { digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); digitalWrite(led13, HIGH); } void flashled() { // LED Flash if (millis() - time > flashtime){ time = millis(); if (ledon){ turnledoff(); ledon = false; } else { turnledon(); ledon = true; } } }// Lets set everything upvoid setup() { // initialize serial communication at 115200 bits per second so we can see whats going on: Serial.begin(115200); pinMode(PIN1, INPUT); // Initialize rx input pin digitalWrite(PIN1, HIGH); // Set the rx pin to High to start the counter PCintPort::attachInterrupt(PIN1, &handlePin1, CHANGE); // Attach the interrupt pinMode(led1, OUTPUT); // Assign output mode to pin for LED 1 pinMode(led2, OUTPUT); // Assign output mode to pin for LED 2 pinMode(led3, OUTPUT); // Assign output mode to pin for LED 3 pinMode(led4, OUTPUT); // Assign output mode to pin for LED 4 pinMode(led13, OUTPUT); // Assign output mode to pin for LED 4 pinMode(msup, INPUT); pinMode(msdown, INPUT); msupstate = digitalRead(msup); msdownstate = digitalRead(msdown); time = millis(); // Save current millis reading (this is a counter that always runs in milliseconds) turnledon(); }// Main Programvoid loop() { msupstate = digitalRead(msup); msdownstate = digitalRead(msdown); // read the input channels if (pulseTime1 > 900 && pulseTime1 < 1300){ //legs down myservo.attach(3); pos = 0; moveup = true; if (msupstate == LOW){ if (movedown){myservo.write(pos);} flashtime = 200; flashled(); } else { movedown = false; myservo.detach(); turnledon(); } } if (pulseTime1 > 1299 && pulseTime1 < 1701){ //no movement myservo.detach(); pos = 100; } if (pulseTime1 > 1700) { //legs up myservo.attach(3); pos = 180; movedown = true; if (msdownstate == LOW){ if (moveup) {myservo.write(pos);} flashtime = 200; flashled(); } else { moveup = false; turnledon(); myservo.detach(); } } }
If you are running a NAZA then this will power the RX when you plug it in. I also power my arduino via the 7.2v dc-dc mini board that's used to get a better transition speed on the servo.