Cómo agregar un botón de encendido/apagado a la Raspberry Pi


Siempre debemos apagar con  seguridad nuestra Raspberry Pi ,pues de lo contrario nos exponemos  a perder  el sistema de arranque y  tener que volver  a  crear una  imagen  con todo el trabajo que esto conlleva  respecto a las personalizaciones que tanto nos gustan
Raspberry Pi no cuenta con   un pulsador de encendido para intentar competir con su clones  y de este modo  mantener el precio «bajo»,  aunque  sin embargo, es muy fácil  añadir  el suyo propio  como vamos a ver en este post donde añadiremos un botón de encendido a su Raspberry para que puede encender o  apagar esta con total de seguridad .
No nos bastara añadir el pulsador pues tendremos  que usar unos scripts que vigilen  dos pines GPIO (general entrada/salida) en el Pi para que cuando se presione el botón activar o desactivar el  Pi.

 

raspberrypi

¿Por qué es importante un botón de encendido ?

Como comentábamos  nunca deberíamos «tirar» del cable de alimentación de su Raspberry Pi pues esto puede conducir a la corrupción de los datos graves (y en algunos casos, dañar físicamente tu tarjeta SD) pues para ello se puede cerrar con seguridad el Pi a través de un comando de consola (shutdown)  o por supuesto también  desde el propio interfaz gráfico de Raspian (shutdown)

Veamos  ahora como podemos añadir un pulsador  pero entes tenemos que entender cómo despertar la Raspberry Pi de un estado de suspensión antes de construir la funcionalidad de apagado.

Una manera fácil de comprobarlo es apagando  con sudo shutdown -h now y conectando los pines 5 y 6 con un cable hembra a hembra. Sólo necesitará cortarlo momentáneamente y entonces usted debe encontrar que la Raspberry Pi se «despertó».

En este punto es interesante destacar que cuando «apaga» el Pi, lo enviará en un estado de suspensión, lo cual significa  que sigue consumiendo una cantidad muy pequeña de  energía ( muy  similar a cómo todos modernos equipos trabajo cunado quedan en stand-bye).

Lógicamente  si  agrega un botón de encendido podrá tanto detener como despertar el Pi de un estado detenido, pero si su Raspberry Pi se ha apagado, usted puede desconectar de forma segura la fuente de alimentación  sin la preocupación de corrupción de datos.

 

El equipamiento hardware como vemos es muy sencillo pues basta dos cablecillos que conectaremos en los pines 5 y 6  de la Raspberry PI del conector de expansión( justos los dos de la tercera columna empezando por la drecha)

IMG_20181018_224306[1].jpg

 

Sencillamente, si se cortocircuitan entre sí los pines 5 y 6 (GPIO3 y GND) se pondrá nivel bajo el pin correspondiente al GPIO y podremos actuaren consecuencia con la Raspberry Pi

Obviamente el cortocircuito lo sustituiremos por un pequeño pulsador normalmente abierto  que conduciremos con dos cablecillo  a los pines 5 y 6  de nuestra Raspbery Pi

 

IMG_20181018_224929[1]

Finalmente sujetaremos el pulsador con cinta de doble cara , pegándolo o practicando un agujero al contenedor de la Raspberry Pi

 

IMG_20181018_225410[1]

 

 

La solución de sleep es bastante sencilla, pero para cerrar con seguridad el Pi vamos a tener que utilizar una solución de software. Ya que sabemos que vamos a utilizar los pines 5 y 6 para el Pi, vamos a usar estos pines para apagarlo tambien . Tanto así que podemos conectar nuestro botón a los alfileres y se concluirá y despertar la Pi.

Vamos a tener que escribir un script que escuche una pulsación y  cierre el Pi. Antes nos fijamos en la secuencia de comandos, vamos a discutir algunos enfoques diferentes. En primer lugar, podríamos escribir un script que inicie un bucle infinito y espere un cambio en el estado de los pines GPIO.

Usando  seudo-código, podría ser algo como:

while True:
    if GPIO3 is pressed:
        shutdown the pi

Mientras que esto funcionaría y probablemente no tenga problema de rendimiento real, hay realmente una manera mejor:podemos escuchar  una interrupción (un cambio de estado de bajo a alto o alto a bajo) que interrumpa  el procesador para qeu realize uan determinada accion .

Afortunadamente la biblioteca de RPi.GPIO proporciona un método llamado wait_for_edge que bloqueará la ejecución de nuestro script hasta que se detecte una interrupción. Así configuramos GPIO3 y una vez que detectamos un borde de caída vamos a apagar el Pi.

Entonces, vamos a usar un script llamado listen-for-shutdown.py.

Para crear el script, podemos usar el editor nano asi  que después de conectar con el Pi, ejecute el siguiente comando para crear este

