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:
¿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.
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:
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()
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
Andy alias
pedro bennett
dannyyy