wjzc2006 发表于 2014-7-27 01:12:29

通过I2C总线使用LCD1602液晶显示屏

本帖最后由 wjzc2006 于 2014-7-27 01:23 编辑

由于我基本上都是通过SSH来联接树莓派,因此很少将它接在显示器上。但有时又想让它显示一些简单的信息,比如IP地址、传感器的一些信息等,因此入手了一块LCD1602液晶显示屏,希望通过它来显示这些信息。这时,出现了两个问题:一是这块显示屏有16个引脚,如果将它们全部接在树莓派的GPIO引脚上,那其他的传感器就没法用了;二是驱动的问题。在Linux下,关于驱动有一个通用的解决方案:lcdproc,它可以驱动包括HD44780类型的液晶显示屏。这样就解决了一个问题,更加让人激动的是,lcdproc还提供了一个python库,这样你就可以在你的python程序中控制显示屏的显示了。查看lcdproc的文档,发现它也支持通过I2C总线来使用HD44780液晶显示器,其推荐的方案是用PCF8574的I/O扩展器,而树莓派上恰好有I2C接口。这样又解决了一个问题。这样两个问题都解决了,我买了一块PCF8574AP后,就动手安装了。整个过程最麻烦的是接线,下面先上PCF8574AP的引脚图:
它一共有16只引脚,请注意它上方的半月形缺口,缺口的左面是1号脚,右面是16号脚。而LCD1602也有16只引脚,这里就不上引脚图了,一般在显示屏上会标注的。我们先从PCF8574AP的引脚接起。
PCF8574AP的第1、2、3号脚(即A0、A1、A2)是选择地址的,将它们接在高电平上将会获得高位地址,接在低电平上将会获得低位地址,我将这三个脚都接在3.3V电源上了(即树莓派GPIO的第1号引脚)。
PCF8574AP的第4号脚(P0)与显示屏的第11号脚连接。PCF8574AP的第5号脚(P1)与显示屏的第12号脚连接。PCF8574AP的第6号脚(P2)与显示屏的第13号脚连接。PCF8574AP的第7号脚(P3)与显示屏的第14号脚连接。
PCF8574AP的第8号脚(VSS)接地,与树莓派GPIO的第6号脚连接。
PCF8574AP的第9号脚(P4)与显示屏的第4号脚连接。PCF8574AP的第10号脚(P5)与显示屏的第5号脚连接。PCF8574AP的第11号脚(P6)与显示屏的第6号脚连接。
PCF8574AP的第12、13号脚空置,不用做连接。
PCF8574AP的第14号脚(SCL)与树莓派GPIO的第5号脚连接。PCF8574AP的第15号脚(SDA)与树莓派GPIO的第3号脚连接。PCF8574AP的第16号脚(VDD)接3.3V电源,即与树莓派GPIO的第1号脚连接。
这样PCF8574AP的引脚就连接完了。而显示屏还有几个脚要连,分别如下:
显示屏1号脚接地,即与树莓派GPIO的第6号脚连接。显示屏2号脚接5V电源,即与树莓派GPIO的第2号脚连接。显示屏3号脚接一个10K的可调电阻中间脚上,用于调节显示屏亮度,可调电阻另两只脚一只接5V电源,一只接地。虽然这个脚可以不用连接,但在实际操作中,调节显示屏的亮度是很重要的,因此强烈建议安装。显示屏7、8、9、10脚空置。显示屏15号脚接5V电源,即与树莓派GPIO的第2号脚连接。(用于背灯)显示屏16号脚接地,即与树莓派GPIO的第6号脚连接。(用于背灯) (图有点乱,大家凑合着看吧,呵呵!)
好了,完成上面的接线工作,就可以通电使用了。树莓派通电后,显示屏应会亮,同时在第一行显示一排黑方块。如果看不到黑方块或黑方块不明显,请调节可调电阻,直到黑方块清晰显示。如果调节可调电阻还看不到方块,则可能你的连接有问题了,请检查连接,包括检查显示屏的引脚有没有虚焊。 接下来是加载内核模块和lcdproc了。我使用的raspbain中系统已默认安装好了I2C的模块,但不会自动加载,必须手动加载。我们需要加载两个模块,如下:sudo modprobe i2c-bcm2708

