OpenHarmony Neptune开发板I2C驱动 MPU6050获取数据 原创 精华

远道可思
发布于 2021-10-8 11:47
浏览
7收藏

本文介绍如何在Neptune开发板上,使用openHarmony IoT硬件子系统的IIC接口 获取MPU6050原始数据并使用四元数姿态解算通过openHarmony IoT硬件子系统PWM接口驱动舵机
1.环境准备
1.1 开发环境、编译环境搭建,参考官方文档,参考链接如下:
Neptune开发板的环境搭建及使用
1.2 Neptune开发板 openharmony V1.1.0 LTS 版本获取:
git clone https://gitee.com/hihopeorg_group/neptune-harmony-os1.1-iot.git
2.材料准备
2.1、Neptune HarmonyOS物联网 IOT模组
2.2、MPU6050 模块
2.3、SG90 伺服舵机
2.4、杜邦线若干

3.开发调试
这里我修改小熊派-E53_SC2读取三轴加速度例程 使Neptune开发板能通过IIC接口获取MPU6050原始数据
修改关键代码部分(IIC):

/***************************************************************
  * 函数功能: 通过I2C读取一个指定寄存器内容
  * 输入参数: Addr:I2C设备地址
  *           Reg:目标寄存器
  * 返 回 值: uint8_t:寄存器内容
  * 说    明: 无
  **************************************************************/
uint8_t I2C_MPU6050_ReadData(uint8_t Reg)
{
    uint8_t value = 0;
    uint32_t status = 0;
    //WifiIotI2cData mpu6050_i2c_data = {0};
    uint8_t  buffer[1] = {Reg};
    /*
    mpu6050_i2c_data.sendBuf = buffer;
    mpu6050_i2c_data.sendLen = 1;
    mpu6050_i2c_data.receiveBuf = &value;
    mpu6050_i2c_data.receiveLen = 1;
    status =IoTI2cWrite(MPU6050_I2C_IDX,(MPU6050_SLAVE_ADDRESS<<1)|0x00, buffer,sizeof(buffer));
    if (status != IOT_SUCCESS)
    {
        printf("===== Error: I2C write status = 0x%x! =====\r\n", status);
        return status;
    }
    */
    IoTI2cWrite(MPU6050_I2C_IDX,(MPU6050_SLAVE_ADDRESS<<1)|0x00, buffer,sizeof(buffer));
    HAL_Delay1();
    IoTI2cRead(MPU6050_I2C_IDX,(MPU6050_SLAVE_ADDRESS<<1)|0x01, &value,1);
    HAL_Delay1();
    /*
    status =IoTI2cRead(MPU6050_I2C_IDX,(MPU6050_SLAVE_ADDRESS<<1)|0x01, &value,1);
    if (status != IOT_SUCCESS)
    {
        printf("===== Error: I2C write status = 0x%x! =====\r\n", status);
        return status;
    }
    */
    return value;
}

这里HAL_Delay1是延时,必须要添加,否则MPU6050读不出数据:

void HAL_Delay1(void)     //大概延时30~40us
{
    uint32_t tick;
    // Calculating 100us timeout in system timer ticks
    const uint32_t timeout = 20U * osKernelGetSysTimerFreq() / 1000000u;

    tick = osKernelGetSysTimerCount(); // get start value of the Kernel system tick
    do {
        ;
    } while(osKernelGetSysTimerCount() - tick < timeout);
}

四元数姿态解算(本人比较菜)就直接下载STM32+mpu6050姿态角(精简四元数法)程序
应用到Neptune开发板中发现还不错。

openHarmony IoT硬件子系统 PWM接口驱动舵机我这篇文章介绍的很清楚
4.编译、烧录,并测试最后的完成效果。
演示:Neptune开发板 MPU6050控制SG90舵机
代码:Gitte

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-10-8 11:47:23修改
9
收藏 7
回复
举报
5条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

干货,感谢分享。

回复
2021-10-8 11:54:25
wx637a2238d85b7
wx637a2238d85b7

你好,代码编译不了,可以请教一下吗,大神

回复
2022-11-21 21:30:04
wx637a2238d85b7
wx637a2238d85b7

你好,编译时在最后报错,屏蔽掉下面就没有一点问题了

IMUupdate(Angle_gx,Angle_gy,Angle_gz,Angle_ax,Angle_ay,Angle_az);

想请教一下大神这是怎么回事啊

回复
2022-11-21 21:32:19
远道可思
远道可思

报错原因了?相关截图有吗?

回复
2022-11-22 16:33:40
wx637a2238d85b7
wx637a2238d85b7 回复了 远道可思
报错原因了?相关截图有吗?

找到原因了,没有连接到正确的头文件。不过得到的数据貌似有点不太对,下记截图

直接读出值有变化,但是俯仰角值很奇怪

回复
2022-11-26 21:40:51
回复
    相关推荐