Ich bin ganz neu in Sachen Elektronik. Ich bin es gewohnt, für Desktop- und mobile Anwendungen zu entwickeln, nicht für Hardwareprodukte.
Ich versuche, mein Raspberry Pi-Board mit einem digitalen Potentiometer MCP4131 zu verdrahten . Aber es ist nicht ganz einfach zu verstehen. Ich habe versucht, die Projekte aus diesem vorherigen Thread zu erstellen . Aber Chris (das Original, das in diesem Thread gepostet wurde) hat weder einen Schaltplan der Verkabelung noch den erfolgreich ausgeführten Quellcode geliefert - also habe ich mein Bestes versucht, es selbst herauszufinden:
Was bedeutet P0A, P0W, P0B? Ich habe versucht, die Spannung über P0A und P0B zu messen, aber es ist immer 0 V. An welche Anschlüsse soll eine LED, Summer, ... zur Regelung angeschlossen werden? (P0A-P0W oder P0B-P0W)
Mein Python-Code sieht wie folgt aus (versucht, den Hinweis anzupassen, indem acht Nullen vor dem Wert geschrieben werden):
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)
Gibt es eine einfachere Möglichkeit, den MCP4131 zu verwenden? Ich weiß, dass das RPi das SPI-Protokoll unterstützt, aber ich bin mir nicht sicher, wie ich mit dem Multiplexing umgehen soll, da das RPi einen dedizierten Pin für SDI und SDO hat.
Beachten Sie, dass Ihr weißes Kabel von SCK von Ihrem Chip mit Pin 22 von RPi verbunden ist. Aber in Ihrem Code haben Sie:
SPI_CLK_PIN = 23
SPI_SDISDO_PIN = 22 # mosi
Sie sind also umgekehrt. Es sollte sein:
SPI_CLK_PIN = 22
SPI_SDISDO_PIN = 23 # mosi
Beachten Sie auch, dass in der Grafik die Verbindung von 3 Pins des digitalen Potis fehlt:
Für alle, die nach einer Lösung für ähnliche Probleme mit MCP4131 suchen, hier ist der Code, der für mich funktioniert hat:
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
Andi aka
Peter Bennett
dannyyy