Python 无接口读取raspberry中的模拟信号

Python 无接口读取raspberry中的模拟信号,python,raspberry-pi,Python,Raspberry Pi,我需要读取树莓中的模拟信号,为此我买了一个MCP3002电路。我用正确的连接将其插入,我在互联网上找到了示例代码,但它不起作用 我是否需要一个界面,或者我可以不用它来完成工作?你知道什么地方会出错吗 你有一个简单的代码来读取模拟输入吗 我使用的代码如下: #!/usr/bin/env python # Written by Limor "Ladyada" Fried for Adafruit Industries, (c) 2015 # This code is released into t

我需要读取树莓中的模拟信号,为此我买了一个MCP3002电路。我用正确的连接将其插入,我在互联网上找到了示例代码,但它不起作用

我是否需要一个界面,或者我可以不用它来完成工作?你知道什么地方会出错吗

你有一个简单的代码来读取模拟输入吗

我使用的代码如下:

#!/usr/bin/env python

# Written by Limor "Ladyada" Fried for Adafruit Industries, (c) 2015
# This code is released into the public domain

import time
import os
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
DEBUG = 1

# read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7)
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
        if ((adcnum > 7) or (adcnum < 0)):
                return -1
        GPIO.output(cspin, True)

        GPIO.output(clockpin, False)  # start clock low
        GPIO.output(cspin, False)     # bring CS low

        commandout = adcnum
        commandout |= 0x18  # start bit + single-ended bit
        commandout <<= 3    # we only need to send 5 bits here
        for i in range(5):
                if (commandout & 0x80):
                        GPIO.output(mosipin, True)
                else:
                        GPIO.output(mosipin, False)
                commandout <<= 1
                GPIO.output(clockpin, True)
                GPIO.output(clockpin, False)

        adcout = 0
        # read in one empty bit, one null bit and 10 ADC bits
        for i in range(12):
                GPIO.output(clockpin, True)
                GPIO.output(clockpin, False)
                adcout <<= 1
                if (GPIO.input(misopin)):
                        adcout |= 0x1

        GPIO.output(cspin, True)

        adcout >>= 1       # first bit is 'null' so drop it
        return adcout

# change these as desired - they're the pins connected from the
# SPI port on the ADC to the Cobbler
SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25

# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)

# 10k trim pot connected to adc #0
potentiometer_adc = 0;

last_read = 0       # this keeps track of the last potentiometer value
tolerance = 5       # to keep from being jittery we'll only change
                    # volume when the pot has moved more than 5 'counts'

while True:
        # we'll assume that the pot didn't move
        trim_pot_changed = False

        # read the analog pin
        trim_pot = readadc(potentiometer_adc, SPICLK, SPIMOSI, SPIMISO, SPICS)
        # how much has it changed since the last read?
        pot_adjust = abs(trim_pot - last_read)

        if DEBUG:
                print "trim_pot:", trim_pot
                print "pot_adjust:", pot_adjust
                print "last_read", last_read

        if ( pot_adjust > tolerance ):
               trim_pot_changed = True

        if DEBUG:
                print "trim_pot_changed", trim_pot_changed

        if ( trim_pot_changed ):
                set_volume = trim_pot / 10.24           # convert 10bit adc0 (0-1024) trim pot read into 0-100 volume level
                set_volume = round(set_volume)          # round out decimal value
                set_volume = int(set_volume)            # cast volume as integer

                print 'Volume = {volume}%' .format(volume = set_volume)
                set_vol_cmd = 'sudo amixer cset numid=1 -- {volume}% > /dev/null' .format(volume = set_volume)
                os.system(set_vol_cmd)  # set volume

                if DEBUG:
                        print "set_volume", set_volume
                        print "tri_pot_changed", set_volume

                # save the potentiometer reading for the next loop
                last_read = trim_pot

        # hang out and do nothing for a half second
        time.sleep(0.5)

下面的代码可能会对您有所帮助。请试一试并告诉我结果

import spidev
import time
import RPi.GPIO as GPIO

spi_ce0 = spidev.Spidev()

spi_ce0.open(0,0)

# channel1: adc1,   channel2: adc2
adc1 = spi_ce0.xfer2([1,(8+0)<<4,0])
adc2 = spi_ce0.xfer2([1,(8+1)<<4,0])

下面的代码可能会对您有所帮助。请试一试并告诉我结果

import spidev
import time
import RPi.GPIO as GPIO

spi_ce0 = spidev.Spidev()

spi_ce0.open(0,0)

# channel1: adc1,   channel2: adc2
adc1 = spi_ce0.xfer2([1,(8+0)<<4,0])
adc2 = spi_ce0.xfer2([1,(8+1)<<4,0])

这是一个非常广泛的问题,因为问题可能是硬件或软件等许多因素造成的

为了缩小范围,我建议测量I/O上是否有任何数据传输。如果您没有示波器,则可以使用LED和适当的电阻器来查看MCP3002上的芯片选择引脚CS是否变低。中是否有任何有关数据的活动?关于数据输出有什么答案吗

MCP3002上的数据输出应连接到Raspberry Pi上的MISO主输入从输出,这样您就不会将输出连接到输出,反之亦然

您还需要在Raspberry Pi上启用SPI,您可以通过运行sudo-raspi-config并转到Advanced options->SPI来实现这一点。

您是否已将MCP3002的VDD从Raspberry Pi连接到3.3v?小心不要将其连接到5v,否则会破坏覆盆子Pi的输入

你好像在毫不延迟地手动切换时钟。我猜PythonGPIO库相当慢,所以这应该可以。MCP3002的最短时钟高时间是140nS,我猜python库至少能将您带到微秒级。

这是一个非常广泛的问题,因为这个问题可能是硬件或软件等多种因素造成的

为了缩小范围,我建议测量I/O上是否有任何数据传输。如果您没有示波器,则可以使用LED和适当的电阻器来查看MCP3002上的芯片选择引脚CS是否变低。中是否有任何有关数据的活动?关于数据输出有什么答案吗

MCP3002上的数据输出应连接到Raspberry Pi上的MISO主输入从输出,这样您就不会将输出连接到输出,反之亦然

您还需要在Raspberry Pi上启用SPI,您可以通过运行sudo-raspi-config并转到Advanced options->SPI来实现这一点。

您是否已将MCP3002的VDD从Raspberry Pi连接到3.3v?小心不要将其连接到5v,否则会破坏覆盆子Pi的输入

你好像在毫不延迟地手动切换时钟。我猜PythonGPIO库相当慢,所以这应该可以。MCP3002的最短时钟高时间是140nS,我猜python库至少能将您带到微秒级。

另外,我注意到我也遇到了以下错误:RuntimeWarning:这个频道已经在使用中,不管怎样都在继续,上面哪一行代码给出了这个错误?你说这段代码“不工作”-给出更多细节,什么方面不工作?另外,我注意到我也得到了以下错误:RuntimeWarning:这个频道已经在使用中,无论如何都在继续上面的哪行代码给出了错误?你说这段代码“不起作用”——请给出更多细节,什么方面不起作用?