Tastaturknapper (Switches)
Midi Controlleren er udstyret med 6 Switches. De fungerer som helt normale tastaturknapper.
Hvordan virker det?
For at anvende alle 6 Switches skal vi bruge:
-
- Digital læsning
Hvad skal vi bruge?
I denne opgave skal vi bruge:
-
- 6 Switches
- Raspberry Pi Pico W
Hvordan virker vores Switches?
Vores Switches virker som en helt normal knap. Den anvender digital læsning. Derudover sidder der også en rød LED samt en grøn LED. Dem kan vi tænde og slukke alt efter behov.
Hvordan forbinder vi alle 6 Switches med mikrokontrolleren?
Nedenfor ser du et diagram af hvordan du bygger dit kredsløb så alle 6 Switches kan kommunikere med mikrokontrolleren. De farvede streger er ledninger.
HUSK dine ledninger behøver ikke at have samme farve som på diagrammet.
HUSK at starte med en Switch. Få den til at virke og tilføje herefter en Switch ad gangen. Så sæt ledningerne til en Switch først. Test koden. Hvis det virker så kan du tilføje en Switch mere.
Hvordan modtager vi signaler fra vores Switches?
Nu skal vi gang med at kode! Nedenunder vil du kunne se hele koden for, at alle 6 Switches til at virke.
from machine import Pin
import time
SWITCH_PINS = [8, 11, 14, 17, 20, 27] # GPIO pins for switches
LED_GREEN_PINS = [7, 10, 13, 16, 19, 22] # Green LED
LED_RED_PINS = [6, 9, 12, 15, 18, 21] # Red LED
for pin in LED_RED_PINS: # For all buttons turn on the red LED
Pin(pin, Pin.OUT).on()
# Set up switches
switches = [Pin(pin, Pin.IN, Pin.PULL_UP) for pin in SWITCH_PINS]
# Set up switch states
switch_states = [0, 0, 0, 0, 0, 0] # 0: released, 1: pressed
# Set up switch press times
switch_press_times = [time.ticks_ms(), time.ticks_ms(), time.ticks_ms(), time.ticks_ms(), time.ticks_ms(), time.ticks_ms()]
# Set up switch press delay
SWITCH_PRESS_DELAY = 1000 # milliseconds
# Set up switch callbacks
def button_callback(pin):
global switch_press_times
global switch_states
index = switches.index(pin)
if time.ticks_diff(time.ticks_ms(), switch_press_times[index]) > SWITCH_PRESS_DELAY:
switch_press_times[index] = time.ticks_ms()
if switch_states[index] == 0: # Button pressed
print(f"Button {index} pressed")
switch_states[index] = 1
Pin(LED_GREEN_PINS[index], Pin.OUT).on()
Pin(LED_RED_PINS[index], Pin.OUT).off()
else: # Button released
print(f"Button {index} released")
switch_states[index] = 0
Pin(LED_GREEN_PINS[index], Pin.OUT).off()
Pin(LED_RED_PINS[index], Pin.OUT).on()
# Set up button interrupts with trigger on falling edge
for button in range(6):
switches[button].irq(handler=button_callback, trigger=Pin.IRQ_FALLING)
Gennemgang af koden
Nu skal vi gang med at kode! Der er en masse linjer, men lad dig ikke blive bange for du skal nok forstå det .
Til at starte med så importerer vi 2 biblioteker.
Herefter definerer vi 3 arrays. Disse array indeholder henholdsvis vores Pins for knapperne på alle vores Switches. Samt vores Pins for de grønne og røde LED’er
Herefter tænder vi alle de røde LED’er.
Derefter definerer vi endnu et array, hvor vi skaber 6 knapper, som alle anvender Pull-Up. Det ser måske lidt kompliseret ud. Men det der sker er bare, at vi via en for-løkke skaber alle 6 knapper.
Derudover definerer vi yderligere 2 arrays. Et som holder styr på statussen for hver knap og et som logger tiden hvor knapperne sidst blev trykket på.
Dertil definerer vi også en variable som skal hjælpe os med at debounce vores knapper. Du kan ændre denne værdi, hvis du ønsker at kunne trykke hurtigere på knapperne.
Derefter har vi en funktion som tjekker om vores knap er blevet trykket på.
Til sidste skaber vi 6 interrupts, som gør at når vi trykker på en knap, så bliver vores funktion kaldt med det samme.
Virker det?
Når du har fået alle 6 Switches til at virke, så må du gå videre til næste step.
Skriv til os
Hvis du har spørgsmål til vores forening eller vores forløb - også gerne hvis du kunne tænke dig at være frivillig sammen med os.


