一起玩转树莓派(7)——树莓派模数/数模转换实践(二)

简介: 一起玩转树莓派(7)——树莓派模数/数模转换实践

下面我们来详细解释下上面的代码,首先smbus是一个Python模块,我们之前并没使用过,我们这次实验不使用GPIO,使用smbus来进行I2C总线管理。


在核心逻辑执行前,首先需要进行总线管理器的实例化,使用如下方法:


bus = smbus.SMBus(1)




其中的参数表示要使用的I2C版本。


前面我们分析过,在I2C总线通信中,主机先要发送指令告诉从机要做什么,对应代码中就是write_byte方法,这个方法用来向PCF芯片发送一个8位的控制指令,通过查阅芯片手册,很容易找到这个8位的控制指令每一位的意义,如下图所示:


image.png


我们从左往右来分析上图。


对于上图,我们在多解释一下,这个8位的控制指令,第1位和第5位都是默认填充位,都用0填充,目前没有任何意义。


第2位表示是否开启AOUT输出口,只有这一位为1,数模转换才会工作,数字信号才会被转换为模拟信号从AOUT引脚输出。(本次实验我们暂不使用)


第3位和第4位用来编程控制输入模式,这两位可以组成的数值有00,01,10,11共四种,设置为00表示AIN端口与输入通道一一对应。01,10,11这3种模式通道的值都是经过 处理的,上图有明确的标注,比如在11模式下,通道0的值是AIN0和AIN1输入的差分,通道1的值是AIN2和AIN3输入的差分。(本次实验我们也无需使用这一功能)


第6位的作用是设置是否自动切换通道,当其设置为1时,每次读取数据后,通道都会切换,例如第一次读取通道0的数值,第二次会在读取时,会自动读取通道1的数值。


第7位和第8位用来指定从哪个通道读取数值,有4个通道可用,分别通过00,01,10,11进行设置。


我们再来看下write_byte方法:


bus.write_byte(0x48,0x00)  

这个方法有两个参数,第2个参数就是我们上面说的指令参数,其用16进制表示,例如0x03设置为:


第1位 第2位 第3位 第4位 第5位 第6位 第7位 第8位

0(占位) 0(不使用AOUT) 0(一一对应模式) 0(一一对应模式) 0(占位) 0(不启动切换通道) 1(设置要读取的通道) 1(设置要读取的通道)

write_byte这个方法的第1个参数用来设置I2C总线中要为哪一个从机设置指令,PCF的地址设置是7位,查阅手册如下:


image.png


可以看到第4位到第7位都是固定的,前3位是可编程的,还记得PCF的A0到A3引脚吧,就是让主机来分配从机地址使用的。我们可以知道,PCF从机的地址一定在二进制数01001000(0x48)到01001111(0x4F)之间,要查阅当前连接到树莓派的PCF从机的地址,可以在树莓派终端输入如下指令:


sudo i2cdetect -y 1

效果如下图所示:

image.png



从图中可以看到,树莓派当前只连接了一个I2C从机模块,分配的地址是0x48。


现在,上面的代码对你来说非常好理解了,需要注意,其中除了0x48表示的是PCF从机的地址外,其他十六进制数都是指令。指令设置完成后,接下来就可以进行数据的通信,使用如下方法:


bus.read_byte(0x48)  

这个方法用来通过I2C总线从PCF读取数据,上面代码中我们在读取数据时连续调用了两次,这是因为PCF8591接收到读取数据的命令后会同时进行上一次转换数据的传输和本次数据的转换,空读一次可以消费掉不正确的数据。


还有一点需要注意,对于我们使用的PCF8591模块来说,其自带的可调节电压会输出到第4个通道,光敏传感器的数据会输出到第1个通道,热敏传感器的数据会输出到第2个通道,在本次实验中,第3个通道不被使用(如果你使用的PCF8591模块和笔者的不太一样,对应通道可能会不同,可以自行测试)。


三、尽情玩耍


现在,你可以尝试在树莓派上运行写好的程序,通过输出可以看到当前的可调节电压、环境亮度和环境温度的情况。你可以尝试使用螺丝刀对电位计进行调节,可以实时的看到输出电压的改变,可以关灯和开灯来改变环境亮度,你也可以将热敏传感器握在手中,这些都可以明显的从输出信息上看到环境数据的变化。如下图所示:



image.png

这次,关于树莓派编程,我们学到了一些新的东西,使用I2C总线和数模转换模块我们可以做出更多有意思的东西,比如红外控制的自制电视机?比如有有马达驱动的遥控小车?等等...。你可以做好准备,我们后面会一起开发一些更好玩的东西!

目录
相关文章
|
IDE 网络安全 开发工具
GitLab - GitLab 使用 SSH 免密登录
GitLab 使用 SSH 免密登录
1693 0
GitLab - GitLab 使用 SSH 免密登录
|
存储 Linux 虚拟化
轻量服务器
【10月更文挑战第19天】
527 1
|
12月前
|
传感器
Modbus协议深入解析
Modbus协议是由Modicon公司(现施耐德电气)于1979年发明的串行通信协议,主要用于工业自动化系统中的PLC通信。本文深入解析了Modbus协议的主从模式、数据类型(线圈、离散输入、保持寄存器、输入寄存器)、帧结构和通信过程,并介绍了其应用场景和重要性。
|
数据可视化 IDE Linux
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
2461 3
vscode 生成项目目录结构 directory-tree 实用教程
vscode 生成项目目录结构 directory-tree 实用教程
1635 2
|
安全 程序员 编译器
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误(一)
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误
1091 1
|
存储 安全 NoSQL
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误(二)
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误
1011 1
|
Java
springboot启动报错:“Error starting ApplicationContext. To display the conditions report re-run your appl
springboot启动报错:“Error starting ApplicationContext. To display the conditions report re-run your appl
2602 0
|
数据可视化 数据挖掘 Python
Python对职业人群体检数据进行分析与可视化(附源码 超详细)
Python对职业人群体检数据进行分析与可视化(附源码 超详细)
610 4