树莓派论坛

 找回密码
 立即注册

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

wjzc2006 发表于 2014-7-27 01:12:29 | 显示全部楼层 |阅读模式
本帖最后由 wjzc2006 于 2014-7-27 01:23 编辑

由于我基本上都是通过SSH来联接树莓派,因此很少将它接在显示器上。但有时又想让它显示一些简单的信息,比如IP地址、传感器的一些信息等,因此入手了一块LCD1602液晶显示屏,希望通过它来显示这些信息。
这时,出现了两个问题:一是这块显示屏有16个引脚,如果将它们全部接在树莓派的GPIO引脚上,那其他的传感器就没法用了;二是驱动的问题。
Linux下,关于驱动有一个通用的解决方案:lcdproc,它可以驱动包括HD44780类型的液晶显示屏。这样就解决了一个问题,更加让人激动的是,lcdproc还提供了一个python库,这样你就可以在你的python程序中控制显示屏的显示了。
查看lcdproc的文档,发现它也支持通过I2C总线来使用HD44780液晶显示器,其推荐的方案是用PCF8574I/O扩展器,而树莓派上恰好有I2C接口。这样又解决了一个问题。
这样两个问题都解决了,我买了一块PCF8574AP后,就动手安装了。
整个过程最麻烦的是接线,下面先上PCF8574AP的引脚图:
pcf8574.jpg

它一共有16只引脚,请注意它上方的半月形缺口,缺口的左面是1号脚,右面是16号脚。而LCD1602也有16只引脚,这里就不上引脚图了,一般在显示屏上会标注的。
我们先从PCF8574AP的引脚接起。

PCF8574AP的第123号脚(即A0A1A2)是选择地址的,将它们接在高电平上将会获得高位地址,接在低电平上将会获得低位地址,我将这三个脚都接在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的第1213号脚空置,不用做连接。

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电源,一只接地。虽然这个脚可以不用连接,但在实际操作中,调节显示屏的亮度是很重要的,因此强烈建议安装。
显示屏78910脚空置
显示屏15号脚接5V电源,即与树莓派GPIO的第2号脚连接。(用于背灯)
显示屏16号脚接地,即与树莓派GPIO的第6号脚连接。(用于背灯)
IMG_20140727_003342.jpg IMG_20140727_003444.jpg
(图有点乱,大家凑合着看吧,呵呵!)

好了,完成上面的接线工作,就可以通电使用了。
树莓派通电后,显示屏应会亮,同时在第一行显示一排黑方块。如果看不到黑方块或黑方块不明显,请调节可调电阻,直到黑方块清晰显示。如果调节可调电阻还看不到方块,则可能你的连接有问题了,请检查连接,包括检查显示屏的引脚有没有虚焊。
IMG_20140727_003514.jpg
接下来是加载内核模块和lcdproc了。我使用的raspbain中系统已默认安装好了I2C的模块,但不会自动加载,必须手动加载。我们需要加载两个模块,如下:
  1. sudo modprobe i2c-bcm2708

  2. sudo modprobe i2c-dev
复制代码
加载上述两个模块后,我们开始寻找设备:
  1. sudo i2cdetect -l
复制代码
(上面这个命令中,-l 的l是英文字母l,不是数字1,请注意)这个命令显示系统中所有可用的I2C总线。我的树莓派中找到了2个,分别是01
我用下面的两条命令来扫描这两个I2C总线以查找设备地址:
  1. sudo i2cdetect 0
  2. sudo i2cdetect 1
复制代码
最终在1上找到了设备地址,地址为0x3f。
img.jpg
现在我们就来安装lcdproc。在我的raspbain系统中,是没有默认安装lcdproc的,用如下命令来安装:
  1. sudo apt-get install lcdproc
复制代码
如果你的网速够快的话,安装会很快结束。安装结束后,系统会启动lcdprocLCDd守护进程。但是,先别忙,我们还要进行一番配置,先将这个守护进程停下来吧:
  1. sudo service LCDd stop
复制代码
打开/etc/LCDd.conf这个配置文件:
  1. sudo vi /etc/LCDd.conf
复制代码
(我是vi党的,但不管你用什么文本软件,别忘了root权限。)
[server]下找到:Driver=curses,将其改为:Driver=hd44780
[menu]后的[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
做完上面的修改后,保存、退出。然后启动我们刚才停止的守护进程:
  1. sudo service LCDd start
复制代码
现在赶紧看一下你的LCD1602,是不是有显示了?显示屏上应出现如下的欢迎信息:

IMG_20140726_215626.jpg IMG_20140726_215109.jpg

    (好了,今天先写到这吧,太晚了。明天我再找时间写下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。你可以用telnetlcdproc通讯。在lcdproc的官方文档中有操作lcdproc的命令介绍。因此只要你有足够的学习精神,完全可以用python写出自己的lcdprocpython
但这一工作已有人帮我们做好了,感谢这些大牛啊!
(lcdproc的python库:https://github.com/jinglemansweep/lcdproc )
让我们先来安装这个库:
对于python2
  1. sudo apt-get install python-setuptools
  2. sudo easy_install lcdproc
复制代码
对于python3:
  1. sudo apt-get install python3-setuptools
  2. sudo easy_install3 lcdproc
复制代码
这个库很好用,但缺点是作者仅提供了一个例程,没有提供文档,但这个例程已足够我们来学习了,如下:
  1. #!/usr/bin/env python

  2. import time
  3. import datetime

  4. from lcdproc.server import Server

  5. def main():

  6.     lcd = Server("media", debug=False)
  7.     lcd.start_session()
  8.    
  9.     screen1 = lcd.add_screen("Screen1")
  10.     screen1.set_heartbeat("off")
  11.     screen1.set_duration(10)
  12.    
  13.     screen2 = lcd.add_screen("Screen2")
  14.     screen2.set_heartbeat("off")
  15.     screen2.set_duration(2)

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

  25.     time.sleep(2)

  26.     progress = 0
  27.    
  28.     while True:
  29.    
  30.         num1_widget.set_value(progress)
  31.         num2_widget.set_value(progress)
  32.         num3_widget.set_value(progress)
  33.         num4_widget.set_value(progress)               
  34.    
  35.         time.sleep(0.5)
  36.         
  37.         progress = progress + 1
  38.         if progress > 9: progress = 0
  39.         
  40. # Run

  41. if __name__ == "__main__":
  42.     main()
复制代码
wjzc2006  楼主| 发表于 2014-7-27 11:05:35 | 显示全部楼层
树老大 发表于 2014-7-27 09:40
很不错。32个赞。

谢谢老大支持啊!
潇洒哥 发表于 2014-7-28 16:09:23 | 显示全部楼层
楼主在树莓派上安装了ubuntu吗?
楼主要的那个i2c的1602淘宝上有,就是适配arduino的i2c屏幕,就是一个小模块+一块1602
给个地址,自己看吧
http://s.taobao.com/search?q=i2c ... d=tbindexz_20140728
wgs3101 发表于 2016-1-28 15:49:05 | 显示全部楼层
大大, 我是这个问题 更改了LCDd.conf 后 运行LCDd -f
shumeipai.png
一直卡在这里不动了…………

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


对了 ,我没办法在网上下载lcdproc因为会提示
shumei3.png
所以我是在官网http://www.lcdproc.net/ 进行的下载 使用su进行make安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版 | Archiver | 树莓派论坛 ( 粤ICP备15075382号-1 )