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

# 5_taster_abfragen_02.py
#

from time import sleep_ms, ticks_us
from machine import Pin


#
# 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)

#
# Variablen
#
buttons = (b_up, b_down, b_left, b_right, b_ok)
b_masks = {'up':1, 'down':2 , 'left':4, 'right':8, 'ok':16}

#
# Tasterstatus abfragen
#
# wert: 16    8    4    2   1
# bit:   4    3    2    1   0
# MSB   |ok|right|left|down|up| LSB
#
def get_button(auftrag):
    y = 0
    for i, x in enumerate(auftrag):
        if x.value():
            sleep_ms(35)
            if x.value():
                y += 2**i
        while x.value():        # wichtig für saubere Erkennung
            pass
    return y
#
# Anwendung
#
while True:
    a = get_button(buttons)
    if a & b_masks['down']:           # gesuchte Taste identifizieren
        print('Taste down gedrückt.') # Reaktion auf gedrückte Taste
    if a & b_masks['ok']:           # gesuchte Taste identifizieren
        print('Taste ok gedrückt.')
    sleep_ms(200)


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)

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