基于stm32的小型无人机MPU9250流程图
基于STM32F407的无人机智能监测系统
基于 STM32F407的无人机智能监测系统摘要:无人机是现代新兴的一种可飞行科技产品,与有人驾驶飞机相比,无人机往往更适合那些太“愚钝,肮脏或危险”的任务。
目前其在航拍、农业、植保、快递运输、灾难救援、测绘、新闻报道、电力巡检、救灾、影视拍摄等等领域的应用,大大的拓展了无人机本身的用途,发达国家也在积极扩展行业应用与发展无人机技术。
无人机一出世便带有智能的色彩,随着经济和科技的发展,无人机也必将越来越趋向智能化以满足人们更高的需求。
关键词:智能无人机;智能监测;MPU9250;STM32一、相关模块概述1.嵌入式微控制器单片机是将整个计算机系统集成到-块芯片中,多以Intel 8031为核心组成中央处理器,包括CPU、ROM、RAM、1/0接口、UART、定时器/计数器、A/D转换器等多个模块,外围配以少量的接口器件组成。
单片机集成度高,由此提高了可靠性,抗干扰能力强,嵌入性能好。
其功耗小、体积小、接口灵活、易于产品化。
因此,基于单片机的飞行监测系统具备丰富的模拟信号接口、方便灵活的数字接口和串行通信接口等硬件资源,能方便的组成各种智能化的控制设备,满足无人机的飞行智能监测需求,具有很高的性价比。
2.四频通信模块A9G 是一个完整的四频GSM/GPRS+GPRS/GPS 模块。
相较于前代A6/A7,A9/A9G 的集成度更高,核心芯片的成本降低也使得整个方案性价比更高。
方便应用于各种物联网硬件终端场合。
可利用AT命令控制A9G获取GPS信息,并且发送短信和上传数据。
3.九轴惯性传感器MPU9250集电路总线(IIC)传输速率可达400k Hz/s,串行外设接口(SPI)传输速率可达20MHz/s。
陀螺仪的角速度测量范围最高达±2 000 (°) /s, 具有良好的动态响应特性。
加速度计的测量范围最大为±16g (g为重力加速度) , 静态测量精度高。
电子罗盘采用高灵敏度霍尔型传感器进行数据采集, 磁感应强度测量范围为±2000(°)/s,具有良好的动态响应特性。
MPU-9250寄存器映射中文
MPU-9250 寄存器映射介绍版本1.6目录1、陀螺仪和加速度计寄存器映射 (3)2、寄存器介绍 (5)2.1、寄存器0-2——陀螺仪自检寄存器(Gyroscope Self-Test Registers) (5)2.2、寄存器13-15——加速度计自检寄存器(Accelerometer Self-Test Registers) (5)2.3、寄存器19-24——陀螺仪偏置寄存器(Gyro Offset Registers) (5)2.4、寄存器25——采样频率分频器(Sample Rate Divider) (6)2.5、寄存器26——配置(Configuration) (6)2.6、寄存器27——陀螺仪配置(Gyroscope Configuration) (7)2.7、寄存器28——加速度计配置(Accelerometer Configuration) (7)2.8、寄存器28——加速度计配置2 (8)2.9、寄存器30——低功率加速度计ODR控制寄存器Low Power Accelerometer ODR Control (9)2.10、寄存器31——唤醒运动阈值 (10)2.11、寄存器32——FIFO使能 (10)2.12、寄存器36——I2C主机控制寄存器 (10)2.13、寄存器37和39——I2C从机0控制器 (11)2.14、寄存器40和42——I2C从机1控制器 (12)2.15、寄存器43和45——I2C从机2控制器 (13)2.16、寄存器46和48——I2C从机3控制器 (14)2.17、寄存器49和53——I2C从机4控制器 (15)2.18、寄存器54——I2C主机状态寄存器I2C Master Status (16)2.19、寄存器55——INT Pin / Bypass Enable Configuration (16)2.20、寄存器56——Interrupt Enable (17)2.21、寄存器58——Interrupt Status (17)4.22、寄存器50-64——Accelerometer Measurements (17)2.23、寄存器65-66——Temperature Measurement (18)2.24、寄存器67-72——Gyroscope Measurements (18)2.25、寄存器73-96——External Sensor Data (19)2.26、寄存器99——I2C Slave 0 Data Out (20)2.27、寄存器100——I2C Slave 1 Data Out (21)2.28、寄存器101——I2C Slave 2 Data Out (21)2.29、寄存器102——I2C Slave 3 Data Out (21)2.30、寄存器103——I2C Master Delay Control (21)2.31、寄存器104——Signal Path Reset(SIGNAL_PATH_RESET) (21)2.32、寄存器105——Accelerometer Interrupt Control(ACCEL_INTEL_CTRL) (22)2.33、寄存器106——User Control(USER_CTRL) (22)2.34、寄存器107——Power Management 1(PWR_MGMT_1) (22)2.35、寄存器108——Power Management 2(PWR_MGMT_2) (23)2.36、寄存器114和115——FIFO Count Registers (24)2.37、寄存器116——FIFO Read Write(FIFO_R_W) (24)2.38、寄存器117——Who Am I(WHOAMI) (24)2.39、寄存器119, 120, 122, 123, 125, 126加速度计偏移寄存器 (25)3、磁力仪寄存器映射 (25)3.1、寄存器映射描述 (26)3.2、磁力仪寄存器详细介绍 (26)3.3 WIA: Device ID (26)3.4 INFO: Information (26)3.5、ST1: Status 1 (27)3.6 HXL to HZH: Measurement Data (27)3.7 ST2: Status 2 (28)3.8 CNTL1: Control 1 (28)3. 9 CNTL2: Control 2 (29)3.10 ASTC: Self-Test Control (29)3.11 TS1, TS2: Test 1, 2 (29)3.12 I2CDIS: I2C Disable (29)3.13 ASAX, ASAY, ASAZ: Sensitivity Adjustment values (29)4、高级硬件功能 (30)1、陀螺仪和加速度计寄存器映射下表列出了MPU-9250运动轨迹设备的陀螺仪和加速度计的寄存器映射表1、MPU-9250模式陀螺仪和加速度计寄存器映射注意:寄存器名称以_H和_L结尾的内部寄存器值分别包括一个高字节和低字节在接下来详细的寄存器表中,寄存器名称将以大写和大写加斜体出现。
MPU-9250 九轴产品中文说明书
4.9 运动数字处理引擎(DMP)...........................................................................................23
4.10 主 I2C 及 SPI 通信..........................................................................................................23
4.17 FIFO 数据缓存区 ............................................................................................................27
4.15 时钟方案........................................................................................................................26
4.16 数据寄存器....................................................................................................................27
4.13 MPU-250 I2C 通信解决方案 ...................................................................................PI 通信解决方案.........................................................................................26
MPU9250配置例程
MPU9250的SPI读取例程,由一个忘了什么来源的程序改成,只需要改SPI和CS的宏定义,加上延时函数,就可以使用,亲测可用,发上来给那些找不到例程的朋友,配置后的状态在另一个文档里,名为MPU9250刷新速率和单位,程序如有侵权等,请联系…//MPU9250的陀螺仪单位转换系数://#define MPU9250_Gyro_FS1000 32.8//MPU9250的加速度计单位转换系数://#define Acc_FS2g 1671.84 //to m/ss//MPU9250磁力计的单位转换系数://#define Mega_FS16BIT_Ga 6.83/*1uT-10mGass*/static s16 MPU9250_AK8963_ASA[3] = {0, 0, 0};//1T=10000GASS 1uT=0.01GASS// 定义MPU9250内部地址////////////////////////////////////////////////////////////////////////////Register Map for Gyroscope and Accelerometer#define MPU9250_SELF_TEST_X_GYRO 0x00#define MPU9250_SELF_TEST_Y_GYRO 0x01#define MPU9250_SELF_TEST_Z_GYRO 0x02#define MPU9250_SELF_TEST_X_ACCEL 0x0D#define MPU9250_SELF_TEST_Y_ACCEL 0x0E#define MPU9250_SELF_TEST_Z_ACCEL 0x0F#define MPU9250_XG_OFFSET_H 0x13#define MPU9250_XG_OFFSET_L 0x14#define MPU9250_YG_OFFSET_H 0x15#define MPU9250_YG_OFFSET_L 0x16#define MPU9250_ZG_OFFSET_H 0x17#define MPU9250_ZG_OFFSET_L 0x18#define MPU9250_SMPLRT_DIV 0x19//陀螺仪采样率,典型值:0x07(125Hz) #define MPU9250_CONFIG 0x1A//低通滤波频率,典型值:0x06(5Hz) #define MPU9250_GYRO_CONFIG 0x1B//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)#define MPU9250_ACCEL_CONFIG 0x1C//加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)#define MPU9250_ACCEL_CONFIG2 0x1D#define MPU9250_LP_ACCEL_ODR 0x1E#define MPU9250_WOM_THR 0x1F#define MPU9250_FIFO_EN 0x23#define MPU9250_I2C_MST_CTRL 0x24#define MPU9250_I2C_SLV0_ADDR 0x25#define MPU9250_I2C_SLV0_REG 0x26#define MPU9250_I2C_SLV0_CTRL 0x27#define MPU9250_I2C_SLV1_ADDR 0x28#define MPU9250_I2C_SLV1_CTRL 0x2A #define MPU9250_I2C_SLV2_ADDR 0x2B #define MPU9250_I2C_SLV2_REG 0x2C #define MPU9250_I2C_SLV2_CTRL 0x2D #define MPU9250_I2C_SLV3_ADDR 0x2E #define MPU9250_I2C_SLV3_REG 0x2F #define MPU9250_I2C_SLV3_CTRL 0x30 #define MPU9250_I2C_SLV4_ADDR 0x31 #define MPU9250_I2C_SLV4_REG 0x32 #define MPU9250_I2C_SLV4_DO 0x33 #define MPU9250_I2C_SLV4_CTRL 0x34 #define MPU9250_I2C_SLV4_DI 0x35 #define MPU9250_I2C_MST_STATUS 0x36 #define MPU9250_INT_PIN_CFG 0x37 #define MPU9250_INT_ENABLE 0x38#define MPU9250_INT_STATUS 0x3A #define MPU9250_ACCEL_XOUT_H 0x3B #define MPU9250_ACCEL_XOUT_L 0x3C #define MPU9250_ACCEL_YOUT_H 0x3D #define MPU9250_ACCEL_YOUT_L 0x3E #define MPU9250_ACCEL_ZOUT_H 0x3F #define MPU9250_ACCEL_ZOUT_L 0x40 #define MPU9250_TEMP_OUT_H 0x41 #define MPU9250_TEMP_OUT_L 0x42 #define MPU9250_GYRO_XOUT_H 0x43 #define MPU9250_GYRO_XOUT_L 0x44 #define MPU9250_GYRO_YOUT_H 0x45 #define MPU9250_GYRO_YOUT_L 0x46 #define MPU9250_GYRO_ZOUT_H 0x47 #define MPU9250_GYRO_ZOUT_L 0x48 #define MPU9250_EXT_SENS_DATA_00 0x49 #define MPU9250_EXT_SENS_DATA_01 0x4A #define MPU9250_EXT_SENS_DATA_02 0x4B #define MPU9250_EXT_SENS_DATA_03 0x4C #define MPU9250_EXT_SENS_DATA_04 0x4D #define MPU9250_EXT_SENS_DATA_05 0x4E #define MPU9250_EXT_SENS_DATA_06 0x4F #define MPU9250_EXT_SENS_DATA_07 0x50 #define MPU9250_EXT_SENS_DATA_08 0x51 #define MPU9250_EXT_SENS_DATA_09 0x52 #define MPU9250_EXT_SENS_DATA_10 0x53 #define MPU9250_EXT_SENS_DATA_11 0x54#define MPU9250_EXT_SENS_DATA_13 0x56#define MPU9250_EXT_SENS_DATA_14 0x57#define MPU9250_EXT_SENS_DATA_15 0x58#define MPU9250_EXT_SENS_DATA_16 0x59#define MPU9250_EXT_SENS_DATA_17 0x5A#define MPU9250_EXT_SENS_DATA_18 0x5B#define MPU9250_EXT_SENS_DATA_19 0x5C#define MPU9250_EXT_SENS_DATA_20 0x5D#define MPU9250_EXT_SENS_DATA_21 0x5E#define MPU9250_EXT_SENS_DATA_22 0x5F#define MPU9250_EXT_SENS_DATA_23 0x60#define MPU9250_I2C_SLV0_DO 0x63#define MPU9250_I2C_SLV1_DO 0x64#define MPU9250_I2C_SLV2_DO 0x65#define MPU9250_I2C_SLV3_DO 0x66#define MPU9250_I2C_MST_DELAY_CTRL 0x67#define MPU9250_SIGNAL_PATH_RESET 0x68#define MPU9250_MOT_DETECT_CTRL 0x69#define MPU9250_USER_CTRL 0x6A#define MPU9250_PWR_MGMT_1 0x6B//电源管理,典型值:0x00(正常启用) #define MPU9250_PWR_MGMT_2 0x6C#define MPU9250_FIFO_COUNTH 0x72#define MPU9250_FIFO_COUNTL 0x73#define MPU9250_FIFO_R_W 0x74#define MPU9250_WHO_AM_I 0x75//ID寄存器(默认数值0x71,只读) #define MPU9250_XA_OFFSET_H 0x77#define MPU9250_XA_OFFSET_L 0x78#define MPU9250_YA_OFFSET_H 0x7A#define MPU9250_YA_OFFSET_L 0x7B#define MPU9250_ZA_OFFSET_H 0x7D#define MPU9250_ZA_OFFSET_L 0x7E//#define MPU9250_I2C_READ 0x80//Magnetometer register maps#define MPU9250_AK8963_WIA 0x00#define MPU9250_AK8963_INFO 0x01#define MPU9250_AK8963_ST1 0x02#define MPU9250_AK8963_XOUT_L 0x03#define MPU9250_AK8963_XOUT_H 0x04#define MPU9250_AK8963_YOUT_L 0x05#define MPU9250_AK8963_YOUT_H 0x06#define MPU9250_AK8963_ZOUT_L 0x07#define MPU9250_AK8963_ZOUT_H 0x08#define MPU9250_AK8963_ST2 0x09#define MPU9250_AK8963_CNTL 0x0A#define MPU9250_AK8963_CNTL2 0x0B#define MPU9250_AK8963_RSV 0x0B //DO NOT ACCESS <MPU9250_AK8963_CNTL2>#define MPU9250_AK8963_ASTC 0x0C#define MPU9250_AK8963_TS1 0x0D //DO NOT ACCESS#define MPU9250_AK8963_TS2 0x0E //DO NOT ACCESS#define MPU9250_AK8963_I2CDIS 0x0F#define MPU9250_AK8963_ASAX 0x10#define MPU9250_AK8963_ASAY 0x11#define MPU9250_AK8963_ASAZ 0x12#define MPU9250_AK8963_I2C_ADDR 0x0C#define MPU9250_AK8963_POWER_DOWN 0x10#define MPU9250_AK8963_FUSE_ROM_ACCESS 0x1F#define MPU9250_AK8963_SINGLE_MEASUREMENT 0x11#define MPU9250_AK8963_CONTINUOUS_MEASUREMENT 0x16 //MODE2刷新速率100Hz#define MPU9250_AK8963_DATA_READY (0x01)#define MPU9250_AK8963_DATA_OVERRUN (0x02)#define MPU9250_AK8963_OVERFLOW (0x80)#define MPU9250_AK8963_DATA_ERROR (0x40)#define MPU9250_AK8963_CNTL2_SRST 0x01//#define MPU9250_I2C_SLV4_EN 0x80#define MPU9250_I2C_SLV4_DONE 0x40#define MPU9250_I2C_SLV4_NACK 0x10//#define MPU9250_I2C_IF_DIS (0x10)#define MPU9250_I2C_MST_EN (0x20)#define MPU9250_FIFO_RST (0x04)#define MPU9250_FIFO_ENABLE (0x40)//#define MPU9250_RESET 0x80#define MPU9250_CLOCK_MASK 0xF8#define MPU9250_CLOCK_INTERNAL 0x00#define MPU9250_CLOCK_PLL 0x01#define MPU9250_CLOCK_PLLGYROZ 0x03#define MPU9250_FS_SEL_MASK 0xE7#define MPU9250_SLEEP_MASK 0x40//#define MPU9250_XYZ_GYRO 0xC7#define MPU9250_XYZ_ACCEL 0xF8//#define MPU9250_RAW_RDY_EN (0x01)#define MPU9250_RAW_DATA_RDY_INT (0x01)#define MPU9250_FIFO_OVERFLOW (0x10)//#define MPU9250_INT_ANYRD_2CLEAR (0x10)#define MPU9250_LATCH_INT_EN (0x20)//#define MPU9250_MAX_FIFO (1024)#define MPU9250_FIFO_SIZE_1024 (0x40)#define MPU9250_FIFO_SIZE_2048 (0x80)#define MPU9250_FIFO_SIZE_4096 (0xC0)#define MPU9250_TEMP_OUT (0x80)#define MPU9250_GYRO_XOUT (0x40)#define MPU9250_GYRO_YOUT (0x20)#define MPU9250_GYRO_ZOUT (0x10)#define MPU9250_ACCEL (0x08)//////////////////////////////////////////////////////////////////////////#define SMPLRT_DIV 0#define MPU9250_SPIx_ADDR 0x00/****************************************************************************** /#define MPU9250_SPI_ReadWriteByte(x)SPI1_ReadWriteByte(x)#define MPU9250_CS_LGPIO_ResetBits(GPIOA,GPIO_Pin_4)#define MPU9250_CS_HGPIO_SetBits(GPIOA,GPIO_Pin_4)/****************************************************************************** ///////////////////////////////////////////////////////////////////////////enum MPU9250_GYRO_DLPF{MPU9250_GYRO_DLPF_250HZ = 0,MPU9250_GYRO_DLPF_184HZ,MPU9250_GYRO_DLPF_92HZ,MPU9250_GYRO_DLPF_41HZ,MPU9250_GYRO_DLPF_20HZ,MPU9250_GYRO_DLPF_10HZ,MPU9250_GYRO_DLPF_5HZ,MPU9250_GYRO_DLPF_3600HZ,NUM_GYRO_DLPF};enum MPU9250_GYRO_FSR{MPU9250_FSR_250DPS = 0,MPU9250_FSR_500DPS,MPU9250_FSR_1000DPS,MPU9250_FSR_2000DPS,MPU9250_NUM_GYRO_FSR};enum MPU9250_ACCEL_DLPF{MPU9250_ACCEL_DLPF_460HZ = 0,MPU9250_ACCEL_DLPF_184HZ,MPU9250_ACCEL_DLPF_92HZ,MPU9250_ACCEL_DLPF_41HZ,MPU9250_ACCEL_DLPF_20HZ,MPU9250_ACCEL_DLPF_10HZ,MPU9250_ACCEL_DLPF_5HZ,MPU9250_ACCEL_DLPF_460HZ2,MPU9250_NUM_ACCEL_DLPF};enum MPU9250_ACCEL_FSR{MPU9250_FSR_2G = 0,MPU9250_FSR_4G,MPU9250_FSR_8G,MPU9250_FSR_16G,MPU9250_NUM_ACCEL_FSR};enum MPU9250_CLK{MPU9250_CLK_INTERNAL = 0,MPU9250_CLK_PLL,MPU9250_NUM_CLK};//MPU9250_SPI_Write//MPU9250的SPI写一个字节函数//reg_addr 寄存器地址data 要写入的数据void MPU9250_SPI_Write(u8 reg_addr, u8 data) {MPU9250_CS_L;MPU9250_SPI_ReadWriteByte(reg_addr);MPU9250_SPI_ReadWriteByte(data);MPU9250_CS_H;}//MPU9250_SPI_Writes//MPU9250的SPI写多个字节函数// reg_addr 寄存器地址len字节数*data 要写入的数据存放的数组void MPU9250_SPI_Writes(u8 reg_addr, u8 len, u8* data){u32 i = 0;MPU9250_CS_L;MPU9250_SPI_ReadWriteByte(reg_addr);while(i < len){MPU9250_SPI_ReadWriteByte(data[i++]);}MPU9250_CS_H;}//MPU9250_SPI_Read//MPU9250的读一个字节函数//reg_addr 寄存器地址u8 MPU9250_SPI_Read(u8 reg_addr){u8 dummy = 0;u8 data = 0;MPU9250_CS_L;MPU9250_SPI_ReadWriteByte(0x80 | reg_addr);data = MPU9250_SPI_ReadWriteByte(dummy);MPU9250_CS_H;return data;}//MPU9250_SPI_Reads//MPU9250的读多个字节函数//reg_addr 寄存器地址len读取字节数*data数据存放数组void MPU9250_SPI_Reads(u8 reg_addr, u8 len, u8* data){u32 i = 0;u8 dummy = 0x00;MPU9250_CS_L;MPU9250_SPI_ReadWriteByte(MPU9250_I2C_READ | reg_addr);while(i < len){data[i++] = MPU9250_SPI_ReadWriteByte(dummy);}MPU9250_CS_H;}//以下四个函数,作用是设置磁力计int MPU9250_AK8963_SPI_Read(u8 akm_addr, u8 reg_addr, u8* data){u8 status = 0;u32 timeout = 0;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_REG, 1, ®_addr);delay_ms(1);reg_addr = akm_addr | MPU9250_I2C_READ;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_ADDR, 1, ®_addr);delay_ms(1);reg_addr = MPU9250_I2C_SLV4_EN;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_CTRL, 1, ®_addr);delay_ms(1);do{if (timeout++ > 50){return -2;}MPU9250_SPI_Reads(MPU9250_I2C_MST_STATUS, 1, &status);delay_ms(1);}while ((status & MPU9250_I2C_SLV4_DONE) == 0);MPU9250_SPI_Reads(MPU9250_I2C_SLV4_DI, 1, data);return 0;}int MPU9250_AK8963_SPI_Reads(u8 akm_addr, u8 reg_addr, u8 len, u8* data) {u8 index = 0;u8 status = 0;u32 timeout = 0;u8 tmp = 0;tmp = akm_addr | MPU9250_I2C_READ;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_ADDR, 1, &tmp);delay_ms(1);while(index < len){tmp = reg_addr + index;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_REG, 1, &tmp);delay_ms(1);tmp = MPU9250_I2C_SLV4_EN;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_CTRL, 1, &tmp);delay_ms(1);do {if (timeout++ > 50){return -2;}MPU9250_SPI_Reads(MPU9250_I2C_MST_STATUS, 1, &status);delay_ms(2);} while ((status & MPU9250_I2C_SLV4_DONE) == 0);MPU9250_SPI_Reads( MPU9250_I2C_SLV4_DI, 1, data + index);delay_ms(1);index++;}return 0;}int MPU9250_AK8963_SPI_Write(u8 akm_addr, u8 reg_addr, u8 data){u32 timeout = 0;uint8_t status = 0;u8 tmp = 0;tmp = akm_addr;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_ADDR, 1, &tmp);delay_ms(1);tmp = reg_addr;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_REG, 1, &tmp);delay_ms(1);tmp = data;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_DO, 1, &tmp);delay_ms(1);tmp = MPU9250_I2C_SLV4_EN;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_CTRL, 1, &tmp);delay_ms(1);do {if (timeout++ > 50)return -2;MPU9250_SPI_Reads(MPU9250_I2C_MST_STATUS, 1, &status);delay_ms(1);} while ((status & MPU9250_I2C_SLV4_DONE) == 0);if (status & MPU9250_I2C_SLV4_NACK)return -3;return 0;}int MPU9250_AK8963_SPI_Writes(u8 akm_addr, u8 reg_addr, u8 len, u8* data){u32 timeout = 0;uint8_t status = 0;u8 tmp = 0;u8 index = 0;tmp = akm_addr;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_ADDR, 1, &tmp);delay_ms(1);while(index < len){tmp = reg_addr + index;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_REG, 1, &tmp);delay_ms(1);MPU9250_SPI_Writes(MPU9250_I2C_SLV4_DO, 1, data + index);delay_ms(1);tmp = MPU9250_I2C_SLV4_EN;MPU9250_SPI_Writes(MPU9250_I2C_SLV4_CTRL, 1, &tmp);delay_ms(1);do {if (timeout++ > 50)return -2;MPU9250_SPI_Reads(MPU9250_I2C_MST_STATUS, 1, &status);delay_ms(1);} while ((status & MPU9250_I2C_SLV4_DONE) == 0);if (status & MPU9250_I2C_SLV4_NACK)return -3;index++;}return 0;}// MPU9250_Get9AxisRawData//MPU9250获取九轴数据// *accel 加速计数据*gyro陀螺仪数据*mag 磁力计数据数组数组大小应为3x y zvoid MPU9250_Get9AxisRawData(short *accel, short * gyro, short * mag){u8 data[22];MPU9250_SPI_Reads(MPU9250_ACCEL_XOUT_H, 22, data);accel[0] = (data[0] << 8) | data[1];accel[1] = (data[2] << 8) | data[3];accel[2] = (data[4] << 8) | data[5];gyro[0] = (data[8] << 8) | data[9];gyro[1] = (data[10] << 8) | data[11];gyro[2] = (data[12] << 8) | data[13];if (!(data[14] & MPU9250_AK8963_DATA_READY) || (data[14] & MPU9250_AK8963_DATA_OVERRUN)){return;}if (data[21] & MPU9250_AK8963_OVERFLOW){return;}mag[0] = (data[16] << 8) | data[15];mag[1] = (data[18] << 8) | data[17];mag[2] = (data[20] << 8) | data[19];//ned x,y,zmag[0] = ((long)mag[0] * MPU9250_AK8963_ASA[0]) >> 8;mag[1] = ((long)mag[1] * MPU9250_AK8963_ASA[1]) >> 8;mag[2] = ((long)mag[2] * MPU9250_AK8963_ASA[2]) >> 8;}//MPU9250_GetDeviceID//MPU9250获取IDu8 MPU9250_GetDeviceID(void){return MPU9250_SPI_Read(MPU9250_WHO_AM_I);}//MPU9250_Init//MPU9250初始化void MPU9250_Init(void){u8 data = 0, state = 0;uint8_t response[3] = {0, 0, 0};////////////////////////////////////////////////////////////////////////////MPU9250 ResetMPU9250_SPI_Write(MPU9250_PWR_MGMT_1, MPU9250_RESET);delay_ms(100);//MPU9250 Set Clock SourceMPU9250_SPI_Write(MPU9250_PWR_MGMT_1, MPU9250_CLOCK_PLLGYROZ);delay_ms(1);//MPU9250 Set Interrupt//Interrupt status is cleared if any read operation is performed.MPU9250_SPI_Write(MPU9250_INT_PIN_CFG, MPU9250_INT_ANYRD_2CLEAR);delay_ms(1);MPU9250_SPI_Write(MPU9250_INT_ENABLE, DISABLE);delay_ms(1);//MPU9250 Set Sensors//Enable all xyzMPU9250_SPI_Write(MPU9250_PWR_MGMT_2, MPU9250_XYZ_GYRO & MPU9250_XYZ_ACCEL);delay_ms(1);//MPU9250 Set SampleRate//SAMPLE_RATE = Internal_Sample_Rate / (1 + SMPLRT_DIV)MPU9250_SPI_Write(MPU9250_SMPLRT_DIV, SMPLRT_DIV);delay_ms(1);//MPU9250 Set Full Scale Gyro Range//Fchoice_b[1:0] = [00] enable DLPFMPU9250_SPI_Write(MPU9250_GYRO_CONFIG, (MPU9250_FSR_1000DPS << 3));delay_ms(1);//MPU9250 Set Full Scale Accel Range PS:2GMPU9250_SPI_Write(MPU9250_ACCEL_CONFIG, (MPU9250_FSR_2G << 3));delay_ms(1);//MPU9250 Set Accel DLPFdata = MPU9250_SPI_Read(MPU9250_ACCEL_CONFIG2);data |= MPU9250_ACCEL_DLPF_41HZ;delay_ms(1);MPU9250_SPI_Write(MPU9250_ACCEL_CONFIG2, data);delay_ms(1);//MPU9250 Set Gyro DLPFMPU9250_SPI_Write(MPU9250_CONFIG, MPU9250_GYRO_DLPF_41HZ);delay_ms(1);//MPU9250 Set SPI Modestate = MPU9250_SPI_Read(MPU9250_USER_CTRL);delay_ms(1);//Reset I2C Slave module and put the serial interface in SPI mode only. This bit auto clears after one clock cycle.MPU9250_SPI_Write(MPU9250_USER_CTRL, state | MPU9250_I2C_IF_DIS);delay_ms(1);state = MPU9250_SPI_Read(MPU9250_USER_CTRL);delay_ms(1);//Enable the I2C Master I/F module; pins ES_DA and ES_SCL are isolated from pins SDA/SDI and SCL/ SCLK.MPU9250_SPI_Write(MPU9250_USER_CTRL, state | MPU9250_I2C_MST_EN);delay_ms(1);////////////////////////////////////////////////////////////////////////////AK8963 Setup//reset AK8963MPU9250_AK8963_SPI_Write(MPU9250_AK8963_I2C_ADDR, MPU9250_AK8963_CNTL2, MPU9250_AK8963_CNTL2_SRST);delay_ms(2);//BIT: Output bit setting 4800uT// "1": 16-bit outputMPU9250_AK8963_SPI_Write(MPU9250_AK8963_I2C_ADDR, MPU9250_AK8963_CNTL, MPU9250_AK8963_POWER_DOWN);delay_ms(1);//Fuse ROM access modeMPU9250_AK8963_SPI_Write(MPU9250_AK8963_I2C_ADDR, MPU9250_AK8963_CNTL, MPU9250_AK8963_FUSE_ROM_ACCESS);delay_ms(1);//AK8963 get calibration data//Magnetic sensor X-axis sensitivity adjustment valueMPU9250_AK8963_SPI_Reads(MPU9250_AK8963_I2C_ADDR, MPU9250_AK8963_ASAX, 3, response);//AK8963_SENSITIVITY_SCALE_FACTOR//AK8963_ASA[i++] = (s16)((data - 128.0f) / 256.0f + 1.0f) ;调节校准的公式MPU9250_AK8963_ASA[0] = (s16)(response[0]) + 128;MPU9250_AK8963_ASA[1] = (s16)(response[1]) + 128;MPU9250_AK8963_ASA[2] = (s16)(response[2]) + 128;//delay_ms(1);MPU9250_AK8963_SPI_Write(MPU9250_AK8963_I2C_ADDR, MPU9250_AK8963_CNTL, MPU9250_AK8963_POWER_DOWN);delay_ms(1);//there is a stop between reads.MPU9250_SPI_Write(MPU9250_I2C_MST_CTRL, 0x5D);//400kHz的IIC通信速率delay_ms(1);MPU9250_SPI_Write(MPU9250_I2C_SLV0_ADDR, MPU9250_AK8963_I2C_ADDR | MPU9250_I2C_READ);delay_ms(1);MPU9250_SPI_Write(MPU9250_I2C_SLV0_REG, MPU9250_AK8963_ST1);delay_ms(1);//Enable reading data from this slave at the sample rate and storing data at the//first available EXT_SENS_DATA register, which is always EXT_SENS_DATA_00 for I2C slave 0.MPU9250_SPI_Write(MPU9250_I2C_SLV0_CTRL, 0x88);delay_ms(1);//连续测量MPU9250_AK8963_SPI_Write(MPU9250_AK8963_I2C_ADDR,MPU9250_AK8963_CNTL, MPU9250_AK8963_CONTINUOUS_MEASUREMENT);delay_ms(1);//function is disabled for this slaveMPU9250_SPI_Write(MPU9250_I2C_SLV4_CTRL, 0x09);delay_ms(1);//When enabled, slave 0 will only be accessed 1+I2C_MST_DLY) samples as determined by SMPLRT_DIV and DLPF_CFGMPU9250_SPI_Write(MPU9250_I2C_MST_DELAY_CTRL, 0x81);delay_ms(100);}。
基于STM32单片机的无人机飞行控制系统设计
基于STM32单片机的无人机飞行控制系统设计基于STM32单片机的无人机飞行控制系统设计一、引言无人机作为一种高效、灵活的飞行器,已经广泛应用于农业、航空摄影、物流等领域。
无人机的飞行控制系统是实现无人机稳定飞行的核心部件,关乎到无人机的安全性和性能。
本文将基于STM32单片机,设计一种高效稳定的无人机飞行控制系统。
二、系统设计方案1. 硬件设计无人机飞行控制系统的硬件设计包括主控芯片选型、传感器选择与连接、无线通信模块等。
(1)主控芯片选型本系统选用STM32系列单片机作为主控芯片。
STM32单片机具有高性能、低功耗和丰富的外设接口等特点,适合用于嵌入式系统设计。
(2)传感器选择与连接无人机的稳定飞行依赖于姿态传感器、气压传感器等,用于实时测量无人机的姿态信息和气压信息。
通过SPI或I2C接口,将传感器与STM32单片机连接。
(3)无线通信模块为了实现与地面控制站的通信,本系统选用WiFi或蓝牙模块作为无线通信模块。
通过无线通信模块,实现无人机与地面控制站之间的数据传输和指令控制。
2. 软件设计无人机飞行控制系统的软件设计包括飞行控制算法的实现、通信协议的设计和图形界面开发等。
(1)飞行控制算法本系统采用PID控制算法实现无人机的稳定飞行。
PID控制算法能根据无人机的姿态信息,实时调整无人机的控制指令,使其保持稳定飞行。
(2)通信协议设计在无人机飞行控制系统中,需要设计一种通信协议,在无人机和地面控制站之间进行数据传输。
本系统采用串口通信协议,在硬件上通过UART接口实现无人机和地面控制站之间的数据交互。
(3)图形界面开发为了方便用户对无人机进行操作和监控,本系统设计了图形界面。
通过图形界面,用户可以实时查看无人机的姿态信息、图像传输和设置飞行参数等。
三、系统实现及测试在系统设计完成后,需要进行实际的硬件搭建和软件开发。
在硬件搭建过程中,需要将选用的传感器、无线通信模块等进行连接。
在软件开发过程中,需要编写飞行控制算法、通信协议和图形界面等。
基于stm32的微型四旋翼飞行器设计
定为0,然后调内环PID,首先将I和D置0,对单P进行调试,当用 手干扰系统能感觉到有一定恢复力并有点晃动时,P就为理想值。 在P值确定好的情况下调节I值,I主要是消除稳态误差,对P有辅助 作用,当用手去干扰系统,系统能较快的恢复水平,此时的I值就 为理想值。由于调试P和I能达到预期效果,所以内环D值置0,内 环参数确定好后再对外环参数进行调试,外环主要作用是控制四 旋翼姿态响应快慢,本次调试期望值是0,调试外环单P,用手给 PITCH方向一个力,四旋翼能快速达到设定角并保持水平飞行, 此时的P就为理想值。在调试过程过程中虽然四旋翼能快速达到设 定角,但是系统会有一点震荡,通过调试外环D,当系统不再震荡 时,记下D值。对ROLL方向的调试步骤同上。最终调试飞行效果 如图10所示,对PITCH方向调试参数如表1所示,对ROLL方向调 试参数如表2所示。
ELECTRONICS WORLD・技术交流
基于STM32的微型四旋翼飞行器设计
贵阳学院电子与通信工程学院 古 训 贵州民族大学机械电子工程学院 郑亚利
本文以STM32F103C8T6为主控制器,采用MPU6050完成姿态 信息采集,通过蓝牙模块完成四旋翼飞行器与电脑之间的通信, Nrf2401完成微型四旋翼飞行器和遥控器之间的通信。将MPU6050 采集的数据由四元素法转换成欧拉角对四旋翼进行姿态解算控制, 通过串级PID控制四个空心杯电机的转速,实现了微型四旋翼飞行 器PITCH和ROLL方向的稳定水平飞行。
1.引言 四旋翼在无人机研究领域中是发展最快、研究最多的一种飞行
器(赵鹏,郑文豪,李刚,基于STM32的四旋翼飞行器的设计: 电子制作,2019),目前主要应用于研发平台、军事和执法、商业 应用方面。四旋翼飞行器体积小、质量轻、飞行稳定,可应用于执 行航拍、监控、勘察、救援等飞行任务。其工作原理是主控芯片输 出四路PWM波调节四个电机的转速来改变四个旋翼的转速,从而 改变螺旋桨产生的升力,使四旋翼飞行器的位置和姿态得以控制。 四旋翼飞行器是一个欠驱动系统,它有4个输入,分别是上升力和 三个方向的转矩,6个输出分别是垂直、前 后、侧向、俯仰、滚转、偏航运动。四旋翼 飞行器有垂直、横滚、俯仰、偏航四种基本 飞行控制方式。本文主要介绍四旋翼硬件设 计以及串级PID对PITCH和ROLL方向的平衡 控制影响。
基于STM32+MPU6050的小型四旋冀无人机设计
基于STM32+MPU6050的小型四旋冀无人机设计作者:何枫杨凤年何文德来源:《电脑知识与技术》2020年第19期摘要:设计了一款基于STM32微控制器和六轴运动处理传感器的小型四旋翼无人机。
它采用STM32F103C8作为微控制器,利用MPU6050感应无人机的实时加速度和角速度信息,通过Wi-Fi通信获得遥控指令,并结合串级PID控制算法,对姿态信息进行解算,最终生成并输出控制电机转速所需的PWM波,使无人机稳定飞行。
关键词:四旋翼无人机;STM32;飞行控制中图分类号:TP311 文献标识码:A文章编号:1009-3044(2020)19-0213-02开放科学(资源服务)标识码(0SID):随着信息技术、传感器技术和微机电技术的迅猛发展,无人机技术的研究已成当今的研究热点之一。
若以外形结构来分类,无人机可分为固定翼无人机、无人直升机和多旋翼无人机等类型。
而多旋翼无人机具有系统安全性好、可靠性高、负载能力强等特点,具有非常广阔的应用前景,其中,四旋翼无人机以其结构简单,操控方便等优点,被广泛应用于军事和民用领域,其应用场景包括如航空测量、航空施药、空中摄影、环境监测、货物投送、灾害现场搜救、电力石油基础设施巡检等领域。
1 总体方案設计根据机翼与飞行方向的相对布局方式的不同,四旋翼无人机可分为十字型和X型两种模式。
十字型无人机的机头方向指向某个旋翼,而X型无人机的机头方向则指向两个旋翼的正中间。
十字型无人机因其机头方向明确,飞行控制相对简单;X型无人机三轴的姿态调整至少需要操控两个电机,因此操作更为快速灵活,适合特技飞行,也便于扩展功能。
因此,本文采用X型四旋翼无人机方案。
无人机系统由无人机和遥控器两部分组成,用户利用手机APP通过Wi-Fi无线通信实现对无人机的远程控制,无须配备专用遥控器,在Wi-Fi网络环境下,打开智能手机上的专用遥控APP,可对无人机进行遥控。
Wi-Fi和蓝牙技术一样,同属于短距离无线技术,与蓝牙技术相比,它具备更高的传输速率,更远的传播距离,已经广泛应用于笔记本、手机、汽车等广大领域中,因此,相对于蓝牙通信,利用Wi-Fi无线通信遥控无人机,具有更快的响应速度和更远的控制距离。
一种基于MPU9250的四旋翼姿态解算改进算法
MECHANICAL ENGINEER
一种基于MPU9250的四旋翼姿态解算改进算法
赵嵌嵌 (浙江海洋大学 港航与交通运输工程学院EMS惯性测量单元姿态估计过程中存在的漂移和噪声问题,提出了一种基于互补滤波的改
进算法。 建立了以MPU9250为姿态测量单元的四旋翼飞行器测试平台。分别在静态和动态条件下,收集和比较了不同方
fusion with traditional complementary filtering, and our improved filtering fusion algorithm. Experimental results show that
the present improved attitude fusion algorithm has advantages in terms of higher estimation precision and lesser drift and
为了解决这些问题并提高姿态角的测量精度,基于
基金项目:海上搜救用无人机视觉导航系统设计及算法研究 (LGG18F030013)
卡尔曼滤波原理的算法被提出。冯少江、徐泽宇等[5]针对 EKF在工程实践中难以获得准确的预测模型参数,以及 标准EKF对非线性系统采用线性化模型带来的误差等问 题,采用一种改进扩展卡尔曼滤波算法(BPNN-EKF),使 得姿态解算精度得到较大提升[5]。贺海鹏、阎妍等[6]使用优 化的迭代EKF(IEKF)方法,解决了利用不精确的传感器 测量信息获取精确姿态角的难题;该方法使测量精度有 明显的改善。汪绍华、杨莹[7]使用卡尔曼滤波算法来提高 无人机姿态测量的精度。姜海涛、常青等[8]针对无人机控 制系统易受外界噪声干扰、强耦合、非线性的问题,提出 了一种自抗扰控制(ADRC)与改进的扩展卡尔曼滤波器 (EKF)相结合的方法。该算法使无人机的姿态跟踪曲线 平稳,降低了高度控制的稳定时间,提高了抗干扰能力。 李迟等[9]针对无人机姿态解算过程中噪声干扰引起的无 人机不稳定,提出了一种改进的无迹卡尔曼滤波(UKF) 算法,采用了迭代卡尔曼滤波(ISR-UKF)、衰减因子的单 侧最小偏度采样滤波等二种滤波方法对噪声进行处理; ISR-UKF在滤波精度上较UKF有所提高,而最小偏度采 样在采样点利用率和实时性方面取得较好效果。吴和龙、 白越等[10]针对传统扩展卡尔曼滤波(Extended Kalman Filter, EKF) 姿态解算方法无法满足大载荷无人机强振动条件 下的工作要求,导致姿态角解算精度不高,并且容易导致 姿态角发散的问题,提出了基于二十维状态量的CPF-
mpu9250STM32源程序
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void I2C_delay(void)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
SDA_L;
I2C_delay();
return TRUE;
}
/*******************************************************************************
* Function Name : I2C_Stop
* Description : Master Stop Simulation IIC Communication
* Input
: None
* Output
: None
* Return
: None
****************************************************************************** */
void I2C_Stop(void)
{
SCL_L;
基于STM32 的云台稳定器设计
基于STM 32的云台稳定器设计摘要:针对视频拍摄过程中容易出现不稳定的现象,提出以STM32为主控核心的防抖动云台的设计方案。
文章介绍了以MPU9250为姿态传感器获取原始姿态角,利用卡尔曼滤波融合算法计算出稳定可靠的姿态角,当检测到姿态角发生偏移时,通过PID 算法调节SPWM 波,经DRV8313芯片放大后驱动三相无刷直流电机,将抖动消除,使云台保持稳定。
通过理论仿真与实际测试,实现了能够搭载小型运动相机的云台稳定器。
关键词:STM32;MPU9250;姿态算法;云台稳定器中图分类号:TP273.2文献标识码:A 文章编号:2095-0438(2020)05-0149-05(龙岩学院物理与机电工程学院福建龙岩364012)赖义汉龙忠华刘子铄李小强熊益康∗∗∗第40卷第5期绥化学院学报2020年5月Vol.40No.5Journal of Suihua UniversityMay .2020收稿日期:2019-10-30作者简介:赖义汉(1968-),男,福建龙岩人,龙岩学院物理与机电工程学院副教授,硕士,研究方向:嵌入式系统研究与应用。
基金项目:福建省大学生创新创业训练计划项目(201811312055)。
随着数码产品的快速发展,视频拍摄已经成为大部分人生活的一部分。
目前,便携式拍摄设备主要以手机或小型摄像机为主,由于部分手机或者小型摄像机没有防抖功能或者防抖功能较弱,直接手持设备拍摄时容易发生抖动,导致拍摄的视频出现模糊、视频画面质量不佳等现象。
为了解决拍摄抖动的问题,提出以STM32为控制核心的防抖动云台的设计方法,通过MPU9250获取云台姿态角,采用卡尔曼滤波融合算法计算出最优姿态角,使用PID 算法调节三相无刷直流电机,使云台保持平衡。
一、系统总体设计方案云台控制系统由MPU9250姿态传感器、STM32主控芯片、电机驱动模块、横滚轴电机和俯仰轴电机等部分组成,系统总体框图如图1所示:图1系统总体框图本系统使用MPU9250作为姿态传感器[1],能实时检测当前云台的角速度、加速度等信息,并传送到STM32单片机中,采用卡尔曼滤波算法进行滤波融合,得到最优的云台偏转角[2]。
基于树莓派的智能清洁垃圾桶的设计
2023年 / 第8期 物联网技术790 引 言随着社会的发展和科技的进步,环境和资源问题被大多数人所关注,垃圾分类也被提上日程;进一步地,各类智能垃圾桶随着智能科技的发展不断问世。
然而,许多家庭仍在使用传统的垃圾桶。
由于传统垃圾桶位置固定,垃圾桶距离远时扔垃圾不方便,还存在功能单一、无法分类等问题,不能明显提高人们的生活环境和质量,且不利于推动垃圾分类的实施[1-4]。
目前市面上的智能垃圾桶一般只具备单一的配置WiFi 或蓝牙功能,并不能完全从根本上解决原本就存在的问题。
本文所述的智能清洁垃圾桶结合家庭用户及服务行业需求解决了多个有关垃圾桶使用的问题,效率更高,功能更全,更便于实现家庭垃圾分类[5]。
1 总体方案设计本设计以性能强大、模块的拓展性强,以及通过USB串口可以连接多种模块进行操作的树莓派4B 作为系统的主控芯片。
树莓派上运行的ROS 主要作用于智能清洁垃圾桶的数据处理以及指令发布,机身连接着USB 摄像头、麦克风阵列、激光雷达、扬声器。
因为控制左右轮电机采用的是PID 算法,而PID 算法是一种实时性算法,采用严格的实时时钟驱动逻辑,作为上位机的大部分系统满足不了高时效性,所以采用STM32作为本设计的辅助控制芯片,负责指令动作的直接执行,直接驱动左右轮的运作,实现智能清洁垃圾桶的移动、清洁、旋转桶盖等功能[3]。
智能清洁垃圾桶总体由分类垃圾桶、清洁机器人和充电桩这3个部分组成,清洁机器人和分类垃圾桶采用可分离式结构设计,正常模式下作为移动式智能垃圾桶,当用户下达清洁指令后机身分离,清洁机器人脱离分类垃圾桶并记录当前位置执行清洁任务,执行完清洁任务后自动返回合体,并且该智能清洁垃圾桶可以通过手机APP 和电脑远程登录ROS 系统管理和控制。
总体方案设计如图1所示。
2 系统硬件设计系统硬件主要由控制模块、视觉分类模块、运动清洁模块、激光雷达模块、语言交互与声源定位模块组成。
树莓派4B 作为主控单元,通过串口与STM32F103C8T6驱动板通信,调节各个模块之间的运行。
四旋翼自主追踪智能车的系统设计
电子技术• Electronic Technology98 •电子技术与软件工程 Electronic Technology & Software Engineering●基金项目:西北民族大学国家级大学生创新创业训练计划项目资助(项目编号:201810742075)。
【关键词】四旋翼无人机 控制 自主导航四旋翼无人机具有结构简单,控制方便等优点,在狭小空间内实现起飞,盘旋,着陆等动作,在通过无线串口获取到地面智能车传来的实时位置,利用滤波算法提高坐标精度,设计导航算法,实现四旋翼快速精准跟踪到地面智能车。
1 总体方案设计1.1 系统硬件组成四旋翼无人机呈“X ”型结构,由机架、飞控、姿态模块、无刷电机及驱动和无线通信模块、电源等组成,四个螺旋桨分别固定“X ”字支架末端,相邻之间的螺旋桨转速相反,抵消所产生的扭矩,智能车以STM32为处理器,搭载GPS 模块,将智能车位置坐标发送给四旋翼,实现自主导航。
1.2 系统工作原理四旋翼飞行器以STM32单片机为控制器,使用MPU-9250对四旋翼飞行姿态的数据进行采集和分析处理,飞控以得到的数据作为输入,使用控制算法调整输出量,通串行总线控制各个电机,使四旋翼向预定姿态无限逼近,完成姿态调整。
飞控通过串行总线获得的四旋翼和智能车经纬度坐标,通过算法设计出四旋翼飞行追踪地面智能车的最佳飞行路线,让无人机可以快速追踪目标。
如图1为四旋翼自主追踪智能车的系统结构图。
2 硬件的设计与实现2.1 硬件设计四旋翼飞行器有四个输入力,有六个状态输出,依靠四个旋翼之间的的速度差实现无四旋翼自主追踪智能车的系统设计文/李金鹏 张国恒本文通过无线串口获取到地面智能车传来的实时位置,利用滤波算法提高坐标精度,设计导航算法,从而实现四旋翼快速精准跟踪到地面智能车。
摘 要人机的悬停、上升、下降、前后飞行、左右飞行、偏航飞行。
将获得的导航模块数据进行滤波处理,使四旋翼和智能车的位置坐标进行不同参考系下的转换处理,设计出最优导航路线并实现自主导航。
Processing电子罗盘校准(以MPU9250为例)
Processing电⼦罗盘校准(以MPU9250为例) 使⽤Processing 软件, 通过 arduino 输⼊电⼦罗盘的数据,通过PC端进⾏校准,程序如下:import processing.serial.*;Serial myPort;ArrayList<Float> xList = new ArrayList<Float>();ArrayList<Float> yList = new ArrayList<Float>();ArrayList<Float> zList = new ArrayList<Float>();float minX,maxX;float minY,maxY;float minZ,maxZ;float moX,moY;float count;void setup() {size(600, 600, P3D);myPort = new Serial(this,"COM5", 38400);myPort.bufferUntil(10);}void draw() {background(100);float midX = (minX+maxX)/2;float midY = (minY+maxY)/2;float midZ = (minZ+maxZ)/2;if (mousePressed) {moX= mouseX;moY= mouseY;}//camera(moX,moY, (height/2) / tan(PI/5), midX, midY,midZ, 0, 1, 0);camera(moX,moY,(height/2) / tan(PI/5), width/2, height/2,0, 0, 1, 0);translate(width/2, height/2, -100);strokeWeight(2); // Defaultstroke(255);noFill();//xline(midX-100,midY,midZ,midX+100,midY,midZ);//yline(midX,midY+100,midZ,midX,midY-100,midZ);//zline(midX,midY,midZ-100,midX,midY,midZ+100);//box(200);for(int i = 0;i<xList.size();i++){point(xList.get(i),yList.get(i),zList.get(i));}println(count);println("midX:"+midX+","+"midY"+midY+","+"midZ:"+midZ);}void serialEvent (Serial myPort){float mX = 0;float mY = 0;float mZ = 0;String inString = myPort.readStringUntil(10);if (inString != null){inString = trim(inString);String[] list = split(inString, ',');if(list.length ==4){count = float(list[0]);mX = float(list[1])/100;mY = float(list[2])/100;mZ = float(list[3])/100;//-------------------------if(mX < minX){minX = mX;}if(mX > maxX){maxX = mX;}//----------------------------if(mY < minY){minY = mY;}if(mY > maxY){maxY = mY;}//----------------------------if(mZ > maxZ){maxZ = mZ;}if(mZ < minZ){minZ = mZ;}xList.add(mX);yList.add(mY);zList.add(mZ);}}}arduino 代码如下:int mx,my,mz;::: 略Serial.print(count);Serial.print(",");Serial.print(mx); //Inclination X axis (as measured by accelerometer) Serial.print(",");Serial.print(my); //Inclination X axis (estimated / filtered)Serial.print(",");Serial.print(mz); //Inclination X axis (estimated / filtered)Serial.println("");count++;PC端获取的效果如下图:最终坐标系完全落⼊球内表⽰校准成功.视频:。
MPU-9250 九轴产品中文说明书
4.3 周围电路元器件清单.......................................................................................................20
4.4 内部框图...........................................................................................................................21
4.11 辅助 I2C 芯片通讯 ......................................................................................................23
4.12 自检模式........................................................................................................................24
4.5 概述 ..................................................................................................................................22
4.6 16 位 ADC 三轴陀螺仪信号输出及调理.........................................................................22
2.5 应用建议............................................................................................................................7
MPU9250MPU6050与运动数据处理与卡尔曼滤波(1)
MPU9250MPU6050与运动数据处理与卡尔曼滤波(1)第⼀篇——概述和MPU6050及其⾃带的DMP输出四元数概述 InvenSense(国内⼀般译为应美盛)公司产的数字运动传感器在国内⾮常流⾏,我⽤过它的两款,9250和6050。
出于被国产芯⽚惯坏的习惯,我⾃然⽽然地认为其封装引脚和寄存器都是兼容的,所以这成功地让我打废两次板,这两款芯⽚的封装并不是⼀样的,MPU9250的要⼩很多,⽽两者都引脚也不⼀样,虽然他们都是24pin的,可能是出于MPU9250多⼀个地磁传感器,AK8963。
所以两者的差异点主要在于:1,封装(塑体⼤⼩);2,管脚功能;3,MPU9250较MPU6050多⼀个三轴地磁传感器AK8963;4,部分寄存器(待补充); MPU6050是款加速度和⾓速度传感器,有⼈也将因为其⾓速度传感器的功能将其称为陀螺仪,我其实并不能理解,我觉得能直接输出姿态数据⽐如欧拉⾓或者四元数的传感器才是陀螺仪。
多年以前我刚进⼊⼤学时听过⼀个东⼤微电⼦学院教授的讲座,讲的是MEMS技术,我只记得中间陈提出了⼀个MEMS能否⽤来制造晶振的问题,让我记住了这个⼤⼆的。
后来也有同事说过MEMS技术中封装也是很重要的,我⼀想也有道理,能把AK8963封装进去肯定不简单啊。
MPU6050能测三轴加速度和三轴加速度,加速度的量程为±2/4/6/8/16g,⾓速度量程为±250/500/1000/2000⾓度每秒,16位ADC,输出速率好像能达到⼏千赫兹,当然6050只⽀持IIC,时钟最快400KHz。
3.3V供电,⼏个毫安的功耗。
带⼀个IIC主机接⼝,⽤来外挂其他的IIC传感器⽐如GNSS或者地磁传感器。
MPU6050的DMP ⼀般运动传感器都是要靠处理器跑算法来进⾏⾓度融合以得到最终能直接使⽤的表⽰当前⾃⾝姿态的欧拉⾓或者四元数的。
我之前⽤的是卡尔曼滤波。
要⾃⼰写代码⼤家⾃然会觉得多个流程,当然有时也会觉得⾃⼰算的才靠谱,其实也是,靠6050⾃带的DMP算的并不⽐单⽚机算的准,⽽且DMP算得慢,有时是不够⽤的。
MPU-9250寄存器映射中文
MPU-9250 寄存器映射介绍版本1.6目录1、陀螺仪和加速度计寄存器映射 (3)2、寄存器介绍 (5)2.1、寄存器0-2——陀螺仪自检寄存器(Gyroscope Self-Test Registers) (5)2.2、寄存器13-15——加速度计自检寄存器(Accelerometer Self-Test Registers) (5)2.3、寄存器19-24——陀螺仪偏置寄存器(Gyro Offset Registers) (5)2.4、寄存器25——采样频率分频器(Sample Rate Divider) (6)2.5、寄存器26——配置(Configuration) (6)2.6、寄存器27——陀螺仪配置(Gyroscope Configuration) (7)2.7、寄存器28——加速度计配置(Accelerometer Configuration) (7)2.8、寄存器28——加速度计配置2 (8)2.9、寄存器30——低功率加速度计ODR控制寄存器Low Power Accelerometer ODR Control (9)2.10、寄存器31——唤醒运动阈值 (10)2.11、寄存器32——FIFO使能 (10)2.12、寄存器36——I2C主机控制寄存器 (10)2.13、寄存器37和39——I2C从机0控制器 (11)2.14、寄存器40和42——I2C从机1控制器 (12)2.15、寄存器43和45——I2C从机2控制器 (13)2.16、寄存器46和48——I2C从机3控制器 (14)2.17、寄存器49和53——I2C从机4控制器 (15)2.18、寄存器54——I2C主机状态寄存器I2C Master Status (16)2.19、寄存器55——INT Pin / Bypass Enable Configuration (16)2.20、寄存器56——Interrupt Enable (17)2.21、寄存器58——Interrupt Status (17)4.22、寄存器50-64——Accelerometer Measurements (17)2.23、寄存器65-66——Temperature Measurement (18)2.24、寄存器67-72——Gyroscope Measurements (18)2.25、寄存器73-96——External Sensor Data (19)2.26、寄存器99——I2C Slave 0 Data Out (20)2.27、寄存器100——I2C Slave 1 Data Out (21)2.28、寄存器101——I2C Slave 2 Data Out (21)2.29、寄存器102——I2C Slave 3 Data Out (21)2.30、寄存器103——I2C Master Delay Control (21)2.31、寄存器104——Signal Path Reset(SIGNAL_PATH_RESET) (21)2.32、寄存器105——Accelerometer Interrupt Control(ACCEL_INTEL_CTRL) (22)2.33、寄存器106——User Control(USER_CTRL) (22)2.34、寄存器107——Power Management 1(PWR_MGMT_1) (22)2.35、寄存器108——Power Management 2(PWR_MGMT_2) (23)2.36、寄存器114和115——FIFO Count Registers (24)2.37、寄存器116——FIFO Read Write(FIFO_R_W) (24)2.38、寄存器117——Who Am I(WHOAMI) (24)2.39、寄存器119, 120, 122, 123, 125, 126加速度计偏移寄存器 (25)3、磁力仪寄存器映射 (25)3.1、寄存器映射描述 (26)3.2、磁力仪寄存器详细介绍 (26)3.3 WIA: Device ID (26)3.4 INFO: Information (26)3.5、ST1: Status 1 (27)3.6 HXL to HZH: Measurement Data (27)3.7 ST2: Status 2 (28)3.8 CNTL1: Control 1 (28)3. 9 CNTL2: Control 2 (29)3.10 ASTC: Self-Test Control (29)3.11 TS1, TS2: Test 1, 2 (29)3.12 I2CDIS: I2C Disable (29)3.13 ASAX, ASAY, ASAZ: Sensitivity Adjustment values (29)4、高级硬件功能 (30)1、陀螺仪和加速度计寄存器映射下表列出了MPU-9250运动轨迹设备的陀螺仪和加速度计的寄存器映射表1、MPU-9250模式陀螺仪和加速度计寄存器映射注意:寄存器名称以_H和_L结尾的内部寄存器值分别包括一个高字节和低字节在接下来详细的寄存器表中,寄存器名称将以大写和大写加斜体出现。
MPU9250九轴陀螺仪--读接口数据
MPU9250九轴陀螺仪--读接⼝数据1.使⽤i2c链接到树莓派的scl , sda 接⼝vcc给3v引脚,gnd接树莓派gnd就ok。
2.要操作mpu必须使⽤mpu的寄存器实现对参数的设定以及读取,取官⽅下载资料看了⼀下,在github上找了⼀个python代码,运⾏不了bug 太多了,然后精简了⼀下。
终于能读出数据了,读出来的数据都是6个字节的,后来发现这哥们⽤python 读取mpu没有做字节合并,重写了⼀下,后来发现数据都是整数,不管我怎么旋转数字都是正的,看了⽹上的⼀⽚⽂章说寄存器度出来的是⼀个⽆符号整数。
后来想了半天,⽤⼿机下了⼀个陀螺仪app发现会出现负数的情况,只要向相对轴相反⽅向做运动就会出现负数,于是想了ctypes,强制转换成int这回数据看起来是有正数和负数了,不过在陀螺仪平放着的时候读书优点太⼤了都达到3000以上了,明显不是,貌似是这个数字需要转换⼀下才能使⽤,我找了N多的资料,终于找到有个⼈mpu6050的代码⾥,有⼀个固定的常亮,他使⽤acc_x乘以这个固定的常数,然后我测试了⼀下,确实可⾏,只要将加速计的值乘以16.4就可以得到正确的值!陀螺仪读数要乘以13.我搜索了半天也没有找到为什么要乘以16.4 ,不找了,如果有⼈看到这篇⽂章知道为啥乘以16.4请留⾔,谢谢使⽤如下代码需要安装smbus库,在树莓派直接 sudo apt-get install py-smbus就ok了3.python代码如下:import smbusimport sched, timeimport binasciifrom threading import Timer, Thread, Eventfrom struct import *import ctypesfrom math import acosimport sched, timeimport binasciifrom struct import *i2c = smbus.SMBus(1)addr = 0x68t0 = time.time()# ====== initial zone ======try:device_id = i2c.read_byte_data(addr, 0x75)print ("Device ID:" + str(hex(device_id)))print ("MPU9250 I2C Connected.")print("")except:print ("Connect failed")print ("")i2c.write_byte_data(0x68, 0x6a, 0x00)time.sleep(0.05);i2c.write_byte_data(0x68, 0x37, 0x02)i2c.write_byte_data(0x0c, 0x0a, 0x16)# set frequence for acceleratori2c.write_byte_data(0x68, 29, 9)# enable fifo and dmp# i2c.write_byte_data(0x68 , 106 , 32+64);# ====== intial done ======def mpu9250_data_get_and_write():# global t_a_g# keep AKM pointer on continue measuringi2c.write_byte_data(0x0c, 0x0a, 0x16)# get MPU9250 smbus block data# xyz_g_offset = i2c.read_i2c_block_data(addr, 0x13, 6)xyz_a_out = i2c.read_i2c_block_data(addr, 0x3B, 6)print("xyz_a_out" + str(list2word(xyz_a_out, calc_accelerator_value)))# print("xyz_a_out_org#:"+str(xyz_a_out))xyz_g_out = i2c.read_i2c_block_data(addr, 0x43, 6)print("xyz_g_out" + str(list2word(xyz_g_out, calc_gyro_value)))# xyz_a_offset = i2c.read_i2c_block_data(addr, 0x77, 6)# get AK8963 smb#us data (by pass-through way)xyz_mag = i2c.read_i2c_block_data(0x0c, 0x03, 6)# print("xyz_mag"+str(list2word(xyz_mag)))xyz_mag_adj = i2c.read_i2c_block_data(0x0c, 0x10, 3)def list2word(data_list=[], callback=''):data = data_list[:]if not len(data):return [];result = []for i in range(3):high_byte = data.pop(0)low_byte = data.pop(0)result.append(callback(float(ctypes.c_int16(((high_byte << 8) | low_byte)).value))) return resultdef calc_accelerator_value(value):return round(value / 16.4)def calc_gyro_value(value):return round(value / 131)def clear_i2c_and_close_file():i2c.write_byte_data(addr, 0x6A, 0x07)# solution 1: while truedef while_true_method():# max_count = raw_input("Enter how many count you want.")max_count = 100;if max_count < 1: max_count = 1000print ("Data Counts: " + str(max_count))max_count = int(max_count)count = 1print ("")print ("MPU9250 9axis DATA Recording...")while True:# if count <= max_count:mpu9250_data_get_and_write()count += 1time.sleep(0.5)# else:pass# break;while_true_method();附:寄存器地址#define SMPLRT_DIV 0X19 //陀螺仪采样率典型值为0X07 1000/(1+7)=125HZ #define CONFIG 0X1A //低通滤波器典型值0x06 5hz#define GYRO_CONFIG 0X1B //陀螺仪测量范围 0X18 正负2000度#define ACCEL_CONFIG 0X1C //加速度计测量范围 0X18 正负16g#define ACCEL_CONFIG2 0X1D //加速度计低通滤波器 0x06 5hz#define PWR_MGMT_1 0X6B//电源管理1 典型值为0x00#define PWR_MGMT_2 0X6C //电源管理2 典型值为0X00#define WHO_AM_I 0X75 //器件ID MPU9250默认ID为0X71#define USER_CTRL 0X6A //⽤户配置当为0X10时使⽤SPI模式#define MPU9250_CS PDout(3) //MPU9250⽚选信号#define I2C_ADDR 0X68 //i2c的地址#define ACCEL_XOUT_H 0X3B //加速度计输出数据#define ACCEL_XOUT_L 0X3C#define ACCEL_YOUT_H 0X3D#define ACCEL_YOUT_L 0X3E#define ACCEL_ZOUT_H 0X3F#define ACCEL_ZOUT_L 0X40#define TEMP_OUT_H 0X41 //温度计输出数据#define TEMP_OUT_L 0X42#define GYRO_XOUT_H 0X43 //陀螺仪输出数据#define GYRO_XOUT_L 0X44#define GYRO_YOUT_H 0X45#define GYRO_YOUT_L 0X46#define GYRO_ZOUT_H 0X47#define GYRO_ZOUT_L 0X48当然以上的都是把数据⼿册的地址进⾏定义。