树莓派使用 Python 驱动 ST7735 1.44 寸彩色 TFT 屏幕(SPI 通信)
本文详细介绍了如何在树莓派上使用 python 驱动 ST7735 TFT 彩色屏幕,并提供完整的驱动包,真正的开箱即用。支持SPI。
先介绍一下 ST7735 TFT 屏幕,这个屏幕的主控型号是使用的 ST7735,分辨率是 128*128,接口是 SPI。它是 TFT 屏幕,所以需要背光,LED 引脚是背光引脚,可以接 3.3V 或者 5V。注意,不接背光接口它也能亮,只是会发生闪烁现象和屏幕灰暗,所以看到背光闪烁多半是因为电压不够或者没有接背光导致的。它支持 262K 颜色,即 565 格式,使用 2 个字节表示 RGB 颜色,准确的说,它的颜色数量和我们通常上的电脑屏幕颜色数量会少一点,可能存在色差,但一般人分辨不出。这个效果尤其在渐变的时候很容易观察出来。
上面的图片是本店中出售的 ST7735 SPI 接口的屏幕,分辨率是 128*128。
【luma-lcd 英文文档】 【luma-lcd Github】
下面我们使用 Python 的 luma.lcd 库来驱动这个屏幕。感谢开源社区和作者给我们提供这么好用的库。
安装驱动库
这个库在 Python 2.7, 3.4, 3.5 和 3.6 上测试通过。
我们在树莓派上默认使用 Python2.7 进行安装和使用。如果你之前安装过 luma.oled 则可以直接安装 luma.lcd 了。
$ sudo apt-get install python-dev python-pip
$ sudo -H pip install --upgrade luma.lcd
打开硬件 SPI
屏幕需要使用 SPI 进行通信,所以树莓派先要打开硬件 SPI 功能。首先检查下是否打开了 SPI 功能。执行下面的命令:
$ ls /dev/spi*
如果看到有 spidev0.0
或者 spidev0.1
就打开了,接下来这步可以跳过。如果什么也没看到,则按下面的方法打开 SPI。
打开 SPI 方法请查看这篇文章:树莓派使用 Python 驱动 SSD1306(IIC/SPI 通信)
硬件接线
下面是树莓派的 GPIO 引脚图,引脚编号请参考此图。
将屏幕的 CLK(有的也叫SCLK) 接树莓派的 23 号引脚,将屏幕的 SDI(有的也叫MOSI) 接到树莓派的 19 号引脚,将屏幕的 RST 接到树莓派的 22 号引脚,将屏幕的 RS(有的也叫DC) 接到树莓派的 18 号引脚,将屏幕的 CS 接到树莓派的 24 号引脚。最后,将屏幕的 LED 接 3.3V 或者 5V 电源口。如果你之前购买过 SSD1306 SPI 接口的屏幕,会发现接线是一模一样的,接线不用变,程序也不用变,只需要将 device 变成 ST7735 就行了。
注意:请一定以屏幕的实际引脚编号为准,如你不清楚如何接,请本店咨询客服,电源反接必烧毁,本店概不负责,屏幕会产生大量热量,注意烫伤手。
如果你接了风扇,风扇可以接其它的电源口,树莓派有 2 个 3v 电源和 2 个 5v 电源。学会变通,不要死盯着这一个电源接口,只要不短路和过载,一般都没什么问题。在本店购买的屏幕支持 3v-5v 宽电压,接 5v 也不会烧坏的,其它地方购买的屏幕,请一定注意电源,烧坏本人不负责。
写在前面
在往下看之前,请确保先看过这篇文章:树莓派使用 Python 驱动 SSD1306(IIC/SPI 通信)。设置好你的系统字符编码,以及了解一些基础会让你更好的阅读此文章。本站的硬件相关文章一般都是循序渐进的。
hello world! 代码
新建 st7735.py 文件,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: UTF-8 -*-
from luma.core.interface.serial import spi
from luma.lcd.device import st7735
from PIL import Image, ImageDraw, ImageFont
serial = spi(port=0, device=0)
device = st7735(serial, width=128, height=128, rotate=2, h_offset=1, v_offset=2, bgr=True)
buffer = Image.new(device.mode, device.size)
draw = ImageDraw.Draw(buffer)
while True:
draw.rectangle(device.bounding_box, outline=None, fill=(152, 152, 3))
draw.text((30, 50), "hello world!", "white")
draw.text((10, 70), "http://timor.tech", "white")
device.display(buffer)
然后运行它,就能看到屏幕有显示了。
$ python st7735.py
如果屏幕没有显示,检查屏幕的接线是否正确,确认接线无误后,如还不能显示,将程序停止,等几秒再次执行,如此多试几次就行了,这是因为可能没有将 SPI 设备释放导致的资源忙。如果程序有报错,能看懂的错误自己解决,看不懂的请在文章下面留言,或使用页面右下角的站内信邮件。在本店购买的用户,有问题请直接联系旺旺客服或售后技术群,将会第一时间给你解答。
在本店购买过 SSD1306 的同学们会发现,绘图代码几乎是一模一样的。是的,不同的屏幕驱动协议不一样,但绘图的原理都是一样的。这个库使用 PIL 的好处就是统一了绘图,实现跟平台无关,同样的绘图代码,可以使用在其它的屏幕上。
绘制 GUI
上面只是简单的 hello world!,这个屏幕是支持 565 彩色格式的,不来点图形之类的太浪费了,下面我们来绘制一下 提莫的神秘商店 的主题 logo。
首先需要准备一张我们的 logo,在这里可以下载:【logo.png 下载地址】。
然后需要准备一个中文字体文件,我们演示时用的是微软雅黑,大家可以自己随便下载一个中文字体,或者从 Windows 系统里面 copy 一个字体出来,下载链接我就不放了,大家懂的。
好了,新建 gui.py 文件,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- coding: UTF-8 -*-
from luma.core.interface.serial import spi
from luma.core.render import canvas
from luma.lcd.device import st7735
from PIL import Image, ImageDraw, ImageFont
serial = spi(port=0, device=0)
device = st7735(serial, width=128, height=128, rotate=2, h_offset=1, v_offset=2, bgr=True)
font = ImageFont.truetype("./msyh.ttf", 16)
buffer = Image.new(device.mode, device.size)
draw = ImageDraw.Draw(buffer)
logo = Image.open("./logo.png").convert("RGBA")
while True:
draw.rectangle(device.bounding_box, outline=None, fill=(152, 152, 3))
buffer.paste(logo, (32, 20), mask=logo)
draw.text((8, 90), "提莫的神秘商店".decode("UTF-8"), "white", font)
device.display(buffer)
然后同样的执行它就可以看到屏幕变绿了,中间一个大大的 T,这就是我们的 logo 了,个人觉得挺好看的(自恋)。可惜我锤拍照实在太差了,拍出来惨不忍睹,这里就不放实拍图了,我实在看不下去。
注意,上面的代码我们使用了中文和图片,请确保你的系统设置好了中文编码,以及图片的路径和字体的路径是正确的。
本来还想做一个动画的,让 T 一直旋转,可是手上没有好的拍照设备,也放不了图,不能让大家看到,暂时就不做了。大家可以自己发挥,拿它播放视频都可以。