forked from andybarry/ardupilot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmotors.pde
212 lines (169 loc) · 5.55 KB
/
motors.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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
// 10 = 1 second
#define ARM_DELAY 20
#define DISARM_DELAY 20
#define AUTO_TRIM_DELAY 100
// called at 10hz
static void arm_motors()
{
static int16_t arming_counter;
// don't allow arming/disarming in anything but manual
if (g.rc_3.control_in > 0) {
arming_counter = 0;
return;
}
if ((control_mode > ACRO) && ((control_mode != TOY_A) && (control_mode != TOY_M))) {
arming_counter = 0;
return;
}
#if FRAME_CONFIG == HELI_FRAME
if ((motors.rsc_mode > 0) && (g.rc_8.control_in >= 10)){
arming_counter = 0;
return;
}
#endif // HELI_FRAME
#if TOY_EDF == ENABLED
int16_t tmp = g.rc_1.control_in;
#else
int16_t tmp = g.rc_4.control_in;
#endif
// full right
if (tmp > 4000) {
// increase the arming counter to a maximum of 1 beyond the auto trim counter
if( arming_counter <= AUTO_TRIM_DELAY ) {
arming_counter++;
}
// arm the motors and configure for flight
if (arming_counter == ARM_DELAY && !motors.armed()) {
////////////////////////////////////////////////////////////////////////////////
// Experimental AP_Limits library - set constraints, limits, fences, minima, maxima on various parameters
////////////////////////////////////////////////////////////////////////////////
#if AP_LIMITS == ENABLED
if (limits.enabled() && limits.required()) {
gcs_send_text_P(SEVERITY_LOW, PSTR("Limits - Running pre-arm checks"));
// check only pre-arm required modules
if (limits.check_required()) {
gcs_send_text_P(SEVERITY_LOW, PSTR("ARMING PREVENTED - Limit Breached"));
limits.set_state(LIMITS_TRIGGERED);
gcs_send_message(MSG_LIMITS_STATUS);
arming_counter++; // restart timer by cycling
}else{
init_arm_motors();
}
}else{
init_arm_motors();
}
#else // without AP_LIMITS, just arm motors
init_arm_motors();
#endif //AP_LIMITS_ENABLED
}
// arm the motors and configure for flight
if (arming_counter == AUTO_TRIM_DELAY && motors.armed()) {
auto_trim_counter = 250;
}
// full left
}else if (tmp < -4000) {
// increase the counter to a maximum of 1 beyond the disarm delay
if( arming_counter <= DISARM_DELAY ) {
arming_counter++;
}
// disarm the motors
if (arming_counter == DISARM_DELAY && motors.armed()) {
init_disarm_motors();
}
// Yaw is centered so reset arming counter
}else{
arming_counter = 0;
}
}
static void init_arm_motors()
{
// arming marker
// Flag used to track if we have armed the motors the first time.
// This is used to decide if we should run the ground_start routine
// which calibrates the IMU
static bool did_ground_start = false;
// disable failsafe because initialising everything takes a while
failsafe_disable();
//cliSerial->printf("\nARM\n");
#if HIL_MODE != HIL_MODE_DISABLED || CONFIG_HAL_BOARD == HAL_BOARD_AVR_SITL
gcs_send_text_P(SEVERITY_HIGH, PSTR("ARMING MOTORS"));
#endif
// we don't want writes to the serial port to cause us to pause
// mid-flight, so set the serial ports non-blocking once we arm
// the motors
hal.uartA->set_blocking_writes(false);
if (gcs3.initialised) {
hal.uartC->set_blocking_writes(false);
}
#if COPTER_LEDS == ENABLED
piezo_beep_twice();
#endif
// Remember Orientation
// --------------------
init_simple_bearing();
// Reset home position
// -------------------
if(ap.home_is_set)
init_home();
// all I terms are invalid
// -----------------------
reset_I_all();
if(did_ground_start == false) {
did_ground_start = true;
startup_ground();
}
#if HIL_MODE != HIL_MODE_ATTITUDE
// read Baro pressure at ground -
// this resets Baro for more accuracy
//-----------------------------------
init_barometer();
#endif
// temp hack
ap_system.motor_light = true;
digitalWrite(A_LED_PIN, LED_ON);
// go back to normal AHRS gains
ahrs.set_fast_gains(false);
#if SECONDARY_DMP_ENABLED == ENABLED
ahrs2.set_fast_gains(false);
#endif
// finally actually arm the motors
motors.armed(true);
set_armed(true);
// reenable failsafe
failsafe_enable();
}
static void init_disarm_motors()
{
#if HIL_MODE != HIL_MODE_DISABLED || CONFIG_HAL_BOARD == HAL_BOARD_AVR_SITL
gcs_send_text_P(SEVERITY_HIGH, PSTR("DISARMING MOTORS"));
#endif
motors.armed(false);
set_armed(false);
motors.auto_armed(false);
set_auto_armed(false);
compass.save_offsets();
g.throttle_cruise.save();
// we are not in the air
set_takeoff_complete(false);
#if COPTER_LEDS == ENABLED
piezo_beep();
#endif
// setup fast AHRS gains to get right attitude
ahrs.set_fast_gains(true);
#if SECONDARY_DMP_ENABLED == ENABLED
ahrs2.set_fast_gains(true);
#endif
}
/*****************************************
* Set the flight control servos based on the current calculated values
*****************************************/
static void
set_servos_4()
{
#if FRAME_CONFIG == TRI_FRAME
// To-Do: implement improved stability patch for tri so that we do not need to limit throttle input to motors
g.rc_3.servo_out = min(g.rc_3.servo_out, 800);
#endif
motors.output();
}