斯屹

换用 Raspberry Pi 实现同样的效果

gnawux Raspberry PiEEbirthdaysiyitutorial时间机器

生日当天,爸爸用 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 针

确定针脚编号的方法是这样的

  1. 面对电路板,让 GPIO 插针区域位于右下方
  2. 现在右上角的针是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 模块接线和我的不同,修改开头的接口定义即可。

gnawux
father!#$!@#$@#$wangsiyi!@#$%^&*()_net