Potenciómetro digital (MCP4131) con Raspberry Pi

3

Soy muy nuevo en cosas electrónicas. Estoy acostumbrado a desarrollar aplicaciones de escritorio y móviles, no para productos de hardware.

Intento conectar mi tarjeta Raspberry Pi con un potenciómetro digital MCP4131 . Pero no es muy fácil de entender. Intenté crear los proyectos desde este hilo anterior . Pero Chris (el original publicado en ese hilo) no ha suministrado un esquema del cableado ni el código fuente de ejecución exitoso, así que hice mi mejor esfuerzo para averiguarlo por mi cuenta:

¿CuáleselsignificadosiP0A,P0W,P0B?IntentémedirelvoltajeenP0AyP0Bperosiemprees0V.¿AquéconectoressedebeconectarunLED,unzumbador,...pararegular?(P0A-P0WoP0B-P0W)

ElaspectodemicódigodePythonessimilaralsiguiente(seintentóadaptarlasugerenciaconlaescrituradeocho0antesdelvalor):

importtimeimportRPi.GPIOasGPIOSPI_CS_PIN=17SPI_CLK_PIN=23SPI_SDISDO_PIN=22#mosiGPIO.setmode(GPIO.BCM)GPIO.setup(SPI_CS_PIN,GPIO.OUT)GPIO.setup(SPI_CLK_PIN,GPIO.OUT)GPIO.setup(SPI_SDISDO_PIN,GPIO.OUT)defset_value(value):print"here"
    GPIO.output(SPI_CS_PIN, True)

    GPIO.output(SPI_CLK_PIN, False)
    GPIO.output(SPI_CS_PIN, False)

    b = '{0:016b}'.format(value)
    for x in range(0, 16):
        print 'x:' + str(x) + ' -> ' + str(b[x])
        GPIO.output(SPI_SDISDO_PIN, int(b[x]))

        GPIO.output(SPI_CLK_PIN, True)
        GPIO.output(SPI_CLK_PIN, False)

    GPIO.output(SPI_CS_PIN, True)

while True:
    for level in range(0, 128):
        print 'level:' + str(level)
        set_value(level)
        time.sleep(0.1)

    for level in range(127, -1, -1):
        print 'level:' + str(level)
        time.sleep(0.1)

¿Hay una manera más fácil de usar el MCP4131? Sé que RPi es compatible con el protocolo SPI, pero no estoy seguro de cómo manejar la multiplexación, ya que el RPi tiene un pin dedicado para SDI y SDO.

    
pregunta dannyyy

1 respuesta

2

Observe que su cable blanco está conectado desde SCK desde su chip hasta el pin 22 de RPi. Pero en tu código tienes:

SPI_CLK_PIN = 23
SPI_SDISDO_PIN = 22 # mosi

Así que se invierten. Debería ser:

SPI_CLK_PIN = 22
SPI_SDISDO_PIN = 23 # mosi

Además, tenga en cuenta que en el gráfico falta la conexión de 3 pines del potenciómetro digital:

  • Pin 5 va a GND
  • Pin 7 va a Vcc
  • El pin 6 irá al ánodo de su LED (o lo que sea) y su cátodo debe pasar por una resistencia a GND

Para cualquiera que busque una solución a problemas similares con MCP4131, aquí está el código que funcionó para mí:

import sys
import time
import RPi.GPIO as GPIO

SPI_CS_PIN = 17
SPI_SDISDO_PIN = 22 # mosi
SPI_CLK_PIN = 23

def sleep(a = 0.1):
    time.sleep(a)

# Enables step by step checking by wiring some LEDs to those 3 terminals
def wait_a_key():
    print "waiting..."
    #raw_input()

GPIO.setmode(GPIO.BCM)
GPIO.setup(SPI_CS_PIN, GPIO.OUT)
GPIO.setup(SPI_CLK_PIN, GPIO.OUT)
GPIO.setup(SPI_SDISDO_PIN, GPIO.OUT)

GPIO.output(SPI_CLK_PIN, False)
GPIO.output(SPI_SDISDO_PIN, False)
GPIO.output(SPI_CS_PIN, False)

print "Setup"
GPIO.output(SPI_CS_PIN, True)
GPIO.output(SPI_CLK_PIN, False)
GPIO.output(SPI_CS_PIN, False)
wait_a_key()

def set_value(b):
    b = "0000" "00" "{0:010b}".format(b)

    GPIO.output(SPI_CS_PIN, False)
    for x in b:
        GPIO.output(SPI_SDISDO_PIN, int(x))
        GPIO.output(SPI_CLK_PIN, True)
        #For step by step checking: sleep()
        GPIO.output(SPI_CLK_PIN, False)
        #For step by step checking: sleep()

    wait_a_key()

    GPIO.output(SPI_CS_PIN, True)
    sleep()

try:
    for i in range(0, 100, 10):
        print 'set_value:' + str(i)
        set_value(i)
        sleep()
finally:
    GPIO.cleanup()
    
respondido por el MondKin

Lea otras preguntas en las etiquetas

Comentarios Recientes

Tablero de arranque de ethernet cero (las tapas de nariz deben estar conectadas a su dispositivo de prueba para que sean útiles. Si puede conectarlo en un comando, literalmente se necesita un cambio de código cero para obtener las lecturas). Una vez desarrollado, el investigador me informó que las pruebas serían varios pasos. Paso # 1: Comience por construir su microcontrolador Teensy económico. Primero, comencé con un circuito Arduino Uno creado para emular el principio del proyecto de kernel de Linux iDownload... Lees verder