• 5/8

Skydepotentiometre (Sliders)


Skydepotentiometre (Sliders)

Midi Controlleren er udstyret med 2 Sliders

Hvordan virker det?

For at anvende alle 2 Sliders skal vi bruge:

    • Analog læsning

Hvad skal vi bruge?

I denne opgave skal vi bruge:

    • 2 Sliders
    • Raspberry Pi Pico W

Hvordan virker vores Sliders?

De fungerer som helt normale potentiometre. Den eneste forskel er, at de fungerer ved at skubbe op og ned på den modsat en normal potentiometer, hvor man drejer den med eller mod uret.

Et potentiometer er en variabel modstand, der ændrer modstand alt efter hvor meget den er drejet. I virkeligheden fungerer et potentiometer som en spændingsdeler, hvor spændingen deles mellem de 2 varierende modstande, der er mellem det første og det midterste ben og det midterste og det sidste ben på potentiometeret.

Hvordan forbinder vi alle 2 Sliders med mikrokontrolleren?

Nedenfor ser du et diagram af hvordan du bygger dit kredsløb så begge 2 Sliders 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 Slider. Få den til at virke og tilføje herefter den anden Slider.

Hvordan modtager vi signaler fra vores Sliders?

Nu skal vi gang med at kode! Nedenunder vil du kunne se hele koden for, at begge 2 Sliders til at virke.

# ----------------------------------- LIBRARIES -----------------------------------------------------

from machine import Pin
import time
from neopixel import Neopixel

# ----------------------------------- SWITCHES -----------------------------------------------------

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

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 = 14    # 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 > 55000: #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

Vi er nået så langt at vi nu har fået rigtig meget kode. Men frygt ikke, for vi har bare lagt de to tidligere koder sammen til et stort. Vi anvender nemlig samme metode for vores Sliders som med vores Pads

Virker det?

Når du har fået begge 2 Sliders 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.