terminaterfxy 发表于 2014-6-28 17:39:56

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

树莓派可以通过自己的GPIO上的I2C接口与外部的器件进行通信。SDA,SCL输出为5V左右。如图所示:

我们可以用这两个接口与外部的器件经行链接来学习一下树莓派的I2C用法。下面我们以树莓派通过I2C链接18位ADC芯片并通过I2C连接1602显示来带大家体验一下
先上一张显示的实现的效果图:

(通过ADC的2路通道测试流过电阻电流和LED的压降,分别利用单端差分放大和双端差分放大)

准备的器件:
1、树莓派(这个必须要有)
2、DFRobotI2C 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的文件
我们还需要1602的Python库,直接下载即可,也可以直接从网上下载

第三部:
打开finaltest.py看到函数:
下面我来解释一下(#后面的文字即为解释)#!/user/bin/env python                  #绝对地址引用


import smbus                               #调用smbus函数库
import time
import sys
import getopt
import LCD1602                        #调用1602函数库

bus = smbus.SMBus(1)               #定义类
duk = LCD1602.lcd1602()
address_ad = 0x68                     #AD芯片的地址
address_lcd = 0x27                  #lcd1602的i2c地址


if __name__ == '__main__':      #main函数
   
    while True:                            #循环相当于while(1)
      
      duk.init_lcd()                     #lcd初始化
      getcode = bus.read_i2c_block_data(address_ad,0x88,2)#发送地址和配置文档,返回2位数据
      high = getcode             #高8位
      low = getcode            #低8位
      one = high*256+low-144 #计算
      ea = one*0.00006277779
      if(ea <= 0):
            ea = 0.00
      ea = str(ea)                        
      ea = ea                        #显示6位
      duk.print_lcd(0,0,'Current:')#在第0行第0个数开始显示Current
      duk.print_lcd(8,0,ea)          #在第0行第8个数开始显示ea的值
      duk.print_lcd(14,0,'mA')

      
      getcode = bus.read_i2c_block_data(address_ad,0xA8,2)
      high = getcode
      low = getcode
      one = high*256+low-144
      ea = one*0.00006277779
      if(ea <= 0):
            ea = 0.00
      ea = str(ea)
      ea = ea
      duk.print_lcd(0,1,'Voltage:')
      duk.print_lcd(8,1,ea)
      duk.print_lcd(15,1,'V')      

      
      time.sleep(1)                                       #延时1秒钟


第四步:
我们开始搭我们的电路


所有的I2C都在2根SDA和SCL上


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

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




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

你好,我现在用的是树莓派B,使用i2ctool能找到设备的地址0x40,0x44,0x60,但是在使用write_i2c_block_data(0x60,0x32,)这组数据进行收音机操作时,出现Input/Output error,这几个设备没有寄存器是直接操作数据的,请指教一下,谢谢!
页: [1]
查看完整版本: 《边学边用树梅派-9》树莓派 I2C 通信初探 I2C LCD及其ADC模