打造增强型Raspberry Pi-液晶屏篇

对我来说,Raspberry Pi最吸引人的地方不是它的体积、功耗、性能之类的,而是它有两排很好用的接口,可以把软件和一些简单的硬件结合起来做点好玩的东西。对于学过做过单片机的同学来说,这些东西太小儿科了,可是对我来说还是一件非常新鲜的事情,在这里分享一下心得。

目标:为Raspberry Pi加上一个简易的液晶显示屏,可以用来显示Raspberry Pi的一些状态信息,也可以显示一个菜单,用红外线遥控器去操作菜单指挥Raspberry Pi执行相关的操作。

警告:任何时候,电流的速度都比你的反应要快,所以,在实验过程中,不正确的接线、不正确的程序、意外的短路、过载等都可能在瞬间烧掉你的Raspberry Pi或其它外围的硬件。Raspberry Pi的GPIO接口全都是没有保护电路的,一旦短路或输入过高电压,主芯片会马上被烧掉,基本上没有维修的可能性。

需要的硬件:

  • 一块面包板和若干连接线,用于组装电路。连接RPi与面板的线是母头转公头的,面包板上的连接线是两个公头的
  • 一块LCD1602液晶显示屏。如果你不会焊接,那就买一块预先焊好针脚的
  • 10K电位器一个
所需硬件

所需材料(其中红外接收管和遥控器这次用不上,下回要用)

面包板的使用方法:

可以把元件或接线直接插在面包板上连通电路,无需焊接。面包板上每一行的一组五个插孔之间是相互连通的,同一行上如果有两组五个插孔,则两组之间是断开的,适合插接集成电路或开关。面包板上行与行之间都是断开的。面包板两侧的如果有供电线插孔,则同一条供电线上的所有插孔都是连通的。

连接液晶屏:

LCD1602液晶屏提供了16列x2行的ASCII字符显示能力,工作电压5V,提供4位数据与8位数据两种工作模式,Raspberry Pi的GPIO口数量很有限,所以我们使用4位数据模式。

LCD1602液晶屏模块提供了16个引脚,我们只需接其中的12个即可:

1. VSS,接地,RPi PIN 6
2. VDD,接5V电源,PRi PIN 2
3. VO,液晶对比度调节,接电位器中间的引脚
4. RS,寄存器选择,接GPIO 14,RPi PIN 8
5. RW,读写选择,接地,表示写模式,PRi PIN 6
6. EN,使能信号,接GPIO 15,RPi PIN 10
7. D0,数据位0,4位工作模式下不用,不接
8. D1,数据位1,4位工作模式下不用,不接
9. D2,数据位2,4位工作模式下不用,不接
10. D3,数据位3,4位工作模式下不用,不接
11. D4,数据位4,接GPIO 17,RPi PIN 11
12. D5,数据位5,接GPIO 18,RPi PIN 12
13. D6,数据位6,接GPIO 27,RPi PIN 13
14. D7,数据位7,接GPIO 22,RPi PIN 15
15. A,液晶屏背光+,接5V,RPi PIN 2
16. K,液晶屏背光-,接地,RPi PIN 6

注意:

  1. 请注意GIPO引脚编号与Raspberry Pi上P1扩展口的PIN编号的区别,别搞混了。
  2. 如果你的液晶屏没有背光,则15,16脚可能不会引出,也就不用接线。
  3. LCD1602工作电压是5V,而RPi的GPIO口工作电压是3.3V,所以RW脚请确保接地进入写模式,否则尝试从LCD1602读取数据可能会烧掉RPi。
  4. VO脚接的是电位器,电位器的另外两个脚分别接5V和地。通过调节这个电位器,可以调节液晶屏的对比度。
  5. Raspberry Pi有Rev 1和Rev 2两个版本,它们对于PIN 13的定义是不同的。市面上现在大部分都是Rev 2版本,PIN 13对应GPIO 27。如果你的RPi是老的Rev 1版本,PIN 13对应是GPIO 21,你需要调整程序中的参数,把27改为21。

获取程序

git clone https://github.com/lifanxi/rpimenu.git

测试液晶屏:

Raspberry Pi通电后,正常情况下液晶屏会初始化。上面一行显示黑色方块,下面一行空白。如果屏幕一片空白或一片黑,可以尝试调节一下电位器,看看对比度是否合适。

直接以root权限运行程序包中的Adafruit_CharLCD.py,LCD上会显示两行字符:LCD 1602 Test, 123456789ABCDEF,这样就说明液晶屏已经工作正常了。

如果你想让液晶屏显示些别的东西,可以参考lcdmenu.py代码和Adafruit_CharLCD.py中所暴露的接口。

LCD1602液晶屏测试

LCD1602液晶屏测试(右上角的红棕两根线是预留给红外接收管的,目前插在那里相当于悬空,没用)

下期预告:

下期会介绍如何把红外线接收管接上去,并配置LIRC去接收遥控器的信号,从而实现用遥控器控制Raspberry Pi的目的。

参考资料:

  1. 面包板的使用
  2. Drive a 16×2 LCD with the Raspberry Pi
  3. Raspberry Pi GPIO接口信息

题外话:

细心的同学在上图中可以发现我的Raspberry Pi的电源口附近有一个体积和样子都很违和的电解电容。这里原本是一个给电源滤波用的贴片电解电容C6(15V, 220μF),但是我在给Raspberry Pi接线时,轻轻的在上面借了一点力,它就掉下来了……

