MrBeaker escribió:Buenas compañeros, ando realizando un proyecto de raspberry + carcasa NES y necesitaba poder apagar y encender la Raspberry a través de un botón.
Según si estemos en Recalbox o Retropie el procedimiento es distinto, así que procedo a explicar los dos.
Buscando encontré un tutorial que explica a la perfección el proceso para poder apagar nuestra plaquita a través del GPIO.
Consiste en la programación de un script en python, y el tutorial en cuestión es el siguiente
http://forum.arcadecontrols.com/index.p ... c=147052.0
Aunque está genialmente explicado ahí, paso a ponerlo en español.
Necesitamos:
- Una Raspberry Pi
- Un pulsador
- Dos cables para la conexión entre la Raspberry y el pulsador
El pulsador lo tenemos que conectar a los pines 5 y 6 del GPIO. Con el simple hecho de conectar un pulsador en esos pines tendremos la capacidad de poder arrancar la placa a través del botón sin ninguna linea de código extra ni configuración. Sin embargo lo interesante del asunto es poder tanto encender como apagar la raspberry, por lo que el proceso de apagado si que tiene que ser programado a través de un script.
En pocas palabras, el objetivo final es hacer un programilla que la raspberry ejecute al arrancar y que se quede esperando indefinidamente una acción que nosotros le digamos (que en nuestro caso será pulsar el botón). Una vez que se realice esa acción forzamos el apagado de la placa, fácil! :vago
RETROPIE
Lo primero que tenemos que hacer es acceder por SSH a nuestra Raspberry, y una vez dentro ejecutar las siguientes lineas
Después, creamos nuestro script con el siguiente comando
y dentro copiamos el siguiente fragmento de código
Código: Seleccionar todo
import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(03, GPIO.IN, pull_up_down = GPIO.PUD_UP)
while True:
print GPIO.input(03)
if(GPIO.input(03) == False):
os.system("sudo shutdown -h now")
break
time.sleep(1)
Tras ello pulsamos Ctrl+X y decimos Y (Yes) para guardar cambios.
Una vez hecho esto y con nuestro script ya programado, tenemos que indicarle a la raspberry que cada vez que arranque tiene que ejecutar este código, para ello tenemos que escribir en crontab a través de la siguiente línea
Si os pregunta, seleccionar la opción 2 (nano).
bajamos hasta el final y escribimos lo siguiente
De nuevo pulsamos Ctrl+X y decimos Y para guardar.
Para finalizar, nos tenemos que asegurar que el script funciona correctamente, por lo que vamos a testear su funcionamiento ejecutando de manera manual el código a través de la siguiente línea
Si todo va bien, el código no arrojará ningún error por pantalla y se quedará escuchando a que pulsemos el botón.
Si lo pulsamos, la raspberry se debe apagar!
Una vez apagada podemos comprobar que, efectivamente, la raspberry también enciende si pulsamos el botón y... ya tendremos nuestro pulsador de encendido/apagado
RECALBOX
En recalbox no tenemos package manager (apt-get), y comandos como sudo no funcionan, ya que digamos es una versión "light" del sistema y no implementa todos los paquetes, por lo que si necesitas instalar alguno tienes que montar la imagen, añadirlo y volver a hacer un build de la imagen. Por suerte el paquete que necesitamos (el de python) ya está instalado, por lo que nos ahorramos este tedioso paso.
Lo primero que tenemos que hacer es acceder por SSH a nuestra Raspberry, y una vez dentro crear nuestro script con el siguiente comando
y dentro copiamos el siguiente fragmento de código
Código: Seleccionar todo
import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(03, GPIO.IN, pull_up_down = GPIO.PUD_UP)
while True:
print GPIO.input(03)
if(GPIO.input(03) == False):
os.system("shutdown -h now")
break
time.sleep(1)
Tras ello pulsamos Ctrl+X y decimos Y (Yes) para guardar cambios.
Una vez hecho esto y con nuestro script ya programado, tenemos que indicarle a la raspberry que cada vez que arranque tiene que ejecutar este código, para ello tenemos que indicar en init.d que tenemos un script que queremos que arranque junto con el sistema.
Para ello lo primero es irse a init.d
Una vez aquí tenemos que darle permisos de escritura a la carpeta. Como el comando chmod tampoco funciona, la solución pasa por ejecutar
Si ejecutamos el comando
vemos como hay una serie de ficheros enumerados desde el 01 hasta el 99. Todo esto son scripts que se ejecutan de manera secuencial al arrancar la placa, teniendo cada uno de ellos una función. Por ejemplo, el S31 arranca emulationstation, el S32 el bluetooth, etc...
Lo que nosotros vamos a hacer es crear un script en la última posición de la lista, para asegurarnos así que ningún otro arranque interfiere en el de nuestro script.
Ejecutamos el siguiente comando
y copiamos el siguiente código
Código: Seleccionar todo
#!/bin/sh
#
# Start logging
#
start() {
python /recalbox/share/system/pi/shutdown.py
}
stop() {
printf "Stopping shutdown: "
echo "OK"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
De nuevo pulsamos Ctrl+X y decimos Y para guardar.
Para finalizar, nos tenemos que asegurar que el script funciona correctamente, por lo que vamos a testear su funcionamiento ejecutando de manera manual el código a través de la siguiente línea
Si todo va bien, el código no arrojará ningún error por pantalla y se quedará escuchando a que pulsemos el botón.
Si lo pulsamos, la raspberry se debe apagar!
Una vez apagada podemos comprobar que, efectivamente, la raspberry también enciende si pulsamos el botón y... ya tendremos nuestro pulsador de encendido/apagado
OPENELEC (KODI)
*TUTORIAL EN CONSTRUCCIÓN*
Os dejo los pasos aún sin explicar:
Instalación y testeo realizado en base a la imagen v11 de kamber (OpenELEC 7.0.1 y Kodi 16.1)
1) Habilitar el paquete RPi.GPIO en kodi yendo a... Sistema/Ajustes/Add-ons/Instalar desde repositorio/OpenELEC Add-ons (unofficial)/Add-ons de programa/RPi.GPIO.
Una vez ahí instalar y habilitar el plugin, posteriormente pulsar en actualizar por si hubiera una actualización. -La versión 7.0.3 es la más reciente a fecha de 09/08-
2) Programar el script:
Código: Seleccionar todo
mkdir /storage/scripts
nano /storage/scripts/shutdown.py
Pegar esta porción de código en el fichero y guardar con Ctrl+X, después Y
Código: Seleccionar todo
import sys
sys.path.append('/storage/.kodi/addons/python.RPi.GPIO/lib')
import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(03, GPIO.IN, pull_up_down = GPIO.PUD_UP)
while True:
print GPIO.input(03)
if(GPIO.input(03) == False):
os.system("sudo shutdown -h now")
break
time.sleep(1)
Probar con el código
Si queremos hacer que arranque al encender la placa:
Información sacada del tutorial en Inglés:
http://www.barryhubbard.com/raspberry-pi/howto-raspberry-pi-openelec-power-wake-shutdown-button-using-gpio/
Os dejo una foto de las pruebas que estoy realizando ahora mismo con un botón de encendido/apagado, otro de reset y un led :P
EDIT:
Como veo que ya sois varios los que me lo habéis preguntado, os pongo como sería la conexión y programación para el botón de RESET.
Hay dos opciones:
1 - Volver a hacer el tutorial creando un nuevo script (con otro nombre) y cambiando el comando de apagado
(SI ES EN RECALBOX SERÍA SIN EL SUDO)
por
Obviamente el botón hay que conectarlo en otros dos pines diferentes, por ejemplo al 7 y al 9.
Si lo conectas al 7 y al 9 hay que modificar el script y donde pone GPIO.setup() y GPIO.input() cambiar el 03 por 04, quedando tal que así.
Código: Seleccionar todo
import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(04, GPIO.IN, pull_up_down = GPIO.PUD_UP)
while True:
print GPIO.input(04)
if(GPIO.input(04) == False):
os.system("sudo shutdown -r now")
break
time.sleep(1)
2 - Conectar (soldando) el botón al puerto RUN de la placa. El puerto RUN son unos agujeritos que se encuentran al lado del GPIO.
Este tipo de reinicio es de tipo hardware, es decir, es como si desconectaras y conectaras la rpi de la corriente, lo cual no es muy recomendable, al menos hacerlo de manera repetida.