21. Lektion: Pin's

Aus Attraktor Wiki

Wechseln zu: Navigation, Suche

Was bietet uns die Klasse Pin?

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:

>>> 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.

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:

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

Bedeutung der Parameter:

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

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

from machine import Pin

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

LED ansteuern.

  • Anschaltung
    • nach Vcc
    • nach GND
  • Software

LED blinken lassen.

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 '^'

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:
>>> 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.

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:
  • 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

Taster abfragen.

Taster anschließen

Taster abfragen

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:
  • Schreibe ein Programm, das die LED leuchten lässt wenn der Taster gedrückt ist.
Übung:
  • Schreibe ein Programm, dass beim ersten Tastendruck die LED einschaltet und beim nächsten sie wieder ausschaltet.

Taster entprellen

# 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:
  • Ü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

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

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

Das Objekt Pin

Navigation

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

Diese Seite wurde zuletzt am 21. Januar 2024 um 11:07 Uhr geändert. Diese Seite wurde bisher 7.841 mal abgerufen.