|
|
|
@ -1,20 +1,20 @@
@@ -1,20 +1,20 @@
|
|
|
|
|
/* |
|
|
|
|
Example of RC_Channel library. |
|
|
|
|
Code by Jason Short. 2010 |
|
|
|
|
DIYDrones.com |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
* Example of RC_Channel library. |
|
|
|
|
* Code by Jason Short. 2010 |
|
|
|
|
* DIYDrones.com |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include <FastSerial.h> |
|
|
|
|
#include <AP_Common.h> // ArduPilot Mega Common Library |
|
|
|
|
#include <AP_Common.h> // ArduPilot Mega Common Library |
|
|
|
|
#include <Arduino_Mega_ISR_Registry.h> |
|
|
|
|
#include <AP_Math.h> // ArduPilot Mega Vector/Matrix math Library |
|
|
|
|
#include <APM_RC.h> // ArduPilot Mega RC Library |
|
|
|
|
#include <RC_Channel.h> // ArduPilot Mega RC Library |
|
|
|
|
#include <APM_RC.h> // ArduPilot Mega RC Library |
|
|
|
|
#include <RC_Channel.h> // ArduPilot Mega RC Library |
|
|
|
|
|
|
|
|
|
// define APM1 or APM2 |
|
|
|
|
#define APM_HARDWARE_APM1 1 |
|
|
|
|
#define APM_HARDWARE_APM2 2 |
|
|
|
|
#define APM_HARDWARE_APM1 1 |
|
|
|
|
#define APM_HARDWARE_APM2 2 |
|
|
|
|
|
|
|
|
|
// set your hardware type here |
|
|
|
|
#define CONFIG_APM_HARDWARE APM_HARDWARE_APM2 |
|
|
|
@ -37,9 +37,9 @@ FastSerialPort3(Serial3); // Telemetry port
@@ -37,9 +37,9 @@ FastSerialPort3(Serial3); // Telemetry port
|
|
|
|
|
// RC Hardware |
|
|
|
|
//////////////////////////////////////////// |
|
|
|
|
#if CONFIG_APM_HARDWARE == APM_HARDWARE_APM2 |
|
|
|
|
APM_RC_APM2 APM_RC; |
|
|
|
|
APM_RC_APM2 APM_RC; |
|
|
|
|
#else |
|
|
|
|
APM_RC_APM1 APM_RC; |
|
|
|
|
APM_RC_APM1 APM_RC; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
RC_Channel rc_1; |
|
|
|
@ -62,219 +62,219 @@ RC_Channel rc_8;
@@ -62,219 +62,219 @@ RC_Channel rc_8;
|
|
|
|
|
|
|
|
|
|
void setup() |
|
|
|
|
{ |
|
|
|
|
Serial.begin(115200); |
|
|
|
|
Serial.println("ArduPilot RC Channel test"); |
|
|
|
|
APM_RC.Init( &isr_registry ); // APM Radio initialization |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
delay(500); |
|
|
|
|
|
|
|
|
|
// setup radio |
|
|
|
|
|
|
|
|
|
// read eepom or set manually |
|
|
|
|
/* |
|
|
|
|
rc_1.radio_min = 1100; |
|
|
|
|
rc_1.radio_max = 1900; |
|
|
|
|
|
|
|
|
|
rc_2.radio_min = 1100; |
|
|
|
|
rc_2.radio_max = 1900; |
|
|
|
|
|
|
|
|
|
rc_3.radio_min = 1100; |
|
|
|
|
rc_3.radio_max = 1900; |
|
|
|
|
|
|
|
|
|
rc_4.radio_min = 1100; |
|
|
|
|
rc_4.radio_max = 1900; |
|
|
|
|
|
|
|
|
|
// or |
|
|
|
|
|
|
|
|
|
rc_1.load_eeprom(); |
|
|
|
|
rc_2.load_eeprom(); |
|
|
|
|
rc_3.load_eeprom(); |
|
|
|
|
rc_4.load_eeprom(); |
|
|
|
|
rc_5.load_eeprom(); |
|
|
|
|
rc_6.load_eeprom(); |
|
|
|
|
rc_7.load_eeprom(); |
|
|
|
|
rc_8.load_eeprom(); |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
// interactive setup |
|
|
|
|
setup_radio(); |
|
|
|
|
|
|
|
|
|
print_radio_values(); |
|
|
|
|
|
|
|
|
|
// set type of output, symmetrical angles or a number range; |
|
|
|
|
rc_1.set_angle(4500); |
|
|
|
|
rc_1.set_dead_zone(80); |
|
|
|
|
rc_2.set_angle(4500); |
|
|
|
|
rc_2.set_dead_zone(80); |
|
|
|
|
rc_3.set_range(0,1000); |
|
|
|
|
rc_3.set_dead_zone(20); |
|
|
|
|
rc_3.scale_output = .8; // gives more dynamic range to quads |
|
|
|
|
rc_4.set_angle(6000); |
|
|
|
|
rc_4.set_dead_zone(500); |
|
|
|
|
rc_5.set_range(0,1000); |
|
|
|
|
rc_5.set_filter(false); |
|
|
|
|
rc_6.set_range(200,800); |
|
|
|
|
rc_7.set_range(0,1000); |
|
|
|
|
rc_8.set_range(0,1000); |
|
|
|
|
|
|
|
|
|
for (byte i = 0; i < 30; i++){ |
|
|
|
|
read_radio(); |
|
|
|
|
} |
|
|
|
|
rc_1.trim(); |
|
|
|
|
rc_2.trim(); |
|
|
|
|
rc_4.trim(); |
|
|
|
|
Serial.begin(115200); |
|
|
|
|
Serial.println("ArduPilot RC Channel test"); |
|
|
|
|
APM_RC.Init( &isr_registry ); // APM Radio initialization |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
delay(500); |
|
|
|
|
|
|
|
|
|
// setup radio |
|
|
|
|
|
|
|
|
|
// read eepom or set manually |
|
|
|
|
/* |
|
|
|
|
* rc_1.radio_min = 1100; |
|
|
|
|
* rc_1.radio_max = 1900; |
|
|
|
|
* |
|
|
|
|
* rc_2.radio_min = 1100; |
|
|
|
|
* rc_2.radio_max = 1900; |
|
|
|
|
* |
|
|
|
|
* rc_3.radio_min = 1100; |
|
|
|
|
* rc_3.radio_max = 1900; |
|
|
|
|
* |
|
|
|
|
* rc_4.radio_min = 1100; |
|
|
|
|
* rc_4.radio_max = 1900; |
|
|
|
|
* |
|
|
|
|
* // or |
|
|
|
|
* |
|
|
|
|
* rc_1.load_eeprom(); |
|
|
|
|
* rc_2.load_eeprom(); |
|
|
|
|
* rc_3.load_eeprom(); |
|
|
|
|
* rc_4.load_eeprom(); |
|
|
|
|
* rc_5.load_eeprom(); |
|
|
|
|
* rc_6.load_eeprom(); |
|
|
|
|
* rc_7.load_eeprom(); |
|
|
|
|
* rc_8.load_eeprom(); |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
// interactive setup |
|
|
|
|
setup_radio(); |
|
|
|
|
|
|
|
|
|
print_radio_values(); |
|
|
|
|
|
|
|
|
|
// set type of output, symmetrical angles or a number range; |
|
|
|
|
rc_1.set_angle(4500); |
|
|
|
|
rc_1.set_dead_zone(80); |
|
|
|
|
rc_2.set_angle(4500); |
|
|
|
|
rc_2.set_dead_zone(80); |
|
|
|
|
rc_3.set_range(0,1000); |
|
|
|
|
rc_3.set_dead_zone(20); |
|
|
|
|
rc_3.scale_output = .8; // gives more dynamic range to quads |
|
|
|
|
rc_4.set_angle(6000); |
|
|
|
|
rc_4.set_dead_zone(500); |
|
|
|
|
rc_5.set_range(0,1000); |
|
|
|
|
rc_5.set_filter(false); |
|
|
|
|
rc_6.set_range(200,800); |
|
|
|
|
rc_7.set_range(0,1000); |
|
|
|
|
rc_8.set_range(0,1000); |
|
|
|
|
|
|
|
|
|
for (byte i = 0; i < 30; i++) { |
|
|
|
|
read_radio(); |
|
|
|
|
} |
|
|
|
|
rc_1.trim(); |
|
|
|
|
rc_2.trim(); |
|
|
|
|
rc_4.trim(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void loop() |
|
|
|
|
void loop() |
|
|
|
|
{ |
|
|
|
|
delay(20); |
|
|
|
|
read_radio(); |
|
|
|
|
print_pwm(); |
|
|
|
|
delay(20); |
|
|
|
|
read_radio(); |
|
|
|
|
print_pwm(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void read_radio() |
|
|
|
|
{ |
|
|
|
|
rc_1.set_pwm(APM_RC.InputCh(CH_1)); |
|
|
|
|
rc_2.set_pwm(APM_RC.InputCh(CH_2)); |
|
|
|
|
rc_3.set_pwm(APM_RC.InputCh(CH_3)); |
|
|
|
|
rc_4.set_pwm(APM_RC.InputCh(CH_4)); |
|
|
|
|
rc_5.set_pwm(APM_RC.InputCh(CH_5)); |
|
|
|
|
rc_6.set_pwm(APM_RC.InputCh(CH_6)); |
|
|
|
|
rc_7.set_pwm(APM_RC.InputCh(CH_7)); |
|
|
|
|
rc_8.set_pwm(APM_RC.InputCh(CH_8)); |
|
|
|
|
//Serial.printf_P(PSTR("OUT 1: %d\t2: %d\t3: %d\t4: %d \n"), rc_1.control_in, rc_2.control_in, rc_3.control_in, rc_4.control_in); |
|
|
|
|
rc_1.set_pwm(APM_RC.InputCh(CH_1)); |
|
|
|
|
rc_2.set_pwm(APM_RC.InputCh(CH_2)); |
|
|
|
|
rc_3.set_pwm(APM_RC.InputCh(CH_3)); |
|
|
|
|
rc_4.set_pwm(APM_RC.InputCh(CH_4)); |
|
|
|
|
rc_5.set_pwm(APM_RC.InputCh(CH_5)); |
|
|
|
|
rc_6.set_pwm(APM_RC.InputCh(CH_6)); |
|
|
|
|
rc_7.set_pwm(APM_RC.InputCh(CH_7)); |
|
|
|
|
rc_8.set_pwm(APM_RC.InputCh(CH_8)); |
|
|
|
|
//Serial.printf_P(PSTR("OUT 1: %d\t2: %d\t3: %d\t4: %d \n"), rc_1.control_in, rc_2.control_in, rc_3.control_in, rc_4.control_in); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void print_pwm() |
|
|
|
|
{ |
|
|
|
|
Serial.print("ch1 "); |
|
|
|
|
Serial.print(rc_1.control_in, DEC); |
|
|
|
|
Serial.print("\tch2: "); |
|
|
|
|
Serial.print(rc_2.control_in, DEC); |
|
|
|
|
Serial.print("\tch3 :"); |
|
|
|
|
Serial.print(rc_3.control_in, DEC); |
|
|
|
|
Serial.print("\tch4 :"); |
|
|
|
|
Serial.print(rc_4.control_in, DEC); |
|
|
|
|
Serial.print("\tch5 :"); |
|
|
|
|
Serial.print(rc_5.control_in, DEC); |
|
|
|
|
Serial.print("\tch6 :"); |
|
|
|
|
Serial.print(rc_6.control_in, DEC); |
|
|
|
|
Serial.print("\tch7 :"); |
|
|
|
|
Serial.print(rc_7.control_in, DEC); |
|
|
|
|
Serial.print("\tch8 :"); |
|
|
|
|
Serial.println(rc_8.control_in, DEC); |
|
|
|
|
Serial.print("ch1 "); |
|
|
|
|
Serial.print(rc_1.control_in, DEC); |
|
|
|
|
Serial.print("\tch2: "); |
|
|
|
|
Serial.print(rc_2.control_in, DEC); |
|
|
|
|
Serial.print("\tch3 :"); |
|
|
|
|
Serial.print(rc_3.control_in, DEC); |
|
|
|
|
Serial.print("\tch4 :"); |
|
|
|
|
Serial.print(rc_4.control_in, DEC); |
|
|
|
|
Serial.print("\tch5 :"); |
|
|
|
|
Serial.print(rc_5.control_in, DEC); |
|
|
|
|
Serial.print("\tch6 :"); |
|
|
|
|
Serial.print(rc_6.control_in, DEC); |
|
|
|
|
Serial.print("\tch7 :"); |
|
|
|
|
Serial.print(rc_7.control_in, DEC); |
|
|
|
|
Serial.print("\tch8 :"); |
|
|
|
|
Serial.println(rc_8.control_in, DEC); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
void |
|
|
|
|
print_radio_values() |
|
|
|
|
{ |
|
|
|
|
Serial.print("CH1: "); |
|
|
|
|
Serial.print(rc_1.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_1.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH2: "); |
|
|
|
|
Serial.print(rc_2.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_2.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH3: "); |
|
|
|
|
Serial.print(rc_3.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_3.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH4: "); |
|
|
|
|
Serial.print(rc_4.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_4.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH5: "); |
|
|
|
|
Serial.print(rc_5.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_5.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH6: "); |
|
|
|
|
Serial.print(rc_6.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_6.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH7: "); |
|
|
|
|
Serial.print(rc_7.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_7.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH8: "); |
|
|
|
|
Serial.print(rc_8.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_8.radio_max, DEC); |
|
|
|
|
Serial.print("CH1: "); |
|
|
|
|
Serial.print(rc_1.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_1.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH2: "); |
|
|
|
|
Serial.print(rc_2.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_2.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH3: "); |
|
|
|
|
Serial.print(rc_3.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_3.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH4: "); |
|
|
|
|
Serial.print(rc_4.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_4.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH5: "); |
|
|
|
|
Serial.print(rc_5.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_5.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH6: "); |
|
|
|
|
Serial.print(rc_6.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_6.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH7: "); |
|
|
|
|
Serial.print(rc_7.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_7.radio_max, DEC); |
|
|
|
|
|
|
|
|
|
Serial.print("CH8: "); |
|
|
|
|
Serial.print(rc_8.radio_min, DEC); |
|
|
|
|
Serial.print(" | "); |
|
|
|
|
Serial.println(rc_8.radio_max, DEC); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
setup_radio() |
|
|
|
|
{ |
|
|
|
|
Serial.println("\n\nRadio Setup:"); |
|
|
|
|
uint8_t i; |
|
|
|
|
|
|
|
|
|
for(i = 0; i < 100;i++){ |
|
|
|
|
delay(20); |
|
|
|
|
read_radio(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
rc_1.radio_min = rc_1.radio_in; |
|
|
|
|
rc_2.radio_min = rc_2.radio_in; |
|
|
|
|
rc_3.radio_min = rc_3.radio_in; |
|
|
|
|
rc_4.radio_min = rc_4.radio_in; |
|
|
|
|
rc_5.radio_min = rc_5.radio_in; |
|
|
|
|
rc_6.radio_min = rc_6.radio_in; |
|
|
|
|
rc_7.radio_min = rc_7.radio_in; |
|
|
|
|
rc_8.radio_min = rc_8.radio_in; |
|
|
|
|
|
|
|
|
|
rc_1.radio_max = rc_1.radio_in; |
|
|
|
|
rc_2.radio_max = rc_2.radio_in; |
|
|
|
|
rc_3.radio_max = rc_3.radio_in; |
|
|
|
|
rc_4.radio_max = rc_4.radio_in; |
|
|
|
|
rc_5.radio_max = rc_5.radio_in; |
|
|
|
|
rc_6.radio_max = rc_6.radio_in; |
|
|
|
|
rc_7.radio_max = rc_7.radio_in; |
|
|
|
|
rc_8.radio_max = rc_8.radio_in; |
|
|
|
|
|
|
|
|
|
rc_1.radio_trim = rc_1.radio_in; |
|
|
|
|
rc_2.radio_trim = rc_2.radio_in; |
|
|
|
|
rc_4.radio_trim = rc_4.radio_in; |
|
|
|
|
// 3 is not trimed |
|
|
|
|
rc_5.radio_trim = 1500; |
|
|
|
|
rc_6.radio_trim = 1500; |
|
|
|
|
rc_7.radio_trim = 1500; |
|
|
|
|
rc_8.radio_trim = 1500; |
|
|
|
|
|
|
|
|
|
Serial.println("\nMove all controls to each extreme. Hit Enter to save:"); |
|
|
|
|
while(1){ |
|
|
|
|
|
|
|
|
|
delay(20); |
|
|
|
|
// Filters radio input - adjust filters in the radio.pde file |
|
|
|
|
// ---------------------------------------------------------- |
|
|
|
|
read_radio(); |
|
|
|
|
|
|
|
|
|
rc_1.update_min_max(); |
|
|
|
|
rc_2.update_min_max(); |
|
|
|
|
rc_3.update_min_max(); |
|
|
|
|
rc_4.update_min_max(); |
|
|
|
|
rc_5.update_min_max(); |
|
|
|
|
rc_6.update_min_max(); |
|
|
|
|
rc_7.update_min_max(); |
|
|
|
|
rc_8.update_min_max(); |
|
|
|
|
|
|
|
|
|
if(Serial.available() > 0){ |
|
|
|
|
//rc_3.radio_max += 250; |
|
|
|
|
Serial.flush(); |
|
|
|
|
|
|
|
|
|
Serial.println("Radio calibrated, Showing control values:"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return; |
|
|
|
|
Serial.println("\n\nRadio Setup:"); |
|
|
|
|
uint8_t i; |
|
|
|
|
|
|
|
|
|
for(i = 0; i < 100; i++) { |
|
|
|
|
delay(20); |
|
|
|
|
read_radio(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
rc_1.radio_min = rc_1.radio_in; |
|
|
|
|
rc_2.radio_min = rc_2.radio_in; |
|
|
|
|
rc_3.radio_min = rc_3.radio_in; |
|
|
|
|
rc_4.radio_min = rc_4.radio_in; |
|
|
|
|
rc_5.radio_min = rc_5.radio_in; |
|
|
|
|
rc_6.radio_min = rc_6.radio_in; |
|
|
|
|
rc_7.radio_min = rc_7.radio_in; |
|
|
|
|
rc_8.radio_min = rc_8.radio_in; |
|
|
|
|
|
|
|
|
|
rc_1.radio_max = rc_1.radio_in; |
|
|
|
|
rc_2.radio_max = rc_2.radio_in; |
|
|
|
|
rc_3.radio_max = rc_3.radio_in; |
|
|
|
|
rc_4.radio_max = rc_4.radio_in; |
|
|
|
|
rc_5.radio_max = rc_5.radio_in; |
|
|
|
|
rc_6.radio_max = rc_6.radio_in; |
|
|
|
|
rc_7.radio_max = rc_7.radio_in; |
|
|
|
|
rc_8.radio_max = rc_8.radio_in; |
|
|
|
|
|
|
|
|
|
rc_1.radio_trim = rc_1.radio_in; |
|
|
|
|
rc_2.radio_trim = rc_2.radio_in; |
|
|
|
|
rc_4.radio_trim = rc_4.radio_in; |
|
|
|
|
// 3 is not trimed |
|
|
|
|
rc_5.radio_trim = 1500; |
|
|
|
|
rc_6.radio_trim = 1500; |
|
|
|
|
rc_7.radio_trim = 1500; |
|
|
|
|
rc_8.radio_trim = 1500; |
|
|
|
|
|
|
|
|
|
Serial.println("\nMove all controls to each extreme. Hit Enter to save:"); |
|
|
|
|
while(1) { |
|
|
|
|
|
|
|
|
|
delay(20); |
|
|
|
|
// Filters radio input - adjust filters in the radio.pde file |
|
|
|
|
// ---------------------------------------------------------- |
|
|
|
|
read_radio(); |
|
|
|
|
|
|
|
|
|
rc_1.update_min_max(); |
|
|
|
|
rc_2.update_min_max(); |
|
|
|
|
rc_3.update_min_max(); |
|
|
|
|
rc_4.update_min_max(); |
|
|
|
|
rc_5.update_min_max(); |
|
|
|
|
rc_6.update_min_max(); |
|
|
|
|
rc_7.update_min_max(); |
|
|
|
|
rc_8.update_min_max(); |
|
|
|
|
|
|
|
|
|
if(Serial.available() > 0) { |
|
|
|
|
//rc_3.radio_max += 250; |
|
|
|
|
Serial.flush(); |
|
|
|
|
|
|
|
|
|
Serial.println("Radio calibrated, Showing control values:"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return; |
|
|
|
|
} |