De trykfølsomme knapper (Pads)
Midi Controlleren er udstyret med 8 Pads. Ved at trykke på dem modtager vores mikrokontroller en værdi, som den omregner til lysstyrke.
Hvordan virker det?
For at anvende alle 8 Pads skal vi bruge:
-
- Analog læsning til at indsamle en værdi mellem 0 – 65535
- Neopixels til at få dem til at lyse op
Hvad skal vi bruge?
I denne opgave skal vi bruge:
-
- 8 Pads
- Raspberry Pi Pico W
- Multiplexer
Hvad er en Multiplexer?
Tænk på en en jernbaneskinne-skifter: Der er flere forskellge mulige spor, men kun ét spor må være forbundet ad gangen til “hovedvejen”.
I vores tilfælde bruger vi en multiplexer med 16 kanaler. Så der altså 16 spor hvoraf kun et spor kan være forbundet.
Hvorfor bruge den?
Alle vores pads anvender analog læsning, men Raspberry Pi Pico W har kun 3 analog kanaler. Derfor har vi behoc for at udvide antallet af analog kanaler, og det bruger vi multiplexeren til.
Hvordan vælger man hvilken kanal?
På chippen er der 4 små “valgknapper”, ofte kaldet S0, S1, S2, S3.
De er som fire ja/nej-knapper (0/1). Med fire knapper kan man tælle fra 0 til 15 → altså 16 muligheder.
-
S3 S2 S1 S0 = 0000 → vælg kanal 0
-
S3 S2 S1 S0 = 0001 → vælg kanal 1
-
…
-
S3 S2 S1 S0 = 1111 → vælg kanal 15
Hvordan forbinder vi multiplexeren med mikrokontrolleren?
Nedenfor ser du et diagram af hvordan du bygger dit kredsløb så multiplexeren kan kommunikere med mikrokontrolleren. De farvede streger er ledninger.
HUSK dine ledninger behøver ikke at have samme farve som på diagrammet.
Hvordan styrer vi vores Pads med multiplexeren?
Nu skal vi gang med at kode! Nedenunder vil du kunne se hele koden for, at alle 8 Pads til at virke. Der er også et diagram, som viser hvordan du skal sætte dine ledninger for alle 8 Pad.
HUSK at starte med en Pad. Få den til at virke og tilføje herefter en Pad ad gangen. Så sæt ledningerne til en Pad først. Test koden. Hvis det virker så kan du tilføje en Pad mere.
from machine import Pin
import time
from neopixel import Neopixel
pixels = Neopixel(8, 0, 5, "GRBW", transfer_mode="PUT_CRITICAL")
SIG = machine.ADC(26) #Analog read on pin 26
S0 = Pin(0, Pin.OUT)
S1 = Pin(1, Pin.OUT)
S2 = Pin(2, Pin.OUT)
S3 = Pin(3, Pin.OUT)
EN = Pin(4, Pin.OUT)
maxNumControllers = 16 # Number of channels in the CD74HC4067 multiplexer
actualNumControllers = 1 # Number of channels actually used
def set_mux_channel(channel):
"""Set the CD74HC4067 multiplexer channel."""
S0.value((channel >> 0) & 1)
S1.value((channel >> 1) & 1)
S2.value((channel >> 2) & 1)
S3.value((channel >> 3) & 1)
EN.value(0) # Enable the multiplexer
time.sleep_ms(10) # Wait for the multiplexer to settle
def read_mux_channel(channel):
"""Read the value from the specified channel of the CD74HC4067 multiplexer."""
set_mux_channel(channel)
return SIG.read_u16() # Read the signal value from the selected channel
# Will return a integer
def convert(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
pixels.clear()
pixels.show()
while True:
for i in range(actualNumControllers):
value = read_mux_channel(i)
if i < 8:
red = 0
if value > 56000: #Threshhold
red = convert(value, 0, 65535, 0, 255) #Convert 16bit to 8 bit
print(value)
pixels.set_pixel(i, (red, 0, 0, 0),255)
pixels.show()
else:
print(value)
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 3 biblioteker.
Herefter definerer vi nogle forskellige variabler. Først definerer vi en variable for vores neopixels. Det gør vi på linje 5. Herefter definerer vi 6 variabler som er til vores multiplexer. Læg mærke til at at vi har har S0, S1, S2 og S3. Disse variabler bruger vi til at fortælle vores multiplexer hvilken kanal vi vil læse fra. Derudover har vi en variable til analog læsning på Pin 26. Samt variblen EN som vi kan bruge til at tænde og slukke for vores multiplexer.
Herefter definerer vi to yderligere kanaler. maxNumControllers fortæller os, hvor mange kanaler vi har. actualNumControllers fortæller, hvor mange kanaler vi bruger. Det er actualNumControllers, som vi ændrer, når vi vil tilføje flere pads.
Derefter kommer der tre funktioner. De første to funktioner bruger vi til at kommunikerer med vores multiplexer. Den sidste funktion bruger vi til at omregne et 16 bit tal til 8 bit.
Til sidste har vi et loop hvor vi itererer hen over alle vores valgte kanaler og læser om vi har trykket på den trykfølsomme knap eller ej. Hvis vi har, så tænder vi for den neopixel.
Virker det?
Når du har fået alle 8 Pads 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.


