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

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

在上一篇博客中,我们介绍了在树莓派中使用模数转换芯片的基本方法,如果你对上一篇博文中介绍的内容已经有了深入的理解,那后面的应用试验对你来说将非常容易。如果不是,那么我建议你先将之前介绍的内容在研究一下:


https://my.oschina.net/u/2340880/blog/5142788


现在,如果你决定继续本篇博客的学习,那么我认为你已经了解了PCF8591芯片的基本用法,明白了PCF8591的接线方式,I2C总线的基本工作原理以及PCF8591的设置命令的意义和读数据的方法。


一、读取外部传感器的模拟信号


在本系列博客的上一篇文章中,我们通过读取PCF8591实验模块自带的可调节电压输出、光敏传感器和热敏传感器实现了对当前环境信息的的读取,除了可以读取当前设置的输出电压外,我们还可以获得当前的环境的温度和亮度。PCF8591实验模块自带的传感器可以让我们很方便的进行实验,其实在实际应用中,更多时候我们需要从AIN0到AIN3引脚来获取外接传感器的模拟信号。现在,我们尝试下通过AIN0和AIN1两个输入引脚来获取外接光敏和热敏传感器的数据。


1.关于实验所使用的传感器


我们这里的小实验将使用光敏和热敏传感器。


光敏模块


光敏传感器能够感应光纤的明暗变化,其实现此功能的核心在于光敏电阻,只做光敏电阻的常用材料有硫化镉、硫化铝等。这些材料在特定波长的光波照射下,其阻值会产生明显的变化。本次实验,我们使用的光敏传感器模块如下图所示:


image.png


可以看到,此模块的核心是一个光敏电阻,提供了可调节灵敏度的功能单元和两个LED指示灯,其中一个LED是电源指示灯,接通电源后会亮,另一个LED灯是电平指示灯,当光亮达到阈值时,输出引脚输出低电平,此LED灯亮,当光亮度较暗时,输出引脚输出高电平,此LED灯不亮。我们再看此模块的4个引脚:


VCC:电源引脚


GND:接地引脚


DO:数字信号输出引脚(高低电平)


AO:模拟信号输出引脚


热敏模块


本次实验我们使用的热敏模块的功能与上面将的光敏模块类似,如下图所示:


image.png


此热敏模块同样包含两个LED指示灯、灵敏度调节单元和4个引脚,引脚如下:


VCC:电源引脚


GND:接地引脚


DO:数字信号输出引脚(高低电平)


AO:模拟信号输出引脚


2.实验连线


本次实验,我们使用PCF8591读取光敏和热敏传感器的模拟信号,将其转换成数字信号被树莓派程序处理,同时,我们使用树莓派的GPIO端口来读取传感器本身输出的数字信号,首先,我们先确定要使用的PCF8591的输入引脚和要使用的树莓派GPIO引脚。


PCF8591输入引脚使用:AINO和AIN1,其中AINO读取光敏模拟信号,AIN1读取热敏模拟信号。


GPIO输入引脚使用:GPIO17和GPIO18(BCM编码方式),其中17引脚读取光敏数字信号,18引脚读取热敏数字信号。


PCF8591连线:


PCF8591 树莓派功能引脚

SCL SCL

SDA SDA

GND GND

VCC 5V

光敏传感器:


光敏传感器 树莓派/PCF8591

VCC 树莓派3.3V

GND 树莓派GND

DO 树莓派GPIO11(物理引脚)

AO PCF8591 AIN0

热敏传感器:


热敏传感器 树莓派/PCF8591

VCC 树莓派3.3V

--- ---

GND 树莓派GND

--- ---

DO 树莓派GPIO12(物理引脚)

--- ---

AO PCF8591 AIN1

--- ---

连线最终如下图所示:


image.png


和之前相比,我们这次直接在树莓派上连接了3个元件,连线也复杂了很多,只要按照上面的表格,注意引脚的正确即可。


3.编写程序


步入正题,先上代码:


#coding:utf-8


#SMBus (System Management Bus,系统管理总线)

import smbus   #在程序中导入“smbus”模块

import RPi.GPIO as GPIO

import time


bus = smbus.SMBus(1)         #创建一个smbus实例



# 通过PCF8591读取模拟信号


# 数据亮度的模拟数据

def readLight():

   #发送一个控制字节到设备 表示要读取AIN0通道的数据

   bus.write_byte(0x48,0x40)  

   bus.read_byte(0x48)         # 空读一次,消费掉无效数据

   return bus.read_byte(0x48)  # 返回某通道输入的模拟值A/D转换后的数字值


def readTemperature():

#发送一个控制字节到设备 表示要读取AIN1通道的数据

   bus.write_byte(0x48,0x41)  

   bus.read_byte(0x48)         # 空读一次,消费掉无效数据

   return bus.read_byte(0x48)  # 返回某通道输入的模拟值A/D转换后的数字值


# 通过GPIO读取数字信号


# 设置使用的引脚编码模式

GPIO.setmode(GPIO.BOARD)

# 光敏模块的数字输出引脚 BCM 17

LP = 11

# 热敏模块的数字输出引脚 BCM 18

TP = 12

# 引脚初始化

GPIO.setup(LP, GPIO.IN)

GPIO.setup(TP, GPIO.IN)


while True:

print('--------分割线----------')

