OrangePi ZERO 2 外设应用程序开发之 I²C 配置及驱动 OLED 屏幕


在这里插入图片描述
如果需要把 OrangePi ZERO 2 的一些系统信息显示出来,在没有远程终端和显示器的情况下,可以用一个 OLED 屏幕呈现这些基本信息。OLED 屏幕非常轻薄,理论上很灵活,可以产生更明亮、更清晰的图像。

在这里插入图片描述

本篇使用的 OLED 屏幕尺寸大小为 0.96 寸,分辨率为 128×64,核心控制 IC 为 SSD1306。

一、0.96 寸 OLED 屏幕硬件描述

OLED 屏幕有多种分辨率(如 128×64、128×32)和颜色(如白色、蓝色和双色 OLED)。OLED 屏幕的接口分别有 IIC 接口和 SPI 接口两种,它们都有一个共同点,它们的核心是一个强大的单芯片 CMOS OLED 驱动控制器——SSD1306,该芯片可以处理所有 RAM 缓冲。

在这里插入图片描述

1. 电源

与 LCD 不同,OLED 不需要背光,因为它可以产生自己的光。所以无论是高对比度、极宽的视角以及显示深黑色水平的能力,OLED 都要强于 LCD。背光的不存在显著地降低了功耗。OLED 平均使用约为 20mA,但这取决于 OLED 的照明程度。

SSD1306 的工作电压为 1.65V - 3.3V,而 OLED 面板需要 7V - 15V 的电源电压。所有这些不同的功率要求都通过内部电荷泵电路来满足。这使得可以在不需要逻辑电平转换器的情况下将显示器连接到任何其它 5V 逻辑微控制器。

2. OLED 内存映射

为了控制显示器,理解 OLED 屏幕的存储器映射至关重要。

无论 OLED 屏幕的大小如何,SSD1306 都包括 1KB 图形显示数据 RAM(GDDRAM),该 RAM 存储要在屏幕上显示的位模式。这个 1KB 的内存区域分为 8 页(从 0 到 7),每个页面具有 128 列/段(块 0 到 127),并且每列可以存储 8 位数据(从 0 到 7)。这些数据刚好为 1KB,如下证明:

8 pages × 128 segments × 8 bits of data = 8192 bits = 1024 bytes = 1KB memory

在这里插入图片描述

每个位代表屏幕上的单个OLED像素,可以通过编程方式打开或关闭。

3. OLED 屏幕的技术规格

显示技术 Display Technology OLED (Organic LED)
单片机接口 MCU Interface I2C / SPI
屏幕尺寸 Screen Size 0.96 Inch Across
分辨率 Resolution 128×64 pixels
工作电压 Operating Voltage 3.3V – 5V
工作电流 Operating Current 20mA max
可视角度 Viewing Angle 160°
每行字符数 Characters Per Row 21
字符行数 Number of Character Rows 7

4. OLED 屏幕引脚定义

在这里插入图片描述

其中SCL是 IIC 接口的串行时钟引脚,SDA是 IIC 接口的串行数据引脚。

二、OrangePi ZERO 2 IIC 配置及测试

1.OrangePi ZERO 2 的 IIC 3 通道配置

OrangePi ZERO 2 的 26 pin 引脚中,有一对 IIC 接口,为 IIC 3通道(后称 i2c3),分别是 3 号引脚(SDA)和 5 号引脚(SCK)组成。

在这里插入图片描述

如果系统内核是 4.9 的版本,i2c3 通道默认是开启状态,可以直接使用。而内核版本为 5.16 的系统,i2c3 通道默认是关闭的,需要手动打开才能使用。如果不确定自己用的是什么内核版本的系统,可以在终端上输入uname -r来查看内核版本(下图所示为 5.16 的内核版本)。

在这里插入图片描述

在“/boot/orangepiEnv.txt”中加入 i2c3 的配置,然后重启香橙派就可以打开 i2c3 了,具体操作如下:

sudo vim /boot/orangepiEnv.txt

然后在任意位置插入下面的配置信息:

overlays=i2c3

如果之前文本已经有了overlays这一行的信息,说明之前配置过其他的接口,那就需要在该配置后面补上 i2c3。如图所示,之前测试了 PWM 通道 1 和 2,所以留下了之前的配置信息,如果这些配置还有作用,就把其他的配置写在这一行的后,每项配置用空格隔开。当然,如果之前的配置信息不需要,可以删除,只留下有用的。

在这里插入图片描述

重启香橙派后,终端输入ls /dev/i2c-*,只要有出现/dev/i2c-3,就说明已经打开了 i2c3 的通道了。

在这里插入图片描述

2. IIC 测试

测试 IIC 总线之前,首先要安装 i2c-tools,输入下面的命令进行安装:

sudo apt update
sudo apt install i2c-tools -y

接着接入一个 IIC 总线的设备,就以本篇主要的设备 OLED 屏幕为例。接线图如下:

在这里插入图片描述

连接好设备后,在命令行输入下面的命令:

sudo i2cdetect -y 3

如果能检测到连接的 IIC 设备的地址,就说明香橙派的 IIC 能正常使用。如下图所示,该设备的 IIC 地址为 0x3C。(每个 IIC 设备的地址不一定相同,只要有出现地址即可。)

在这里插入图片描述

三、wiringOP 库的 OLED 测试 demo

第一次用香橙派驱动 OLED 屏幕可以使用 wiringOP 库的 demo 代码测试一下,具体步骤如下:

先找到 wiringOP 库的安装路径,并进入文件夹找到example的文件夹,在这个文件夹里面就有驱动 OLED 的 demo。

在这里插入图片描述

直接用cp命令复制该文件到测试的文件夹中。

在这里插入图片描述

编译后,输入下面的命令运行(需要指定 IIC 通道):

sudo ./oled_demo /dev/i2c-3

最终的效果如下图:

在这里插入图片描述

四、wiringOP 库的 OLED 相关代码浅析

以下是 wiringOP 库自带的 OLED 屏幕测试 demo 的源代码:

/*
 * Copyright (c) 2015, Vladimir Komendantskiy
 * MIT License
 *
 * SSD1306 demo of block and font drawing.
 */

//
// fixed for OrangePiZero by HypHop
//

#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>

#include "oled.h"
#include "font.h"

int oled_demo(struct display_info *disp) {
   
   
	int i;
	char buf[100];

	//putstrto(disp, 0, 0, "Spnd spd  2468 rpm");
	//	oled_putstrto(disp, 0, 9+1, "Spnd cur  0.46 A");
	oled_putstrto(disp, 0, 9+1, "Welcome       to");
	disp->font = font1;
	//	oled_putstrto(disp, 0, 18+2, "Spnd tmp    53 C");
	oled_putstrto(disp, 0, 18+2, "----OrangePi----");
	disp->font = font2;
	//	oled_putstrto(disp, 0, 27+3, "DrvX tmp    64 C");
	oled_putstrto(disp, 0, 27+3, "This is 0.96OLED");
	oled_putstrto(disp, 0
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Grayson Zheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值