Configurar apagado y reinicio desde botón en Rabsperry Pi

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
Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.