Sega MegaPi (5 / 6 steg)
Steg 5: Återställ knapparna och avstängning
Jag ville ha den ursprungliga fallet knappar fungerar lika bra. Inledningsvis men om en fysisk förmåga knapp men sedan beslutade jag att göra det en programvara avstängningskommandot istället så att den korrupta SD kort problem minimeras. (I själva verket jag ursprungligen skär styrelsen så att knappen original var fortfarande där och jag skulle använda det!)
För det första hårdvara. Du kan få lite tillfällig tryckknappar med en plast skaft runt platsen. De jag använde har jag haft i evigheter. Fördelen med plast axeln är att du kan skära av det till den längd du behöver. För strömbrytaren är den ursprungliga fyrkantigt hål precis rätt storlek för tråden i knappen. Jag skruvade in till punkten där är bara röra knappen original. Några silicon förseglade den på plats. För reset återställa knappen jag skär axeln av den ursprungliga Sega knappen tillbaka något. Sedan borrade jag ut hålet i axeln som knappen sitter i något så att min knapp skulle skruva i den. Detta höll den robust så jag lämnade den på det.
För ledningar som gick jag igenom en massa iterationer för att få det rätt. Det finns gott om guider på hur tråd upp en knapp men inte så många om flera knappar. Till sist hittade jag denna och och detta och detta:
Från allt detta trådbundna jag upp de två tryck-knapparna som visas i diagrammet överst. Också av intresse jag dela upp "GPIO" tråd att gå till Arduino stiften 16 och 10 såväl som Raspberry PI stiften. Detta är så jag kan använda knapparna vara ett tangentbord tryck via Arduino eller göra något direkt på Raspberry Pi (t.ex. skicka en avstängningskommandot)
För programvaran använde jag skissen från här. Bara Observera diagrammet på sidan om 26 pin huvudet. Ett bra diagram för 40 pin huvudet jag hittade här. En trevlig sak om denna skiss är du effektivt har fyra knappar, kort tryck och långt tryck för både makten och återställa knappar.
Du kan se tillägg till Arduino skiss i steg 4. Raspberry Pi är Python koden jag använde:
importera RPi.GPIO som GPIO
Importera tid
importera uinput
importera os
GPIO.setmode (GPIO. BCM)
GPIO.setup (23, GPIO. I)
GPIO.setup (24, GPIO. I)
buttonPower_previous = 1
buttonPower_current = 1
powerTimer = 0
flag_powerPressed = 0
buttonReset_previous = 1
buttonReset_current = 1
resetTimer = 0
flag_resetPressed = 0
samtidigt sant:
buttonPower_current = GPIO.input(23);
flag_powerPressed = buttonPower_previous + buttonPower_current
buttonReset_current = GPIO.input(24);
flag_resetPressed = buttonReset_previous + buttonPower_current
om (not(flag_powerPressed)):
powerTimer + = 1
annat:
powerTimer = 0
om (not(flag_resetPressed)):
resetTimer + = 1
annat:
resetTimer = 0
händelser = {
uinput. KEY_ESC, uinput. KEY_M
}
Device = uinput. Device(Events)
om (buttonPower_current och (inte buttonPower_previous)):
Device.Emit (uinput. KEY_ESC, 1)
Device.Emit (uinput. KEY_ESC, 0)
om ((not flag_powerPressed) och powerTimer > = 20):
OS.system ("sudo shutdown -h nu")
bryta;
om (buttonReset_current och (inte buttonReset_previous)):
Device.Emit (uinput. KEY_M, 1)
Device.Emit (uinput. KEY_M, 0)
om ((not flag_resetPressed) och resetTimer > = 20):
OS.system ("sudo shutdown - r nu")
bryta;
buttonPower_previous = buttonPower_current
buttonReset_previous - buttonReset_current
Time.Sleep(0.03)
Du måste installera modulen uinput sannolikt om du vill att knapptryckningar att arbeta. Vid denna punkt jag har det i koden men jag använder inte det som jag fann dessa pressar inte upptäcktes av emulatorer. Därför varför jag har dubbla config att använda arduino för att göra de. Jag har kvar förmågan men om jag tänker på något i framtiden.
Du måste också sannolikt att installera modulen GPIO som beskrivs här.