Zum Inhalt springen

GPIO Pins nutzen

Jeder Microcontroller hat mehrere GPIO1 Pins. Über diese Pins können exteren Komponenten angeschlossen werden. Je nach Bedarf können diese als Eingang (Input) oder Ausgang (Outpout) festgelegt werden.

Damit man weiß welcher Pin für was verantwortlich ist, benötigt man das sogenannte Pinout.

Hier sehen Sie die Pinouts verschiedener Boards.

ESP32 DevKit Pinout

Damit wir in Micropython Pins als Eingang oder Ausgang definieren können müssen wir zunächst die Klasse Pin aus dem Module machine einbinden.

main.py
from machine import Pin

Der Konstruktor der Klasse Pin, muss die Nummer des GPIO Pins aus dem Pinout übergeben werden. Außerdem muss festgelegt werden ob der Pin als Eingang oder Ausgang genutzt werden soll.

main.py
from machine import Pin
pin = Pin(19)

In diesem Beispiel wird ein Object für den Pin mit der Nummer 19 angelegt.

Um einen Pin als Ausgang festzulegen können wir dem Konstruktor Pin.OUT als zweites Argument übergeben.

main.py
from machine import Pin
output_pin = Pin(19, Pin.OUT)

Um den gewünschten Pegel am Ausgang zu setzen bietet Micropython zwei Möglichkeiten.

main.py
from machine import Pin
output_pin = Pin(19, Pin.OUT)
# Setzen des Pegels auf HIGH.
output_pin.on()
# Setzen des Pegels auf LOW
output_pin.off()
  • Die Methode on() setzt den Zustand des Pins auf HIGH.
  • Die Methode off() setzt den Zustand des Pins auf LOW.
  1. Bauen Sie folgende Schaltung auf. (R=220Ω) Aufbau LED Hinweis: Aufbau in Wokwi oder Hardware möglich.

    Start Lab in Wokwi

  2. Schreiben Sie ein Programm welches die LED mit Hilfe der Sleep Funktion im Takt von 500ms blinken lässt. Das heißt die LED ist 500ms an und danach 500ms aus.

Mögliche Lösung
main.py
import time
from machine import Pin
led_pin = Pin(16, Pin.OUT)
while True:
led_pin.on()
time.sleep(0.5)
led_pin.off()
time.sleep(0.5)

Um einen Pin als Eingang festzulegen können wir dem Konstruktor Pin.IN als zweites Argument übergeben.

main.py
from machine import Pin
input_pin = Pin(18, Pin.IN)

Die Methode value() liefert uns den aktuellen Zustand am Pin zurück.

main.py
from machine import Pin
input_pin = Pin(18, Pin.IN)
current_value = input_pin.value()

Im folgenden Beispiel wird der Zustand in der Variable current_value gespeichert.

main.py
from machine import Pin
from time import sleep
input_pin = Pin(17, Pin.IN)
while True:
current_value = input_pin.value()
print(current_value)
sleep(0.5)
  1. Führen Sie folgenden Code aus.

  2. Verbinden Sie GPIO17 mit einer Drahtbrücke zu GND (0V) und anschließend VCC (3.3V).

    • Welche Ausgabe erhalten Sie?
    • Welche Ausgabe erhalten Sie wenn keine Verbindung besteht?

Wenn keine Verbindung zum Pin besteht haben wir einen undefinierten Zustand. Demnach wird “zufällig” HIGH oder LOW eingelesen. Dies ist auch der Fall, wenn man einen Taster an den Pin anschließt und dieser nicht gedrückt ist.

Folgender Code zeigt wie man dies in Software umsetzt.

main.py
from machine import Pin
btn = Pin(27, Pin.IN, Pin.PULL_UP)
while True:
current_btn_state = btn.value()
print(current_btn_state)

Der Ausdruck Pin.PULL_UP aktiviert den internen Pullup-Widerstand des ESP32.

Dadurch liegt ein HIGH-Pegel am Pin an, wenn der Taster nicht gedrückt ist und ein LOW-Pegel wenn der Taster gedrückt wird. Dieses Prinzip nennt man auch LOW active.

Ein Taster, nicht zu verwechseln mit einem Schalter ist ein mechanisches Bauteil, welches als Eingang für einen Microcontroller genutzt werden kann.

  1. Bauen Sie folgende Schaltung auf. (R=220Ω) Aufbau Button Hinweis: Aufbau in Wokwi oder Hardware möglich.

    Start Lab in Wokwi

  2. Schreiben Sie ein Programm welches eine LED einschaltet solange der Taster gedrückt ist. Und die LED wieder ausschaltet falls der Taster nicht mehr gedrückt ist.

    Mögliche Lösung
    main.py
    from machine import Pin
    led = Pin(14, Pin.OUT)
    btn = Pin(27, Pin.IN, Pin.PULL_UP)
    while True:
    if 0 == btn.value():
    led.on()
    else:
    led.off()
  3. Betrachten Sie folgendes Diagram welches den Ablauf darstellt. Versuchen Sie dies in Code umzusetzen.

    flowchart TB
        setup["`**Setup** Pins and
        init *last* state to HIGH `"]
        check["`Check *current* button state`"]
        if_edge{" "}
        do["`set *last* state = *current* state`"]
        if_falling{"is current state LOW"}
        toggle["`*toggle LED*`"]
    
        setup --> check
        check --> if_edge
        if_edge -- last != current --> check
        if_edge -- last == current --> do
        do --> if_falling
        if_falling -- true --> toggle
        if_falling -- false --> check
    Mögliche Lösung
    main.py
    from machine import Pin
    led = Pin(14, Pin.OUT)
    btn = Pin(27, Pin.IN, Pin.PULL_UP)
    # Set btn state to HIGH as btn is low active.
    last_btn_state = 1
    while True:
    current_btn_state = btn.value()
    if current_btn_state != last_btn_state:
    last_btn_state = current_btn_state
    if current_btn_state == 0:
    led.value(not led.value())

Achtung manche Pins auf dem ESP32 DevKit werden auch für andere Funktionalitäten genutzt und können daher nicht frei verwendet werden.

  1. Wofür steht der Begriff GPIO?

  2. Wie legen Sie GPIO 12 als Ausgang fest?

  3. Wie können Sie den Zustand eines Pins abfragen?

  4. Wie können Sie den Zustand eines Ausgangs von HIGH auf LOW ändern?

  5. Welche Informationen sind typischerweise nicht im Pinout zu finden.

  1. Welcher Pol der LED muss an GND angeschlossen werden?
  1. Wie groß sollte der Vorwiderstand für eine LED sein?
  1. Was passiert, wenn ein Taster direkt (also ohne Pullup-Widerstand) mit dem Microkontroller verbunden wird.
  1. Ein Taster ist mit einem Pullup-Widerstand verbunden. Welches logische Level liegt am Pin an, wenn der Taster offen ist?
  1. GPIO steht für General Purpose Input Output.