换用 Raspberry Pi 实现同样的效果
生日当天,爸爸用 Arduino 做了滚动显示效果,不过 Arduino 开发用的是 C++,略显生涩,教小朋友,还是来 Python 吧,Pi 也能做这个事呢。
材料 & 硬件连接
这个设计材料略有变化
- Raspberry Model B (以及为了美观方便加的亚克力的盒子),B+ 或 Pi 2 也可以的
- LCD 1602 + I2C 模块,分开买就要自己焊在一起,也可以买焊好的,焊在一起的效果是这样的(图片)
- 4 根两头母的杜邦线,因为 Pi 和模块两边是排针,所以要用这种两头母的
把这些东西连在一起就可以了,连线方法是:
- 接口板上的
VCC
连接 Raspberry Pi GPIO 插针的 4 针 - 接口板上的
GND
链接 Raspberry Pi GPIO 插针的 6 针 - 接口板上的
SDA
链接 Raspberry Pi GPIO 插针的 3 针 - 接口板上的
SCL
链接 Raspberry Pi GPIO 插针的 5 针
确定针脚编号的方法是这样的
- 面对电路板,让 GPIO 插针区域位于右下方
- 现在右上角的针是1号针,右下角的针是2号针,它们左侧是3、4号针,依次类推
Model B 有 26 针,B+ 和 2 更多一些,但是和 B 是兼容的,下面是 Model B 的针脚定义
CE1/GPIO-7 26 | 25 GND
CE0/GPIO-8 24 | 23 SCLK/GPIO-39
GPIO-25 22 | 21 MISO/GPIO-37
GND 20 | 19 MOSI/GPIO-38
GPIO-24 18 | 17 3V3
GPIO-23 16 | 15 GPIO-22
GND 14 | 13 GPIO-27
CLK/GPIO-18 12 | 11 GPIO-17
RXD/GPIO-15 10 | 9 GND
TXD/GPIO-14 8 | 7 GPIO-4
GND 6 | 5 SCL/GPIO-3
5V0 4 | 3 SDA/GPIO-2
5V0 2 | 1 3V3
软件预备
下面的所有操作都是登录到树莓派里进行的操作。
I2C 总线相关
首先,i2c
总线模块在 pi 上缺省是禁用的,需要把它打开,找到黑名单文件,并把 i2c-bcm2708
这行注释掉:
root@raspberrypi:~# cat /etc/modprobe.d/raspi-blacklist.conf
# blacklist spi and i2c by default (many users dont need them)
blacklist spi-bcm2708
#blacklist i2c-bcm2708
然后安装一些依赖包
apt-get install i2c-tools
apt-get install build-essential python-dev python-smbus python-pip git
现在看看 LCD 的 I2C 总线地址
root@raspberrypi:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
可以看到,地址是 0x27
。好了,下面要进入正题。
液晶程序库
我修改了一个可以用的库,位于这里,略长,就不贴了,下来放在工作目录里,命名为 pylcdlib,接下来就开始写最终的显示逻辑了。
软件程序
最终的软件很简单,程序非常短,比 Arduino 的还短,我直接贴到这里了
#!/usr/bin/env python
import time
import pylcdlib
lcd = pylcdlib.lcd(0x27,1, Rs=0, Rw=1, En=2, Backlight=3, D4=4, D5=5, D6=6, D7=7)
lcd.lcd_clear()
banners=[
(" Happy birthday ", " to Siyi! "),
(" Wish you have ", " a better year! "),
("Welcome to Yi's ", "Birthday party ")
]
def transit(now, next, step=0.03):
for i in range(1, 16+1):
lcd.lcd_puts(now[0][i:]+next[0][:i], 1)
lcd.lcd_puts(now[1][i:]+next[1][:i], 2)
time.sleep(step)
cur = 0
while True:
next = (cur + 1) % len(banners)
transit(banners[cur], banners[next], 0.03)
time.sleep(2)
cur = next
这个程序的逻辑过于简单,几乎不需要解释,python 原生支持 tuple
,所以写起来更轻松一些,还是循环显示,串场的时候再用一个循环,小间隔逐字移动模拟滚动效果。如果所用的 I2C 模块接线和我的不同,修改开头的接口定义即可。