树莓派ADC,Raspberry Pi如何使用模数转换器MCP3008

在本教程中,记录下用树莓派控制模数转换器(ADC)的详细步骤,让树莓派更方便操作模拟信号的传感器。

Raspberry-Pi-ADC.jpg

树莓派的GPIO没有模拟引脚,模拟引脚的缺乏使得连接模拟传感器变得更加复杂。

有几种解决模拟引脚缺失的方法,比如我在树莓派LDR教程中做的,使用电容测量LDR的电阻。

更好的解决方法是使用模拟数字转换器(MCP3008)。

我还会对MCP3008与MyDevices Cayenne进行配置,这比从头开始写代码要简单得多,但有时乐趣的一半是在学习如何编码。

设备清单

需要以下设备来完成本Raspberry Pi ADC教程。可以使用不同版本的模数转换器,如MCP3004,但让它工作的步骤可能与本教程有些微的不同。

建议

可选

树莓派ADC电路

连接MCP3008和Pi的电路看起来很复杂,但只要把线正确连接起来就可以了。

MCP3008是我在这个树莓派ADC教程中要用到的芯片。这款芯片上有很多技术信息,但我只涉及到最基本的内容。

对于任何一个刚接触微芯片的人来说,你会发现芯片的一端会有一个凹槽。这个凹槽代表引脚1所在的一端。它通常是左手边的第一个引脚,凹口朝向你(见下图)。一号引脚上面有时也会有一个小圆点。

这款特殊的芯片使用了SPI(串行外设接口总线),因此与它通信只需要4个引脚,并且可以由于Python的SPIDev库交互。

CH0->CH7引脚(1-8引脚)是MCP3008的模拟输入。在另一边,有一系列不同的引脚。

  • DGND(引脚9)芯片的数字地脚。
  • CS(引脚10)芯片选择。
  • DIN(引脚11)从Raspberry Pi本身输入的数据。
  • DOUT(引脚12)数据输出引脚。
  • CLK(引脚13)时钟引脚。
  • AGND(14脚)模拟地,连接到地。
  • VREF(引脚15)模拟参考电压。如果想改变电压,你可以改变它。你可能想保持它不变,所以将其保持为3v3。
  • VDD(16脚)芯片的正电源引脚。

Raspberry-Pi-mcp3008.png

如果你想了解更多关于该芯片的信息,可以在Adafruit找到完整的数据表。

把电路组装起来非常简单。由于我用了相当多的电线,所以电路很可能看起来有点凌乱。如果你想让它成为一个永久性的项目,可以在以后整理下电路。

在这个例子中,我已经包含了一个LDR,以展示如何使用模数转换器(ADC)将LDR的值反馈给Pi。

首先,将3v3引脚与面包板上的正极轨连接,将地线引脚与面包板上的地线连接。同时,将MCP3008芯片放到面包板的中间。

  • VDD(引脚16)将此线接入3.3V。
  • VREF(15脚)将此线接至3.3V。
  • AGND(14号针)将此线连接到地。
  • CLK(引脚13)将此线连接到GPIO11(引脚23/SCLK)。
  • DOUT (引脚12)将此线连接到GPIO9 (引脚21/MISO)。
  • DIN(引脚11)将此线连接到GPIO10(引脚19/MOSI)。
  • CS(引脚10)将此线连接到GPIO8(引脚24/CE0)。
  • DGND(9号脚)将此线接至地线。

现在,完成了这些工作,把LDR连接到MCP3008上。

首先,将LDR放到面包板上。接着,将10k电阻接到LDR的一端,另一端接到正极。从LDR和正极线之间有一条线走到MCP3008的1号引脚(CH0)。最后,有一根线从LDR的另一端到面包板的地线。

在下面找到一个详细的图。如果你仍然有问题,请仔细检查芯片的连接,也要确保所有的引脚都连接正确。

Raspberry-Pi-ADC-Circuit.png

守则

这个代码非常简单,但也只是处理一个输入,即LDR。添加的设备越多,代码可能就越复杂。

本教程所需的所有包都应该默认安装在Raspbian上。

