====== Boutons (GPIO) supplémentaires pour retropie ====== {{{project picture:{{ :projets:retropie_gpio_additions:esc_tab_poweroff_bb.png?300 |}} machines: materiaux: logiciels: sources: liens:[[http://makezine.com/projects/tutorial-raspberry-pi-gpio-pins-and-python/|Tutorial: Raspberry Pi GPIO Pins and Python (en)]], [[http://blog.petrockblock.com/retropie/| Retropie (en)]], [[projets:boitierraspberrybplus|]] langages:python tags: raspberry_pi gpio python retropie usager:bumblebee licence:cc-by-sa }}} Suite à quelques tests d'utilisation de Retropie //(voir [[projets:boitierraspberrybplus|]])// il s'avère qu'une des problématique est que l'on est obligé d'avoir un clavier branché pour pourvoir utiliser la touche ''echap'' lorsque l'on veux sortir d'un jeu. Cela empêche donc de brancher de seconde manette, ou implique l'utilisation un hub usb. L'idée ici est d'utiliser les GPIO du raspberry pour brancher quelques petits boutons qui permettront, apr l’intermédiaire un petit script python,de remplacer le clavier. Je suis pour le moment parti sur 3 bouton : un bouton ''esc'' pour sortir des jeux, un boutons ''tab'' super utile pour configurer Mame, et un bouton ''power off'' qui permettra d'éteindre correctement le système du raspberry (sans toutefois l'éteindre électriquement malheureusement). ===== Schéma de branchement ===== {{ :projets:retropie_gpio_additions:esc_tab_poweroff.svg |}} ===== Script ===== ==== Dépendances ==== Ce script utilise 3 libraires : * La libraire ''[[https://pypi.python.org/pypi/RPi.GPIO|RPi.GPIO]]'' qui est normalement intégrée nativement dans les version récente de raspbian * La libraire ''[[http://python-evdev.readthedocs.org/en/latest/|evdev]]'' qui permet de gérer ou simuler des input type clavier et souris sous linux * La libraire [[http://tjjr.fi/sw/python-uinput/|python-uinput]] permettant de simuler un device (ici clavier) virtuel * la libraire ''[[https://github.com/amoffat/sh|sh]]'' qui permet de facilement lancer des commande shell dans python Pour installer les lib : sudo apt-get install python-pip python-dev libudev-dev sudo pip install python-uinput sudo pip install sh ==== La script python ==== #!/usr/bin/env python # encoding: utf-8 import RPi.GPIO as GPIO from sh import shutdown import uinput # Script de test permettant de simuler l'appui sur la touche echap avec un bouton mettant a la masse la broche 23 de la Raspberry Pi # Si la broche 24 est mise a la masse le script va éteindre le rasbarry proprement (mais pas électriquement) # # Nécessites les libs evdev et sh : # pip install sh evdev # # Source simulation de clavier avec evedv : # https://stackoverflow.com/questions/2575528/simulating-key-press-event-using-python-for-linux#adzerk9805928 # # Tuto utilisation boutons et GPIO : # http://makezine.com/projects/tutorial-raspberry-pi-gpio-pins-and-python/ #Initalise GPIO INPUTs with pull_ups GPIO.setmode(GPIO.BCM) GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(25, GPIO.IN, pull_up_down = GPIO.PUD_UP) import uinput import time #Virtual Keyboard device to simulate key events events = ( uinput.KEY_ESC, uinput.KEY_TAB ) device = uinput.Device(events) def simulate_key(code): device.emit(code, 1) # Press. time.sleep(0.1) device.emit(code, 0) # Release. def echap(*args,**kwargs): print("echap") simulate_key(uinput.KEY_ESC) def tab(*args,**kwargs): print("tab") simulate_key(uinput.KEY_TAB) #Add lisneners on GPIOs pins 23 & 25 GPIO.add_event_detect(23, GPIO.FALLING, callback=echap, bouncetime=300) GPIO.add_event_detect(25, GPIO.FALLING, callback=tab, bouncetime=300) print("Started") #Wait for a falling edge on GPIO 24 to shut down the system GPIO.wait_for_edge(24, GPIO.FALLING) GPIO.cleanup() shutdown('-h','now') pour le lancer : sudo python retropie_additions.py Mes deux sources d'info pour ce script : * Simulation de clavier en python : https://stackoverflow.com/questions/2575528/simulating-key-press-event-using-python-for-linux#adzerk9805928 * Simulation de clavier en python : http://www.raspberrypi.org/forums/viewtopic.php?f=32&t=23548&p=219560&hilit=uinput#p219560 * Utilisation des GPIO du raspberry en python : http://makezine.com/projects/tutorial-raspberry-pi-gpio-pins-and-python/ ==== Lancement automatique ==== En supposant que le script est enregistré dans ''/home/pi/'', il suffit de rajouter la ligne suivante dans le fichier ''/etc/rc.local'' //(''sudo nano /etc/rc.local'')// avant la ligne ''exit 0'' : /usr/bin/python /home/pi/retropie_additions.py & ==== Aide pour la réalisation ==== Pour les personnes qui ne savent pas trop comment bidouiller dans ce domaine, voila la marche à suivre pas à pas: * Lancez votre retropie, une fois prête, appuyez sur F4 et installez les librairies en faisant comme indiqué plus haut (sudo apt-get install .......) * Créez un fichier texte nommé " retropie_additions " sur un ordinateur autre * Copiez le script plus haut dans ce fichier. Remplacez le *.txt/odt/... par le .py * Éteignez votre retropie * Placez le fichier fraichement créé dans le répertoire /home/pi de votre retropie (à partir d'un linux faites un drag'n drop... pour les autres OS, aucune idée) * Pour l'automatisation, lancez votre retropie (pas trop loin) * Une fois en marche, appuyez encore une fois sur F4 * Tapez la commande plus haut dans la rubrique automatisation (sudo nano ...) pour lire le contenu du fichier * Faite la commande pour éditer le texte (Ctrl + X de mémoire) * Tapez la ligne indiquée à la fin du texte * enregistrez vos modification * Redémarrez et ça marche ===== Tests ==== * Installation des dépendance : :OK: * GPIO : :OK: * Shutdown: :OK: * Simulation du clavier : :OK: //(pas réussi avec la lib evdev mais cela fonctionne avec la lib uinput)// * Lancement automatique : :OK: ===== Ce qu'il reste à faire ===== * Trouver pourquoi la simulation du clavier ne marche pas, ou trouver une autre solution * Ajouter d'autres boutons/touches/fonctionnalités ? * Automatiser le démarrage du script (service ?) * Faire un boitier qui intégre les boutons et le raspberry ? * ...