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

[ESP8266/ESP32] ESP32-C5连载系列之透明LED你有我也有

[复制链接]
之前在社区看到大佬发的集中点屏让我突然想起以前积分兑换的1.5inch 透明OLED屏幕,这次正好趁着ESP32-C5开箱测试也尝试点亮一下,写点儿好玩儿的显示在上面。看看是否能够实现和MPU6050的梦幻联动。
ESP32-C5连载系列之透明LED你有我也有图1
产品还不便宜呢。。哈哈
官方的说明:这是一块带转接板的1.51”透明单色屏幕,分辨率为128x64(完全透明的区域分辨率为128*56,在靠近排线侧有一小块区域不能完全透明,但可显示),显示颜色为蓝色,全视角显示。尺寸小巧的转接板提供了GDI接口和SPI排针两种接线方式,为用户留有足够的使用和发挥的空间。DFRobot还提供了多样化的显示例程,能满足用户的大部分基础显示需求
规格:
  • 工作电压:3.3V
  • 视角方向:全视角
  • 驱动芯片:SSD1309
  • 转接板接口类型:SPI,GDI
  • 转接板尺寸:18mm*28mm
  • 显示区域:35mm*15mm
  • 显示颜色:蓝色
  • 像素间距:0.274mm*0.274mm
  • 透明显示屏屏幕尺寸:42mm*27mm
  • 工作温度:-40~70℃



ESP32-C5连载系列之透明LED你有我也有图2
尺寸和合适DIY,之前想着有空再画个3D模型,做到驴车上,作为一个资深的牛马,一直没时间折腾自己的爱好,不知道屏幕前的你是不是和我一样。
ESP32-C5连载系列之透明LED你有我也有图3
实际上会占用很多的引脚:
ESP32-C5与OLED连接:根据DFRobot的GDI 1.51寸透明OLED的接口定义,使用FPC线将其与ESP32-C5的GDI接口相连,具体引脚对应关系如下:
VCC接ESP32-C5的3V3
BLK接ESP32-C5的15/D13
GND接ESP32-C5的GND
SCLK接ESP32-C5的23/SCLK
MOSI接ESP32-C5的24/MOSI
MISO接ESP32-C5的25/MISO
DC接ESP32-C5的8/D2
RES接ESP32-C5的26/D3
CS接ESP32-C5的27/D6
SCL接ESP32-C5的10/SCL
SDA接ESP32-C5的9/SDA


这些信息有了,再加上官方的wiki就很nice,代码世界一大抄,不抄袭不成佛哈哈,给个链接防止新手迷失在丛林~
  1. https://wiki.dfrobot.com.cn/SKU_DFR0934_Fermion_1.51''_128x64_OLED_Transparent_Display_with_Converter_Breakout
复制代码
ESP32-C5连载系列之透明LED你有我也有图4
官方接线图和我的接线图对比一下,真实感还是不错的吧~

ESP32-C5连载系列之透明LED你有我也有图6ESP32-C5连载系列之透明LED你有我也有图7ESP32-C5连载系列之透明LED你有我也有图8ESP32-C5连载系列之透明LED你有我也有图5
ESP32-C5连载系列之透明LED你有我也有图9
最终效果还不错,什么?你问我MPU6050 怎么接?去看我之前的帖子,就四根线, 哦不,5根线就好了,走I2C协议,记得int引脚也控制起来哈哈
还是一并写了吧,免得你找不到帖子了。
MPU6050  ---  ESP32-C5 IO板
VCC    ------   3v3
GND   ------- GND
SCL    -------- 10/C
SDA  ----------9/D
AD0  ----------GND
INT   ---------- 2
接好就行。等线接好了,接下来就开始安装库,写代码(抄AI) 然后添加一丢丢创意就好了哈哈
官方wiki使用的是U8g2lib,所以我也得安装一下。哈哈

1. 先创建一个sketch再说。

  1. Arduino-cli sketch new esp32c5_oled_mpu6050
  2. cd  esp32c5_oled_mpu6050/
  3. # 编辑文档
  4. vim esp32c5_oled_mpu6050.ino
复制代码
2. 测试一下屏幕,哎,这个得先安装一下u8g2lib库,这个好像比较帅。。
  1. # 查询一下
  2. arduino-cli lib search u8g2
  3. # 安装一下 这个U得大写哈
  4. arduino-cli lib install U8g2
复制代码

ESP32-C5连载系列之透明LED你有我也有图10
ESP32-C5连载系列之透明LED你有我也有图11
ESP32-C5连载系列之透明LED你有我也有图12
瞬间搞定
然后要注意的是需要根据这个官方提供的GDI的pinout来修改初始化代码的信息:
ESP32-C5连载系列之透明LED你有我也有图13
初始化代码引脚信息需要改一下:
ESP32-C5连载系列之透明LED你有我也有图14参考这个,我下面代码定义了一些宏变量,方便修改。
然后写个测试代码看看屏幕是否能用:
  1. <blockquote>#include <Arduino.h>
复制代码

火速编译上传看效果:
  1. arduino-cli compile -b esp32:esp32:esp32c5:CDCOnBoot=cdc -p /dev/ttyACM0 --upload
复制代码
每次打这么长的代码你肯定不爽,但是可以用alias命令直接设置成一个超级简答的命令,编辑一下你用户属主目录下的.bashrc 文件,添加:
  1. alias upcode='arduino-cli compile -b esp32:esp32:esp32c5:CDCOnBoot=cdc -p /dev/ttyACM0 --upload'
复制代码
以后就直接输入:upcode命令就可以编译和上传了,舒服了~

