2016-06-05 2 views
1

라즈베리에서 아날로그 신호를 읽어야하는데이 목적으로 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) 
+0

또한 다음 오류가 나타납니다. RuntimeWarning :이 채널은 이미 사용 중이며 어쨌든 계속됩니다. –

+0

위 코드 중 어떤 줄에서 오류가 발생합니까? 이 코드가 '작동하지 않습니다'라고 말하면 - 더 자세한 정보를 제공하고, 어떤면에서는 작동하지 않습니까? – barny

답변

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

이 문제는 많은 사물, 하드웨어 또는 소프트웨어의 결과 일 수 있으므로 매우 광범위한 질문입니다.

I/O에 실제로 데이터 전송이 있는지를 측정하는 것이 좋습니다. 오실로스코프가 없으면 MCP3002의 칩 선택 핀 (CS)이 로우인지 확인하기 위해 LED (물론 적당한 저항기)를 사용하는 것이 좋습니다. 데이터에 대한 활동이 있습니까? 데이터에 대한 답변이 있습니까?

MCP3002의 데이터 출력은 Raspberry Pi의 MISO (Master In Slave Out)에 연결해야 출력을 출력으로 연결하거나 그 반대로 연결할 수 있습니다.

또한 Raspberry Pi에서 SPI를 활성화해야합니다. "sudo raspi-config"를 실행하고 "Advanced options"-> "SPI"로 이동하여이 작업을 수행 할 수 있습니다. enter image description here

MCP3002의 VDD를 Raspberry Pi에서 3.3v에 연결 했습니까? 5v에 연결하지 않도록주의하십시오. 그러면 라스베리 파이의 입력을 파괴 할 것입니다.

지연없이 수동으로 시계를 전환하는 것처럼 보입니다. 파이썬 GPIO 라이브러리는 꽤 느려서 아마 괜찮을 것 같습니다. MCP3002에 대한 최소한의 클럭 시간은 140nS이며 적어도 파이썬 라이브러리는 마이크로 초 단위로 사용자를 이동시킵니다. enter image description here

관련 문제