如果你是Python编码新手,希望学习更多的知识,我的Python基础知识指南是非常好的。你应该还是可以在几乎没有Python知识的情况下完成本教程。

如果你遇到任何问题,那么请查看我的树莓GPIO引脚指南。它介绍了如何设置它们并安装必要的软件。

要将代码直接下载到Pi上,只需在终端中运行以下一行。

git clone https://github.com/pimylifeup/Pi-ADC-Example-Code

然后,需要运行以下一行移动到包含脚本的文件夹中。

cd ./Pi-ADC-Example-Code

现在可以运行以下一行来启动它。

sudo python adc-code.py

可以按ctrl+c停止脚本。

现在我简单地解释一下代码。在代码的开始,我定义了Python的安装路径。之后,导入两个需要的包。Time 可以将脚本置于睡眠状态(添加一个延迟)。Spidev与SPI设备通信,在本例中,它是MCP3008。

#!/usr/bin/python
 
import spidev
import time

接下来,定义变量并创建SPIdev对象。首先创建两个变量是以毫秒为单位的延迟。如果想在更新之间有一个更长的时间,可以改变这个变量。接下来是LDR所在的通道,这是通道0/针脚1。

最后,创建SPIdev对象。这个对象可以从连接到SPI启用引脚的设备中获取需要的值。

#Define Variables
delay = 0.5
ldr_channel = 0

#Create SPI
spi = spidev.SpiDev()
spi.open(0, 0)

接下来,是readadc函数,在这个函数中做了几件事。首先,检查参数值是否在0和7之间,如果不是,则返回-1。如果是,继续从指定的通道中获取值,然后返回值。

def readadc(adcnum):
    # read SPI data from the MCP3008, 8 channels in total
    if adcnum > 7 or adcnum < 0:
        return -1
    r = spi.xfer2([1, 8 + adcnum << 4, 0])
    data = ((r[1] & 3) << 8) + r[2]
    return data

最后,有一个 while 循环,它一直持续到你按 ctrl + c 强行退出为止。要做的第一件事是调用 readadc 函数,以 ldr_channel 变量作为参数。

一旦得到了值,然后打印它。%d指的是一个十进制值;然后在print语句后有变量。可以通过这样的方式每行打印多个值。 print ‘%s %d’ % (name, number)

在打印数据后,将脚本的延迟时间设置为任何延迟时间,默认情况下,它设置为半秒。默认情况下,它被设置为半秒。

while True:
    ldr_value = readadc(ldr_channel)
    print "---------------------------------------"
    print("LDR Value: ".ldr_value)
    time.sleep(delay)

希望这能帮助你理解一些代码。

如果你确实遇到了任何问题,那么欢迎在下面评论。

在Raspberry Pi Cayenne中使用ADC。

现在我快速地介绍MCP3008与Cayenne的设置步骤。我还将介绍如何设置LDR。

如果你还没有设置Cayenne,那么一定要按照我的指南来安装Raspberry Pi Cayenne

1. 要开始首先去添加新的,然后从下拉框中选择设备。

2. 然后搜索或选择模拟转换器。

3. 在此列表中选择MCP3008

4. 现在选择Raspberry Pi,然后选择SPI芯片-选择0。

5. 现在,这个选择将弹出一个页面,显示所有通道的数值。

MCP3008.png

现在要添加LDR,流程也差不多。

1. 回到上面添加新的,然后选择设备。

2. 找到或选择光敏电阻(光度传感器)。

3. 这个选择你的Raspberry Pi,你喜欢的部件(我走的是图形),然后选择MCP3008为模拟转换器,最后选择通道0为通道。

4. 该传感器现在应该没有任何问题地添加。现在它将从模拟转换器得到的数值中产生一个图形。

photoresistor-cayenne.png

现在可以按照这个步骤来处理任何模拟设备。

希望本教程对您设置Raspberry Pi ADC有所帮助。如果你遇到任何问题,有反馈或发现错误,请在下面留言讨论。

平均: 0 / 5. votes: 0

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » 树莓派ADC,Raspberry Pi如何使用模数转换器MCP3008

赞 (1)

1 评论

8+6=

  1. 鋒鋭

    请问这一步需要设置嘛spi.max_speed_hz

    回复