Um eine Lampe zu dimmen oder die Lautstärke am Radio zu regeln, werden Potentiometer genutzt. Diese einstellbaren Widerstände gibt es in analoger oder digitaler Form. Während beim analogen Potentiometer der Widerstand mechanisch eingestellt wird, kann bei einem digitalen Potentiometer der Widerstand per Software kontrolliert werden. Ich habe zum Beispiel einen einfachen MCP1413-103, der mit dem SPI Protokoll angesprochen und in 129 Stufen zwischen 0 und 10kOhm eingestellt werden kann.

Mit der SPI Schnittstelle des Raspberry Pi und der Python Bibliothek spidev ist die Ansteuerung des MCP1413-103 ganz einfach. Voraussetzung ist, dass die SPI Schnittstelle aktiviert ist. Die SPI Schnittstelle wird am einfachsten im raspi-config aktiviert.

sudo raspi-config

Im Abschnitt Schnittstellen gibt es den Eintrag SPI, der dann aktiviert werden muss. Dabei werden die SPI Kerneltreiber geladen und 2 SPI Geräte /dev/spidev0.0 und /dev/spidev0.1 erstellt. Die Geräte /dev/spidev0.0 und /dev/spidev0.1 sind dann mit den GPIO PINs CE0 und CE1 verbunden.

Die GPIO PINs für die SPI Schnittstelle des Raspi sind in der folgenden Grafik dargestellt.

GPIO Port des Raspberry Pi 3-4

Für den MCP1413-103 braucht man nur MOSI, SCLK und CE0. Außerdem noch 5V von PIN 2 und GND von PIN 6. Die PIN Belegung des MCP1413-103 ist in der folgenden Grafik dargestellt.

Das Potentiometer wird mit 5V an VCC (PIN 8) und mit GND an PIN 4 mit Strom versorgt. Die SPI Verbindungen werden vom RasPi wie folgt an das Potentiometer angeschlossen:

PIN am Raspberry PiPIN am MCP4131-103
MOSIDI/O
SCLKSCLK
CE0CS
GNDGND
5VVCC

Schickt man nun Werte an das Potentiometer wird der Widerstand zwischen PBW (Wiper) und PBB (Wert 0) und PBA (Wert 129) von 0 bis 10kOhm eingestellt.

Für das Ansteuern habe ich ein einfaches Python Script erstellt. Das nutzt die spidev Bibliothek, die auf dem RasPi nachinstalliert wird.9

sudo apt install python3-spidev python3-rpi.gpio

Das Script enthält nur wenige Zeilen. Es lädt die SPI Bibliothek, und öffnet das SPI Gerät an CE0. Anschließend läuft ees immer wieder in einer Schleife durch alle möglichen Werte von 0 bis 128.

import RPi.GPIO as GPIO
import spidev
import sys
import time
spi = spidev.SpiDev()
spi.open(0,0)
cmd = 0x00
data = 0x00
while True:
  spi.xfer([cmd, data])
  data = (data + 1) % 0x80
  time.sleep(0.2)

Das Datenblatt des MCP1413-103 findet sich hier. Demnach wird erst ein Byte geschickt, welches in den obersten 4 Bit das Adressregister (hier immer 0 0 0 0, da es nur ein Register gibt), dem Kommando in 2 Bit (0 0 für Write) und den obersten 2 Bit des Einstellwertes enthält. Ein zweites Byte enthält den einzustellenden Wert. Zum Beispiel 0x00 für den kleinsten Wert und PBW ist an PBB und 0x7F für den größten Wert und PBW ist an PBA.

Beim MCP1413-103 kann der Widerstand in Schritten von 10.000/128 = 78,125 Ohm eingestellt werden. Das kann direkt wie oben gezeigt mit dem Schreiben eines konkreten Wertes in das Adressregister geschehen. Man kann aber auch die Einstellung in einzelnen Schritten nach oben oder unten mit dem Inkrement- oder Dekrement-Befehlen ändern. Dabei wird nur ein Byte mit dem Kommando Byte 0 0 0 0 0 1 0 0 (hex Wert 0x04) für ein Erhöhung um einen Schritt und das Byte 0 0 0 0 1 1 0 0 (hex Wert 0x0C) für die Herabsetzung um Schritt an den Chip geschickt. Das zweite Byte wird weggelassen.