sudo nano listen-for-shutdown.py

Luego, pegue el código siguiente en el archivo y pulse CTRL-X y salida, Y para guardar cuando se le solicite.

#!/usr/bin/env python


import RPi.GPIO as GPIO
import subprocess


GPIO.setmode(GPIO.BCM)
GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.wait_for_edge(3, GPIO.FALLING)

subprocess.call(['shutdown', '-h', 'now'], shell=False)

A continuación necesitamos poner este script en el arranque por lo que  deberemos copiar el script en lar uta de  usr y hacerlo ejecutable , acciones que haremos con los dos siguintes comandos:

sudo mv listen-for-shutdown.py /usr/local/bin/
sudo chmod +x /usr/local/bin/listen-for-shutdown.py

Pero este script solo apagaria la placa  y nosotros queremso tambien qeu se pueda arrancar pulsando el boton por lo que  añadiremos otro script llamado listen-for-shutdown.py: que e enciende/apaga nuestro servicio.

Para crear el script  escriba  la secuencia de comandos:

sudo nano listen-for-shutdown.sh

Introduzca el código siguiente en el archivo y guárdelo:

#! /bin/sh

### BEGIN INIT INFO
# Provides:          listen-for-shutdown.py
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

# If you want a command to always run, put it here

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting listen-for-shutdown.py"
    /usr/local/bin/listen-for-shutdown.py &
    ;;
  stop)
    echo "Stopping listen-for-shutdown.py"
    pkill -f /usr/local/bin/listen-for-shutdown.py
    ;;
  *)
    echo "Usage: /etc/init.d/listen-for-shutdown.sh {start|stop}"
    exit 1
    ;;
esac

exit 0

 

Ahora necesitamos coloque este archivo en /etc/init.d y hacerlo ejecutable, acciones que haremos con los dos siguientes comandos.

sudo mv listen-for-shutdown.sh /etc/init.d/
sudo chmod +x /etc/init.d/listen-for-shutdown.sh

Ahora registramos la secuencia de comandos para ejecutar en el arranque y le pasaremos el parámetros de arranque con los dos siguientes comandos.

sudo update-rc.d listen-for-shutdown.sh defaults
sudo /etc/init.d/listen-for-shutdown.sh start

 

Seguro querido lector que por lo menos la próxima vez que desconecte su Raspberry de forma violenta recuerda que podría haber puesto un botón para hacer el apagado seguro…  Y por cierto si tiene una Orange Pi u otro clon , este sencillo truco le puede servir tambien..

 

 

Fuente  howchoo.com

