0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用第三方开源库驱动OLED模块

CHANBAEK 来源:鱼香ROS 作者:小鱼 2023-07-13 15:00 次阅读

你好,我是爱吃鱼香ROS的小鱼。本节我们继续尝试使用开源库,驱动OLED模块,最后的效果实现在OLED上显示当前的角度信息

教程所使用硬件平台为MicroROS学习板V1.0.0,可点击阅读原文购买及查看详情

图片

我们MicroROS开发板上的OLED位置如图所示。

图片

一、OLED模块介绍

我们的OLDE模块样子如上图所示,整个屏幕有128*64个像素点,我们可以实现对每一个像素点的亮灭控制,以此实现对屏幕显示内容的控制。注意我们并不能控制屏幕上像素的颜色,所以我们OLED一般是单色的。

那我们如何控制它的亮灭呢,可以看到在OLED的上方一共有四个引脚,从左到右依次是GND、VCC、SCL、SDA,其中GND、VCC是用于OLED的供电使用,SCL和SDA是I2C通信使用。

听到I2C通信是不是觉得很熟悉,毕竟上一节驱动MPU6050时我们就是使用的I2C协议(Wrie),别着急,我们先用着,下一节我们再详细介绍I2C通信。

二、新建工程并安装依赖

图片

安装依赖,可以直接修改>platformio.ini

[env:featheresp32]
platform = espressif32
board = featheresp32
framework = arduino
lib_deps = 
    https://ghproxy.com/https://github.com/rfetick/MPU6050_light.git
    adafruit/Adafruit SSD1306@^2.5.7

接着打开IMU的源码目录,将pio/libdeps/featheresp32/MPU6050_light/examples/GetAngle/GetAngle.ino文件内容复制到main.cpp中,接着修改波特率和I2C地址。

#include "Wire.h"
#include < MPU6050_light.h >

MPU6050 mpu(Wire);
unsigned long timer = 0;

void setup()
{
  Serial.begin(115200);
  Wire.begin(18, 19);

  byte status = mpu.begin();
  Serial.print(F("MPU6050 status: "));
  Serial.println(status);
  while (status != 0)
  {
  } // stop everything if could not connect to MPU6050

  Serial.println(F("Calculating offsets, do not move MPU6050"));
  delay(1000);
  // mpu.upsideDownMounting = true; // uncomment this line if the MPU6050 is mounted upside-down
  mpu.calcOffsets(); // gyro and accelero
  Serial.println("Done!n");
}

void loop()
{
  mpu.update();

  if ((millis() - timer) > 10)
  { // print data every 10ms
    Serial.print("X : ");
    Serial.print(mpu.getAngleX());
    Serial.print("tY : ");
    Serial.print(mpu.getAngleY());
    Serial.print("tZ : ");
    Serial.println(mpu.getAngleZ());
    timer = millis();
  }
}

三、使用Adafruit库驱动OLED

该库提供的驱动例程较为复杂,小鱼这里提供一个简易版本。

#include "Wire.h"
#include < Adafruit_GFX.h >     // 加载Adafruit_GFX库
#include < Adafruit_SSD1306.h > // 加载Adafruit_SSD1306库
Adafruit_SSD1306 display;     // 声明对象

void setup()
{
  Wire.begin(18, 19);
  display = Adafruit_SSD1306(128, 64, &Wire);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址,默认0x3C
  display.clearDisplay();                    // 清空屏幕
  display.setTextSize(2);                    // 设置字体大小,最小为1
  display.setCursor(0, 0);                   // 设置开始显示文字的坐标
  display.setTextColor(SSD1306_WHITE);       // 设置字体颜色
  display.println("hello oled!");             // 输出的字符
}

void loop()
{
  
}

根据上面的简易版本,修改原有的IMU代码,最后得到如下代码

/* Get tilt angles on X and Y, and rotation angle on Z
 * Angles are given in degrees
 *
 * License: MIT
 */

#include "Wire.h"
#include < MPU6050_light.h >
#include < Adafruit_GFX.h >     // 加载Adafruit_GFX库
#include < Adafruit_SSD1306.h > // 加载Adafruit_SSD1306库

Adafruit_SSD1306 display;
MPU6050 mpu(Wire);
unsigned long timer = 0;

void setup()
{
  Serial.begin(115200);
  Wire.begin(18, 19);
  /*========================OLED初始化====================================*/
  display = Adafruit_SSD1306(128, 64, &Wire);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址
  display.clearDisplay();                    // 清空屏幕
  display.setTextSize(2);                    // 设置字体大小
  display.setCursor(0, 0);                   // 设置开始显示文字的坐标
  display.setTextColor(SSD1306_WHITE);       // 设置字体颜色
  display.println("hello oled!");            // 输出的字符
  display.display();

  /*========================IMU初始化====================================*/
  byte status = mpu.begin();
  Serial.print(F("MPU6050 status: "));
  Serial.println(status);
  while (status != 0)
  {
  } // stop everything if could not connect to MPU6050

  Serial.println(F("Calculating offsets, do not move MPU6050"));
  delay(1000);
  // mpu.upsideDownMounting = true; // uncomment this line if the MPU6050 is mounted upside-down
  mpu.calcOffsets(); // gyro and accelero
  Serial.println("Done!n");
}