sudo modprobe i2c-dev加载上述两个模块后,我们开始寻找设备:sudo i2cdetect -l(上面这个命令中,-l 的l是英文字母l,不是数字1,请注意)这个命令显示系统中所有可用的I2C总线。我的树莓派中找到了2个,分别是0和1。我用下面的两条命令来扫描这两个I2C总线以查找设备地址:sudo i2cdetect 0
sudo i2cdetect 1最终在1上找到了设备地址,地址为0x3f。
现在我们就来安装lcdproc。在我的raspbain系统中,是没有默认安装lcdproc的,用如下命令来安装:sudo apt-get install lcdproc如果你的网速够快的话,安装会很快结束。安装结束后,系统会启动lcdproc的LCDd守护进程。但是,先别忙,我们还要进行一番配置,先将这个守护进程停下来吧:sudo service LCDd stop打开/etc/LCDd.conf这个配置文件:sudo vi /etc/LCDd.conf(我是vi党的,但不管你用什么文本软件,别忘了root权限。)
在下找到:Driver=curses,将其改为:Driver=hd44780在后的下找到:ConnectionType=4bit,将其改为:ConnectionType=i2c;接着找到Port=0x378,将其改为你刚才在上面找到的设备地址,我的是0x3f,因此我就改为Port=0x3f;接着找到Device=/dev/ttyS0,根据你刚才找到设备的总线编号修改,比如我是在1总线上找到的,此处就改为Device=/dev/i2c-1(同样,如果你是在0总线上找到的,就改为Device=/dev/i2c-0);最后找到Size=20x4,改为Size=16x2。做完上面的修改后,保存、退出。然后启动我们刚才停止的守护进程:sudo service LCDd start现在赶紧看一下你的LCD1602,是不是有显示了?显示屏上应出现如下的欢迎信息:


    (好了,今天先写到这吧,太晚了。明天我再找时间写下lcdproc的python库的用法。)


补充内容 (2014-7-27 10:43):
lcdproc的官方文档都在这里:http://lcdproc.omnipotent.net/docs.php3。其中有PCF8574和显示屏的接线图,但不知是我的浏览器问题,还是本来就是乱的,这幅图是乱的,因此没有贴上来

树老大 发表于 2014-7-27 09:40:57

很不错。32个赞。

wjzc2006 发表于 2014-7-27 11:01:59

本帖最后由 wjzc2006 于 2014-7-27 11:31 编辑

Lcdproc使用了服务器/客户端的工作模式,如果你没有对LCDd.conf做其他改动的话,它默认绑定了本机localhost地址:127.0.0.1,端口是:13666。你可以用telnet与lcdproc通讯。在lcdproc的官方文档中有操作lcdproc的命令介绍。因此只要你有足够的学习精神,完全可以用python写出自己的lcdproc的python库。但这一工作已有人帮我们做好了,感谢这些大牛啊!(lcdproc的python库:https://github.com/jinglemansweep/lcdproc )
让我们先来安装这个库:对于python2:sudo apt-get install python-setuptools
sudo easy_install lcdproc对于python3:sudo apt-get install python3-setuptools
sudo easy_install3 lcdproc这个库很好用,但缺点是作者仅提供了一个例程,没有提供文档,但这个例程已足够我们来学习了,如下:#!/usr/bin/env python

import time
import datetime

from lcdproc.server import Server

def main():

    lcd = Server("media", debug=False)
    lcd.start_session()
   
    screen1 = lcd.add_screen("Screen1")
    screen1.set_heartbeat("off")
    screen1.set_duration(10)
   
    screen2 = lcd.add_screen("Screen2")
    screen2.set_heartbeat("off")
    screen2.set_duration(2)

    #string_widget = screen.add_string_widget("MyStringWidget", text="TestwWEJIowejioewjio", x=1, y=2)
    #scroller_widget = screen.add_scroller_widget("MyScrollerWidget", text="This Is A Test Message, Yeah, Yeah, Yeah", speed=2)
    #hbar_widget = screen.add_hbar_widget("MyHBarWidget", x=1, y=4, length=60)
    #frame_widget = screen.add_frame_widget("MyFrameWidget")
   
    num1_widget = screen1.add_number_widget("MyNumber1Widget", x=1, value=0)
    num2_widget = screen1.add_number_widget("MyNumber2Widget", x=5, value=0)
    num3_widget = screen1.add_number_widget("MyNumber3Widget", x=9, value=0)   
    num4_widget = screen1.add_number_widget("MyNumber4Widget", x=13, value=0)   

    time.sleep(2)

    progress = 0
   
    while True:
   
      num1_widget.set_value(progress)
      num2_widget.set_value(progress)
      num3_widget.set_value(progress)
      num4_widget.set_value(progress)               
   
      time.sleep(0.5)
      
      progress = progress + 1
      if progress > 9: progress = 0
      
# Run

if __name__ == "__main__":
    main()

wjzc2006 发表于 2014-7-27 11:05:35

树老大 发表于 2014-7-27 09:40 static/image/common/back.gif
很不错。32个赞。

谢谢老大支持啊!:$

潇洒哥 发表于 2014-7-28 16:09:23

楼主在树莓派上安装了ubuntu吗?
楼主要的那个i2c的1602淘宝上有,就是适配arduino的i2c屏幕,就是一个小模块+一块1602
给个地址,自己看吧
http://s.taobao.com/search?q=i2c1602&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=1.7274553.1997520841.1&initiative_id=tbindexz_20140728

wgs3101 发表于 2016-1-28 15:49:05

大大, 我是这个问题 更改了LCDd.conf 后 运行LCDd -f

一直卡在这里不动了…………

如果输入sudo service LCDd start(或 stop)会出现这个:



对了 ,我没办法在网上下载lcdproc因为会提示

所以我是在官网http://www.lcdproc.net/ 进行的下载 使用su进行make安装
页: [1]
查看完整版本: 通过I2C总线使用LCD1602液晶显示屏