小言_互联网的博客

HaaS EDU场景式应用学习 - 陀螺仪小球

396人阅读  评论(0)

 

HaaS EDU场景式应用整体介绍

 

1、实验介绍

手机上的“重力感应”想必大家都不陌生,基于重力感应可以实现飞车、辅助瞄准等各种体感非常强的交互功能。所谓的“重力感应”,其实就可以使用“加速度计及陀螺仪传感器”来实现。

本节实验中,我们将会基于 MPU-6050 实现一个根据开发板姿态滚动的小球。当我们倾斜 HaaS EDU K1 时,会看见小球根据我们的倾斜方向发生相对应的偏移。

 

2、涉及知识点

  • MPU-6050 的驱动和使用
  • OLED绘图

 

3、软硬件环境准备

3.1、硬件

开发用电脑一台

HAAS EDU K1 开发板一块 (开发板内置 MPU-6050 传感器)

USB2TypeC 数据线一根

3.2、软件

"陀螺仪小球"功能已经包含在edu_demo应用中,并且包含在发布版本中。

3.2.1、固件版本

固件版本:V1.0.0

 

3.2.2、代码路径


  
  1. git clone https: //gitee.com/alios-things/AliOS-Things.git -b dev_3.1.0_haas
  2. cd AliOS-Things /application/example /edu_demo/k1_apps/gyroscope

3.2.3、编译

进入代码的顶层目录如AliOS-Things进行编译。直接编译application/example/目录下的edu_demo应用。

两种方法进行编译

命令行方式


  
  1. aos make distclean
  2. aos make edu_demo@haaseduk1 -c config
  3. aos make

AliOS Studio IDE方式

3.2.4、烧录

见开发环境章节

 

4、硬件介绍 - MPU-6050

 

