[英]Read analog signal in raspberry without an interface
我需要在树莓中读取模拟信号,为此我买了一个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])
这是一个非常广泛的问题,因为问题可能是许多因素,硬件或软件的结果。
为了缩小范围,我建议测量I / O上是否存在任何数据传输。 如果您没有示波器,可能可以使用LED(当然还有合适的电阻)来查看MCP3002上的芯片选择引脚(CS)是否变低。 是否存在数据活动? 数据输出有什么答案吗?
MCP3002上的数据应连接到Raspberry Pi上的MISO(主机输入从机输出),因此您不会将输出连接到输出,反之亦然。
您还需要在Raspberry Pi上启用SPI,您可以通过运行“sudo raspi-config”并单步执行“高级选项” - >“SPI”来完成此操作。
您是否已从Raspberry Pi将MCP3002的VDD连接到3.3v? 小心不要将它连接到5v,然后你将破坏Raspberry Pi的输入。
好像你手动切换时钟没有任何延迟。 我想python GPIO库很慢,所以应该没问题。 对于MCP3002,最小时钟高电平时间为140nS,我猜想python库至少会带你到微秒级。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.