.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_potentiometer:
2.8 Potentiometer
===================
**Einführung**
Die ADC-Funktion (Analog-Digital-Wandler) ist entscheidend, um analoge Signale in digitale Signale umzuwandeln. In diesem Experiment verwenden wir den Fusion HAT+, um diese Umwandlung mithilfe eines Potentiometers durchzuführen. Das Potentiometer verändert die Spannung – eine physikalische Größe – die anschließend vom ADC digitalisiert wird. Dieses Experiment zeigt außerdem, wie das Potentiometer zur Steuerung der Helligkeit einer LED verwendet werden kann.
----------------------------------------------
**Benötigte Komponenten**
Für dieses Projekt werden die folgenden Komponenten benötigt:
.. list-table::
:widths: 30 20
:header-rows: 1
* - COMPONENT INTRODUCTION
- PURCHASE LINK
* - :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_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**Schaltplan**
Unten sind die Schaltpläne für dieses Projekt dargestellt:
.. image:: img/fzz/2.1.7_sch.png
:width: 80%
:align: center
----------------------------------------------
**Verdrahtungsdiagramm**
Bauen Sie die Schaltung wie in der folgenden Abbildung gezeigt auf:
.. image:: img/fzz/2.1.7_bb.png
:width: 80%
:align: center
----------------------------------------------
**Beispiel ausführen**
Der gesamte Beispielcode dieses Tutorials befindet sich im Verzeichnis ``ai-lab-kit``.
Führen Sie das Beispiel mit den folgenden Schritten aus:
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 2.8_Potentiometer.py
Dieses Python-Skript verwendet den Fusion HAT+, um ein analoges Eingangssignal zu lesen und damit die Helligkeit einer PWM-LED zu steuern. Beim Ausführen passiert Folgendes:
1. Der Fusion HAT+ liest kontinuierlich ein analoges Signal und wandelt es in einen digitalen Wert zwischen 0 und 4095 um.
2. Dieser Wert wird auf einen Bereich zwischen 0 und 100 abgebildet, der den Helligkeitsprozentsatz der LED darstellt.
3. Die Helligkeit der PWM-LED wird dynamisch anhand dieses Wertes angepasst.
4. Der rohe ADC-Wert sowie die Spannung werden in Echtzeit im Terminal ausgegeben.
5. Das Programm läuft unbegrenzt weiter, bis es mit ``Ctrl+C`` beendet wird. Anschließend wird die LED ausgeschaltet.
----------------------------------------------
**Code**
Unten befindet sich der Code für dieses Experiment:
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from fusion_hat.adc import ADC
from fusion_hat.pwm import PWM
import time
# Set up the potentiometer
pot = ADC(0)
# Initialize a PWM LED
led = PWM(0)
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
try:
while True:
# Get the current reading from the ADC port
result = pot.read()
voltage = pot.read_voltage()
print('result = %d voltage = %.2f' %(result,voltage))
# Map the ADC value to a range suitable for setting LED brightness
value = MAP(result, 0, 4095, 0, 100)
# Set the LED brightness
led.pulse_width_percent(value)
# Wait for 1 seconds before reading again
time.sleep(0.2)
# Graceful exit when 'Ctrl+C' is pressed
except KeyboardInterrupt:
led.pulse_width_percent(0) # Turn off the LED
----------------------------------------------
**Code verstehen**
1. **Importe:**
.. code-block:: python
from fusion_hat.adc import ADC
from fusion_hat.pwm import PWM
import time
Das Skript verwendet ``fusion_hat`` zur Steuerung der PWM-LED und zur Analog-Digital-Umwandlung, während ``time`` für Zeitverzögerungen genutzt wird.
2. **Initialisierung:**
.. code-block:: python
# Potentiometer einrichten
pot = ADC(0)
# PWM-LED initialisieren
led = PWM(0)
Das Skript initialisiert eine PWM-LED an Pin ``P0`` und einen ADC an Pin ``A0``.
3. **MAP-Funktion:**
.. 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
Die Funktion ``MAP`` wandelt Werte von einem Bereich in einen anderen um. Dies ist notwendig, um ADC-Messwerte auf die LED-Helligkeit abzubilden.
4. **Hauptschleife:**
.. code-block:: python
try:
while True:
# Aktuellen Wert vom ADC-Port lesen
result = pot.read()
voltage = pot.read_voltage()
print('result = %d voltage = %.2f' %(result,voltage))
# ADC-Wert auf einen Bereich für die LED-Helligkeit abbilden
value = MAP(result, 0, 4095, 0, 100)
# LED-Helligkeit einstellen
led.pulse_width_percent(value)
# 0.2 Sekunden warten, bevor erneut gelesen wird
time.sleep(0.2)
# Sauberes Beenden bei 'Ctrl+C'
except KeyboardInterrupt:
led.pulse_width_percent(0) # LED ausschalten
- Liest kontinuierlich ADC-Werte.
- Wandelt ADC-Messwerte (0–4095) in Helligkeitswerte (0–100) um.
- Passt die LED-Helligkeit entsprechend an und wartet 0.2 Sekunden vor der nächsten Messung.
----------------------------------------------
**Fehlerbehebung**
1. **LED reagiert nicht**
- **Ursache**: Falsche Verkabelung oder GPIO-Pin-Konfiguration.
- **Lösung**: Stellen Sie sicher, dass die LED mit PWM 0 und einem geeigneten Vorwiderstand verbunden ist.
2. **ADC-Werte sind immer Null**
- **Ursache**: Falsche Verdrahtung des Sensors.
- **Lösung**: Überprüfen Sie die Sensorverbindungen und stellen Sie sicher, dass der Eingangssensor korrekt funktioniert.
3. **Fehler bei der Werteabbildung**
- **Ursache**: Falsche Parameter in der ``MAP()``-Funktion.
- **Lösung**: Stellen Sie sicher, dass der Eingangsbereich (``in_min``, ``in_max``) korrekt auf 0–4095 gesetzt ist und der Ausgangsbereich (``out_min``, ``out_max``) für die LED-Helligkeitssteuerung (0–100) geeignet ist.
----------------------------------------------
**Erweiterungsideen**
1. **Schwellwertbasierte Steuerung**
Fügen Sie eine Logik hinzu, die die LED basierend auf bestimmten ADC-Schwellenwerten ein- oder ausschaltet:
.. code-block:: python
if result > 2048:
led.on()
else:
led.off()
----------------------------------------------
**Fazit**
Dieses Experiment zeigt, wie der Fusion HAT+ zusammen mit einem Potentiometer verwendet werden kann, um die Helligkeit einer LED zu steuern. Durch das Verständnis der Analog-Digital-Umwandlung und der PWM-Steuerung können Sie dieses Wissen erweitern und komplexere interaktive Systeme entwickeln.