通过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和显示屏的接线图,但不知是我的浏览器问题,还是本来就是乱的,这幅图是乱的,因此没有贴上来 很不错。32个赞。 本帖最后由 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() 树老大 发表于 2014-7-27 09:40 static/image/common/back.gif
很不错。32个赞。
谢谢老大支持啊!:$ 楼主在树莓派上安装了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 大大, 我是这个问题 更改了LCDd.conf 后 运行LCDd -f
一直卡在这里不动了…………
如果输入sudo service LCDd start(或 stop)会出现这个:
对了 ,我没办法在网上下载lcdproc因为会提示
所以我是在官网http://www.lcdproc.net/ 进行的下载 使用su进行make安装
页:
[1]