15浏览
查看: 15|回复: 0

[ESP8266/ESP32] 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 顶条,橙色的,看起来挺好看。
整体接线如下图所示:
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图1
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图2
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图3
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图4

接下来就是安装库,我用的库是在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/目录下。
结构如图:
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图5
这些都搞定了就直接执行:
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图6
就可以看到安装的库被识别了。
然后就是创建一个sketch,我用的方法是arduino-cli在树莓派上跑的。速度贼快,贼方便,不过我在家测试使用Lattepanda MU的主板,那速度,更是吊打我的树莓派5,瞬间感觉树莓派都不香了,没拍图,你可以想象一下,一台驴车一边充电,一边给ESP32-C5 编程的既视感,就是很违和,这里就不放图了,后面敬请期待我的Lattepanda MU 漂移驴车的连载哈哈, 言归正转,创建一个空的sketch。
命令是:
arduino-cli  sketch new esp32c5-mpu6050-coblight
然后看看效果。
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图7
已经生成目录和代码文件框架*.ino, 编辑代码并填写内容,代码如下:
#include <Arduino.h>
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#include "Wire.h"

#define INTERRUPT_PIN  2
#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[64];

Quaternion q;
VectorFloat gravity;
float ypr[3];  // [yaw, pitch, roll]

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[0] * 180 /M_PI);
                Serial.print("\tPITCH: ");
                Serial.print(ypr[1] * 180 /M_PI);
                if ((ypr[1] * 180 /M_PI) > 50.0){
                   digitalWrite(COB_PIN, LOW);}
                else {
                   digitalWrite(COB_PIN, HIGH);
                }
                Serial.print("\tROLL: ");
                Serial.println(ypr[2] * 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就可以了
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图8
然后执行upup就开始编译和上传了。
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图9
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图10
编译结束后,打开串口监视器:
arduino-cli  monitor -p /dev/ttyACM0  --config 115200
<pre>
命令解释:
1. monitor : 串口监视器参数
2. -p /dev/ttyACM0 指定串口设备
3. --config 115200 指定串口波特率,根据代码里面Serial.begin(115200); 这里来决定,你如果设置的是9600,那就不用指定--config 115200
</pre>
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图12
ESP32-C5系列连载03-老黄的金箍棒项目终于不用烂尾了图11
这样就看到串口信息了,这时候调整一下mpu6050的位置,数值就会发生变化,我代码里面设置了当PITCH的值大于50.0的时候,就会点亮cob light。


嗯,至此,MPU6050测试完毕,下一篇,将介绍如何采集MPU6050的数据,敬请期待~哈哈下面是操作整个过程的视频:

欢迎点赞,关注,转发,一键三联~


QQ截图20250928141138.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail