Potenciómetro digital (MCP4131) con Raspberry Pi

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 placa Raspberry Pi con un potenciómetro digital MCP4131 . Pero no es muy fácil de entender. Traté de construir los proyectos de este hilo anterior . Pero Chris (el original publicado en ese hilo) no ha proporcionado un esquema del cableado ni el código fuente de ejecución exitoso, así que hice todo lo posible para averiguarlo por mí mismo:RPi con MCP4131 en una placa de pruebas

¿Cuál es el significado si P0A, P0W, P0B? Traté de medir el voltaje entre P0A y P0B pero siempre es 0V. ¿A qué conectores se debe conectar un LED, zumbador,... para regular? (P0A-P0W o P0B-P0W)

Mi código de Python tiene el siguiente aspecto (traté de adaptar la sugerencia escribiendo ocho 0 antes del valor):

import time
import RPi.GPIO as GPIO

SPI_CS_PIN = 17
SPI_CLK_PIN = 23
SPI_SDISDO_PIN = 22 # mosi


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)

def set_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 admite el protocolo SPI, pero no estoy seguro de cómo manejar la multiplexación, porque RPi tiene un pin dedicado para SDI y SDO.

¿De dónde viene PoA? ¿Enlace? ¿Pista? Además, ¿quién diablos es Chris? ¿Tiene una hermana llamada Alice?
La hoja de datos del MPC4131 indica que POA y POB son los extremos del elemento de resistencia y POW es el contacto móvil. No medirá ningún voltaje en estos pines, pero debería poder medir la resistencia. Debe medir la resistencia anunciada del potenciómetro entre POA y POB, y una resistencia variable entre POW y POA o POB, dependiendo la resistencia de la posición del limpiaparabrisas programado.
Gracias Peter, llegué demasiado tarde en la noche... Después de medir la resistencia en lugar del voltaje, todo está bien;) El código y el cableado parecen estar funcionando.

Respuestas (1)

Observe que su cable blanco está conectado desde SCK desde su chip al pin 22 de RPi. Pero en su código tiene:

SPI_CLK_PIN = 23
SPI_SDISDO_PIN = 22 # mosi

Así que están invertidos. 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:

  • El pin 5 va a GND
  • El 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()
Gracias por esto, esto funcionó para mí. En una nota al margen, después de ejecutar este script, los pines tienen un estado no válido para usar la biblioteca cableadoPi. Tienes que reiniciar o ejecutar estos comandos:gpio -g mode 7 out gpio -g mode 8 out gpio -g mode 9 alt0 gpio -g mode 10 alt0 gpio -g mode 11 alt0