21. Lektion: Pin's: Difference between revisions
| Line 89: | Line 89: | ||
if led_pin.value() == 0: | if led_pin.value() == 0: | ||
led_pin.value(1) | led_pin.value(1) | ||
else: | |||
led_pin.value(0) | led_pin.value(0) | ||
sleep_ms(500) | sleep_ms(500) | ||
Revision as of 18:49, 16 January 2024
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.
| 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 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.
- Schreibe ein Programm bei dem Du mit der Taste die Blinkfrequenz verändern kannst.
- Übung 2:
- Schreibe ein Programm bei dem Du mit der Taste die Helligkeit verändern kannst.
- max. 100%, min: 0%., step: 10%.
- Schreibe ein Programm bei dem Du mit der Taste die Helligkeit verändern kannst.
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)
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