17762浏览
查看: 17762|回复: 1

[教程] 《边学边用树梅派-9》树莓派 I2C 通信初探 I2C LCD及其ADC模

[复制链接]
树莓派可以通过自己的GPIO上的I2C接口与外部的器件进行通信。SDA,SCL输出为5V左右。如图所示:
《边学边用树梅派-9》树莓派 I2C 通信初探 I2C LCD及其ADC模图2
我们可以用这两个接口与外部的器件经行链接来学习一下树莓派的I2C用法。下面我们以树莓派通过I2C链接18位ADC芯片并通过I2C连接1602显示来带大家体验一下
先上一张显示的实现的效果图:
《边学边用树梅派-9》树莓派 I2C 通信初探 I2C LCD及其ADC模图1
(通过ADC的2路通道测试流过电阻电流和LED的压降,分别利用单端差分放大和双端差分放大)

准备的器件:
1、树莓派(这个必须要有)
2、DFRobot  I2C LCD1602液晶模块(I2C接口的,如果你是普通的1602的话请按这个方法接: GND 接 GND   VCC 接  5V   SDA 接模拟口 A4    SCL 接模拟口 A5
3、DFRobot  最新出品的   MCP3424 18位AD转换模块(通过差分放大来检测电压)
4、杜邦线若干(面包板上插线用)
5、红色LED小灯(测试分压)
6、1K欧电阻(测试分压)
7、屏幕(这个必须要,否则你都不知道自己输了什么)
8、键盘(必要的东西)
9、鼠标(如果你不进入图形界面可以不用管)
10、网线(下载驱动)
11、面包板(便于插芯片和电路搭接)
第一步:
I2C设备的设置见前面的文章:《边学边用树莓派-4》I2C总线的使用

第二步:
我们既然安装了Python-smbus就可以利用smbus内部的函数来控制树莓派的GPIO的I2C
我们可以利用Python新建一个test.py下载附件test.zip的文件
我们还需要1602的Python库,直接下载即可,也可以直接从网上下载下载附件LCD1602.zip

第三部:
打开finaltest.py看到函数:
下面我来解释一下(#后面的文字即为解释)
  1. #!/user/bin/env python                  #绝对地址引用
  2. import smbus                               #调用smbus函数库
  3. import time
  4. import sys
  5. import getopt
  6. import LCD1602                          #调用1602函数库
  7. bus = smbus.SMBus(1)               #定义类
  8. duk = LCD1602.lcd1602()  
  9. address_ad = 0x68                     #AD芯片的地址
  10. address_lcd = 0x27                    #lcd1602的i2c地址
  11. if __name__ == '__main__':      #main函数
  12.    
  13.     while True:                            #循环相当于while(1)
  14.         
  15.         duk.init_lcd()                     #lcd初始化
  16.         getcode = bus.read_i2c_block_data(address_ad,0x88,2)#发送地址和配置文档,返回2位数据
  17.         high = getcode[0]             #高8位
  18.         low = getcode[1]              #低8位
  19.         one = high*256+low-144 #计算
  20.         ea = one*0.00006277779
  21.         if(ea <= 0):
  22.             ea = 0.00
  23.         ea = str(ea)                        
  24.         ea = ea[0:6]                        #显示6位
  25.         duk.print_lcd(0,0,'Current:')#在第0行第0个数开始显示Current
  26.         duk.print_lcd(8,0,ea)          #在第0行第8个数开始显示ea的值
  27.         duk.print_lcd(14,0,'mA')
  28.         
  29.         getcode = bus.read_i2c_block_data(address_ad,0xA8,2)
  30.         high = getcode[0]
  31.         low = getcode[1]
  32.         one = high*256+low-144
  33.         ea = one*0.00006277779
  34.         if(ea <= 0):
  35.             ea = 0.00
  36.         ea = str(ea)
  37.         ea = ea[0:6]
  38.         duk.print_lcd(0,1,'Voltage:')
  39.         duk.print_lcd(8,1,ea)
  40.         duk.print_lcd(15,1,'V')        
  41.         
  42.         time.sleep(1)                                         #延时1秒钟
复制代码


第四步:
我们开始搭我们的电路
《边学边用树梅派-9》树莓派 I2C 通信初探 I2C LCD及其ADC模图5

所有的I2C都在2根SDA和SCL上
《边学边用树梅派-9》树莓派 I2C 通信初探 I2C LCD及其ADC模图6

然后我们点击F5或者运行就可以了。
大家就会发现LCD1602的上面正显示着当前的电压和电流。

总结:
用smbus库函数来控制I2C的通信非常方便,I2C设备一般都是先发送地址(可以用I2C tools检测,也可以看技术文档),然后发送配置文件(有些需要寄存器地址),然后接受(有些芯片是写在寄存器内,这时你需要先发送寄存器地址再接收数据,有些芯片是直接发送数据,这时请不要在发送完配置文件或者接收8位数据后延时或者使用其他函数)。暂时就写到这,有什么好的意见或者不对的地方欢迎大家指正。




b62Xb20294.jpg

zhaolaing056  学徒

发表于 2014-10-14 10:06:54

你好,我现在用的是树莓派B,使用i2ctool能找到设备的地址0x40,0x44,0x60,但是在使用write_i2c_block_data(0x60,0x32,[0x7d,0s40,0x11,0x40])这组数据进行收音机操作时,出现Input/Output error,这几个设备没有寄存器是直接操作数据的,请指教一下,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail