这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » ATOMS3R-CAM AI CHATBOT开发指南【IMU使用之方位识别】

共1条 1/1 1 跳转至

ATOMS3R-CAM AI CHATBOT开发指南【IMU使用之方位识别】

助工
2026-05-24 22:10:11     打赏

摘要:本文主要介绍板载的九轴传感器系统IMU的使用方法,获取当前设备的IMU数据并且根据IMU数据,判断当前设备状态(俯仰、横滚、方位、运动),然后通过串口输出显示;


一、硬件介绍

产品特点

AtomS3R-CAM AI Chatbot 套件由控制器与语音底座两大核心部分组成;

控制器部分采用AtomS3R-CAM (集成0.3MP GC0308摄像头、9轴IMU、IR发射管等);

语音底座部分采用Atomic Voice Base (基于ES831音频编解码芯片);

image-20260504212417200.png


image-20260504212417200主要特性

  • 集成 ESP32-S3-PICO-1-N8R8 主控

  • 0.3MP GC0308 摄像头

  • 九轴传感器系统

  • 8MB Flash 和 8MB PSRAM

  • 集成红外发射管

  • 可扩展的引脚与接口

  • 全双工 I2S 语音

  • MEMS 数字麦克风


功能引脚示意图

image-20260504213854017.png


二、功能实现

1、硬件介绍

AtomS3R-CAM开发板内置了三轴 BMM150 地磁传感器和六轴 BMI270 姿态传感器的九轴传感器系统;


BMM150 磁场干扰:带有磁铁的产品可能对BMM150磁场传感器造成干扰,导致读数异常;

当搭配含有磁铁的M5主控设备时,需拆除磁铁 同时避免 BMM150 传感器放置在强磁场附近;


img


引脚原理图

BMM150 挂载于 BMI270

通过 BMI270 的 Sensor Hub 辅助 I2C 接口接入 BMM150,实现统一的9轴传感数据采集;


image.png

image-20260518205054378.png



特性

image.png


实物效果搭建

image-20260518210610359.png


2、功能效果

获取当前设备的IMU数据并且根据IMU数据进行处理后,通过串口打印当前设备在空间中的姿态和指向(俯仰角、横滚角、方位角、运动状态);


俯仰角(Pitch):设备前后倾斜的角度

横滚角(Roll):设备左右倾斜的角度

方位角(Heading):设备指向的地理方向(类似指南针)

运动状态:设备是否在旋转运动中


加速度计 → 倾斜角度(设备相对于重力的姿态)

陀螺仪 → 旋转速度(是否在转动)

磁力计 → 指南针方向(东南西北)



三、代码编写


俯仰状态:"上仰"、"下俯"、"水平"

横滚状态:"右倾"、"左倾"、"水平"

方位方向:"北"、"东"、"南"、"西"

运动状态:"运动中"、"静止"


主要相关代码

#include <M5Unified.h>
#include <math.h>

void setup() {
  Serial.begin(115200);
  while (!Serial);

  M5.begin();
  M5.Imu.init();

  if (!M5.Imu.isEnabled()) {
    Serial.println("IMU初始化失败");
    while (1) { }
  }
  Serial.println("IMU初始化成功");
}

void loop() {
  M5.update();
  if (M5.Imu.update()) {
    float ax, ay, az;
    float gx, gy, gz;
    float mx, my, mz;

    M5.Imu.getAccel(&ax, &ay, &az);
    M5.Imu.getGyro(&gx, &gy, &gz);
    M5.Imu.getMag(&mx, &my, &mz);

    // 计算姿态角
    float pitch = atan2(-ax, sqrt(ay * ay + az * az)) * 180 / PI;
    float roll = atan2(ay, az) * 180 / PI;

    // 计算方位角
    float heading = atan2(my, mx) * 180 / PI;
    if (heading < 0) heading += 360;

    // 判断运动状态
    bool isMoving = (abs(gx) > 5) || (abs(gy) > 5) || (abs(gz) > 5);


    Serial.printf("=== 设备方位信息 ===\n");
    Serial.printf("俯仰角: %.1f° (%s)\n", pitch,
                  pitch > 45 ? "上仰" : pitch < -45 ? "下俯"
                                                    : "水平");
    Serial.printf("横滚角: %.1f° (%s)\n", roll,
                  roll > 45 ? "右倾" : roll < -45 ? "左倾"
                                                  : "水平");
    Serial.printf("方位角: %.1f° (%s)\n", heading,
                  heading < 45 ? "北" : heading < 135 ? "东"
                                      : heading < 225 ? "南"
                                      : heading < 315 ? "西"
                                                      : "北");
    Serial.printf("运动状态: %s\n", isMoving ? "运动中" : "静止");
    Serial.println();
  }

  delay(500);
}



四、程序烧录

1、连接USB数据线至开发板;

2、选择端口号对应的开发板;

3、点击 上传 烧录程序到开发板上;

image-20260518203300906.png


五、效果演示

IMU.gif









关键词: ATOMS3R-CAM    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]