[intermcu] PX4: Dial down baud after start up period

closes #1587
This commit is contained in:
kevindehecker
2016-03-30 12:14:52 +02:00
committed by Felix Ruess
parent 138e370dd2
commit e477cdf1ac
7 changed files with 85 additions and 24 deletions
+1 -1
View File
@@ -116,7 +116,7 @@
radio="radios/FrSky3dr.xml" radio="radios/FrSky3dr.xml"
telemetry="telemetry/default_rotorcraft_slow.xml" telemetry="telemetry/default_rotorcraft_slow.xml"
flight_plan="flight_plans/TUDELFT/tudelft_delft_basic.xml" flight_plan="flight_plans/TUDELFT/tudelft_delft_basic.xml"
settings="settings/rotorcraft_basic.xml settings/control/rotorcraft_guidance.xml [settings/control/stabilization_att_int_quat.xml] settings/control/stabilization_indi.xml" settings="settings/rotorcraft_basic.xml settings/control/rotorcraft_guidance.xml [settings/control/stabilization_att_int_quat.xml] settings/control/stabilization_indi.xml settings/estimation/body_to_imu.xml"
settings_modules="modules/geo_mag.xml modules/air_data.xml modules/gps_ubx_ucenter.xml" settings_modules="modules/geo_mag.xml modules/air_data.xml modules/gps_ubx_ucenter.xml"
gui_color="#ffffcccaccca" gui_color="#ffffcccaccca"
/> />
+2 -2
View File
@@ -35,7 +35,7 @@
</subsystem> </subsystem>
<subsystem name="intermcu" type="uart"> <subsystem name="intermcu" type="uart">
<configure name="INTERMCU_PORT" value="UART6" /> <configure name="INTERMCU_PORT" value="UART6" />
<configure name="INTERMCU_BAUD" value="B1500000" /> <configure name="INTERMCU_BAUD" value="B1500000" /> <!-- This is only during first 10s start up, afterwards it is set to 230400-->
</subsystem> </subsystem>
</firmware> </firmware>
<firmware name="rotorcraft"> <firmware name="rotorcraft">
@@ -58,7 +58,7 @@
<define name="RC_LOST_FBW_MODE" value="FBW_MODE_FAILSAFE" /> <define name="RC_LOST_FBW_MODE" value="FBW_MODE_FAILSAFE" />
<!-- Switch to Failsafe or to Autopilot on RC loss? --> <!-- Switch to Failsafe or to Autopilot on RC loss? -->
<define name="RC_LOST_IN_AUTO_FBW_MODE" value="FBW_MODE_AUTO" /> <define name="RC_LOST_IN_AUTO_FBW_MODE" value="FBW_MODE_AUTO" />
<define name="AP_LOST_FBW_MODE" value="FBW_MODE_MANUAL" /> <define name="AP_LOST_FBW_MODE" value="FBW_MODE_FAILSAFE" />
<!-- Switch to Failsafe or to Manual on AP loss? --> <!-- Switch to Failsafe or to Manual on AP loss? -->
<define name="INTERMCU_LOST_CNT" value="100" /> <define name="INTERMCU_LOST_CNT" value="100" />
<subsystem name="intermcu" type="uart"> <subsystem name="intermcu" type="uart">
+24 -7
View File
@@ -37,19 +37,17 @@
#include "subsystems/actuators/motor_mixing.h" #include "subsystems/actuators/motor_mixing.h"
#endif #endif
#include "subsystems/electrical.h" #include "subsystems/electrical.h"
#include "subsystems/radio_control.h" #include "subsystems/radio_control.h"
#include "subsystems/intermcu/intermcu_fbw.h" #include "subsystems/intermcu/intermcu_fbw.h"
#include "firmwares/rotorcraft/main_fbw.h" #include "firmwares/rotorcraft/main_fbw.h"
#include "firmwares/rotorcraft/autopilot_rc_helpers.h" #include "firmwares/rotorcraft/autopilot_rc_helpers.h"
#define MODULES_C #define MODULES_C
#include "generated/modules.h" #include "generated/modules.h"
/** Fly by wire modes */ /** Fly by wire modes */
typedef enum {FBW_MODE_MANUAL = 0, FBW_MODE_AUTO = 1, FBW_MODE_FAILSAFE = 2} fbw_mode_enum; typedef enum {FBW_MODE_MANUAL = 0, FBW_MODE_AUTO = 1, FBW_MODE_FAILSAFE = 2} fbw_mode_enum;
fbw_mode_enum fbw_mode; fbw_mode_enum fbw_mode;
@@ -178,18 +176,31 @@ STATIC_INLINE void main_periodic(void)
} }
} }
#ifdef BOARD_PX4IO
//due to a baud rate issue on PX4, for a few seconds the baud is 1500000 however this may result in package loss, causing the motors to spin at random
//to prevent this situation:
if (inter_mcu.stable_px4_baud != PPRZ_BAUD) {
fbw_mode = FBW_MODE_FAILSAFE;
autopilot_motors_on = false;
//signal to user whether fbw can be flashed:
#ifdef FBW_MODE_LED
LED_OFF(FBW_MODE_LED); // causes really fast blinking
#endif
}
#endif
static uint16_t dv = 0; static uint16_t dv = 0;
// TODO make module out of led blink? // TODO make module out of led blink?
/* set failsafe commands */ /* set failsafe commands */
if (fbw_mode == FBW_MODE_FAILSAFE) { if (fbw_mode == FBW_MODE_FAILSAFE) {
autopilot_motors_on = false;
SetCommands(commands_failsafe); SetCommands(commands_failsafe);
#ifdef FBW_MODE_LED #ifdef FBW_MODE_LED
if (!(dv++ % (PERIODIC_FREQUENCY / 20))) { LED_TOGGLE(FBW_MODE_LED);} if (!(dv++ % (PERIODIC_FREQUENCY / 20))) { LED_TOGGLE(FBW_MODE_LED);}
} else if (fbw_mode == FBW_MODE_MANUAL) { } else if (fbw_mode == FBW_MODE_MANUAL) {
if (!(dv++ % (PERIODIC_FREQUENCY))) { LED_TOGGLE(FBW_MODE_LED);} if (!(dv++ % (PERIODIC_FREQUENCY))) { LED_TOGGLE(FBW_MODE_LED);}
} else if (fbw_mode == FBW_MODE_AUTO) { } else if (fbw_mode == FBW_MODE_AUTO) {
LED_TOGGLE(FBW_MODE_LED); // toggle instead of on, because then it is still visible when fbw_mode switches very fast intermcu_blink_fbw_led(dv++);
#endif // FWB_MODE_LED #endif // FWB_MODE_LED
} }
@@ -208,7 +219,10 @@ static void autopilot_on_rc_frame(void)
{ {
/* get autopilot fbw mode as set by RADIO_MODE 3-way switch */ /* get autopilot fbw mode as set by RADIO_MODE 3-way switch */
if (radio_control.values[RADIO_FBW_MODE] < (MIN_PPRZ / 2)) { if (radio_control.values[RADIO_FBW_MODE] < (MIN_PPRZ / 2)) {
fbw_mode = FBW_MODE_MANUAL; //TODO, check whether the aircraft can actually be flown in manual mode
//most rotory aircraft can't, at least not without additional IMU aid
//for now, just turn set to failsafe instead of manual mode.
fbw_mode = FBW_MODE_FAILSAFE;
} else { } else {
fbw_mode = FBW_MODE_AUTO; fbw_mode = FBW_MODE_AUTO;
} }
@@ -222,6 +236,7 @@ static void autopilot_on_rc_frame(void)
/* if manual */ /* if manual */
if (fbw_mode == FBW_MODE_MANUAL) { if (fbw_mode == FBW_MODE_MANUAL) {
autopilot_motors_on = true; autopilot_motors_on = true;
SetCommands(commands_failsafe);
#ifdef SetCommandsFromRC #ifdef SetCommandsFromRC
SetCommandsFromRC(commands, radio_control.values); SetCommandsFromRC(commands, radio_control.values);
#else #else
@@ -237,8 +252,10 @@ static void autopilot_on_ap_command(void)
{ {
if (fbw_mode != FBW_MODE_MANUAL) { if (fbw_mode != FBW_MODE_MANUAL) {
SetCommands(intermcu_commands); SetCommands(intermcu_commands);
} else { } else if (fbw_mode == FBW_MODE_AUTO) {
autopilot_motors_on = true; autopilot_motors_on = true;
} else {
autopilot_motors_on = false;
} }
} }
+15 -9
View File
@@ -74,6 +74,15 @@ void px4flash_init(void)
void px4flash_event(void) void px4flash_event(void)
{ {
if (sys_time_check_and_ack_timer(px4iobl_tid)) {
px4ioRebootTimeout = TRUE;
sys_time_cancel_timer(px4iobl_tid);
//for unknown reasons, 1500000 baud does not work reliably after prolonged times.
//I suspect a temperature related issue, combined with the fbw f1 crystal which is out of specs
//After a initial period on 1500000, revert to 230400
//We still start at 1500000 to remain compatible with original PX4 firmware. (which always runs at 1500000)
uart_periph_set_baudrate(PX4IO_PORT->periph, B230400);
}
if (PX4IO_PORT->char_available(PX4IO_PORT->periph)) { if (PX4IO_PORT->char_available(PX4IO_PORT->periph)) {
if (!setToBootloaderMode) { if (!setToBootloaderMode) {
//ignore anything coming from IO if not in bootloader mode (which should be nothing) //ignore anything coming from IO if not in bootloader mode (which should be nothing)
@@ -128,9 +137,7 @@ void px4flash_event(void)
//the target is the fbw, so reboot the fbw and switch to relay mode //the target is the fbw, so reboot the fbw and switch to relay mode
//first check if the bootloader has not timeout: //first check if the bootloader has not timeout:
if (sys_time_check_and_ack_timer(px4iobl_tid) || px4ioRebootTimeout) { if (px4ioRebootTimeout) {
px4ioRebootTimeout = true;
sys_time_cancel_timer(px4iobl_tid);
FLASH_PORT->put_byte(FLASH_PORT->periph, 'T'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'T');
FLASH_PORT->put_byte(FLASH_PORT->periph, 'I'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'I');
FLASH_PORT->put_byte(FLASH_PORT->periph, 'M'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'M');
@@ -153,23 +160,22 @@ void px4flash_event(void)
//stop all intermcu communication: //stop all intermcu communication:
disable_inter_comm(true); disable_inter_comm(true);
px4iobl_tid = sys_time_register_timer(5.0, NULL); //10 (fbw pprz bl timeout)-5 (px4 fmu bl timeout)
/* /*
* The progdieshit define is very usefull, if for whatever reason the (normal, not bootloader) firmware on the IO chip became disfunct. * The forceprog define is very usefull, if for whatever reason the (normal, not bootloader) firmware on the IO chip became disfunct.
* In that case: * In that case:
* 1. enable this define * 1. enable this define
* 2. build and upload the fmu f4 chip (ap target in pprz center) * 2. build and upload the fmu f4 chip (ap target in pprz center)
* 3. build the io code, and convert the firmware using the following command: * 3. build the io code, and convert the firmware using the following command:
* /home/houjebek/paparazzi/sw/tools/px4/px_mkfw.py --prototype "/home/houjebek/px4/Firmware/Images/px4io-v2.prototype" --image /home/houjebek/paparazzi/var/aircrafts/Iris/fbw/fbw.bin > /home/houjebek/paparazzi/var/aircrafts/Iris/fbw/fbw.px4 * Optional 5&6:
* 4. Start the following command:
* /home/houjebek/paparazzi/sw/tools/px4/px_uploader.py --port "/dev/ttyACM0" /home/houjebek/paparazzi/var/aircrafts/Iris/fbw/fbw.px4
* 5a. Either, boot the Pixhawk (reconnect usb) holding the IO reset button until the FMU led stops blinking fast (i.e. exits its own bootloader) * 5a. Either, boot the Pixhawk (reconnect usb) holding the IO reset button until the FMU led stops blinking fast (i.e. exits its own bootloader)
* 5b Or, press the IO reset button on the pixhawk * 5b Or, press the IO reset button on the pixhawk
* 6. Watch the output of the command of step 4, it should recognize the IO bootloader and start flashing. If not try repeating step 5a. * 6. Watch the output of the command of step 4, it should recognize the IO bootloader and start flashing. If not try repeating step 5a.
* 7. Don forget to disable the define and upload the ap again :) * 7. Don forget to disable the define and upload the ap again :)
*/ */
// #define progdieshit //#define forceprog
#ifndef progdieshit #ifndef forceprog
//send the reboot to bootloader command: //send the reboot to bootloader command:
static struct IOPacket dma_packet; static struct IOPacket dma_packet;
dma_packet.count_code = 0x40 + 0x01; dma_packet.count_code = 0x40 + 0x01;
+13
View File
@@ -37,17 +37,30 @@
#define INTERMCU_LOST_CNT 25 /* 50ms with a 512Hz timer TODO fixed value */ #define INTERMCU_LOST_CNT 25 /* 50ms with a 512Hz timer TODO fixed value */
#endif #endif
#include BOARD_CONFIG
enum intermcu_status { enum intermcu_status {
INTERMCU_OK, INTERMCU_OK,
INTERMCU_LOST INTERMCU_LOST
}; };
enum intermcu_PX4_baud_status {
PX4_BAUD,
CHANGING_BAUD,
PPRZ_BAUD
};
struct intermcu_t { struct intermcu_t {
enum intermcu_status status; enum intermcu_status status;
uint8_t time_since_last_frame; uint8_t time_since_last_frame;
#ifdef BOARD_PX4IO
enum intermcu_PX4_baud_status stable_px4_baud;
#endif
}; };
extern struct intermcu_t inter_mcu; extern struct intermcu_t inter_mcu;
void intermcu_init(void); void intermcu_init(void);
void intermcu_periodic(void); void intermcu_periodic(void);
+29 -5
View File
@@ -31,13 +31,13 @@
#include "pprzlink/pprz_transport.h" #include "pprzlink/pprz_transport.h"
#include "modules/spektrum_soft_bind/spektrum_soft_bind_fbw.h" #include "modules/spektrum_soft_bind/spektrum_soft_bind_fbw.h"
#include BOARD_CONFIG
#ifdef BOARD_PX4IO #ifdef BOARD_PX4IO
#include "libopencm3/cm3/scb.h" #include "libopencm3/cm3/scb.h"
#include "led.h" #include "led.h"
#include "mcu_periph/sys_time.h" #include "mcu_periph/sys_time.h"
static uint8_t px4RebootSequence[] = {0x41, 0xd7, 0x32, 0x0a, 0x46, 0x39}; static uint8_t px4RebootSequence[] = {0x41, 0xd7, 0x32, 0x0a, 0x46, 0x39};
static uint8_t px4RebootSequenceCount = 0; static uint8_t px4RebootSequenceCount = 0;
static bool px4RebootTimeout = false;
uint8_t autopilot_motors_on = false; uint8_t autopilot_motors_on = false;
tid_t px4bl_tid; ///< id for time out of the px4 bootloader reset tid_t px4bl_tid; ///< id for time out of the px4 bootloader reset
#endif #endif
@@ -63,7 +63,7 @@ void intermcu_init(void)
{ {
pprz_transport_init(&intermcu_transport); pprz_transport_init(&intermcu_transport);
#ifdef BOARD_PX4IO #ifdef BOARD_PX4IO
px4bl_tid = sys_time_register_timer(20.0, NULL); px4bl_tid = sys_time_register_timer(10.0, NULL);
#endif #endif
} }
@@ -119,6 +119,21 @@ void intermcu_send_status(uint8_t mode)
//FIXME //FIXME
} }
void intermcu_blink_fbw_led(uint16_t dv)
{
#ifdef FBW_MODE_LED
static uint16_t idv = 0;
if (!autopilot_motors_on) {
if (!(dv % (PERIODIC_FREQUENCY))) {
if (!(idv++ % 3)) { LED_OFF(FBW_MODE_LED);} else {LED_TOGGLE(FBW_MODE_LED);}
}
} else {
LED_TOGGLE(FBW_MODE_LED); // toggle makes random blinks if intermcu comm problem!
}
#endif
}
static void intermcu_parse_msg(struct transport_rx *trans, void (*commands_frame_handler)(void)) static void intermcu_parse_msg(struct transport_rx *trans, void (*commands_frame_handler)(void))
{ {
/* Parse the Inter MCU message */ /* Parse the Inter MCU message */
@@ -174,13 +189,22 @@ void InterMcuEvent(void (*frame_handler)(void))
#ifdef BOARD_PX4IO #ifdef BOARD_PX4IO
static void checkPx4RebootCommand(unsigned char b) static void checkPx4RebootCommand(unsigned char b)
{ {
if (!px4RebootTimeout) { if (inter_mcu.stable_px4_baud == CHANGING_BAUD && sys_time_check_and_ack_timer(px4bl_tid)) {
//to prevent a short intermcu comm loss, give some time to changing the baud
sys_time_cancel_timer(px4bl_tid);
inter_mcu.stable_px4_baud = PPRZ_BAUD;
} else if (inter_mcu.stable_px4_baud == PX4_BAUD) {
if (sys_time_check_and_ack_timer(px4bl_tid)) { if (sys_time_check_and_ack_timer(px4bl_tid)) {
//time out the possibility to reboot to the px4 bootloader, to prevent unwanted restarts during flight //time out the possibility to reboot to the px4 bootloader, to prevent unwanted restarts during flight
px4RebootTimeout = true;
sys_time_cancel_timer(px4bl_tid); sys_time_cancel_timer(px4bl_tid);
//for unknown reasons, 1500000 baud does not work reliably after prolonged times.
//I suspect a temperature related issue, combined with the fbw f1 crystal which is out of specs
//After a initial period on 1500000, revert to 230400
//We still start at 1500000 to remain compatible with original PX4 firmware. (which always runs at 1500000)
uart_periph_set_baudrate(intermcu_device->periph, B230400);
inter_mcu.stable_px4_baud = CHANGING_BAUD;
px4bl_tid = sys_time_register_timer(1.0, NULL);
return; return;
} }
@@ -34,6 +34,7 @@ extern pprz_t intermcu_commands[COMMANDS_NB];
void intermcu_on_rc_frame(uint8_t fbw_mode); void intermcu_on_rc_frame(uint8_t fbw_mode);
void intermcu_send_status(uint8_t mode); void intermcu_send_status(uint8_t mode);
void InterMcuEvent(void (*frame_handler)(void)); void InterMcuEvent(void (*frame_handler)(void));
void intermcu_blink_fbw_led(uint16_t dv);
/* We need radio defines for the Autopilot */ /* We need radio defines for the Autopilot */