漂移菌 发表于 7 天前

ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了

本帖最后由 漂移菌 于 2025-9-28 15:46 编辑

书接上文,上一篇我做了物理连接,后来发现引脚部分在调试的时候不太方便,所以重新定义了引脚:ESP32C5和MPU6050 的接入方式就不用表格展示了,插入表格会乱码。
这里的ESP32C5的9号引脚接MPU6050的SDA, 10号引脚接SCL, 3V3接MPU6050的VCC, GND接MPU6050的GND, 另外,MPU6050的AD0引脚最好接GND,这样默认的它的寄存器地址就是0x68, 如果AD0接3V3,地址就0x69了。 这个要注意一些MPU6050 的库可能在初始化的时候去修改库的默认寄存器地址。然后MPU6050的INT引脚,默认你们都不接的对吧?我建议接入,通过上升沿触发会更加精准一些,这里INT的引脚接入ESP32-C5的2号引脚,为了指示初始化完成的状态,我添加了一个cob 顶条,橙色的,看起来挺好看。
整体接线如下图所示:





接下来就是安装库,我用的库是在Github上找的,亲测好用~。

我们需要以下库:

[*]I2Cdevlib(用于 I2C 通信)
[*]MPU6050(用于 MPU6050 控制)
由于直接通过arduino-cli lib install 方式无法找到,我所以换了个方法,直接拷贝进去就行。


具体命令是:
cd Arduino/libraries/
git clone https://github.com/jrowberg/i2cdevlib
cd i2cdevlib/Arduino/
cp -Rvf MPU6050   ../../
cp -Rvf I2Cdev../../
就是把里面改两个库拷贝到Arduino/libraries/目录下。
结构如图:

这些都搞定了就直接执行:

就可以看到安装的库被识别了。
然后就是创建一个sketch,我用的方法是arduino-cli在树莓派上跑的。速度贼快,贼方便,不过我在家测试使用Lattepanda MU的主板,那速度,更是吊打我的树莓派5,瞬间感觉树莓派都不香了,没拍图,你可以想象一下,一台驴车一边充电,一边给ESP32-C5 编程的既视感,就是很违和,这里就不放图了,后面敬请期待我的Lattepanda MU 漂移驴车的连载哈哈, 言归正转,创建一个空的sketch。
命令是:
arduino-clisketch new esp32c5-mpu6050-coblight
然后看看效果。

已经生成目录和代码文件框架*.ino, 编辑代码并填写内容,代码如下:
#include <Arduino.h>
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#include "Wire.h"

#define INTERRUPT_PIN2
#define SDA_PIN 9
#define SCL_PIN 10
#define COB_PIN 15

MPU6050 mpu;

volatile bool mpuInterrupt = false;
bool dmpReady = false;
uint8_t mpuIntStatus;
uint8_t devStatus;
uint16_t packetSize;
uint8_t fifoBuffer;

Quaternion q;
VectorFloat gravity;
float ypr;//

void IRAM_ATTR dmpDataReady() {
      mpuInterrupt = true;
}

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

      Wire.begin(SDA_PIN, SCL_PIN);
      Wire.setClock(100000);

      mpu.initialize();
      if (!mpu.testConnection()) {
      Serial.println("MPU6050连接失败!");
                while (1);
      }

      devStatus = mpu.dmpInitialize();
      if (devStatus != 0) {
                Serial.printf("DMP初始化失败,状态码: %d\n", devStatus);
                while (1);
      }

      mpu.setXGyroOffset(220);
      mpu.setYGyroOffset(76);
      mpu.setZGyroOffset(-85);
      mpu.setZAccelOffset(1788);

      mpu.CalibrateAccel(6);
      mpu.CalibrateGyro(6);
      mpu.setDMPEnabled(true);

      pinMode(INTERRUPT_PIN, INPUT);
      attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
      mpuIntStatus = mpu.getIntStatus();
      dmpReady = true;
      packetSize = mpu.dmpGetFIFOPacketSize();

      pinMode(COB_PIN, OUTPUT);
      digitalWrite(COB_PIN, HIGH);
      Serial.println("ESP32-C5 + MPU6050 + COB Light 初始化完成!");
      digitalWrite(COB_PIN, LOW);
}

