简体   繁体   English

在没有接口的情况下读取树莓中的模拟信号

[英]Read analog signal in raspberry without an interface

I need to read an analog signal in raspberry and for this purpose I bought an MCP3002 circuit. 我需要在树莓中读取模拟信号,为此我买了一个MCP3002电路。 i plug it in with the correct connections and i have found sample codes over the internet but it doesn't work. 我用正确的连接插入它,我在互联网上找到了示例代码,但它不起作用。

Do I need to have an interface or I can do the job without it? 我需要有一个界面,否则我可以在没有界面的情况下完成工作? Do you have any ideas what can go wrong? 你有什么想法会出错吗?

Do you have a simple code to read the analog input? 你有一个简单的代码来读取模拟输入吗?

The code I used is the following: 我使用的代码如下:

#!/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)

The code below may help you. 以下代码可能对您有所帮助。 Please try it and tell me result. 请试一试,告诉我结果。

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])

This is a very wide question because the problem can be a result of many things, hardware or software. 这是一个非常广泛的问题,因为问题可能是许多因素,硬件或软件的结果。

To narrow it down I would suggest to measure if there actually is any data transfer on the I/Os. 为了缩小范围,我建议测量I / O上是否存在任何数据传输。 If you don't have an oscilloscope it will probably be OK to use a LED (and a suitable resistor of course) to see if the chip-select pin (CS) on the MCP3002 goes low. 如果您没有示波器,可能可以使用LED(当然还有合适的电阻)来查看MCP3002上的芯片选择引脚(CS)是否变低。 Is there any activity on data in? 是否存在数据活动? Is there any answer on data out? 数据输出有什么答案吗?

Data out on the MCP3002 should connect to MISO (Master In Slave Out) on the Raspberry Pi so you don't connect output to output and vice versa. MCP3002上的数据应连接到Raspberry Pi上的MISO(主机输入从机输出),因此您不会将输出连接到输出,反之亦然。

You also need to enable the SPI on the Raspberry Pi, you can do this by running "sudo raspi-config" and stepping down to "Advanced options" -> "SPI". 您还需要在Raspberry Pi上启用SPI,您可以通过运行“sudo raspi-config”并单步执行“高级选项” - >“SPI”来完成此操作。 在此输入图像描述

Have you connected the MCP3002's VDD to 3.3v from the Raspberry Pi? 您是否已从Raspberry Pi将MCP3002的VDD连接到3.3v? Be carefull not to connect it to the 5v, then you will destroy the Raspberry Pi's inputs. 小心不要将它连接到5v,然后你将破坏Raspberry Pi的输入。

Seems like you switching the clock manually without any delay. 好像你手动切换时钟没有任何延迟。 I guess the python GPIO library is quite slow so that should probably be fine. 我想python GPIO库很慢,所以应该没问题。 The minimum clock high time is 140nS for the MCP3002 and i would guess the python library takes you to the microsecond scale at least. 对于MCP3002,最小时钟高电平时间为140nS,我猜想python库至少会带你到微秒级。 在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM