IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Fonction gestion de bouton


Sujet :

Raspberry Pi

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Fonction gestion de bouton
    Bonjour !

    Je suis lycéen en bac general et passionné d'informatique. Je souhaiterais réaliser un projet personnel pour un raspberry pi (une sorte de boîtier amélioré) et l'une de ses particularités serait un bouton et une led qui :
    - lors d'un appui bref, allume la Led, envoie le signal HDMI puis lorsqu'on rappuie dessus éteints la led, coupe le signal hdmi (le rasberry fonctionne encore, mais n'envoie aucun signal)
    - lors d'un appuie long reset le raspberry (de préférence un hard reset)
    pour
    Jai lu qu'il fallait faire un script python exécutable par défaut par le raspberry . Je ne sais comment faire en sorte qu'il soit chargé au tout début du boot, rt encore moins lecrire. Je n'ai en effet aucuneconnaissance dans ce domaine là, c'est pourquoi je demande l'aide ici
    Je demande pas de le faire pour moi, mais de laide, des liens vers de la documentzt ou des lignes de commandes a faire, si possible avec des explications.

    Merci d'avance

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Salut, et bienvenue sur Dvp

    Pour rendre le Pi autonome et démarrer un programme Python automatiquement, tu as un exemple ici.

    Sinon, tu as des tutoriels sur Dvp pour débuter sur le Pi, par exemple ici. Tout en bas de l'article, en complément, tu as des liens vers d'autres articles pour s'amuser avec des LED, boutons poussoirs et autres.

    Sinon je ne vois pas bien ce que tu veux dire par "envoyer le signal HDMI". Peux-tu préciser ce que tu veux faire exactement ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour la réponse ! Les articles sont clairs, je m'y plongerais plus profondément ce weekend

    En fait, de base je voulais faire un bouton on/off ou tout simplement. J'ai trouvé comment faire pour l'éteindre mais apparemment ce n'est pas possible (le raspberry est éteint, il ne reçoit pas l'input). Du coup je voudrais "simuler" pour l'écran l'extinction du Raspberry, en coupant tout signal du Raspberry par ce bouton. Le Raspberry continuerait de tourner, mais sans signal. Je ne sais pas si c'est possible :/

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Apparemment il y a une commande pour ça...

    pour activer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /opt/vc/bin/tvservice -p
    pour désactiver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /opt/vc/bin/tvservice -o
    à tester sur un poste distant, avec Putty par exemple.

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Voici le code que j'ai écrit (modifié directement depuis celui donné sur cette page).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #!/usr/bin/env python2.7
    
    from time import sleep
    import subprocess
    import RPi.GPIO as GPIO
    
    # On choisit le GPIO 23 (pin 16) pour notre bouton
    CHANNEL = 23 
    
    # On definit nos durees
    long_press = 1
    very_long_press = 4
    
    # on met RPi.GPIO en mode notation BCM
    GPIO.setmode(GPIO.BCM)
    
    # on initialise le GPIO 23 en mode entree
    GPIO.setup(CHANNEL, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    # Initialisation pour la led
    GPIO.setup(18, GPIO.OUT)
    
    # notre fonction extinction
    def switchoff():
    	subprocess.call(['/opt/vc/bin/tvservice -o'])
    	
    #Fonction démarrer
    def switchon():
    	subprocess.call(['/opt/vc/bin/tvservice -p'])
    
    # notre fonction reboot
    def reboot():
    	subprocess.call(['sudo reboot'])
    
    # notre fonction de gestion du bouton
    def system_button(CHANNEL):
    	# cette variable servira a stocker le temps de pression
    	button_press_timer = 0
    	#La variable led sert à allumer ou non la LED suivant l'état allumé/éteind.
    	led = 1
    	#De base, vu que le script démarre avec le boot, j'allume la LED
    	GPIO.output(18, 1)
    
    	while True:
    			if (GPIO.input(CHANNEL) == False) : # le bouton a ete presse...
    				button_press_timer += 0.2 # ... on enregistre le temps que cela dure
    				#La LED clignote
    				GPIO.output(18, 0)
    				sleep(0.5)
    				GPIO.output(18.1)
    				sleep(0.5)
    
    			else: # le bouton a ete relache, on compte combien de temps cela a dure
    				if (button_press_timer > very_long_press, led = 1) :
    					print "very long press : ", button_press_timer
    					#J'eteinds la LED, le systeme s'eteind''
    					GPIO.output(18, 0)
    					led = 0
    					switchoff()
    				
    				elif (button_press_timer > very_long_press, led = 0)
    				    print "very long press : ", button_press_timer
    				    #J'allume la led, le systeme s'allume'
    				    GPIO.output(18, 1)
    				    led = 1
    				    switchon()
    
    				elif (button_press_timer > long_press) :
    					print "long press : ", button_press_timer
    					reboot()
    
    				elif (button_press_timer > 0.2):
    					print "short press : ", button_press_timer
    
    				button_press_timer = 0
    			# on attend 0.2 secondes avant la boucle suivante afin de reduire la charge sur le CPU
    			sleep(0.2)
    
    # on met le bouton en ecoute par interruption, detection falling edge sur le canal choisi, et un debounce de 200 millisecondes
    GPIO.add_event_detect(CHANNEL, GPIO.FALLING, callback=system_button, bouncetime=200)
    
    # ici vous pouvez mettre du code qui sera execute normalement, sans influence de la fonction bouton
    try:
    	while True:
    		# faites ce qui vous plait
    		sleep (2)
    
    # on reinitialise les ports GPIO en sortie de script
    except KeyboardInterrupt:
    	GPIO.cleanup()
    GPIO.cleanup()
    Je ne suis pas sûr de ce que j'ai mis en rouge. Elles y sont par défaut (et donc ne seront plus lues après la première boucle) ou justement à chaque boucle la variable sera remise à cette valeur (et donc empêcheront la bonne exécution du script lorsque le système est en mode éteint) ?

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Je ne comprends pas bien cette gestion de bouton avec le while True dans l'interruption

    Je verrais plus un truc comme :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def system_button(CHANNEL):
    	# cette variable servira a stocker le temps de pression
    	button_press_timer = 0
     
    	while GPIO.input(CHANNEL) == False : # tant que le bouton est maintenu presse ...
    		button_press_timer += 0.2 # ... on enregistre le temps que cela dure
    		sleep(0.2)
     
     
    	# le bouton a ete relache, on compte combien de temps cela a dure
    	if (button_press_timer > very_long_press) :
    		# etc.

    Juste avant le sleep(0.2), tu peux rajouter un GPIO.output(18, not GPIO.input(18)) pour faire clignoter la LED.

  7. #7
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Je l'ai fait à partir du tutoriel donné, je ne sais pas ce qu'est la différence :s

    Mais du coup le #else (52) je le vire ?

    Et ce que j'avais mis en rouge, je peux le laisser ?

    Merci beaucoup

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    C'est plus simple que ça...

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    def system_button(CHANNEL):
    	# cette variable servira a stocker le temps de pression
    	button_press_timer = 0
     
    	while GPIO.input(CHANNEL) == False : # tant que le bouton est maintenu presse ...
    		button_press_timer += 0.2 # ... on enregistre le temps que cela dure
    		GPIO.output(18, not GPIO.input(18)) # basculer l'etat de la LED sur 18
    		sleep(0.2)
     
    	# le bouton a ete relache, on regarde combien de temps cela a dure
     
    	if (button_press_timer > very_long_press) :
    		# ton affaire pour appui très long
     
    	elif (button_press_timer > long_press) :
    		# ton affaire pour appui long
     
    	else :
    		# ton affaire pour appui court

    Tu rentres automatiquement dans la fonction system_button lorsque tu appuies sur le bouton. Dans la fonction, tu restes bloqué dans le while (ligne 5 à 8) tant que le bouton n'est pas relâché, et pendant ce temps-là tu incrémentes la durée de l'appui et tu fais clignoter la led (ligne 7). Quand le bouton est relâché, tu agis en fonction de la durée de l'appui.

  9. #9
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    D'accord Merci beaucoup pour l'aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.Net] Problème appel fonction par un bouton
    Par balibo dans le forum ASP.NET
    Réponses: 4
    Dernier message: 25/11/2005, 10h48
  2. [VB.NET] Gestion des boutons d'un formulaire
    Par dinbougre dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/01/2005, 09h35
  3. gestion des boutons d'une manette : relachement
    Par backfire dans le forum DirectX
    Réponses: 1
    Dernier message: 05/01/2005, 10h13
  4. [JSP][Barre de navigation] Gestion du bouton precedent
    Par lando dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 09/09/2003, 16h18
  5. Réponses: 5
    Dernier message: 04/04/2003, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo