《边学边用树梅派-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位数据后延时或者使用其他函数)。暂时就写到这,有什么好的意见或者不对的地方欢迎大家指正。
你好,我现在用的是树莓派B,使用i2ctool能找到设备的地址0x40,0x44,0x60,但是在使用write_i2c_block_data(0x60,0x32,)这组数据进行收音机操作时,出现Input/Output error,这几个设备没有寄存器是直接操作数据的,请指教一下,谢谢!
页:
[1]