Paparazzi UAS  v5.8.2_stable-0-g6260b7c
Paparazzi is a free software Unmanned Aircraft System.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
ins_arduimu_basic.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 Gautier Hattenberger
3  * based on ArduIMU driver:
4  * Autoren@ZHAW: schmiemi
5  * chaneren
6  *
7  * This file is part of paparazzi.
8  *
9  * paparazzi is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2, or (at your option)
12  * any later version.
13  *
14  * paparazzi is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with paparazzi; see the file COPYING. If not, write to
21  * the Free Software Foundation, 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  *
24  */
25 
26 #include <stdbool.h>
28 #include "mcu_periph/i2c.h"
29 
30 // Estimator interface
31 #include "state.h"
32 
33 // GPS data for ArduIMU
34 #include "subsystems/gps.h"
35 
36 // Command vector for thrust
37 #include "generated/airframe.h"
38 #include "inter_mcu.h"
39 
40 #define NB_DATA 9
41 
42 #ifndef ARDUIMU_I2C_DEV
43 #define ARDUIMU_I2C_DEV i2c0
44 #endif
45 
46 // Adresse des I2C Slaves: 0001 0110 letztes Bit ist für Read/Write
47 // einzugebende Adresse im ArduIMU ist 0000 1011
48 // da ArduIMU das Read/Write Bit selber anfügt.
49 #define ArduIMU_SLAVE_ADDR 0x22
50 
51 #ifdef ARDUIMU_SYNC_SEND
52 #include "mcu_periph/uart.h"
53 #include "messages.h"
55 #endif
56 
59 
61 
65 
68 
69 // Ask the arduimu to recalibrate the gyros and accels neutrals
70 // After calibration, values are store in the arduimu eeprom
72 
73 // High Accel Flag
74 #define HIGH_ACCEL_LOW_SPEED 15.0
75 #define HIGH_ACCEL_LOW_SPEED_RESUME 4.0 // Hysteresis
76 #define HIGH_ACCEL_HIGH_THRUST (0.8*MAX_PPRZ)
77 #define HIGH_ACCEL_HIGH_THRUST_RESUME (0.1*MAX_PPRZ) // Hysteresis
80 
81 void ArduIMU_init(void)
82 {
86 
89 
93 
96 }
97 
98 #define FillBufWith32bit(_buf, _index, _value) { \
99  _buf[_index] = (uint8_t) (_value); \
100  _buf[_index+1] = (uint8_t) ((_value) >> 8); \
101  _buf[_index+2] = (uint8_t) ((_value) >> 16); \
102  _buf[_index+3] = (uint8_t) ((_value) >> 24); \
103  }
104 
106 {
107 
108  if (ardu_gps_trans.status != I2CTransDone) { return; }
109 
110 #if USE_HIGH_ACCEL_FLAG
111  // Test for high acceleration:
112  // - low speed
113  // - high thrust
114  float speed = stateGetHorizontalSpeedNorm_f();
115  if (speed < HIGH_ACCEL_LOW_SPEED && ap_state->commands[COMMAND_THROTTLE] > HIGH_ACCEL_HIGH_THRUST && !high_accel_done) {
117  } else {
119  if (speed > HIGH_ACCEL_LOW_SPEED && !high_accel_done) {
120  high_accel_done = TRUE; // After takeoff, don't use high accel before landing (GS small, Throttle small)
121  }
122  if (speed < HIGH_ACCEL_HIGH_THRUST_RESUME && ap_state->commands[COMMAND_THROTTLE] < HIGH_ACCEL_HIGH_THRUST_RESUME) {
123  high_accel_done = FALSE; // Activate high accel after landing
124  }
125  }
126 #endif
127 
129  FillBufWith32bit(ardu_gps_trans.buf, 4, (int32_t)gps.gspeed); // ground speed
131  ardu_gps_trans.buf[12] = gps.fix; // status gps fix
132  ardu_gps_trans.buf[13] = (uint8_t)arduimu_calibrate_neutrals; // calibration flag
133  ardu_gps_trans.buf[14] = (uint8_t)
134  high_accel_flag; // high acceleration flag (disable accelerometers in the arduimu filter)
136 
137  // Reset calibration flag
139 }
140 
142 {
143  //Frequence defined in conf/modules/ins_arduimu.xml
144 
147  }
148 
149 }
150 
151 #include "math/pprz_algebra_int.h"
152 /*
153  Buffer O: Roll
154  Buffer 1: Pitch
155  Buffer 2: Yaw
156  Buffer 3: Gyro X
157  Buffer 4: Gyro Y
158  Buffer 5: Gyro Z
159  Buffer 6: Accel X
160  Buffer 7: Accel Y
161  Buffer 8: Accel Z
162  */
163 
164 void ArduIMU_event(void)
165 {
166  // Handle INS I2C event
168  // received data from I2C transaction
169  recievedData[0] = (ardu_ins_trans.buf[1] << 8) | ardu_ins_trans.buf[0];
170  recievedData[1] = (ardu_ins_trans.buf[3] << 8) | ardu_ins_trans.buf[2];
171  recievedData[2] = (ardu_ins_trans.buf[5] << 8) | ardu_ins_trans.buf[4];
172  recievedData[3] = (ardu_ins_trans.buf[7] << 8) | ardu_ins_trans.buf[6];
173  recievedData[4] = (ardu_ins_trans.buf[9] << 8) | ardu_ins_trans.buf[8];
174  recievedData[5] = (ardu_ins_trans.buf[11] << 8) | ardu_ins_trans.buf[10];
175  recievedData[6] = (ardu_ins_trans.buf[13] << 8) | ardu_ins_trans.buf[12];
176  recievedData[7] = (ardu_ins_trans.buf[15] << 8) | ardu_ins_trans.buf[14];
177  recievedData[8] = (ardu_ins_trans.buf[17] << 8) | ardu_ins_trans.buf[16];
178 
179  // Update ArduIMU data
189 
190  // Update estimator
195 
196 #ifdef ARDUIMU_SYNC_SEND
197  // uint8_t arduimu_id = 102;
198  //RunOnceEvery(15, DOWNLINK_SEND_AHRS_EULER(DefaultChannel, DefaultDevice, &arduimu_eulers.phi, &arduimu_eulers.theta, &arduimu_eulers.psi, &arduimu_id));
199  RunOnceEvery(15, DOWNLINK_SEND_IMU_GYRO(DefaultChannel, DefaultDevice, &arduimu_rates.p, &arduimu_rates.q,
200  &arduimu_rates.r));
201  RunOnceEvery(15, DOWNLINK_SEND_IMU_ACCEL(DefaultChannel, DefaultDevice, &arduimu_accel.x, &arduimu_accel.y,
202  &arduimu_accel.z));
203 #endif
204  } else if (ardu_ins_trans.status == I2CTransFailed) {
206  }
207  // Handle GPS I2C event
210  }
211 }
212 
213 void ahrs_update_gps(void)
214 {
215 
216 }
void ahrs_update_gps(void)
static int16_t recievedData[NB_DATA]
#define ARDUIMU_I2C_DEV
static void stateSetNedToBodyEulers_f(struct FloatEulers *ned_to_body_eulers)
Set vehicle body attitude from euler angles (float).
Definition: state.h:1076
arch independent UART (Universal Asynchronous Receiver/Transmitter) API
Communication between fbw and ap processes.
static float stateGetHorizontalSpeedNorm_f(void)
Get norm of horizontal ground speed (float).
Definition: state.h:912
float y
in meters
float phi
in radians
volatile uint8_t buf[I2C_BUF_LEN]
Transaction buffer With I2C_BUF_LEN number of bytes.
Definition: i2c.h:122
struct i2c_transaction ardu_gps_trans
transaction successfully finished by I2C driver
Definition: i2c.h:57
bool_t high_accel_done
#define FLOAT_EULERS_ZERO(_e)
#define FillBufWith32bit(_buf, _index, _value)
float r
in rad/s
#define FLOAT_RATES_ZERO(_r)
float psi
in radians
uint16_t speed_3d
norm of 3d speed in cm/s
Definition: gps.h:75
float q
in rad/s
float p
in rad/s
#define INS_ROLL_NEUTRAL_DEFAULT
Definition: ahrs_sim.c:43
#define ANGLE_FLOAT_OF_BFP(_ai)
struct FloatVect3 arduimu_accel
#define FALSE
Definition: std.h:5
struct FloatEulers arduimu_eulers
ArduIMU simulation.
void ArduIMU_init(void)
euler angles
float z
in meters
float theta
in radians
#define FLOAT_VECT3_ZERO(_v)
#define TRUE
Definition: std.h:4
vector in North East Down coordinates Units: meters
transaction set to done by user level
Definition: i2c.h:59
Device independent GPS code (interface)
#define ACCEL_FLOAT_OF_BFP(_ai)
struct FloatRates arduimu_rates
bool_t i2c_transmit(struct i2c_periph *p, struct i2c_transaction *t, uint8_t s_addr, uint8_t len)
Submit a write only transaction.
Definition: i2c.c:258
#define ArduIMU_SLAVE_ADDR
signed short int16_t
Definition: types.h:17
#define HIGH_ACCEL_HIGH_THRUST_RESUME
transaction failed
Definition: i2c.h:58
#define HIGH_ACCEL_HIGH_THRUST
#define INS_PITCH_NEUTRAL_DEFAULT
Definition: ahrs_sim.c:46
I2C transaction structure.
Definition: i2c.h:93
enum I2CTransactionStatus status
Transaction status.
Definition: i2c.h:126
#define RATE_FLOAT_OF_BFP(_ai)
signed long int32_t
Definition: types.h:19
float ins_roll_neutral
void ArduIMU_periodic(void)
void ArduIMU_periodicGPS(void)
unsigned char uint8_t
Definition: types.h:14
pprz_t commands[COMMANDS_NB]
Storage of intermediate command values.
Definition: commands.c:30
API to get/set the generic vehicle states.
int32_t course
GPS course over ground in rad*1e7, [0, 2*Pi]*1e7 (CW/north)
Definition: gps.h:76
bool_t high_accel_flag
struct i2c_transaction ardu_ins_trans
float ins_pitch_neutral
uint16_t gspeed
norm of 2d ground speed in cm/s
Definition: gps.h:74
#define NB_DATA
static void stateSetBodyRates_f(struct FloatRates *body_rate)
Set vehicle body angular rate (float).
Definition: state.h:1152
void ArduIMU_event(void)
uint8_t fix
status of fix
Definition: gps.h:82
static void stateSetAccelNed_f(struct NedCoor_f *ned_accel)
Set acceleration in NED coordinates (float).
Definition: state.h:973
#define HIGH_ACCEL_LOW_SPEED
struct GpsState gps
global GPS state
Definition: gps.c:41
angular rates
bool_t i2c_receive(struct i2c_periph *p, struct i2c_transaction *t, uint8_t s_addr, uint16_t len)
Submit a read only transaction.
Definition: i2c.c:268
bool_t arduimu_calibrate_neutrals
Paparazzi fixed point algebra.
float x
in meters
Architecture independent I2C (Inter-Integrated Circuit Bus) API.