Flera inputs från fysiska knappar (Raspberry Pi)?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Apr 2014

Flera inputs från fysiska knappar (Raspberry Pi)?

Vad jag försöker åstadkomma är något i stil med digitaltrummor, just nu dock bara på test- och forskningsstadium. Jag har för ett tag sedan slaktat en gamepad för PC (via USB) och lött bort L/2 och R/2 (alltså två bitar med två kapacitiva ytor vardera). Det går tre sladdar från varje: en för x1, en för x2 och en jord. Jag har lyckats koppla ihop en knapp från varje "sida" i Pi:n, frågan är dock hur man kan få alla fyra att fungera. Alltså hur (om) man kan använda samma GND för olika inputs. Om inte, kan jag helt enkelt skrapa upp lite koppar på kretskortet och löda fast en sladd därifrån?

Sedan är jag inte på det fulla med hur man ska få in detta i Python. Jag har testat följande:

GPIO.setmode(GPIO.BCM) GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_UP)

och sedan:

while True: if GPIO.input(24) == False: print("hitting snare") if GPIO.input(25) == False: print("kicking bass") time.sleep(0.2)

men även:

def playBass(channel): print("kicking bass") def playSnare(channel): print("hitting snare") GPIO.add_event_detect(24, GPIO.RISING, callback=playSnare) GPIO.add_event_detect(25, GPIO.RISING, callback=playBass) while True: print("hej") time.sleep(0.2)

Dock verkar inget av dessa två kodsnuttar fungera ordentligt. I det första exemplet (polling) funkar det bara ibland när man trycker på knappen. I det andra exemplet skriver den ut "kicking bass" (eller om det var tvärt om), oavsett vilken knapp man trycker på.

Dessutom är det väldigt hög latens. Läste någonstans om att använda Arduino för input som i sin tur är kopplad till Pi:n, varav detta?

Hoppas du förstår vad jag menar =).

:)

Trädvy Permalänk
Medlem
Registrerad
Jun 2013

Prova att köra en kod enligt följande:

import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) #pins blir pull-ups-resistorer GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_UP) while True: if GPIO.input(24) ==0 : print(“Hitting snare”) if GPIO.input(25) == 0 : print(“Kicking bass”) time.sleep(0.2) #Avsluta programmet med för att nollstalla GPIO GPIO.cleanup()

0 i if-satserna kanske ska vara false, lite osäker där.
Rent kopplingsmässigt kopplar du knapp 1 till pin 24 samt en GND, knapp 2 till pin 25 och GND(kan vara samma som första).

Var ett tag sen jag pillade med detta men bör funka, kan vara någon miss i kod-syntaxen.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Apr 2014
Skrivet av Barra85:

Prova att köra en kod enligt följande:

import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) #pins blir pull-ups-resistorer GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_UP) while True: if GPIO.input(24) ==0 : print(“Hitting snare”) if GPIO.input(25) == 0 : print(“Kicking bass”) time.sleep(0.2) #Avsluta programmet med för att nollstalla GPIO GPIO.cleanup()

0 i if-satserna kanske ska vara false, lite osäker där.
Rent kopplingsmässigt kopplar du knapp 1 till pin 24 samt en GND, knapp 2 till pin 25 och GND(kan vara samma som första).

Var ett tag sen jag pillade med detta men bör funka, kan vara någon miss i kod-syntaxen.

Min kod ovan är densamma (0 och False är samma), det funkar helt enkelt inte. När varje knapp har sin egen jord funkar det, men inte annars.

:)

Trädvy Permalänk
Medlem
Registrerad
Jun 2013

Hmm så det fungerar om du kopplar till olika jord? Jag har bara provat med en input därför har jag inte stött på det problemet.
Men istället för att koppla separat till varje jord så borde du kunna köra pull-down's istället.
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP) blir istället GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
och if-satsen blir "if GPIO.input(24) ==1 :"
Elmässigt kopplar du en sladd från knappen till din pin-siffra(24) och den andra sladden till GPIO's konstanta 3v3-matning(Pin 1 med boardlayout).
På knapp 2 kopplar du till pin 25 med ena sladden och 3v3-matningen(pin1) med den andra.

Bör gå att parallellkoppla på 3v3-matningen, blir ju en snyggare lösning än att koppla en kabel separat till jord