Una de las virtudes que tiene la Rabsperry Pi es que su encendido y apagado se hace enchufando o desenchufando su cable de corriente. Esto es perfecto para una máquina arcade ya que con un único interruptor de corriente general conectado a una regleta en su interior puedes arrancar todo el sistema con un simple botón.
En otro tipo de proyectos es mas elegante el poder hacer reinicio o apagado la Rabsperry Pi desde un botón o interruptor. Por ejemplo un proyecto que está muy de moda es hacer clones o réplicas de consolas retro con una impresora 3D albergando en su interior una Rabsperry Pi. En este tipo de proyectos se hace necesario el poder utilizar los botones externos para hacer estas acciones.
Lo primero que necesitamos es comprar los botones. Os recomiendo botones de servicio o también llamados «monetarios», os recomiendo que sean los mas delgados y pequeños posibles.
Aquí tenéis un ejemplo, además son muy económicos:
También vais a necesitar para conectar estos botones a la Rabsperry Pi del siguiente cableado «female-male jumper wire» (2 cables por botón):
El jumper hembra irá a la GPIO como voy a detallar mas abajo y el conector macho debe ir conectado a al botón. Para ello lo puedes hacer de varias formas, soldando el cable directamente a la patilla del botón o crimpando el cable con un conector Faston usando una crimpadora.
Por lo tanto deben quedar los cables conectados a cada botón similar a la siguiente imagen
Una vez tengamos nuestros botones con sus correspondientes cables toca conectarlos al puerto GPIO. En la imagen de abajo os pongo como está distribuido el puerto GPIO en una Rabsperry Pi 2/3.
Uno de los cables del botón tiene que ir conectado a tierra y el otro cable a otro puerto cualquiera (que no sea ni tierra ni tenga algún voltaje 5V o 3V).
Por ejemplo podéis conectar uno de los botones al pin número 13 y 14 y el otro botón al pin 33 y 34. MUY IMPORTANTE que recordéis el número de estos pines ya que los tendremos que poner en el script que os voy a detallar mas abajo.
Una vez tengamos los botones conectados tenemos que conectarnos por ssh a la rabsperry pi y ejecutar los siguientes comandos:
Primero instalamos Python que será necesario para ejecutar el script de apagado y reinicio
sudo apt-get install update
sudo apt-get install python-dev
sudo apt-get install python3-dev
sudo apt-get install gcc
sudo apt-get install python-pip
Luego nos descargamos el módulo de Python para controlar el GPIO
wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.11.tar.gz
Lo descomprimimos
sudo tar -zxvf RPi.GPIO-0.5.11.tar.gz
Nos vamos al directorio creado
cd RPi.GPIO-0.5.11
Instalamos el módulo
sudo python setup.py install
sudo python3 setup.py install
Nos creamos una carpeta donde guardaremos nuestros scripts. Va a ver un script para el reset y otro script para el apagado
mkdir /home/pi/scripts
Creamos el script de apagado con nuestro editor favorito
sudo nano /home/pi/scripts/shutdown.py
Y pegamos esto dentro del fichero. Fijaos en el numero del puerto GPIO «13» y la instrucción de apagar el sistema «shutdown – h now»
#!/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(13, GPIO.IN, pull_up_down = GPIO.PUD_UP)
oldButtonState1 = True
while True:
#grab the current button state
buttonState1 = GPIO.input(13)
# 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)
Nos creamos ahora el script de reiniciar la Pi.
sudo nano /home/pi/scripts/reboot.py
Y pegamos esto dentro del fichero. Fijaos que el puerto GPIO es el «33» y que la sentencia es la de reiniciar el sistema «shutdown – r now»
#!/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(33, GPIO.IN, pull_up_down = GPIO.PUD_UP)
oldButtonState1 = True
while True:
#grab the current button state
buttonState1 = GPIO.input(33)
# check to see if button has been pushed
if buttonState1 != oldButtonState1 and buttonState1 == False:
subprocess.call("shutdown -r now", shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
oldButtonState1 = buttonState1
time.sleep(.1)
Ahora tenemos que reiniciar
sudo reboot
Para que nuestros script se ejecuten cuando arranque el sistema operativo tenemos que editar este fichero
sudo nano /etc/rc.local
Y añadir estas dos lineas al final del fichero (antes de la instrucción exit)
sudo python /home/pi/scripts/shutdown.py &
sudo python /home/pi/scripts/reboot.py &
Reiniciamos y ya tenemos operativos nuestros 2 botones de power y reset
sudo reboot