ESP32-C5连载系列之透明LED你有我也有图15
ESP32-C5连载系列之透明LED你有我也有图16
然后屏幕没问题了,就可以添加mpu6050的消息了。
我就直接post代码了,如下:
  1. #include <Arduino.h>
  2. #include <U8g2lib.h>
  3. #include <Wire.h>
  4. #include "I2Cdev.h"
  5. #include "MPU6050_6Axis_MotionApps20.h"
  6. #include <SPI.h>
  7. #define INTERRUPT_PIN  2
  8. #define SDA_PIN 9
  9. #define SCL_PIN 10
  10. #define OLED_DC  8   // GPIO 8
  11. #define OLED_CS  27   // GPIO 27
  12. #define OLED_RST 26   // GPIO 26
  13. #define OLED_CLK 23   // clock 23
  14. #define OLED_DATA 24   // data 24
  15. U8G2_SSD1309_128X64_NONAME2_F_4W_SW_SPI u8g2(
  16.                 /*rotation=*/U8G2_R0,
  17.                 /*clock=*/OLED_CLK,
  18.                 /*data */OLED_DATA,
  19.                 /*cs=*/ OLED_CS,
  20.                 /*dc=*/ OLED_DC,
  21.                 /*reset=*/ OLED_RST);
  22. MPU6050 mpu;
  23. volatile bool mpuInterrupt = false;
  24. bool dmpReady = false;
  25. uint8_t mpuIntStatus;
  26. uint8_t devStatus;
  27. uint16_t packetSize;
  28. uint8_t fifoBuffer[64];
  29. Quaternion q;
  30. VectorFloat gravity;
  31. float ypr[3];  // [yaw, pitch, roll]
  32. void IRAM_ATTR dmpDataReady() {
  33.         mpuInterrupt = true;
  34. }
  35. void setup() {
  36.         Serial.begin(115200);
  37.         Wire.begin(SDA_PIN, SCL_PIN);
  38.         Wire.setClock(100000);
  39.         u8g2.begin();
  40.         u8g2.setFontPosTop();
  41.         mpu.initialize();
  42.         if (!mpu.testConnection()) {
  43.         Serial.println("MPU6050连接失败!");
  44.                 while (1);
  45.         }
  46.         devStatus = mpu.dmpInitialize();
  47.         if (devStatus != 0) {
  48.                 Serial.printf("DMP初始化失败,状态码: %d\n", devStatus);
  49.                 while (1);
  50.         }
  51.         mpu.setXGyroOffset(220);
  52.         mpu.setYGyroOffset(76);
  53.         mpu.setZGyroOffset(-85);
  54.         mpu.setZAccelOffset(1788);
  55.         mpu.CalibrateAccel(6);
  56.         mpu.CalibrateGyro(6);
  57.         mpu.setDMPEnabled(true);
  58.         pinMode(INTERRUPT_PIN, INPUT);
  59.         attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
  60.         mpuIntStatus = mpu.getIntStatus();
  61.         dmpReady = true;
  62.         packetSize = mpu.dmpGetFIFOPacketSize();
  63. }
  64. void loop() {
  65.         if (!dmpReady) return;
  66.         uint16_t fifoCount = mpu.getFIFOCount();
  67.         if (!mpuInterrupt && fifoCount < packetSize) return;
  68.         mpuInterrupt = false;
  69.         mpuIntStatus = mpu.getIntStatus();
  70.         fifoCount = mpu.getFIFOCount();
  71.         if((mpuIntStatus & 0x10) || fifoCount == 1024){
  72.                 mpu.resetFIFO();
  73.                 Serial.println("DAMN, FIFO特喵的溢出了!");
  74.                 return;
  75.         }
  76.         if (mpuIntStatus & 0x02) {
  77.                 while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
  78.                 mpu.getFIFOBytes(fifoBuffer, packetSize);
  79.                 fifoCount -= packetSize;
  80.                 mpu.dmpGetQuaternion(&q, fifoBuffer);
  81.                 mpu.dmpGetGravity(&gravity, &q);
  82.                 mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
  83.                 // 计算圆心位置
  84.         int circleX = 64 + (int)(ypr[1] * 180 / M_PI) * 2; // 根据俯仰角调整 X 位置
  85.         int circleY = 32 - (int)(ypr[0] * 180 / M_PI) * 2; // 根据偏航角调整 Y 位置
  86.         // 限制圆的位置在屏幕范围内
  87.         circleX = constrain(circleX, 0, 123);
  88.         circleY = constrain(circleY, 0, 58);
  89.                 // 清屏并绘制新的圆
  90.                 u8g2.firstPage();
  91.                 do {
  92.                 u8g2.drawCircle(64, 32, 1); //绘制半径5的圆形
  93.                 u8g2.drawCircle(64, 32, 3); //绘制半径5的圆形
  94.                 u8g2.drawCircle(64, 32, 7); //绘制半径5的圆形
  95.                 u8g2.drawCircle(circleX, circleY, 5); //绘制半径5的圆形
  96.                 } while (u8g2.nextPage());
  97.                 Serial.print("YAW: ");
  98.                 Serial.print(ypr[0] * 180 /M_PI);
  99.                 Serial.print("\tPITCH: ");
  100.                 Serial.print(ypr[1] * 180 /M_PI);
  101.                 Serial.print("\tROLL: ");
  102.                 Serial.println(ypr[2] * 180 /M_PI);
  103.         }
  104. }
复制代码
然后编译上传后,就看手稳不稳了,稳定就可以fire in the hole了哈哈
ESP32-C5连载系列之透明LED你有我也有图17

视频如下:

哈哈,面对疾风吧~

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

硬件清单

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

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

mail