Digitales Potentiometer (MCP4131) mit Raspberry Pi

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:RPi mit MCP4131 auf einem Steckbrett

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.

Woher kommt PoA? Verknüpfung? Hinweis? Und wer zum Teufel ist Chris? Hat er eine Schwester namens Alice?
Das Datenblatt des MPC4131 gibt an, dass POA und POB die Enden des Widerstandselements sind und POW der Schleifer (beweglicher Kontakt). Sie werden an diesen Pins keine Spannung messen, sollten aber in der Lage sein, den Widerstand zu messen. Sie sollten den angegebenen Widerstand des Topfes zwischen POA und POB und einen variablen Widerstand zwischen POW und entweder POA oder POB messen, wobei der Widerstand von der programmierten Wischerposition abhängt
Danke Peter, ich war zu spät in der Nacht...Nach dem Messen des Widerstands statt der Spannung ist alles in Ordnung ;) Sowohl der Code als auch die Verkabelung scheinen zu funktionieren.

Antworten (1)

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:

  • Pin 5 geht auf GND
  • Pin 7 geht auf Vcc
  • Pin 6 geht an die Anode Ihrer LED (oder was auch immer) und ihre Kathode sollte durch einen Widerstand an GND gehen

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()
Danke dafür, das hat bei mir funktioniert. Nebenbei bemerkt, nach dem Ausführen dieses Skripts haben die Pins einen ungültigen Zustand für die Verwendung der wiringPi-Bibliothek. Sie müssen entweder neu starten oder diese Befehle ausführen: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