void loop() {
      if (!dmpReady) return;

      uint16_t fifoCount = mpu.getFIFOCount();

      if (!mpuInterrupt && fifoCount < packetSize) return;

      mpuInterrupt = false;
      mpuIntStatus = mpu.getIntStatus();
      fifoCount = mpu.getFIFOCount();

      if((mpuIntStatus & 0x10) || fifoCount == 1024){
                mpu.resetFIFO();
                Serial.println("DAMN, FIFO特喵的溢出了!");
                return;
      }

      if (mpuIntStatus & 0x02) {
                while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
                mpu.getFIFOBytes(fifoBuffer, packetSize);
                fifoCount -= packetSize;
                mpu.dmpGetQuaternion(&q, fifoBuffer);
                mpu.dmpGetGravity(&gravity, &q);
                mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);

                Serial.print("YAW: ");
                Serial.print(ypr * 180 /M_PI);
                Serial.print("\tPITCH: ");
                Serial.print(ypr * 180 /M_PI);
                if ((ypr * 180 /M_PI) > 50.0){
                   digitalWrite(COB_PIN, LOW);}
                else {
                   digitalWrite(COB_PIN, HIGH);
                }
                Serial.print("\tROLL: ");
                Serial.println(ypr * 180 /M_PI);
      }
}


然后保存退出,我这个帖子的操作是为了验证打通ESP32C5 和MPU6050的通道,能够顺利读取MPU6050的数据信息。
接下来就是骚操作了,一条命令编译上传并打开CDConBoot , 为啥要打开CDC? 为了串口看数据啊~
命令是:
arduino-cli compile -b esp32:esp32:esp32c5:CDCOnBoot=cdc -p /dev/ttyACM0 --upload
命令解释:
<pre>
1. arduino-cli 命令主体
2. compile : 编译
3. -b 指定FQBN,完全合格域名哦,不是,是完全合格板名~ , esp32:esp32:esp32c5是我们的板子。
4. CDCOnBoot=cdc 是开启CDC的功能,这样我们可以通过USB串口看到串口消息好调试设备。
5. -p /dev/ttyACM0 是在树莓派上识别出来的串口名称。 可以用arduino-cli board list 查看
6. --upload就是上传了~
</pre>
如果懒得打这么长的命令,可以直接写入.bashrc ,定义一个alias。 例如:
vim .bashrc
添加一行。
alias upup='arduino-cli compile -b esp32:esp32:esp32c5:CDCOnBoot=cdc -p /dev/ttyACM0 --upload'
保存退出后,执行:
source ~/.bashrc
然后直接执行命令就输入: upup就可以了

然后执行upup就开始编译和上传了。


编译结束后,打开串口监视器:
arduino-climonitor -p /dev/ttyACM0--config 115200
<pre>
命令解释:
1. monitor : 串口监视器参数
2. -p /dev/ttyACM0 指定串口设备
3. --config 115200 指定串口波特率,根据代码里面Serial.begin(115200); 这里来决定,你如果设置的是9600,那就不用指定--config 115200
</pre>


这样就看到串口信息了,这时候调整一下mpu6050的位置,数值就会发生变化,我代码里面设置了当PITCH的值大于50.0的时候,就会点亮cob light。

https://www.bilibili.com/video/BV1m6nRzKECA/?pop_share=1&vd_source=bdff96c7413b9836f4a9c717176dc2da
嗯,至此,MPU6050测试完毕,下一篇,将介绍如何采集MPU6050的数据,敬请期待~哈哈下面是操作整个过程的视频:
https://www.bilibili.com/video/BV1tfn9zNESN/?pop_share=1&vd_source=bdff96c7413b9836f4a9c717176dc2da
欢迎点赞,关注,转发,一键三联~


页: [1]
查看完整版本: ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了