21. Lektion: Pin's

Aus Micropython Referenz
Zur Navigation springen Zur Suche springen

Was bietet uns die Klasse Pin?[Bearbeiten | Quelltext bearbeiten]

In Micropython ist der Zugriff auf die Hardware als Klasse implementiert. Für jeden Pin wird dementsprechend eine Instanz der Klasse Pin angelegt. Diese enthält die Einstellungen und die Daten des Pin.


Im Raspi Pico Microphyton:[Bearbeiten | Quelltext bearbeiten]

>>> import machine
>>> dir(machine.Pin)
['__class__', '__name__', 'value', '__bases__', '__dict__', 'ALT', 'ALT_GPCK', 'ALT_I2C', 'ALT_PIO0', 'ALT_PIO1', 
'ALT_PWM', 'ALT_SIO', 'ALT_SPI', 'ALT_UART', 'ALT_USB', 'IN', 'IRQ_FALLING', 'IRQ_RISING', 'OPEN_DRAIN', 
'OUT', 'PULL_DOWN', 'PULL_UP', 'board', 'cpu', 'high', 'init', 'irq', 'low', 'off', 'on', 'toggle']

Pins initialisieren.[Bearbeiten | Quelltext bearbeiten]

So sieht eine umfangreiche Initialisierung aus:

my_pin = machine.Pin(id, mode=- 1, pull=- 1, *, value=None, drive=0, alt=- 1)

Üblicherweise reicht diese Kurzform:[Bearbeiten | Quelltext bearbeiten]

from machine import Pin
p0 = Pin(0, Pin.OUT)
p2 = Pin(2, Pin.IN, Pin.PULL_UP)

Bedeutung der Parameter:[Bearbeiten | Quelltext bearbeiten]

id
Nummer des Pin (GPIOxx)
mode
Pin.IN, Pin.OUT, Pin.OPEN_DRAIN
Open Collector / Open Drain
pull
None, Pin.PULL_UP, Pin.PULL_DOWN
PullUp / PullDown

Methoden von Pin[Bearbeiten | Quelltext bearbeiten]

Pin.init(mode=- 1, pull=- 1, *, value=None, drive=0, alt=- 1)
Neuinitialisierung des Pins unter Verwendung der angegebenen Parameter.
Pin.value(x)
Diese Methode ermöglicht das Setzen und Lesen des Pins. Wird x (0 oder 1) angegeben wird der Pin darauf gesetzt. Ohne x wird der Wert des Pins ausgelesen.
Verhalten von Pin.value()
Pin.high()
Setzt den Pin auf 1. Nicht ESP32!
Pin.low()
Setzt den Pin auf 0. Nicht ESP32!
Pin.off()
Setzt den Pin auf 0.
Pin.on()
Setzt den Pin auf 1.
Pin.toggle()
Pin invertieren. Nur Raspberry Pi Pico. Nicht bei docs.micropython.org erwähnt.

Pins als Ausgang[Bearbeiten | Quelltext bearbeiten]

from machine import Pin

pin_von_led = 22
led_pin = Pin(pin_von_led, Pin.OUT)
led_pin.value(0)

LED ansteuern.[Bearbeiten | Quelltext bearbeiten]

  • Anschaltung
    • nach Vcc
    • nach GND
  • Software

LED blinken lassen.[Bearbeiten | Quelltext bearbeiten]

So findet man es zu Abtippen:

while True:
    led_pin.value(1)
    sleep_ms(500) 
    led_pin.value(0)
    sleep_ms(500) 

Hier eine Alternative:

while True:
    if led_pin.value() == 0:
        led_pin.value(1)
    else:
        led_pin.value(0)
    sleep_ms(500) 

Mit der toggle.Methode:

while True:
    led_pin.toggle()
    sleep_ms(500) 

toggle / XOR '^'[Bearbeiten | Quelltext bearbeiten]

XOR ist eine logische Vernüpfung die nur 1 ergibt, wenn a oder b 1 ist, wenn a und b 1 sind wird 0 ausgegeben.

XOR Verknüpfung
A B Q
0 0 0
1 0 1
0 1 1
1 1 0
Übung:[Bearbeiten | Quelltext bearbeiten]
>>> pin_x = 0
>>> pin_x = pin_x ^ 1
>>> pin_x
1
>>> pin_x = pin_x ^ 1
>>> pin_x
0
>>> 

Als konkretes Beispiel:

# mit toggle-Methode

led_pin.toggle()


# ohne toggle-Methode
# mit bitwise xor

led_pin.value(led_pin.value()^1)

LED dimmen.[Bearbeiten | Quelltext bearbeiten]

Das Dimmen einer LED unterscheidet sich vom Blinken nur durch die Umschaltgeschwindigkeit. Sobald unser Auge den Wechel nicht mehr wahrnimmt, wird das Impuls-Pausen-Verhältnis in Helligkeit umgesetzt.

Übung:[Bearbeiten | Quelltext bearbeiten]
  • Schreibt ein Programm mit dem die Helligkeit der LED verändert werden kann.
    • Ändert dazu den Wert von sleep_ms() auf 10 und 1.
    • Die Helligkeit wird nicht im laufenden Programm geändert. Dazu wird das Programm gestoppt. Entsprechende Werte im Script geändert und neu gestartet.
    • Ersetzt sleep_ms() durch sleep_us() und passt den Wert an.