31 respuestas a “Cómo agregar un botón de encendido/apagado a la Raspberry Pi

  1. israel alvarado May 25, 2019 / 8:29 am

    amigo para la ultima version de rasbian strech sirve? o para la version pc? de rasbian, te agradeco saludos

    Me gusta

    • soloelectronicos May 27, 2019 / 8:02 am

      Por supuesto que debe funcionar con versiones anteriores . Yo lo tengo probado con Raspbian Stretch with desktop and recommended software

      Me gusta

  2. Yuli May 28, 2019 / 8:57 pm

    Hola disculpa puedo utilizar otro conjunto de pines, por ejemplo el GPIO 27 (pin 13) y GND (pin 14) ?

    Me gusta

    • soloelectronicos May 28, 2019 / 10:36 pm

      Por supuesto siempre que en el script listen-for-shutdown.py cambie el valor del puerto 3 por el qeu desee ( y conecte el cable del pulsador a dicho otro pin)

      Me gusta

  3. Lucas septiembre 15, 2019 / 8:04 am

    Hola.
    ¿No sería necesario el uso de una resistencia?
    Gracias

    Me gusta

    • soloelectronicos septiembre 15, 2019 / 11:23 pm

      NO es necesario gracias a que la Raspberry Pi ( en todas sus versiones ) ya incuyen las resistencias de pull-up para lso pines de salia del GPIO dentro de la propia placa

      Me gusta

      • Lucas septiembre 16, 2019 / 7:59 am

        Muchas gracias por la respuesta!!!! Duda aclarada

        Me gusta

  4. McNuel diciembre 10, 2019 / 8:51 pm

    Hola. Lo primero agradecerte el artículo. Lo estoy siguiendo al pie de la letra (creo), pero no me funciona correctamente: sólo funciona la primera vez que inicio (start) el script. Después no he conseguido que sea automático.
    Cuando ejecuto la orden » sudo update-rc.d listen-for-shutdown.sh defaults» me da como que el script está roto (incomplete SLB comment) y le falan parámetros. ¿Puedes echarme una mano?
    Gracias.

    Me gusta

  5. Mike Grins May 7, 2020 / 1:22 am

    corre perfecto! muchas gracias

    Me gusta

  6. Arnau May 10, 2020 / 12:04 pm

    Buenas,
    Tengo una placa AML-S805X-AC con debian y 40 pines igual que raspberry. He instalado la librería RPi.GPIO pero solo es compatible con raspberry, por falta de experiencia no se como hacer un código equivalente sin el uso de la librería.

    Lo he probado en raspberry y funciona perfectamente.

    Arnau

    Me gusta

    • soloelectronicos May 11, 2020 / 12:39 am

      No me sorprende que la libreria del GPIO solo funcione con las rasberry Pi pues es un sw claramente dependiente del chioset de I/O que no creo sea el mismo..

      Me gusta

  7. Miguel Esocbar May 21, 2020 / 1:34 am

    Muchas gracias por el post, tengo una pregunta: me funcionó a la perfección, pero por ciertos motivos tuve que cambiar el botón a gpio21 e hice este cambio al listen-for-shutdown.py pero solo me funciona para apagarlo mas no para encenderlo porque se sigue haciendo con el gpio3.

    lo intenté hacer todo desde cero pero no funcionó, alguna sugerencia?

    Me gusta

    • soloelectronicos May 21, 2020 / 9:21 am

      Es raro, ¿ha probado con otro pin que tenga libre? ¿ha cambiado entiendo en las dos lineas del script por el pin del GPIO ? Es decir: GPIO.setup(GPIOX, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.wait_for_edge(GPIOX3, GPIO.FALLING)

      Me gusta

      • Miguel Esocbar May 22, 2020 / 4:59 am

        Hola, gracias por responder

        Sí, ya lo intenté con otro pin y pasa lo mismo: solo se apaga con el pin que cambio en las líneas que dices pero sólo se enciende con el GPIO3, es raro porque creo que no hay rastro del script anterior, incluso seguí las instrucciones de des-instalación que hay en howchoo.com

        no sé que estoy haciendo mal

        Me gusta

  8. Leonardo Velazquez May 28, 2020 / 8:57 pm

    buenas tardes a mi me sucede lo mismo para que la raspberry encienda necesita forzosamente en el gpio3, a pesar de que el script sea modificado por otro gpio, alguna sugerencia?
    gracias por la aportación

    Me gusta

    • soloelectronicos May 28, 2020 / 11:57 pm

      Pues esta claro que los cambios no son efectivos , asi que esta claro que el firmware lo ha reservado exclusiva para esta funcion al menos en el proceso de arranque o es simplemente un bug de este

      Me gusta

  9. Jose julio 7, 2020 / 1:48 am

    Buenas a todos, me ha encantado, voy a ponerme manos a la obra, por otro lado pregunto porque compré un boton tactil pensando en hacer pruebas y tiene una lucecita azul al encenderse, tengo una raspberry pi 3B y una 3B+, podría funcionar con este tipo de script? el tema es que el boton tiene 3 pines (VCC, GND y OUT). Gracias de antemano!!

    Me gusta

    • soloelectronicos julio 7, 2020 / 11:57 am

      Creo que debería de funcionar pues de hecho si la salida es TTL y la entrada del GPIO de la Raspberry también no debería haber mayores problemas..

      Me gusta

      • Jose julio 7, 2020 / 1:48 pm

        Perfecto, lo voy a probar y comento, por otro lado como el boton tiene 3 pines donde conecto el tercero? En el 1 de la GPIO que es positivo de 3,3V si no recuerdo mal? Gracias por responder tan rapido

        Me gusta

  10. Jose julio 7, 2020 / 5:35 pm

    Buenas de nuevo, he comprobado que funciona perfectamente con un pulsador, pero al probar con el botón táctil no ha habído manera de que reaccione la raspberry, lo he conectado de la siguiente manera, «OUT a pin 5 y GND a pin 6», el botón de por si, lleva una luz y cuando lo pulso esta reduce la intensidad por 3 segundos, lo cual no entiendo por que no funciona, ya que supuestamente el pulsador reconoce bien que lo he pulsado y la placa con un pulsador común reacciona satisfactoriamente.
    Creo que hay algo que no hago bien, pero no caigo.
    Saludos!!!

    Me gusta

    • soloelectronicos julio 8, 2020 / 12:01 am

      El problema se debe a que el script espera un cero logico , pero el pulsador tactil esta mandando un uno logico…

      Me gusta

      • Jose julio 26, 2020 / 9:20 pm

        Buenas!
        Perdon por no contestar antes y gracias por la información.
        Finalmente he hecho uso del tactil para otro proyecto y he puesto un pulsador, ahora bien, se me ha planteado otra duda de la cual tampoco he encontrado respuesta por ningún lado y cuando se ha comenta en algún foro ha acabado en nada, así que creo que puede que no tenga solución pero ya solo por si alguien lo sabe para confirmar.
        Al hacer el apagado en modo seguro con el pulsador la raspberry queda en stand by (Aunque he encontrado foros donde se ha cuestionado bastante esto tambien, ya que algunos dicen que no queda en stand by, pero según mi percepción que no digo que tenga razón ni mucho menos, si la placa carga datos de sistema y configuraciones y queda a la espera de activarse al uso de un pulsador por medio del script que hemos incluido mi opinion es que está en stand by), por lo cual quiero pensar que habrá una carga de datos de sistema que le indica como actuar al igual que la configuración de la bios de un pc al recibir corriente.
        Explicado esto, lamento la magnitud del mensaje, mi pregunta es la siguiente, ¿Hay alguna configuracion o script para que la raspberry no arranque en caso de que pierda la entrada de corriente y luego vuelva, como por ejemplo un apagón?, ya que al añadirle el pulsador tanto para que encienda y apague la idea es no tener que desconectarla de la toma de corriente o añadir un interruptor a la entrada de corriente, pues esto anularía la configuración de encendido a través de un pulsador ya aplicada.

        Doy la gracias de antemano y pido disculpas si el mensaje es demasiado largo.

        Un saludo!!

        Me gusta

      • soloelectronicos julio 28, 2020 / 12:35 am

        Estimado Jose basicamente el script apaga ordenadamente el so mediante subprocess.call([‘shutdown’, ‘-h’, ‘now’], shell=False), pues de hecho se puede comprobar ue si pone un amperimetro en serie con la alimentacion DC el consumo en ese estado pas a ser muy pequeño, de modo que si pulsa nuevamente podemos «despertar» a nuestra RP, Claro el problema esta en que si estando en estado de suspensión, pierde la alimentación perdemos el estado anterior justo antes de pulsar el apagado y por tanto la placa arrancara de forma abrupta como si hubiésemos apagado «a las bravas» dejando corrupto posiblemente el sistema de ficheros. Una solución para evitar el problema es muy simple: conectar una pequeña bateria en paralelo con la alimentación para que caso de falta de alimentación se mantenga la configuración hasta que precisamente vuelva la alimentación

        Me gusta

  11. Jose julio 28, 2020 / 1:06 am

    Perfecto,
    Ahora que lo comentas me doy cuenta de que no he caido en una alimentacion que de energía para mantener el estado al igual que se hace con una placa madre en pc. Doy por hecho que si la bateria debe ir en parlelo deberá ser de 5V y no será valida la tipica pila de motherboard ya que son de 3V si no recuerdo mal.

    Gracias por la aclaración!!
    Un saludo!

    Me gusta

    • soloelectronicos julio 28, 2020 / 10:33 am

      En efecto ,yo creo que la solución mas barata podría usar una batería externa de 5v con conectores USB usadas para cargar móviles ( les llaman power bank).
      Yo la usuaria a modo de SAI o UPS ,es decir para usarla en flotación con la alimentación principal, de modo que cuando falte el suministro del cargador , la batería alimente directamente a la Raspberry Pi

      Me gusta

      • Jose julio 28, 2020 / 10:44 am

        Exactamente, igualmente tambien he visto que venden varios tipos de baterias que van integradas en una pequeña placa, las cuales hacen la misma funcion y como se trata de que mantenga energia para la configuracion son mas que suficientes, ya que un powerbank puede ser un poco mas aparatoso y la idea principal es aprovechar el tamaño reducido que ofrece esta placa, de ahí mi idea de si se podría añadir una pila de 3V como una placa base de pc, pues solo preciso que mantenga la configuracion programada no hacer uso de la placa sin alimentacion externa.
        Gracias y un saludo!

        Me gusta

  12. Xavier Gonzalez septiembre 28, 2022 / 8:22 am

    buenas para informarte que esta interesante el post solo que tengo un inconveniente le puse el gpio 17 para no usar el 3 y entonces solo enciende normalmente sin tener que presionar el pulsador y luego de un tiempo se apaga por si solo a que se debe mi problema?

    Me gusta

    • soloelectronicos septiembre 28, 2022 / 2:31 pm

      Creo, si no recuerdo mal , que por el modo en que esta implementado en el hw, solo se puede usar el puerto gpio3 ¿ha probado con el puerto 3 ?.

      Me gusta

      • Xavier Gonzalez octubre 5, 2022 / 11:50 pm

        si lo cambie al gpio3 pero cabe mencionar que funciona bien un momento pero luego de un cierto tiempo como que se me apaga automáticamente, que puede estar provocando el problema?

        Me gusta

Deja un comentario

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