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 顶条,橙色的,看起来挺好看。 整体接线如下图所示: ![]() ![]() ![]() ![]() 接下来就是安装库,我用的库是在Github上找的,亲测好用~。 我们需要以下库:
具体命令是: 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-cli sketch new esp32c5-mpu6050-coblight 然后看看效果。 ![]() 已经生成目录和代码文件框架*.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就可以了 ![]() 然后执行upup就开始编译和上传了。 ![]() ![]() 编译结束后,打开串口监视器: 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> ![]() ![]() 这样就看到串口信息了,这时候调整一下mpu6050的位置,数值就会发生变化,我代码里面设置了当PITCH的值大于50.0的时候,就会点亮cob light。 嗯,至此,MPU6050测试完毕,下一篇,将介绍如何采集MPU6050的数据,敬请期待~哈哈下面是操作整个过程的视频: 欢迎点赞,关注,转发,一键三联~ |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed