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]