树莓派增加模拟信号输入接口

给树莓派增加模拟信号输入接口

树莓派本身并没有直接接收模拟信号的功能,我们可以通过使用 MCP3008 A/D信号转换器实现树莓派模拟信号输入。

一、 MCP3008

MCP3008是一个10位8通道的ADC(模拟数字转换器),它使用SPI总线协议,价格便宜,也不需要使用额外的组件,不含电源和接地引脚 只占用4个树莓派的引脚,
就可以提供8个模拟信号输入。 MCP3008输出最大值(2的10次方)= 1023,所以输出的范围是0-1023,0表示0V,1023表示3.3V 。
MCP3008引脚
MCP3008 ADC共有16个引脚,其中左侧8个引脚用于接收模拟信号输入,分别是CH0-CH7(引脚序号:1-8)。D.Groud是芯片的数字地,CS/SHDN是芯片选择引脚,Din和Dout是数据输入和输出脚,CLOCK是时钟,A.Ground是模拟地,Vref是模拟基准电压脚,Vdd/Vcc是供电引脚。

二、打开SPI接口

打开树莓派的命令终端并输入以下命令:sudo raspi-config
也可以通过图形界面打开,具体步骤可以百度搜索。

三、安装NumPy

在终端中输入以下命令 :
sudo apt-get install python-numpy

四、使用实例–通过电位器控制LED的亮度

首先,我们将尝试使用电位器的模拟输出值来控制LED的亮度。电路连接如下。
在这里插入图片描述
我们先将树莓派和MCP3008按下表的对应关系完成连接。
在这里插入图片描述
然后,将10k电位计的中心引脚连接到MCP3008的CH0上,将电位计的另外两端连接到3.3V和GND上。最后将LED的正极引脚(LED的长脚)连接到树莓派的GPIO 20,再将220欧电阻从LED的负极引脚连接到树莓派的GND。
通过电位器控制LED的亮度的代码:

# Importing modules
import spidev # To communicate with SPI devices
from numpy import interp  # To scale values
from time import sleep  # To add delay
import RPi.GPIO as GPIO  # To use GPIO pins
# Start SPI connection
spi = spidev.SpiDev() # Created an object
spi.open(0,0)  
# Initializing LED pin as OUTPUT pin
led_pin = 20
GPIO.setmode(GPIO.BCM)
GPIO.setup(led_pin, GPIO.OUT)
# Creating a PWM channel at 100Hz frequency
pwm = GPIO.PWM(led_pin, 100)
pwm.start(0) 
# Read MCP3008 data
def analogInput(channel):
  spi.max_speed_hz = 1350000
  adc = spi.xfer2([1,(8+channel)<<4,0])
  data = ((adc[1]&3) << 8) + adc[2]
  return data
while True:
  output = analogInput(0) # Reading from CH0
  output = interp(output, [0, 1023], [0, 100])
  print(output)
    pwm.ChangeDutyCycle(output)
    sleep(0.1)

其中,interp(output,[0,1023],[0,100])函数用于将值从0-1023转换到0-100。我们上面提到过MCP3008 ADC的输出范围是0-1023,这里需要对应0-100的占空比,因此需要对这些值进行了转换。

五、实例二–树莓派从TMP36读取实时温度

解决了树莓派模拟信号输入的问题,现在,我们将使用树莓派从TMP36的测量值中读取并计算温度值。电路图如下所示:
在这里插入图片描述
代码:

# Importing modules
import spidev # To communicate with SPI devices
from time import sleep  # To add delay
# Start SPI connection
spi = spidev.SpiDev() # Created an object
spi.open(0,0) 
# Read MCP3008 data
def analogInput(channel):
  spi.max_speed_hz = 1350000
  adc = spi.xfer2([1,(8+channel)<<4,0])
  data = ((adc[1]&3) << 8) + adc[2]
  return data
# Below function will convert data to voltage
def Volts(data):
  volts = (data * 3.3) / float(1023)
  volts = round(volts, 2) # Round off to 2 decimal places
  return volts
 
# Below function will convert data to temperature.
def Temp(data):
  temp = ((data * 330)/float(1023))-50
  temp = round(temp)
  return temp
while True:
  temp_output = analogInput(0) # Reading from CH0
  temp_volts = ConvertVolts(temp_output)
  temp       = ConvertTemp(temp_output)
 
  print("Temp : {} ({}V) {} deg C".format(temp_level,temp_volts,temp))
  sleep(5)

本文引用来自:https://www.basemu.com/raspberry-pi-analog-sensing-interfacing.html

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值