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

    文章

    2695

    浏览量

    47433
  • OLED
    +关注

    关注

    119

    文章

    6198

    浏览量

    224115
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1484

    浏览量

    123627
  • 学习板
    +关注

    关注

    0

    文章

    44

    浏览量

    12159
  • ROS
    ROS
    +关注

    关注

    1

    文章

    278

    浏览量

    17001
收藏 人收藏

    评论

    相关推荐

    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

    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

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

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

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

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

    proteus第三方元件下载

    proteus第三方元件 DEV_SPEC_FUNCT.LIB,DEV_TEXAS.LIB,DEV_DSIMM.LIB,DEV_AD.LIB, DEV_MEMORY.LIB,DEV_OPTICAL.LIB,LCD_SYMBOLS.LIB等等。
    发表于 05-19 15:47 0次下载

    移动应用第三方自动检测和分类

    移动应用中,广泛使用第三方来帮助开发和增强应用功能.很多关于移动应用分析以及访问控制的研究工作,需要在分析之前对第三方进行检测、过滤或者对其进行功能分类.当前,大部分研究工作都以使
    发表于 12-29 14:35 0次下载

    鸿蒙开发中怎么引入第三方

    Android 发展到现在不仅提供了很多 API,还提供了很多第三方。这降低了我们开发者的开发难度,提升了开发效率,让应用开发更加的简单高效。 众所周知,HarmonyOS 除了提供 16000
    的头像 发表于 10-11 14:11 4058次阅读

    学会安装第三方开源

    你好,我是爱吃鱼香ROS的小鱼。秉承着拒绝重复造轮子的ROS精神,本节我们学习如何在我们的工程里安装第三方开源
    的头像 发表于 07-13 14:35 998次阅读
    学会安装<b class='flag-5'>第三方</b><b class='flag-5'>开源</b><b class='flag-5'>库</b>

    python第三方有哪些

    Python 作为一门功能强大的编程语言,拥有丰富的第三方,几乎覆盖了各个领域的应用。下面是一些常见且广泛应用的 Python 第三方的总结,希望能为您提供帮助。 NumPy(Nu
    的头像 发表于 11-29 14:31 2127次阅读