projects:raspberry_launch_video_button

Lancer une vidéo depuis une Raspberry Pi avec un bouton

L'idée est de faire tourner un script Python qui, quand il détecte qu'un bouton est pressé lance une vidéo.

Matériel utilisé

  • Raspberry Pi Rev.B avec Raspbian Wheezy du 09/09/2014.
  • Un simple bouton à pression avec 2 fils.

Montage

  • On connecte une des pattes du bouton à pin GPIO de la Raspberry.
  • On connecte l'autre à la masse.

Installation des composants logiciel

Pour pourvoir utiliser les pins GPIO de la Raspberry en Python, on peut utiliser la bibliothèque RPi.GPIO, voici comment l'installer:

  • Il faut déjà installer le paquet python-dev:
    sudo aptitude install python-dev
  • Ensuite installer le module Python. On va le faire proprement en utilisant l'utilitaire pip:
    sudo aptitude install python-setuptools python-pip
    sudo pip install RPi.GPIO

Ecriture du code

Lancement de la vidéo

Sur la Raspberry pour lancer une vidéo le mieux est d'utiliser l'outil en ligne de commande omxplayer. Il utilise le GPU de la Raspberry, ce qui soulage le processeur de la carte. Il s'utilise très simplement:

omxplayer <fichier_video>

L'idée est donc d'exécuter cette commande lorsqu'on appuie sur le bouton.

Le code

Le principe est le suivant: dans une boucle infinie, on teste si le bouton est pressé. S'il l'est et que la vidéo n'est pas déjà lancée alors on lance la vidéo.
Notes:

  • On utilise subprocess pour exécuter omxplayer, ce qui va nous permettre d'effectuer un poll pour savoir si l'exécution est terminée.
  • Il faut lancer ce code en root sinon on ne peut accéder aux pins GPIO de la Raspberry.
import subprocess, time
import RPi.GPIO as GPIO
INPUT_PIN = 3
 
GPIO.setmode(GPIO.BOARD) ## Use board pin numbering
GPIO.setup(INPUT_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
 
video_started = False
play_process = None
val = -1
 
while True:
    val = GPIO.input(INPUT_PIN)
    if val == 0: # Button pressed
        print("Button pressed")
        if not video_started:
            play_process = subprocess.Popen(['omxplayer','../resources/video.mov'], 
                stdin=subprocess.PIPE,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE, 
                close_fds=True)
    if play_process != None:
        video_started = play_process.poll() == None
    else:
        video_started = False
    print("Video started : %s" % video_started)
    time.sleep(0.2)

Remarque:

  • En début de programme on force la résistance de rappel pour le bouton afin qu'il ne se trouve pas dans un état “flottant” grâce au paramètre pull_up_down=GPIO.PUD_UP.
  • Lorsqu'on lance omxplayer, on a à disposition un certain nombre de commandes (au clavier) pour “intéragir” avec la vidéo. Ainsi on peut appuyer sur 'q' (pour quitter), 'p' (pour mettre en pause), etc.

En utilisant l'argument stdin=subprocess.PIPE lorsqu'on appelle subprocess.Popen, cela nous donne la possibilité d'effectuer la même chose. Ainsi on pourrait imaginer placer un deuxième bouton et lui associer la commande pause, du coup on écrirait dans le code:

play_process.stdin.write('p')
/var/www/tech_mirelsol/data/pages/projects/raspberry_launch_video_button.txt · Last modified: 29/11/2014 20:30 by Mirelsol