Pins als Eingang[Bearbeiten | Quelltext bearbeiten]

Taster abfragen.[Bearbeiten | Quelltext bearbeiten]

Taster anschließen

Taster abfragen[Bearbeiten | Quelltext bearbeiten]

from machine import Pin

pin_center = 15
button = Pin(pin_center, Pin.IN, Pin.PULL_DOWN)
button.value()
0

# nun bei gedrückter Taste
button.value()
1
Übung:[Bearbeiten | Quelltext bearbeiten]
  • Schreibe ein Programm, das die LED leuchten lässt wenn der Taster gedrückt ist.
Übung:[Bearbeiten | Quelltext bearbeiten]
  • Schreibe ein Programm, dass beim ersten Tastendruck die LED einschaltet und beim nächsten sie wieder ausschaltet.

Taster entprellen[Bearbeiten | Quelltext bearbeiten]

# button_6.py

from machine import Pin
from time import sleep_ms


pin_center = 15
pin_led = 22

button = Pin(pin_center, Pin.IN, Pin.PULL_DOWN)
led = Pin(pin_led, Pin.OUT)


while True:
    while not button.value():
        pass
    sleep_ms(15)
    if button.value():
        led.toggle()
    while button.value():
        pass
Übung:[Bearbeiten | Quelltext bearbeiten]
  • Übung 1:
    • Schreibe ein Programm bei dem Du mit der Taste die Blinkfrequenz verändern kannst.
      • max: 1000ms, min: 100ms, step: 100ms.
  • Übung 2:
    • Schreibe ein Programm bei dem Du mit der Taste die Helligkeit verändern kannst.
      • max. 100%, min: 0%., step: 10%.

5-Tasten abfragen[Bearbeiten | Quelltext bearbeiten]

Zur Einführung betrachten wir was hinter den Kulissen passiert: Das Objekt Pin

# meine_funktionen.py
#
# Sammlung nützlicher Funktionen
#
# Version: 00.00.01
# Datum: 17.01.2024
# Autor: Peter Stöck
#
# Nach Ideen von:
# Andreas Günther,
#


from machine import Pin
from time import sleep_ms

####################################################################
# Tastenfunktionen
####################################################################

#
# Taster init
#
b_up = Pin(11, Pin.IN, Pin.PULL_DOWN)
b_down = Pin(14, Pin.IN, Pin.PULL_DOWN)
b_left = Pin(12, Pin.IN, Pin.PULL_DOWN)
b_right = Pin(13, Pin.IN, Pin.PULL_DOWN)
b_ok = Pin(15, Pin.IN, Pin.PULL_DOWN)

# Die Pins für das Demoboard
MPDB_BUTTONS = (b_up, b_down, b_left, b_right, b_ok)

# get_button(buttons)
# buttons muss iterierbar sein!
# wartet auf einen Tastendruck
# und gibt den Namen der Taste zurück.

def get_button(buttons):
    while True:
        for i in buttons:
            if i.value():
                sleep_ms(30)
                if i.value():          
                    while i.value():
                        pass            
                    return i

# Anwendung:
# import meine_funktionen as mf
# mf.get_button(MPDB_BUTTONS)
#
# Wenn das zuviel Schreibkram ist:
# get_b = mf.get_button
# get_b()
#

# ----------------------------------------------------------------------

# button_pressed(MPDB_BUTTONS)
# Prüft ob eine Taste gedrückt ist.
# liefert True/False zurück.
# buttons muss iterierbar sein!

def button_pressed(buttons):
    pressed = False
    for b in buttons:
        if b.value():
            pressed = True
    return pressed

# ----------------------------------------------------------------------

# get_button_2(MPDB_BUTTONS)
# wartet bis alle Tasten losgelassen sind
# und wartet dann auf einen Tastendruck.
# Kehrt zurück, sobald ein Tastendruck
# erkannt wurde.

def get_button_2(buttons):
    pressed = True
    while pressed:
        pressed = False 
        for b in buttons:
            if b.value():
                pressed = True 
    sleep_ms(30)               # Prellen abwarten
    while True:
        for i in buttons:
            if i.value():
                sleep_ms(30)
                if i.value():             
                    return i


Buzzer[Bearbeiten | Quelltext bearbeiten]

Das Demoboard enthält auch einen Buzzer. Hier ein kleines Programm, das ihm einen Ton entlockt:

import machine
import time

buzz = machine.Pin(10, machine.Pin.OUT)
freq = 440
verz = int(1/freq/2 * 1E6)

while True:
    buzz.value(1)
    time.sleep_us(verz)
    buzz.value(0)
    time.sleep_us(verz)

Nähere Betrachtung des Objektes Pin[Bearbeiten | Quelltext bearbeiten]

Das Objekt Pin

Navigation[Bearbeiten | Quelltext bearbeiten]

Zurück zur "Micropython Kurs 2023 Teil 2" Startseite
Zurück zur "Micropython Kurs 2023" Startseite
Zurück zur Programmieren Startseite
Zurück zur Wiki Startseite