Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Diff: PX4Flow.h
- Revision:
- 0:4b02060af95b
- Child:
- 1:562a583eb77c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PX4Flow.h Fri Aug 02 14:15:07 2019 +0000 @@ -0,0 +1,130 @@ +#ifndef _PX4FLOW_MBED_H +#define _PX4FLOW_MBED_H + +# include <stdint.h> +# include "mbed.h" + +// 7 Bit I2C Address of the Flow Module: Default 0x42 (user selectable bits 0,1,2) +#define PX4FLOW_ADDRESS 0x42<<1 + +// Commands +#define FRAME 0x00 +#define INTEGRAL_FRAME 0x16 + +// define buffer indicees +// simple frame +#define FRAME_COUNT 0 +#define PIXEL_FLOW_X_SUM 2 +#define PIXEL_FLOW_Y_SUM 4 +#define FLOW_COMP_M_X 6 +#define FLOW_COMP_M_Y 8 +#define QUAL 10 +#define GYRO_X_RATE 12 +#define GYRO_Y_RATE 14 +#define GYRO_Z_RATE 16 +#define GYRO_RANGE 18 +#define SONAR_TIMESTAMP 19 +#define GROUND_DISTANCE 20 + +// integral frame +#define FRAME_COUNT_SINCE_LAST_READOUT 0 +#define PIXEL_FLOW_X_INTEGRAL 2 +#define PIXEL_FLOW_Y_INTEGRAL 4 +#define GYRO_X_RATE_INTEGRAL 6 +#define GYRO_Y_RATE_INTEGRAL 8 +#define GYRO_Z_RATE_INTEGRAL 10 +#define INTEGRATION_TIMESPAN 12 +#define SONAR_TIMESTAMP_INTEGRAL 16 +#define GROUND_DISTANCE_INTEGRAL 20 +#define GYRO_TEMPERATURE 22 +#define QUALITY_INTEGRAL 24 + +typedef struct i2c_integral_frame { + uint16_t frame_count; // counts created I2C frames 0 + int16_t pixel_flow_x_sum; // accumulated x flow in pixels*10 since last I2C frame 2 + int16_t pixel_flow_y_sum; // accumulated y flow in pixels*10 since last I2C frame 4 + int16_t flow_comp_m_x; // x velocity*1000 in meters / timestep 6 + int16_t flow_comp_m_y; // y velocity*1000 in meters / timestep 8 + int16_t qual; // Optical flow quality / confidence 0: bad, 255: maximum quality 10 + int16_t gyro_x_rate; //gyro x rate 12 + int16_t gyro_y_rate; //gyro y rate 14 + int16_t gyro_z_rate; //gyro z rate 16 + uint8_t gyro_range; // gyro range 18 + uint8_t sonar_timestamp; // timestep in milliseconds between I2C frames 19 + int16_t ground_distance; // Ground distance in meters*1000. Positive value: distance known. Negative value: Unknown distance 20 +} i2c_frame; + +typedef struct i2c_integral_frame { + uint16_t frame_count_since_last_readout;//number of flow measurements since last I2C readout [#frames] 22 + int16_t pixel_flow_x_integral; //accumulated flow in radians*10000 around x axis since last I2C readout [rad*10000] 24 + int16_t pixel_flow_y_integral; //accumulated flow in radians*10000 around y axis since last I2C readout [rad*10000] 26 + int16_t gyro_x_rate_integral; //accumulated gyro x rates in radians*10000 since last I2C readout [rad*10000] 28 + int16_t gyro_y_rate_integral; //accumulated gyro y rates in radians*10000 since last I2C readout [rad*10000] 30 + int16_t gyro_z_rate_integral; //accumulated gyro z rates in radians*10000 since last I2C readout [rad*10000] 32 + uint32_t integration_timespan; //accumulation timespan in microseconds since last I2C readout [microseconds] 34 + uint32_t sonar_timestamp; // time since last sonar update [microseconds] 38 + int16_t ground_distance; // Ground distance in meters*1000 [meters*1000] 42 + int16_t gyro_temperature; // Temperature * 100 in centi-degrees Celsius [degcelsius*100] 44 + uint8_t quality; // averaged quality of accumulated flow values [0:bad quality;255: max quality] 46 +} i2c_integral_frame; + + +class PX4Flow +{ +public: + // Constructor + PX4Flow(I2C& i2c, Serial& pc); + // Deconstructor + virtual ~PX4Flow(); + + // Methods + bool update(); + bool update_integral(); + + // Simple frame + uint16_t frame_count(); + int16_t pixel_flow_x_sum(); + int16_t pixel_flow_y_sum(); + int16_t flow_comp_m_x(); + int16_t flow_comp_m_y(); + int16_t qual(); + int16_t gyro_x_rate(); + int16_t gyro_y_rate(); + int16_t gyro_z_rate(); + uint8_t gyro_range(); + uint8_t sonar_timestamp(); + int16_t ground_distance(); + + // Integral frame + uint16_t frame_count_since_last_readout(); + int16_t pixel_flow_x_integral(); + int16_t pixel_flow_y_integral(); + int16_t gyro_x_rate_integral(); + int16_t gyro_y_rate_integral(); + int16_t gyro_z_rate_integral(); + uint32_t integration_timespan(); + uint32_t sonar_timestamp_integral(); + int16_t ground_distance_integral(); + int16_t gyro_temperature(); + uint8_t quality_integral(); + + +protected: + I2C i2c; + Serial pc; + + // Buffer to read in the sensordata + char bufferS[22]; + char bufferI[26]; + + char i2c_commands[2]; + + struct i2c_frame frame; + struct i2c_integral_frame iframe; + + uint8_t read8(char *buffer, const unsigned int& idx = 0); + uint16_t read16(char *buffer, const unsigned int& idx = 0); + uint32_t read32(char *buffer, const unsigned int& idx = 0); +}; + +#endif