21. Lektion: Pin's: Difference between revisions

From Attraktor Wiki
Jump to navigation Jump to search
Line 214: Line 214:


<pre>
<pre>
# 5_taster_abfragen_02.py
# 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 time import sleep_ms, ticks_us
 
from machine import Pin
from machine import Pin
from time import sleep_ms


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


#
#
Line 230: Line 243:
b_ok = Pin(15, 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(buttons)
#
#
# Variablen
# get_b = mf.get_button
# get_b()
#
#
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
 
#
# button_pressed(buttons)
# wert: 16    8    4    2  1
# Prüft ob eine Taste gedrückt ist.
# bit:  4    3    2    1  0
# liefert
# MSB  |ok|right|left|down|up| LSB
# tasten_pins muss iterierbar sein!
#
 
def get_button(auftrag):
def button_pressed(buttons):
     y = 0
     pressed = False
     for i, x in enumerate(auftrag):
     for b in buttons:
         if x.value():
         if b.value():
             sleep_ms(35)
             pressed = True
            if x.value():
     return pressed
                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)


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


</pre
# get_button_2(buttons)
# wartet bis alle Tasten losgelassen sind
# und wartet dann auf einen Tastendrück.
# 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




>
</pre>


== Buzzer==
== Buzzer==

Revision as of 11:17, 19 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.

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

# 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(buttons)
#
# get_b = mf.get_button
# get_b()
#

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

# button_pressed(buttons)
# Prüft ob eine Taste gedrückt ist.
# liefert
# tasten_pins muss iterierbar sein!

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

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

# get_button_2(buttons)
# wartet bis alle Tasten losgelassen sind
# und wartet dann auf einen Tastendrück.
# 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