Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauche tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.

Warum beitreten?

  • Expertenunterstützung: Löse Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.

  • Lernen & Teilen: Tausche Tipps und Tutorials aus, um deine Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalte frühzeitigen Zugang zu neuen Produktankündigungen und Vorschauen.

  • Sonderrabatte: Genieße exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Verlosungen: Nimm an Verlosungen und Feiertagsaktionen teil.

👉 Bereit, mit uns zu entdecken und zu erschaffen? Klicke auf [hier] und tritt noch heute bei!

2.1.4 Potentiometer (MCP3008)

Bemerkung

../_images/mcp3008_and_adc0834.jpg

Je nach Kit-Version bitte prüfen, ob ADC0834 oder MCP3008 enthalten ist, und mit dem entsprechenden Abschnitt fortfahren.

Einführung

Die ADC-Funktion wird verwendet, um analoge Signale in digitale Werte umzuwandeln. In diesem Experiment nutzen wir den MCP3008-ADC-Chip für diese Umwandlung. Ein Potentiometer erzeugt eine variable Spannung, die eine physikalische Größe verändert. Der MCP3008 wandelt diese analoge Spannung anschließend in einen digitalen Wert um, der vom Raspberry Pi gelesen und verarbeitet werden kann.

Benötigte Komponenten

In diesem Projekt benötigen wir die folgenden Komponenten.

../_images/list2_2.1.4_potentiometer1.png

Schaltplan

T-Board-Name

Physical

WiringPi

BCM

SPICE0

pin24

10

8

SPIMOSI

pin19

12

10

SPIMISO

pin21

13

9

SPISCLK

pin23

14

11

GPIO22

pin15

3

22

../_images/schematic_2.1.7_potentiometer_mcp30081.png

Experimentelle Schritte

Schritt 1: Baue die Schaltung auf.

../_images/july24_2.1.7_potentiometer_mcp30081.png

Bemerkung

Platziere den Chip gemäß der dargestellten Position im Bild. Achte darauf, dass sich die Kerbe am Chip auf der linken Seite befindet.

Schritt 2: Richte die SPI-Schnittstelle ein und installiere die spidev-Bibliothek (siehe SPI-Konfiguration für detaillierte Anweisungen). Falls diese Schritte bereits erledigt sind, kannst du sie überspringen.

Schritt 3: Öffne die Code-Datei.

cd ~/davinci-kit-for-raspberry-pi/python-pi5

Schritt 4: Führe den Code aus.

sudo python3 2.1.4-2_Potentiometer_zero.py

Nach dem Start des Codes kannst du den Knopf am Potentiometer drehen, wodurch sich die Helligkeit der LED entsprechend verändert.

Warnung

Falls die Fehlermeldung RuntimeError: Cannot determine SOC peripheral base address erscheint, siehe Wenn gpiozero nicht funktioniert..

Code

Bemerkung

Du kannst den folgenden Code Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen. Vorher musst du jedoch in das Quellcode-Verzeichnis (z. B. davinci-kit-for-raspberry-pi/python-pi5) wechseln. Nach einer Änderung kannst du den Code direkt ausführen, um das Ergebnis zu sehen.

#!/usr/bin/env python3

import spidev
import time
from gpiozero import PWMLED

# PWM-LED an GPIO22 initialisieren
led = PWMLED(22)

# SPI initialisieren
spi = spidev.SpiDev()
spi.open(0, 0)  # Bus 0, CS0 (CE0)
spi.max_speed_hz = 1000000

def read_adc(channel):
    """
    Analogen Wert vom MCP3008 lesen
    :param channel: ADC-Kanal (0-7)
    :return: 10-Bit-Integer (0-1023)
    """
    if channel < 0 or channel > 7:
        return -1
    # MCP3008-Protokoll
    adc = spi.xfer2([1, (8 + channel) << 4, 0])
    value = ((adc[1] & 3) << 8) | adc[2]
    return value

def MAP(x, in_min, in_max, out_min, out_max):
    """
    Einen Wert von einem Bereich in einen anderen umrechnen
    """
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

try:
    while True:
        # Kanal 0 vom MCP3008 lesen
        res = read_adc(0)
        print('res = %d' % res)

        # Wertebereich 0–1023 auf 0–100 % umrechnen
        R_val = MAP(res, 0, 1023, 0, 100)

        # LED-Helligkeit einstellen
        led.value = R_val / 100.0

        time.sleep(0.2)

except KeyboardInterrupt:
    led.value = 0  # LED ausschalten

Code-Erklärung

  1. gpiozero wird für die Steuerung der PWM-LED verwendet, spidev für die SPI-Kommunikation mit dem MCP3008, und time für Verzögerungen.

    #!/usr/bin/env python3
    
    import spidev
    import time
    from gpiozero import PWMLED
    
  2. Erzeugt ein PWMLED-Objekt an GPIO22 und konfiguriert die SPI-Kommunikation (Bus 0, CE0) mit dem MCP3008.

    # PWM-LED an GPIO22 initialisieren
    led = PWMLED(22)
    
    # SPI initialisieren
    spi = spidev.SpiDev()
    spi.open(0, 0)  # Bus 0, CS0 (CE0)
    spi.max_speed_hz = 1000000
    
  3. Definiert die Funktion read_adc, um mit dem MCP3008 zu kommunizieren und analoge Werte vom angegebenen Kanal (0–7) zu lesen.

    def read_adc(channel):
        """
        Analogen Wert vom MCP3008 lesen
        :param channel: ADC-Kanal (0-7)
        :return: 10-Bit-Integer (0-1023)
        """
        if channel < 0 or channel > 7:
            return -1
        adc = spi.xfer2([1, (8 + channel) << 4, 0])
        value = ((adc[1] & 3) << 8) | adc[2]
        return value
    
  4. Definiert die Funktion MAP, um Wertebereiche umzurechnen – nützlich, um ADC-Werte in passende LED-Helligkeitsstufen umzuwandeln.

    def MAP(x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
    
  5. Liest in einer Endlosschleife kontinuierlich den ADC-Wert, rechnet den 10-Bit-Wert (0–1023) in eine Helligkeitsstufe (0–100) um und passt die LED-Helligkeit entsprechend an. Wartet jeweils 0,2 Sekunden zwischen den Messungen.

    try:
        while True:
            # Kanal 0 vom MCP3008 lesen
            res = read_adc(0)
            print('res = %d' % res)
    
            # Wertebereich 0–1023 auf 0–100 % umrechnen
            R_val = MAP(res, 0, 1023, 0, 100)
    
            # LED-Helligkeit einstellen
            led.value = R_val / 100.0
    
            time.sleep(0.2)
    
    except KeyboardInterrupt:
        led.value = 0  # LED ausschalten