forked from AeroQuad/AeroQuad
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFlightCommand.pde
140 lines (127 loc) · 4.93 KB
/
FlightCommand.pde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
AeroQuad v2.5 Beta 1 - July 2011
www.AeroQuad.com
Copyright (c) 2011 Ted Carancho. All rights reserved.
An Open Source Arduino based multicopter.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// FlightCommand.pde is responsible for decoding transmitter stick combinations
// for setting up AeroQuad modes such as motor arming and disarming
void readPilotCommands() {
receiver.read();
// Read quad configuration commands from transmitter when throttle down
if (receiver.getRaw(THROTTLE) < MINCHECK) {
zeroIntegralError();
throttleAdjust = 0;
//receiver.adjustThrottle(throttleAdjust);
// Disarm motors (left stick lower left corner)
if (receiver.getRaw(YAW) < MINCHECK && armed == ON) {
armed = OFF;
motors.commandAllMotors(MINCOMMAND);
#if defined(APM_OP_CHR6DM) || defined(ArduCopter)
digitalWrite(LED_Red, LOW);
#endif
}
// Zero Gyro and Accel sensors (left stick lower left, right stick lower right corner)
if ((receiver.getRaw(YAW) < MINCHECK) && (receiver.getRaw(ROLL) > MAXCHECK) && (receiver.getRaw(PITCH) < MINCHECK)) {
gyro.calibrate(); // defined in Gyro.h
accel.calibrate(); // defined in Accel.h
//accel.setOneG(accel.getFlightData(ZAXIS));
#if defined(AeroQuadMega_CHR6DM) || defined(APM_OP_CHR6DM)
flightAngle->calibrate();
#endif
zeroIntegralError();
motors.pulseMotors(3);
// ledCW() is currently a private method in BatteryMonitor.h, fix and agree on this behavior in next revision
//#if defined(BattMonitor) && defined(ArduCopter)
// ledCW(); ledCW(); ledCW();
//#endif
#ifdef ArduCopter
zero_ArduCopter_ADC();
#endif
}
// Arm motors (left stick lower right corner)
if (receiver.getRaw(YAW) > MAXCHECK && armed == OFF && safetyCheck == ON) {
zeroIntegralError();
armed = ON;
#if defined(APM_OP_CHR6DM) || defined(ArduCopter)
digitalWrite(LED_Red, HIGH);
#endif
for (byte motor = FRONT; motor < LASTMOTOR; motor++)
motors.setMinCommand(motor, MINTHROTTLE);
// delay(100);
//altitude.measureGround();
}
// Prevents accidental arming of motor output if no transmitter command received
if (receiver.getRaw(YAW) > MINCHECK) safetyCheck = ON;
}
// Get center value of roll/pitch/yaw channels when enough throttle to lift off
if (receiver.getRaw(THROTTLE) < 1300) {
receiver.setTransmitterTrim(ROLL, receiver.getRaw(ROLL));
receiver.setTransmitterTrim(PITCH, receiver.getRaw(PITCH));
receiver.setTransmitterTrim(YAW, receiver.getRaw(YAW));
//receiver.setZero(ROLL, receiver.getRaw(ROLL));
//receiver.setZero(PITCH, receiver.getRaw(PITCH));
//receiver.setZero(YAW, receiver.getRaw(YAW));
}
#ifdef RateModeOnly
flightMode = ACRO;
#else
// Check Mode switch for Acro or Stable
if (receiver.getRaw(MODE) > 1500) {
if (flightMode == ACRO) {
#if defined(AeroQuad_v18) || defined(AeroQuadMega_v2) || defined(AeroQuadMega_Wii)
digitalWrite(LED2PIN, HIGH);
#endif
zeroIntegralError();
}
flightMode = STABLE;
}
else {
#if defined(AeroQuad_v18) || defined(AeroQuadMega_v2)
if (flightMode == STABLE)
digitalWrite(LED2PIN, LOW);
#endif
flightMode = ACRO;
}
#endif
#if defined(APM_OP_CHR6DM) || defined(ArduCopter)
if (flightMode == ACRO) {
digitalWrite(LED_Yellow, HIGH);
digitalWrite(LED_Green, LOW);
}
else if (flightMode == STABLE) {
digitalWrite(LED_Green, HIGH);
digitalWrite(LED_Yellow, LOW);
}
#endif
#ifdef AltitudeHold
if (receiver.getRaw(AUX) < 1750) {
if (altitudeHold != ALTPANIC ) { // check for special condition with manditory override of Altitude hold
if (storeAltitude == ON) {
holdAltitude = altitude.getData();
holdThrottle = receiver.getData(THROTTLE);
PID[ALTITUDE].integratedError = 0;
PID[ALTITUDE].lastPosition = holdAltitude; // add to initialize hold position on switch turn on.
//accel.setOneG(accel.getFlightData(ZAXIS)); // AKA need to fix this
storeAltitude = OFF;
}
altitudeHold = ON;
}
// note, Panic will stay set until Althold is toggled off/on
}
else {
storeAltitude = ON;
altitudeHold = OFF;
}
#endif
}