实验目的:实验采用PCF8591数模转换板,实现数字信号(Digital signal)到模拟信号(Analog signal)以及模拟信号到数字信号之间的转换。其中数字信号可以理解为”有无“(高电平或低电平),模拟信号则可以理解为”多少“(可以显示信号量多少)。
#传感器如图:
各引脚说明:
引脚 | 含义 | 接线 |
SDA | I2C通信接口 | 接树莓派SDA |
SCL | I2C通信接口 | 接树莓派SCL |
GND | 接地接口 | 接树莓派GND |
VCC | 电源接口(3.3V~5V) | 接树莓派5V(重要) |
AOUT | DA(数模)输出接口,输出模拟信号 | |
AIN0 | 模拟输入接口0 | |
AIN1 | 模拟输入接口1 | |
AIN2 | 模拟输入接口2 | |
AIN3 | 模拟输入接口3 | |
此处用ps2摇杆传感器测试:
1、GND接树莓派GND;
2、+5V接树莓派5V;
3、VRX接PCF8591的AIN0;
4、VRY接PCF8591的AIN1;
5、SW接PCF8591的AIN3。
实验代码:
#!/usr/bin/env python
#coding:utf-8
'''
from JiuJiang
树莓酱的操作实例
https:://www.suhmeijiang.com
'''
import time ##引入time库
import smbus ##引入控制总线
address = 0x48 ##传感器地址
xAddress = 0x40 ##x轴使用的地址 对应的AIN0
yAddress = 0x41 ##y轴使用的地址 对应的AIN1
zAddress = 0x42 ##z轴使用的地址 对应的AIN2
bus = smbus.SMBus(1) ##开启总线
##定义监测方法
def getStatus(n):
if not n: return
global address
map = {'x':xAddress, 'y':yAddress, 'z':zAddress}
if n not in map.keys():
return False
#发送一个控制字节到设备 表示要读取n通道的数据
bus.write_byte(address, map[n])
#空读一次 消费掉无效数据(重要)
bus.read_byte(address)
#返回某通道输入的模拟值A/D转换后的数字值
return bus.read_byte(address)
#获取数值
try:
while True:
xN = getStatus('x') #获取x轴
yN = getStatus('y') #获取y轴
zN = getStatus('z') #获取z轴
print('x num is', xN)
print('y num is', yN)
print('z num is', zN)
print("\n")
time.sleep(0.3)
except KeyboardInterrupt:
print('stop')
执行Python3 jiujiang.py
执行效果:
注意:其中PCF8591模块是8位的数模转换芯片,所以其输出的数字量是2的8次方也就是256种;也就是0到255区间范围。然后这个区间将5V电压平均分为255份。
实验前,需要先打开树莓派I2c协议支持。