根据Raspberry Pi官网Wiki的说法,C6掉了是常见病。只要你的电源质量不非常差,C6有没有都无所谓。所以,如果你的C6也掉了,除非你是焊接熟练工,或者跟我一样手贱,那可以找个相似型号的电容焊上去(电解电容,一定要注意极性),不然的话,不去管它是一个更好的选择。

打造增强型Raspberry Pi-液晶屏篇》上有46条评论

  1. Pingback引用通告: 打造增强型Raspberry Pi-红外遥控篇 | 李凡希的Blog

  2. ./Adafruit_CharLCD.py
    ./Adafruit_CharLCD.py:68: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    self.GPIO.setup(self.pin_e, GPIO.OUT)
    ./Adafruit_CharLCD.py:69: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    self.GPIO.setup(self.pin_rs, GPIO.OUT)
    ./Adafruit_CharLCD.py:72: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    self.GPIO.setup(pin, GPIO.OUT)

    我的树莓派2,出现这个错误,修改了:
    def __init__(self, pin_rs=14, pin_e=15, pins_db=[17, 18, 27, 22], GPIO = None): ,其中的pin_rs=14, pin_e=15,还是不行,后面的[17, 18, 27, 22]也试着修改了,也不行,是不是要在程序开头的地方,写一句初始化gpio的语句,先把这几个关掉? 谢谢

    • 这个警告信息是正常的,我这里也有。

      建议再检查一下接线,调一下电位器,实在不行再重启一下树莓派。

  3. 经过博主的指点:液晶正常显示了,是操作系统的问题,重新下载安装了最新系统,红外线遥控器也正常了。但是有两点:1:运行/lcdmenu.py,需要首先安装:apt-get install python-pylirc,否则会报错误ImportError: No module named pylirc2:自己建立/home/pi/.lircrc这个文件,否则会报错误lcdmenu: could not open config file /home/pi/.lircrc,请注意!十分感谢博主写的这么好教材!

      • 为什么我安装了python-pylirc,还是会报错ImportError: No module named pylirc

          • 我的应该是树莓派B版,python应该是3.0,pythonhome应该怎么设置啊?还有没有其他方法?谢谢

          • 换2.7的Python试试呢?好多硬件相关的库都没有3.0。

            我手头暂时没有能用的RPi,所以没办法帮您试了,抱歉。

  4. Pingback引用通告: 开拖拉机的熊猫 » [树莓派]桌面时钟

  5. 你好:
    感谢你的教程,显示器工作正常。不过为什么我的显示器只能使用100欧的电位器,并且电位器发热很大,而且不稳定

    • 按我的理解,电位器在这个电路里主要就是起一个分压的功能,这个通路上不需要很大的电流,所以用大一点的电位器应该是可以的,而且阻值大的话发热应该也会少一些。

      • 谢谢,后面重新接了一次就好了,也可以用10K的了。有一次不小心直接连接了5V和GND大概一秒,运气真好,RPi重启了,居然没事

  6. Pingback引用通告: 树莓派 Raspberry Pi 相关文章 | 胖朱

  7. 你好,很感谢你的这篇教程帖。
    我按你的步骤执行之后,开机lcd背光亮,无显示,
    执行程序后,报错。
    pi@chaiwei-pi ~/gpio_test/lcd $ sudo python ./Adafruit_CharLCD.py
    ./Adafruit_CharLCD.py:68: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    self.GPIO.setup(self.pin_e, GPIO.OUT)
    ./Adafruit_CharLCD.py:69: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    self.GPIO.setup(self.pin_rs, GPIO.OUT)
    ./Adafruit_CharLCD.py:72: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    self.GPIO.setup(pin, GPIO.OUT)
    pi@chaiwei-pi ~/gpio_test/lcd $

    我没有安装电位器,不知道是不是这个问题,其它线都接连正确。
    请问作者,会是什么问题。感谢为盼。

    • 这些警告通常情况下是没有关系的。

      没有装电位器是不行的,因为这个电位器是用来调节液晶屏的对比度的,没装的话相当于对比度调到很小,所以就几乎看不到显示了。如果你没有电位器,也可以用两个不同阻值的电阻来代替,必须在液晶屏的3号脚上提供一个合适的电压才能保证液晶屏的正常显示。

  8. 您好,我液晶屏初始化成功,但是显示不出字来,我的1602用的带电位器的转接电路板,引出的6个阵脚,GND接的pin6, vcc接的pin2,RS接的pin8, E接的pin10,还有两个DAT,SCLK不知道怎么接,我DAT接的pin 13,sclk接的pin5或pin7,有时候偶尔能显示出乱码来,但多数时候,不显示字符,只是第一行一个白条,可以正常调对比度,请问我的接线有问题么,会是什么原因呢

    • 搜了一圈好像没有找到完全一样的转接板,不过这听起来这像是用I2C或SPI协议的转接板,需要接到对应的GPIO接口上,然后另外写程序去驱动,我这里的说明和程序都不适用于这种转接板。

        • 我没玩过51,这个转换板应该是把并行数据口转成串行了,但是我不知道它的协议,如果你想要用串行驱动的方式,你可以查查这个相关的协议,然后自己实现一下。本文中的连接方式与程序都不适用于这个转换板。

          要不你就把转换板拆掉,直接把1602屏拿下来用,那就可以完全按本文中的内容进行连接并用程序控制它了。

          • 直接控制试过可以,用你的代码可以显示数据,因为手头没有调位器,对比度没调好,麻烦你了,谢谢你的耐心回复,呵呵

  9. 谢谢楼主分享,我想问一下,如果我的LCD1602的液晶上多了一块I2C的板子,这样该怎么去写程序啊?我现在能找到设备,就是不知道该怎么让它显示内容,只是亮着灯。。呵呵