void loop()
{
  mpu.update();

  if ((millis() - timer) > 100)
  { // print data every 100ms
    Serial.print("X : ");
    Serial.print(mpu.getAngleX());
    Serial.print("tY : ");
    Serial.print(mpu.getAngleY());
    Serial.print("tZ : ");
    Serial.println(mpu.getAngleZ());
    timer = millis();
    /*==========================OLED显示===========================*/
    display.clearDisplay();  // 清空屏幕
    display.setCursor(0, 0); // 设置开始显示文字的坐标
    display.print("X=");   // 输出X
    display.println(mpu.getAngleX());
    display.print("Y="); // 输出Y
    display.println(mpu.getAngleY());
    display.print("Z="); // 输出Z
    display.println(mpu.getAngleZ());
    display.display();
  }
}

四、下载测试

接上OLED,将代码编译下载到开发板上,观察OLED的显示。

五、总结

本节依然是很轻松的完成了OLED驱动,但你应该有个疑问,为什么OLED和MPU6050代码里都有这么一句Wire.begin(18, 19);,为什么都是18和19,不能是其他的数值吗?带着疑惑,下一节小鱼带你一起探秘I2C通信以及原理图。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2486

    浏览量

    46555
  • OLED
    +关注

    关注

    118

    文章

    5992

    浏览量

    221502
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1348

    浏览量

    120883
  • 学习板
    +关注

    关注

    0

    文章

    39

    浏览量

    12082
  • ROS
    ROS
    +关注

    关注

    1

    文章

    272

    浏览量

    16693
收藏 人收藏

    评论

    相关推荐

    proteus第三方元器件

    本帖最后由 eehome 于 2013-1-5 09:59 编辑 网上找的,_proteus第三方元器件。解压后直接安装。
    发表于 12-05 08:23

    如何加入第三方元件

    最近在做食堂管理系统的仿真,需要向元件中添加第三方元件,需要用到SLE4442卡,不知道上哪去下载含此类元件的,以及如何添加?
    发表于 04-21 13:00

    如何把第三方加到PROTEUS中?

    新手求教,弱弱的问下,下了一个第三方,说是要先安装,再添加路径,可是我下来的第三方没有看到安装文件啊。还望指教如何添加!
    发表于 06-15 22:32

    关于proteus第三方元件的问题

    下了两个第三方元件,然后就不知道放哪了,也不知道怎么调用。百度不到,求大神解答。谢了!
    发表于 11-13 08:56

    下载完第三方软件后怎么让protues识别???跪求大神们...

    下载完第三方软件后怎么让protues识别???
    发表于 12-11 18:15

    Proteus 第三方元件

    第三方元件,基本包含大部分常用元件的,分享给大家。
    发表于 04-16 22:06

    第三方dll调用问题!!!

    第三方dll,没有.h,labview怎么实现调用,dll可以用VS打开,类说明也有
    发表于 05-11 09:14

    proteus第三方元件

    proteus第三方元件
    发表于 05-26 10:44

    下载python第三方

    python第三方的下载
    发表于 07-02 13:12

    国内知名第三方检测认证机构排名

    第三方检测机构国内起步的很晚,基本是2000年以后的事情,进入改革开放以来,特别是新世纪以来,国家对第三方机构的政策越来越放开了,很多职能部门都逐步下放到第三方机构来做。为了保证产品品质,就有
    发表于 07-19 16:57

    Keil_C++环境移植第三方出现类型错误问题怎样去解决

    Keil_C++环境移植第三方出现类型错误问题解决@firestaradmin 2020年12月8日16:28:18死亡如风,常伴吾身。Keil里实现C++环境编程,在C/C++ 选项卡中 添加
    发表于 07-16 07:17

    头文件中包含第三方文件

    macrocmake如果源文件(例如 CPP)中包含第三方头文件,但是头文件(例如 hpp)中不包含该第三方文件头,采用 PRIVATE。如果源文件和头文件中都包含该第三方文件头,采用 PUBLIC
    发表于 08-18 08:10

    怎样去调用一个第三方驱动

    怎样去调用一个第三方驱动呢?如何用IIC驱动Terawins的图像处理芯片T613呢?
    发表于 03-04 06:59

    鸿蒙开源第三方组件资料合集

    1、鸿蒙开源第三方组件——日志工具组件Timber_ohosTimber_ohos是一个带有小型可扩展API的日志工具组件,它可以给开发者提供统一的API接口,来记录不同类型的日志,帮助开发者管理
    发表于 03-23 09:53

    在Framework下调用第三方的C++算法库

    我这里是JNI调用一个语音处理,这些厂商会以非开源的so文件形式提供。JNI在编译时需要依赖它,所以需要先预编译安装第三方
    发表于 11-24 17:37