python 驱动 SSD1306 IIC 屏

安装驱动库

这个库在 Python 2.7, 3.4, 3.5 和 3.6 上测试通过。

我们在树莓派上默认使用 Python2.7 进行安装和使用。

$ sudo apt-get install python-dev python-pip libfreetype6-dev libjpeg-dev build-essential
$ sudo -H pip install --upgrade luma.oled

打开硬件 IIC 和 SPI

屏幕需要使用 IIC 进行通信,所以树莓派先要打开硬件 IIC 功能。首先检查下是否打开了 IIC 功能。执行下面的命令:

$ ls /dev/i2c-*

如果看到有 /dev/i2c-1 或者 /dev/i2c-0 就打开了,这步可以跳过。如果什么也没看到,则按下面的方法打开 IIC。

在 raspbian 系统上使用下面命令打开配置菜单:

$ sudo raspi-config

选择 Interfacing options

然后选择 I2C

最后选择 ,按回车。需要打开其他接口也是同样的方式。选择好后,会回到主菜单,选择 finish,回车,然后重启生效。

硬件接线

IIC 仅需要 4 根线就可以,其中 2 根是电源,另外 2 根是 SDA 和 SCL。我们使用 IIC-1 接口。下面是树莓派的 GPIO 引脚图。

注意:请一定以屏幕的实际引脚编号为准,电源反接必烧毁,屏幕会产生大量热量,注意烫伤手。

下面开始接电源。将屏幕的 GND 接到树莓派的 9 号引脚,将屏幕的 VCC 接到树莓派的 1 号引脚。如果你接了风扇,风扇可以接其它的电源口,树莓派有 2 个 3v 电源和 2 个 5v 电源。学会变通,不要死盯着这一个电源接口,只要不短路和过载,一般都没什么问题。在本店购买的屏幕支持 3v-5v 宽电压,接 5v 也不会烧坏的,其它地方购买的屏幕,请一定注意电源,烧坏本人不负责。

下面开始接数据线。将屏幕的 SDA 接到树莓派的 3 号引脚,将屏幕的 SCL(有些也叫SCK) 接到树莓派的 5 号引脚。至此,屏幕的线接好了,下面开始写程序让屏幕显示。

hello world! 代码

新建 ssd1306-iic.py 文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306


# 创建 IIC 设备
serial = i2c(port=1, address=0x3C)

# 如果使用 SPI,换成这个
# serial = spi(device=0, port=0)

# 创建屏幕的驱动实例
device = ssd1306(serial)

# 开始往屏幕上绘图。draw 是 Pillow 的实例,它里面还有非常多的绘图 API。
with canvas(device) as draw:
  draw.rectangle(device.bounding_box, outline="white", fill="black")
  draw.text((30, 40), "Hello World!", fill="white")

# 这行是为了阻止程序退出,因为退出的时候会调用析构函数,清空屏幕。防止一闪而过,什么也看不到。
while (True):
  pass

然后运行它,就能看到屏幕有显示了。

$ python ssd1306-iic.py

如果屏幕没有显示,检查屏幕的接线是否正确。如果程序有报错,能看懂的错误自己解决,看不懂的请在文章下面留言,或使用页面右下角的站内信邮件。在本店购买的用户,有问题请直接联系旺旺客服或售后技术群,将会第一时间给你解答。

SPI 驱动

上面是 IIC 接口的,IIC 的好处是只需要 4 根线,接线简单,可以少占用 GPIO,但是也有缺点:刷新率只有 10FPS 不到。读者可以自己做一个实验,在垂直方向上画一根直线,从 0 扫描到 127,你们就会看到直线移动的非常慢,并且在刷新的时候,从上到下直线会发生断裂。产生这个现象的根本原因是 IIC 传输数据效率太慢了(相对屏幕来说,并不是绝对的慢)。屏幕刷新的时候,驱动默认使用的是水平页刷新方式,也就是从左到右,从上到下,一页一页刷新。而刷新整个屏幕,耗费的时间需要几百毫秒,所以能看到上面的线已经往右移动了,而下面的线还在原来的位置,从而看到断裂现象。

对于只显示静态的图形来说,或者是对刷新率要求不高的场景,IIC 是比较合适的。接线和驱动简单,少占用 GPIO。但是对于刷新率要求高的场景,比如做动画效果,那 IIC 就不太适合了,这个时候就要使用 SPI 通信了。本人做过实验,在树莓派3B上,使用本店购买的 SPI 屏幕,配合本店的 nodejs SPI 驱动,刷新率最大能达到 2200FPS。动画效果看起来非常流畅。这里我们暂时还是使用 luma.oled 驱动来驱动 SPI 的屏幕。

接线

电源线请参照上面 IIC 的接线。这里开始接 SPI 的线。将屏幕的 D0(有的也叫SCLK) 接树莓派的 23 号引脚,将屏幕的 D1(有的也叫MOSI) 接到树莓派的 19 号引脚,将屏幕的 RST 接到树莓派的 22 号引脚,将屏幕的 DC 接到树莓派的 18 号引脚,将屏幕的 CS 接到树莓派的 24 号引脚。

hello world! 程序

使用 SPI 需要先打开硬件 SPI 功能,请参照上面的方法确认打开。

新建 ssd1306-spi.py 文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306

# 创建 SPI 设备,使用 SPI-0
serial = spi(device=0, port=0)

# 创建屏幕的驱动实例
device = ssd1306(serial)

# 开始往屏幕上绘图。draw 是 Pillow 的实例,它里面还有非常多的绘图 API。
with canvas(device) as draw:
  draw.rectangle(device.bounding_box, outline="white", fill="black")
  draw.text((30, 40), "Hello World!", fill="white")

# 这行是为了阻止程序退出,因为退出的时候会调用析构函数,清空屏幕。防止一闪而过,什么也看不到。
while (True):
  pass

然后运行它,就能看到屏幕有显示了。

$ python ssd1306-spi.py

发表评论 取消回复