print('亮度数字信号:', GPIO.input(LP))

print('亮度模拟信号:', readLight())

print('温度数字信号:', GPIO.input(TP))

print('温度模拟信号:', readTemperature())

time.sleep(2)




上面的代码有着比较详尽的注释,这里我们无需多说,在树莓派上运行此代码,即可观察到控制台的数据输出。


二、使用操纵杆外设控制圆球移动


如果你顺利完成了上面的实验,先别急着庆祝,你会发现,和本系列前面几篇博客的内容较比,到目前为止我们并没有介绍新的知识,同时也没有做什么新颖的事情。的确如此,但是通过上面实验的练习,可以帮助你更深入的理解数模/模数转换的应用场景,并且让你能够更加灵活的对I2C总线与通用GPIO串口结合进行使用。下面我们要来做一些好玩的事情了,不知道你小时候是否有玩过“大把机”,这是一种摇杆游戏机,摇杆可以朝上下左右4个方向转动,也可以从中间按下。通常,上下左右用来控制游戏人物的行动方向,按下用来进行人物跳跃。现在,我们要来做一个简单的游戏,为树莓派连接操纵杆,控制游戏程序页面上圆球的行为,其中方向控制圆球的移动,按下操纵杆则使圆球变色。


此实验所使用的操纵杆如下图所示:

image.png



可以看到,此元件有5个引脚:


GND:接地引脚


+5V:5V电源引脚


VRX:横向坐标模拟信号输出引脚


VRY:纵向坐标模拟信号输出引脚


SW:按钮数字信号输出引脚


操作杆内部实际上封装了双向的电阻器,其阻值会根据摇杆的方向变动产生变化,从而影响引脚信号的产生变化。


1.进行连线


我相信,现在连线对你来说应该是最简单的工作了。操纵杆有模拟信号输出同时也有数字信号输出,我们依然需要结合PCF8591与树莓派GPIO一起使用。关于PCF8591的接线上面有介绍,这里不再重复。操作杆的接线方式如下:


操纵杆 树莓派/PCF8591

GND 树莓派GND

+5V 树莓派5.5V

VRX PCF8591 AIN0

VRY PCF8591 AIN1

SW 树莓派GPIO 11(物理引脚)

目录
相关文章
|
4月前
|
Ubuntu Linux 开发者
Ubuntu 25.04:Linux 6.14内核引领技术革新
总的来说,Ubuntu 25.04的发布,不仅仅是一次简单的系统更新,更是Ubuntu社区对技术革新的一次大胆尝试。这些更新,无疑将使得Ubuntu在桌面市场的竞争力得到进一步提升,同时也为用户提供了更加稳定、高效和愉悦的使用体验。在这个版本中,我们看到了Ubuntu团队对技术的热爱和对用户体验的执着追求,这正是Ubuntu能够不断进步和发展的动力所在。让我们期待Ubuntu 25.04能够带来更多的惊喜,也让我们向Steve Langasek致敬,感谢他为开源社区所做的一切。
|
索引
树莓派 Raspberry Pi (bullseye)更换阿里云源方法
树莓派 Raspberry Pi (bullseye)更换阿里云源方法
13087 2
|
3月前
|
人工智能 安全 程序员
RAG系统大脑调教指南:模型选择、提示设计与质量控保一本通
本文用轻松幽默的方式解密如何在RAG系统中选择、调教和监督生成模型,让它成为一个既聪明又靠谱的知识助手。从模型选择到提示工程再到质量控制,手把手教你如何避开AI的「胡言乱语」陷阱。
170 11
|
Shell Linux Python
python执行linux系统命令的几种方法(python3经典编程案例)
文章介绍了多种使用Python执行Linux系统命令的方法,包括使用os模块的不同函数以及subprocess模块来调用shell命令并处理其输出。
648 0
|
Prometheus 监控 Cloud Native
grafana展示的CPU利用率与实际不符的问题探究
观察到`mpstat`命令显示单核CPU的`%usr`和`%sys`分别持续在70%和20%,而Grafana监控数据显示较低。问题源于Grafana表达式计算的是CPU时间增量而非利用率。`mpstat`通过`/proc/stat`获取数据并计算CPU利用率,而`node-exporter`直接导出原始数据。调整Grafana表达式以匹配`mpstat`的计算方式后,两者结果一致。解决方案是修正Grafana查询以准确反映CPU占用率。
651 1
grafana展示的CPU利用率与实际不符的问题探究
|
监控 应用服务中间件 API
深入理解微服务架构中的API网关
在现代后端开发中,微服务架构已经成为主流选择,而API网关作为其关键组件之一,起到了不可替代的作用。本文将深入探讨API网关的基本概念、功能、常见实现方式以及在微服务架构中的重要性。通过实际案例和技术细节,帮助你全面了解如何有效地利用API网关来提升系统的性能与安全性。
stm32f407探索者开发板(十)——时钟系统精讲
stm32f407探索者开发板(十)——时钟系统精讲
768 0
|
数据挖掘 数据处理 索引
使用Pandas从Excel文件中提取满足条件的数据并生成新的文件
使用Pandas从Excel文件中提取满足条件的数据并生成新的文件
716 1
|
机器学习/深度学习 算法 搜索推荐
【机器学习】Apriori算法在关联规则学习中的应用
【机器学习】Apriori算法在关联规则学习中的应用
417 0