Ik ben bezig een arcadekast te bouwen met een raspberry pi 3.
Nu wil ik hier een script op laten draaien om de rpi uit te schakelen d.m.v. een drukknop.
Ik gebruik hiervoor dit script:
https://howchoo.com/pi/how-to-add-a-power-button-to-your-raspberry-pi/…
Nu blijkt dat als ik het aansluit zoals uitgelegd de GPIO pin zweeft en dus gaat spoken en random de pi afsluit.
Nu heb ik een 1K pull-up weerstand tussen de 3.3v en de betreffende GPIO pin gezet zodat de state altijd "high" is tot ik op de knop druk en deze naar massa breng.
Enfin het werkt, maar de GPIO blijft mega gevoelig voor statische lading.
Ik hoef maar aan de kabel naar de knop te komen, of het deurtje van de kabinet te openen en hop hij schakelt de rpi weer uit...
Ook met een 10K weerstand hetzelfde.....kom er maar niet uit, menig hebben hetzelfde probleem maar een oplossing blijkt lastig.
Enig idee wat ik nog kan doen?
Zit een verschil in GPIO.setmode(GPIO.BOARD) en GPIO.setmode(GPIO.BCM).
De eerste maakt gebruik van het pin nummer en de 2e van GPIO nummer.
Je moet even de code delen die je gebruikt hebt en vertellen op welke pin je de drukknop hebt aangesloten.
Dan kunnen we verder kjken wat er fout gaat. Het geheel zou ook zonder pull up moeten werken. Denk dat de code en de aansluiting niet goed overeenkomen.
Dit is de code:
#!/usr/bin/env python
import RPi.GPIO as GPIO
import subprocess
GPIO.setmode(GPIO.BCM)
GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.wait_for_edge(3, GPIO.FALLING)
subprocess.call(['shutdown', '-h', 'now'], shell=False)
Schakelaar zit op GPIO 3 en massa
En een 1k weerstand nu tussen GPIO 3 en 3.3v
kabel tussen de schakelaar en rpi is denk ik 50cm.
Alles werkt wel zolang is de boel met rust laat, zodra ik bijvoorbeeld een metalen bracket van de knoppen loshaal dan hop....schakeld de pi weer uit.
JE zou denken dat met een pull-up weerstand dit verholpen moet zijn......
[Bericht gewijzigd door klabam op (22%)]
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
Weer het zoveelste beunwerk met een py script wat niet de methode is zoals het zou moeten.
99% (of meer) van alle suggesties om een linux embedded systeem te shutdownen op het internet zijn gewoon fout!
Is een beunwerk met polling via een script wat totaal overkill is.
Officieel hoor je een GPIO aan een event te assignen en via dat event doe je een shutdown.
Ik moet het even opzoeken wat de details precies zijn want op het internet vind je dat vrijwel nooit hoe het precies hoort.
Wordt waarschijnlijk morgen pas.
Sja, noem het beunwerk maar blijkbaar moet je bijkant een IT specialist zijn om een fatsoenlijke manier te vinden om een Pi uit te schakelen zonder data corruptie.
Maar goed, dit nieuwe script werkt naar behoren en de pi sluit nu goed af iig.
rudig76
Even iets anders www.echteworst.nl
Bedoel je zoals ze het hieronder doen? Shutdown moet dan nog worden toegevoegd:
from time import sleep
import RPi.GPIO as GPIO
var=1
counter = 0
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
def my_callback(channel):
if var == 1:
sleep(1.5) # confirm the movement by waiting 1.5 sec
if GPIO.input(7): # and check again the input
print("Movement!")
captureImage()
# stop detection for 20 sec
GPIO.remove_event_detect(7)
sleep(20)
GPIO.add_event_detect(7, GPIO.RISING, callback=my_callback, bouncetime=300)
GPIO.add_event_detect(7, GPIO.RISING, callback=my_callback, bouncetime=300)
# you can continue doing other stuff here
while True:
pass
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Op donderdag 30 januari 2025 16:44:16 schreef henri62:
Officieel hoor je een GPIO aan een event te assignen en via dat event doe je een shutdown.
En wat doet hij hier anders?
En wat is er mis mee met het "anders" te doen?
@klabam, jou script triggert op de allereerste edge op de gpio. Voor een arduino, die heeft glitch-prevention: Een input moet twee clocks achtermekaar hoog zijn wil je intern zien dat ie hoog geworden is. Kost een klok vertraging, maar het verhelpt 99% van dit soort glitches.
De pi heeft dat niet. En die draait veel sneller. Dus als je pin een nanoseconde laag is, dan zie je dat!
Ik zou wachten op een "geldige knopdruk" door te wachten op een edge en dan zeg 50x met een ms tussenpoze kijken of ie nog steeds laag is.
t = 0;
while (1) {
if (readpin (3)) t = 0;
else t++;
if (t > 50) break;
sleep_ms (1);
}
system ("shutdown..." );
Dit kan je iets efficienter maken door eerst op een event te wachten.
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
Op vrijdag 31 januari 2025 13:19:12 schreef rew:
[...]En wat doet hij hier anders?
zo ongeveer alles.
En wat is er mis mee met het "anders" te doen?
Omdat het een dom polling script is met een bak dependencies (python zooi wat je niet wilt).
Het hoort via de device tree geregeld te worden, dat is eigelijk de enige goede manier.
Zoiets moet er in/bij staan, waarbij je de juiste GPIO pin configureerd en de juiste driver moet laden (of zit er al in):
gpio-poweroff {
compatible = "gpio-poweroff";
gpios = <&gpio 4 0>;
timeout-ms = <3000>;
};
Staat in de linux kernel documentatie:
https://www.kernel.org/doc/Documentation/devicetree/bindings/power/res…
Daar kun je nog wat dingen in tweaken. Waarschijnlijk kun je gewoon een overlay laden en ben je klaar.
(in de file /boot/firmware/config.txt)
Voor mij blijft het abracadabra en helaas ook met het nieuwe script heb ik nog steeds af en toe dat de shutdown getriggerd word bij aanraking van bijv. een usb poort o.i.d..
Henri, zou je mij misschien in lekentaal kunnen uitleggen hoe ik dit dan op de juiste manier kan doen? Ik heb inmiddels tientallen posts en videos gezien en ik zie steeds maar 2 scripts voorbij komen. Bij de 1 werkt het prima en anderen hebben hetzelfde geneuzel als wat ik ik ondervind.
Enfin, wat ik nu heb is dit:
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import subprocess
# we will use the pin numbering to match the pins on the Pi, instead of the
# GPIO pin outs (makes it easier to keep track of things)
GPIO.setmode(GPIO.BOARD)
# use the same pin that is used for the reset button (one button to rule them all!)
GPIO.setup(5, GPIO.IN, pull_up_down = GPIO.PUD_UP)
oldButtonState1 = True
while True:
#grab the current button state
buttonState1 = GPIO.input(5)
# check to see if button has been pushed
if buttonState1 != oldButtonState1 and buttonState1 == False:
subprocess.call("shutdown -h now", shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
oldButtonState1 = buttonState1
time.sleep(.1)
[Bericht gewijzigd door klabam op (13%)]
Deze heb ik nog niet geprobeerd, hoor graag of dit een betere oplossing is:
https://raspberrypi.stackexchange.com/questions/117013/raspberry-pi-4-…
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Op vrijdag 31 januari 2025 17:39:36 schreef henri62:
[...] zo ongeveer alles.
[...] Omdat het een dom polling script is met een bak dependencies (python zooi wat je niet wilt).
Goed. Dan heb jij dus niet goed gekeken.
Op vrijdag 31 januari 2025 17:39:36 schreef henri62:
Het hoort via de device tree geregeld te worden, dat is eigelijk de enige goede manier.
Zoiets moet er in/bij staan, waarbij je de juiste GPIO pin configureerd en de juiste driver moet laden (of zit er al in):
Dus om poweroff te doen op basis van een GPIO is er al een driver in de kernel die het voor je kan. Leuk. Maar wat nu als Ik een scan wil maken als er op een knopje gedrukt wordt? Hoe configureer ik dat in de kernel?
De moderne IT gaat steeds meer in de richting "we maken precies wat je nodig hebt, en als je wat subtiel anders wilt dan... pech!".
Hier dus ook. Kernel kan shutdown doen op basis van een toets. Als ze nou "hang een actie aan een gpio" hadden gemaakt dan had je in de docu kunnen zeggen: ideaal voor <demo config voor shutdown -h now>
@klabam: Voor het specifieke probleem van "shutdown op basis van een GPIO" is er dus een "kernel driver". Je kan er dus voor kiezen om die te gebruiken. Maar als je volgende week de pi op basis van een andere gpio iets anders wil laten doen, dan heb je daar niets aan.
Dat zijn juist de leuke dingen die je met een pi kan doen. Op basis van iets uit de omgeving vrij ingewikkelde dingen doen op basis van krachtige bouwblokken.
[Bericht gewijzigd door rew op (16%)]
Op zaterdag 1 februari 2025 10:56:01 schreef rew:
[...]Goed. Dan heb jij dus niet goed gekeken.[...]Dus om poweroff te doen op basis van een GPIO is er al een driver in de kernel die het voor je kan. Leuk. Maar wat nu als Ik een scan wil maken als er op een knopje gedrukt wordt? Hoe configureer ik dat in de kernel?
De moderne IT gaat steeds meer in de richting "we maken precies wat je nodig hebt, en als je wat subtiel anders wilt dan... pech!".
Hier dus ook. Kernel kan shutdown doen op basis van een toets. Als ze nou "hang een actie aan een gpio" hadden gemaakt dan had je in de docu kunnen zeggen: ideaal voor <demo config voor shutdown -h now>
@klabam: Voor het specifieke probleem van "shutdown op basis van een GPIO" is er dus een "kernel driver". Je kan er dus voor kiezen om die te gebruiken. Maar als je volgende week de pi op basis van een andere gpio iets anders wil laten doen, dan heb je daar niets aan.
Dat zijn juist de leuke dingen die je met een pi kan doen. Op basis van iets uit de omgeving vrij ingewikkelde dingen doen op basis van krachtige bouwblokken.
De Pi blijft waar hij is en zal geen andere functie meer krijgen.
Daarom wil ik dit graag goed doen.
Gezien bij deze shutdown ook de usb poorten van spanning gaan heb ik op 1 poort een 1 kanaals relaisboard hangen welke de voedingen van het scherm, marquee en audio versterker schakeld.
Hierbij heb ik dus een mooie shutdown en start d.m.v 1 knop waarbij alleen de Pi in sleep mode is.
En zolang ik nergens intern aan rommel werkt het ook wel stabiel, wil alleen niet dat de gpio zo gevoelig is..... Misschien een debounce toevoegen? Dat de knop minimaal enkele seconden ingedrukt moet blijven??
Weer avondjes aan het klooien geweest en kabel van drukknop naar de gpio van de rpi uitgevoerd met dubbel shielded kabel... Tis een stuk beter maar toch nog steeds valse triggers.
Zonder de kabel aan de gpio gebeurd er niks, dus nog steeds last van electromagnetische storing..
Zit er nu aan te denken om een octocoupler de gpio te triggeren, zou dat werken?
Dan heeft de kabel iig geen invloed meer.
Dat zou kunnen met een opto.
Maar ik zou eerst proberen om de pullup "harder" te maken, ipv 10k een 2k2 of 1k weerstand.
Groetjes,
eSe
Ik heb er weer over gelezen
je had al een weerstand van 1k gebruikt.
Worden er nog meer pinnen gebruikt op de GPIO? De meeste zitten op dezelfde uitgangspoort, per 8 dacht ik. Misschien zorgen dat de andere poortpinnen ook een pullup hebben, inwendig of uitwendig.
Groetjes,
eSe
Optocoupler kan ook storing oppikken, en heeft een eigen voeding nodig. Werkt wel goed voor het beschermen van de pi voor schadelijke instraling/stromen.
Ik zou een condensatortje (100nF) tussen de RPi ingang en massa hangen, zo dicht mogelijk bij de Pi.
En daarna twee (schottky-)dioden, eentje van massa naar de kabel en eentje van de kabel naar de voeding. Allebei zo dicht mogelijk bij de pi, en allebei in sper.
Die dioden zitten in principe ook in de pi zelf, maar die kunnen een stuk minder hebben dan een externe diode, en het zou me niet verbazen als je die met een lange kabel al gemold hebt.
Condensator heb ik er al tussen gehad, ik ga het nog anders doen.
Heb nog een klein 5v relais liggen, ga deze eens proberen om de gpio te triggeren.
De 5v voor de spoel kan ik rechtstreeks van de pi voeding halen met een drukknop ertussen. Relais heeft ingebouwde diode, scheelt ook weer.