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
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.
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 |
Experimentelle Schritte
Schritt 1: Baue die Schaltung auf.
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
gpiozerowird für die Steuerung der PWM-LED verwendet,spidevfür die SPI-Kommunikation mit dem MCP3008, undtimefür Verzögerungen.#!/usr/bin/env python3 import spidev import time from gpiozero import PWMLED
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
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
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
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