打造增强型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的板子,这样该怎么去写程序啊?我现在能找到设备,就是不知道该怎么让它显示内容,只是亮着灯。。呵呵

  10. 你的方案中占用了pin6和pin8,这两个口在树莓派的定义里是/tty/USBAMA,串口。

    我修改程序,想不占用这两个端口,一直无法实现。请帮助我

    • 应该不难吧,把线重新接一下,然后程序中对应的端口号码改一下就行了。

      6是GND,你想说是把8和10空出来吧?你可以换成别的端口,然后把Adafruit_CharLCD.py中57行的pin_rs,pin_e改一下。注意那里用的是GPIO编号,不是引脚编号。

  11. 你好,你有没有测试过修改pin针脚?比如我设想利用偶数针脚驱动lcd1602,但是我修改py代码的相关位置,却没有成功,我不知道问题出在什么地方,能帮帮我吗

    • 我文中用的引脚也是反复试验后才确定下来的,目前的安排是为了接线比较好接,所以肯定是测过修改引脚的。

      由于这个改动同时涉及到软件和硬件,所以我很难直接帮你判断你的问题出在哪里。我的建议是你先文中的说明来连接并确认一切工作正常,然后一个个的替换引脚,换一条接线就改一次程序设置,然后马上确认替换后是不是还工作正常。这样一步步的改就很容易确认问题出在哪个地方了。

  12. 博主您好,非常感谢您的教程,我用的是树莓派扩展板,将LCD1602直接对应接口插上去的,屏幕没有出现初始化,通电后直接就是蓝色的,用测试程序也没有显示,还望博主指点!多谢!扩展板是这款http://detail.tmall.com/item.htm?spm=a220o.1000855.1998025129.1.Hl4v3m&id=36454418962&rn=&acm=03054.1003.1.67386&uuid=ePDS74Mw&abtest=_AB-LR32-PV32_648&scm=1003.1.03054.ITEM_36454418962_67386&pos=1

    • 我没用过这块扩展板,不过直觉上要用这个扩展板上的LCD1602接口的话,应该需要改动程序。就算不用改程序逻辑,程序中写死的GPIO端口号也得改吧,不会这么巧正好对上了。你可以参考扩展板提供的文档和示例程序来了解如何去驱动LCD。

      通电就是蓝色是正常的,因为这块LCD只要接上背光电源就会亮的。

      • 恩恩,多谢您的回答!我转动电位器,显示屏上面会出现黑色小方块,程序是我用的这块扩展板上面自带的,应该GPIO端口号是对应的,那如果我要修改这些端口号,我怎么能够知道LCD1602插到的那些口对于数字是多少呢?

        • 电位器是用来调对比度的,所以某个方向转到头肯定会出来小黑方块,你应该把电位器调到小黑方块若隐若现的位置就是合适的位置。
          程序如果用的是自带的,按理说不会有问题,但我没用过这块扩展板,也没有相关的文档,所以没办法提供更多的建议。

  13. 博主您好,我的raspi是通过i2c链接lcd还有按钮的(adafruit卖的一套lcd16x2加上5个按钮)。您有没有带有更多注释的程序?尤其是setup那部分,最好是中文注释,谢谢!还有就是我用官方给的代码char_lcd_plate.py修改之后,lcd显示时间和测量的温度,如何lcd.message把具体到哪行哪列的参数改变而其他的不改变(例如lcd位置(7,1)和(8,1)原来显示19现在显示20)??因为数据要在lcd上每秒更新一次,如果每次都lcd.clear删除全部内容再显示就会太闪烁,想只改变改变的地方*(例如时间里的秒和温度数值)。

    • 我没用过I2C的LCD模块。
      如果你每次clear再重新显示,肯定是会闪的。所以只能是更新需要更新的部分,需要清除的内容用空格去填充。
      可以参考https://github.com/lifanxi/rpimenu/blob/master/lcdmenu.py中DoubanInfo函数,实现的跑马灯效果。

      • 博主您好,我的raspi是通过i2c链接lcd还有按钮的(adafruit卖的一套lcd16x2加上5个按钮)。原来的问题解决了,谢谢!但是现在我要在一个界面上显示所有内容,包括*(a.第一行每秒更新一次的时间和测量温度,b.在固定位置不变的符号,还有c.随时更新的第二行温度设定值)。我分成3个线程去做,分别测试了成功,但是合并起来就不行,猜测是因为数据冲突。不知道你有何解决办法??像youtube上有做成网络收音机的,第一行就能显示时间

        • 我没用过个套件,我猜是多线程向LCD输出数据造成的问题。我觉得你的问题应该不需要多线程,即使用多线程,也可以是三个线程来准备数据,然后最终负责输出LCD的是一个独立的线程,只有它一个统一进行输出,避免并发操作GPIO带来的问题。

  14. 不知道为什么我的提示没有gpio这个模块,但是我已经安装python-rpi.gpio了

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据