4.1、硬件规格

    MPU-60X0是世界上第一款集成 6 轴MotionTracking设备。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器 DMP( DigitalMotion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。

MPU-6050具有三个用于将陀螺仪输出数字化的16位模数转换器(ADC)和三个用于将加速度计输出数字化的16位ADC。 为了精确跟踪快速和慢速运动,这些部件具有用户可编程的陀螺仪满量程范围,范围为±250,±500,±1000和±2000°/ sec(dps),以及用户可编程的加速度计满量程范围 范围为±2g,±4g,±8g和±16g。使用400kHz的I2C与设备的所有寄存器进行通信。其他功能包括嵌入式温度传感器和片上振荡器,在整个工作温度范围内误差±1%。

更多硬件规格请参考 DataSheet。

 

4.2、传感原理

陀螺仪由1850年法国物理学家莱昂·傅科在研究地球自传中获得灵感而发明出来的,类似像是把一个高速旋转的陀螺放到一个万向支架上,靠陀螺的方向来计算角速度,和现在小巧的芯片造型大相径庭。

早期的机械陀螺仪[1]             

目前常见的电子陀螺仪

那么如何将这么庞大的机械设备,塞进小小的芯片当中呢?以目前广泛使用的MPU-6050为例,它属于传感MEMS分支。传感MEMS技术是指用微电子微机械加工出来的、用敏感元件如电容、压电、压阻、热电耦、谐振、隧道电流等来感受转换电信号的器件和系统。感兴趣的同学可以来这里学习亚德诺半导体的公开课 —— MEMS传感器2:加速,旋转——陀螺仪工作原理

我们使用的MPU-6050是一款经典的MEMS陀螺仪,即硅微机电陀螺仪。MEMS(Micro-Electro-Mechanical System)是指集机械元素、微型传感器、微型执行器以及信号处理和控制电路、接口电路、通信和电源于一体的完整微型机电系统。绝大多数的MEMS陀螺仪依赖于相互正交的振动和转动引起的交变科里奥利力。在MPU-6050内部,存在一质量块,当器件上电后,会触发质量块以固定频率横向运动。当器件遭受外力具备加速度时,就会触发质量块的纵向运动,从而改变四周梳齿之间的距离,改变输出的电容,进而通过ADC将模拟信号转换为数字信号,输出给外部[2]。

4.3、原理图

在原理图中我们可以看出,器件使用I2C通讯接口。并且,器件支持使用过INT引脚,当数据到来时可以在该引脚上触发中断。需要注意的是,AD0引脚决定了器件地址的第 0 bit。当AD0连接高电平,即AD0 = 1,此时器件地址为0x69。

4.4、驱动方式

4.4.1、通讯接口

由DataSheet可知,MPU-6050采用的通讯方式为I2C。默认7bit设备地址:0x69 (DataSheet P33 9.2)

在 AliOS Things 中,开发者只需要关心器件的设备地址即可,因为只要知道了设备地址,读写地址也可以计算出,AliOS Things 会自动处理这些计算。如果我们需要为了 MPU-6050 初始化I2C接口,那么对应的代码为:


  
  1. // components\peripherals\sensor\drv\drv_mag_honeywell_qmc5883l.c
  2. static i2c_dev_t i2c_dev;
  3. i2c_dev.port                 = 1;                               // HaaS EDK 默认使用I2C 1
  4. i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;     
  5. i2c_dev.config.freq          = I2C_BUS_BIT_RATES_400K;         
  6. i2c_dev.config.mode          = I2C_MODE_MASTER;
  7. i2c_dev.config.dev_addr      = MPU_ADDR;                        // MPU_ADDR 0X69
  8.  hal_i2c_init(&i2c_dev);

4.4.2、寄存器

一般,使用I2C通讯的器件,都是通过读写寄存器的方式来完成对设备的读取和配置,因此了解寄存器的分布就非常重要。由于 MPU-6050 的寄存器数量较多,建议读者们查阅 Regsiter Map 文档来获取这些信息。我们进列出部分较为关键的寄存器。

0x3B-0x40 三轴加速度寄存器     每轴数据2Byte  

0x41-0x42 温度寄存器               2Byte

0x43-0x48 三轴陀螺仪寄存器     每轴数据2Byte  

 

4.4.3、驱动实现

uint8_t MPU_Init(void)

器件初始化。


  
  1. // components/peripherals/sensor/drv/drv_acc_gyro_inv_mpu6050.c
  2. uint8_t MPU_Init( void)
  3. {
  4.     uint8_t device_id = 0;
  5.     // 初始化I2C
  6.     i2c_dev.port = 1;
  7.     i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
  8.     i2c_dev.config.freq = I2C_BUS_BIT_RATES_100K;
  9.     i2c_dev.config.mode = I2C_MODE_MASTER;
  10.     i2c_dev.config.dev_addr = MPU_ADDR;
  11.     hal_i2c_init(&i2c_dev);
  12.     // 复位MPU6050
  13.     MPU_Write_Byte( MPU_PWR_MGMT1_REG, 0X80);
  14.     aos_msleep( 100);
  15.     // 唤醒MPU6050
  16.     MPU_Write_Byte( MPU_PWR_MGMT1_REG, 0X00);
  17.     // 设置陀螺仪传感器量程,±2000dps
  18.     MPU_Set_Gyro_Fsr( 3);   
  19.     // 设置加速度传感器量程,±2g
  20.     MPU_Set_Accel_Fsr( 0);  
  21.     // 关闭所有中断
  22.     MPU_Write_Byte( MPU_INT_EN_REG, 0X00);   
  23.     // I2C主模式关闭
  24.     MPU_Write_Byte( MPU_USER_CTRL_REG, 0X00);
  25.     // 关闭FIFO
  26.     MPU_Write_Byte( MPU_FIFO_EN_REG, 0X00);  
  27.     // 读取器件ID
  28.     device_id = MPU_Read_Byte( MPU_DEVICE_ID_REG);
  29.     // 如果读取的器件ID与预期一致
  30.     if (device_id == MPU_DEV_ID)
  31.     {
  32.         LOGI( "APP", "MPU init OK\n");
  33.         //设置CLKSEL,PLL X轴为参考
  34.         MPU_Write_Byte( MPU_PWR_MGMT1_REG, 0X01);
  35.         //加速度与陀螺仪都工作
  36.         MPU_Write_Byte( MPU_PWR_MGMT2_REG, 0X00);
  37.         //设置采样率为50Hz
  38.         MPU_Set_Rate( 50);                       
  39.     }
  40.     else
  41.     {
  42.         LOGI( "APP", "MPU init Error -- %x\n", device_id);
  43.         return 1;
  44.     }
  45.     return 0;
  46. }

void MPU_Get_Gyroscope(short *gx, short *gy, short *gz)

读取三轴陀螺仪数据。由Register Map得知,只需要从GYRO_XOUTH向后依次读出6个寄存器内容即可。


  
  1. // components/peripherals/sensor/drv/drv_acc_gyro_inv_mpu6050.c
  2. void MPU_Get_Gyroscope(short *gx, short *gy, short *gz)
  3. {
  4.     uint8_t buf[ 6] ;
  5.     MPU_Read_Len(MPU_GYRO_XOUTH_REG, 6, buf);
  6.     *gx = ((u16)buf[ 0] << 8 ) | buf[ 1] ;
  7.     *gy = ((u16)buf[ 2] << 8 ) | buf[ 3] ;
  8.     *gz = ((u16)buf[ 4] << 8 ) | buf[ 5] ;
  9. }

void MPU_Get_Accelerometer(short *ax, short *ay, short *az)

读取三轴加速度数据。由Register Map得知,只需要从ACCEL_XOUTH向后依次读出6个寄存器内容即可。


  
  1. // components/peripherals/sensor/drv/drv_acc_gyro_inv_mpu6050.c
  2. void MPU_Get_Accelerometer(short *ax, short *ay, short *az)
  3. {
  4.     uint8_t buf[ 6] ;
  5.     MPU_Read_Len(MPU_ACCEL_XOUTH_REG, 6, buf);
  6.     *ax = ((u16)buf[ 0] << 8 ) | buf[ 1] ;
  7.     *ay = ((u16)buf[ 2] << 8 ) | buf[ 3] ;
  8.     *az = ((u16)buf[ 4] << 8 ) | buf[ 5] ;
  9. }

5、应用开发

本实验的应用较为简单,只需要读出加速度数据,并显示在屏幕上即可。OLED的相关接口中已经给出了丰富的绘图函数。具体实现如下。


  
  1. void gyroscope_task(void)
  2. {
  3.     while ( 1)
  4.     {
  5.         // 清除屏幕memory
  6.         OLED_Clear();
  7.         // 获取三轴加速度信息
  8.         MPU_Get_Accelerometer(&r_ax, &r_ay, &r_az);
  9.         // 画出固定的圆形边框
  10.         OLED_DrawCircle( 66, 32, 10, 1, 1);
  11.         // 画出填充的圆
  12.         OLED_FillCircle( 66 - r_ax / 250, 32 + r_ay / 500, 8, 1);
  13.         // 将屏幕memory显示出来
  14.         OLED_Refresh_GRAM();
  15.         // 暂停20ms
  16.         aos_msleep( 20);
  17.     }
  18. }

6、更多应用

本实验展示的仅是六轴传感器的一个非常简单的应用。随着类似传感器的体积越来越小,精度越来越高,它们也被应用在各种消费类电子产品,如穿戴设备、手机上。

使用它们可以进行一些非常有趣的应用,例如,手环中经常会使用到的计步算法,运动状态检测算法,都是基于其中的六轴传感器数据。近年来,还有很多学术界的工作,使用手环中的六轴传感器来实现空中写字的识别。

除此之外,它也广泛应用于辅助定位、飞行设备的姿态检测,摄像机云台的水平保持等等。期待读者们能够发掘出更多有价值的使用场景。

 

7、引用

[1] Gyroscope invented by Léon Foucault in 1852. Replica built by Dumoulin-Froment for the Exposition universelle in 1867. National Conservatory of Arts and Crafts museum, Paris.

By Stéphane Magnenat - Own work by uploader, subject public domain, Public Domain, https://commons.wikimedia.org/w/index.php?curid=4302903

[2] 图片来自 https://www.analog.com/cn/education/education-library/videos/5996766351001.html

 

8、开发者技术支持

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号

更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/

 


转载:https://blog.csdn.net/HaaSTech/article/details/114013987
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场