.. note::
Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook!
Tauchen Sie tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.
**Warum beitreten?**
- **Expertenunterstützung**: Lösen Sie Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.
- **Lernen & Teilen**: Tauschen Sie Tipps und Tutorials aus, um Ihre Fähigkeiten zu verbessern.
- **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugriff auf neue Produktankündigungen und exklusive Einblicke.
- **Spezielle Rabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
- **Festliche Aktionen und Giveaways**: Nehmen Sie an Verlosungen und Feiertagsaktionen teil.
👉 Bereit, mit uns zu forschen und zu kreieren? Klicken Sie auf [|link_sf_facebook|] und treten Sie noch heute bei!
.. _2.1.7_py_pi5_mcp3008:
2.1.7 Potentiometer (MCP3008)
=============================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
Abhängig von Ihrer Kit-Version identifizieren Sie bitte, ob Sie **ADC0834** oder **MCP3008** haben, und fahren Sie mit dem entsprechenden Abschnitt fort.
Einführung
------------
Die ADC-Funktion wird verwendet, um analoge Signale in digitale Werte umzuwandeln.
In diesem Experiment verwenden wir den MCP3008-ADC-Chip, um diese Umwandlung durchzuführen.
Ein Potentiometer wird verwendet, um eine variable Spannung zu erzeugen, die die physikalische Größe verändert.
Der MCP3008 wandelt diese analoge Spannung dann 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:
.. image:: ../python_pi5/img/list2_2.1.4_potentiometer.png
Es ist definitiv bequem, ein komplettes Kit zu kaufen. Hier ist der Link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Name
- ELEMENTE IN DIESEM KIT
- LINK
* - Raphael Kit
- 337
- |link_Raphael_kit|
Sie können sie auch einzeln über die untenstehenden Links kaufen.
.. list-table::
:widths: 30 20
:header-rows: 1
* - KOMPONENTENBESCHREIBUNG
- KAUFLINK
* - :ref:`cpn_gpio_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_led`
- |link_led_buy|
* - :ref:`cpn_potentiometer`
- |link_potentiometer_buy|
* - :ref:`cpn_mcp3008`
- \-
Schaltplan
-----------------
.. list-table::
:widths: 30 30 30 30
:header-rows: 1
* - T-Board Name
- Physikalisch
- WiringPi
- BCM
* - SPICE0
- Pin24
- 10
- 8
* - SPIMOSI
- Pin19
- 12
- 10
* - SPIMISO
- Pin21
- 13
- 9
* - SPISCLK
- Pin23
- 14
- 11
* - GPIO22
- Pin15
- 3
- 22
.. image:: ../python_pi5/img/schematic_2.1.7_potentiometer_mcp3008.png
Experimentelle Verfahren
------------------------------------
**Schritt 1:** Bauen Sie die Schaltung auf.
.. image:: ../python_pi5/img/july24_2.1.7_potentiometer_mcp3008.png
.. note::
Bitte setzen Sie den Chip entsprechend der im Bild dargestellten Position ein.
Achten Sie darauf, dass die Einkerbung des Chips nach links zeigt, wenn er eingesetzt wird.
**Schritt 2:** Richten Sie die SPI-Schnittstelle ein und installieren Sie die ``spidev``-Bibliothek (siehe :ref:`spi_configuration` für detaillierte Anweisungen).
Wenn Sie diese Schritte bereits abgeschlossen haben, können Sie diesen Schritt überspringen.
**Schritt 3:** Öffnen Sie die Codedatei
.. raw:: html
.. code-block::
cd ~/raphael-kit/python-pi5
**Schritt 4:** Ausführen
.. raw:: html
.. code-block::
sudo python3 2.1.7-2_Potentiometer_zero.py
Nachdem der Code ausgeführt wurde, drehen Sie den Knopf am Potentiometer, und die Helligkeit der LED ändert sich entsprechend.
.. warning::
Wenn die Fehlermeldung ``RuntimeError: Cannot determine SOC peripheral base address`` angezeigt wird, lesen Sie bitte :ref:`faq_soc`.
**Code**
.. note::
Sie können den untenstehenden Code **Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen**.
Vorher müssen Sie jedoch zum Quellcodepfad wie ``raphael-kit/python-pi5`` wechseln.
Nach dem Ändern des Codes können Sie ihn direkt ausführen, um das Ergebnis zu sehen.
.. raw:: html
.. code-block:: python
#!/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):
"""
Lese analogen Wert vom MCP3008
: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):
"""
Wertebereich abbilden
"""
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
try:
while True:
# Lese von MCP3008 Kanal 0
res = read_adc(0)
print('res = %d' % res)
# Bereich 0–1023 auf 0–100 % abbilden
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**
#. ``gpiozero`` wird für die PWM-LED-Steuerung verwendet, ``spidev`` für die SPI-Kommunikation mit MCP3008 und ``time`` für Pausen.
.. code-block:: python
import spidev
import time
from gpiozero import PWMLED
#. Initialisiert ein PWMLED-Objekt an GPIO-Pin 22 und richtet die SPI-Kommunikation (Bus 0, CE0) mit MCP3008 ein.
.. code-block:: python
led = PWMLED(22)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000
#. Definiert eine Funktion ``read_adc``, um über SPI Werte von MCP3008-Kanälen (0–7) auszulesen.
.. code-block:: python
def read_adc(channel):
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 3) << 8) | adc[2]
return value
#. Definiert eine Funktion ``MAP``, um Wertebereiche umzuwandeln, nützlich zum Anpassen der ADC-Werte an die LED-Helligkeit.
.. code-block:: python
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 kontinuierlich den ADC-Wert, skaliert ihn auf 0–100 %, steuert die LED-Helligkeit und pausiert 0,2 Sekunden zwischen den Messungen.
.. code-block:: python
try:
while True:
res = read_adc(0)
R_val = MAP(res, 0, 1023, 0, 100)
led.value = R_val / 100.0
time.sleep(0.2)
except KeyboardInterrupt:
led.value = 0