![[IC]Sistema de encendido/apagado para Raspberry Pi [IC]Sistema de encendido/apagado para Raspberry Pi](https://storage.posteamelo.com/assets-adonis/assets/2016/01/11/661-T1p-3UZ4_BO.webp)
Hola genT! Hace ya un tiempo me compré una Raspberry Pi 3 B. A pesar de ser una muy linda placa tanto a nivel de hardware como de software tiene un gran problema y es que si se le corta el suministro de corriente de manera abrupta sin apagar el sistema como corresponde (con el comando shutdown desde la consola por ejemplo) se puede arruinar la memoria SD que almacena el sistema operativo.
Ante este problema me puse a diseñar un circuito capaz de hacer un apagado seguro con un botón coenctado al GPIO. El problema que me encontré era que para volver a encenderla tenía que desconectar y coenctar la fuente de alimentación, algo que a todos seguramente nos va a parecer engorroso. Así que me dispuse a rediseñar el circuito para poder encenderla y apagarla correctamente.

Circuito:

El funcionamiento es muy simple y efectivo. Al presionar el boton POWERON la corriente fluye desde la entrada VIN hacia la base del transistor Q2, el cual se satura y deja pasar la corriente a través de la bobina K1 del relé. Al estar energizada la bobina, el interruptor del relé cambia de posición lo que permite que la corriente se dirija directamente hacia el terminal VOUT. Sin embargo la corriente sigue fluyendo por la bobina del relé mientras haya tensión en la base del transistor Q2, la cual quedó almacenada en el capacitor C1. Cuando está tensión se descarga el interruptor vuelve a desconectarse, cortando la corriente al terminal VOUT. Para que la tensión en el capacitor se mantenga se configura como salida y se pone en alto (3.3v) un terminal del puerto GPIO de la Raspberry Pi, el cual estará conectado en el terminal RPI-1. La corriente saliente del terminal fluye a través del diodo D2 hasta llegar al capacitor C1, logrando así mantener la tensión en el mismo. Del mismo terminal de salida se conecta un led a través de la resistencia R4 para verificar visualmente el proceso.
En cuanto al sistema de apagado, se conecta un botón en el terminal SHUTDOWN que se dirige a través de la resistencia R6 hacia el terminal RPI-2 que estará conectado a un terminal GPIO de la Raspberry Pi configurado como entrada. Dicho terminal posee una resistencia R5 pull-down. La resistencia R6 es por protección.
En el terminal POWEROFF irá conectado un interruptor SPST el cual servirá para descargar instantaneamente el capacitor en caso de ser necesario.
El PDF con el circuito impreso listo para imprimir lo pueden descargar de acá: Vista inferior (pistas) - Vista superior (componentes)

Software
Se debe crear un script en Python que se ejecute inmediatamente después del boot. Este script debe establecer como salida un terminal GPIO y ponerlo en alto y configurar un terminal GPIO como entrada. Para esto último lo mas útil es usar una interrupción en el flanco de subida (cuando la señal pasa de 0 a 1, o en el caso de Python de False a True). Debido al posible ruido eléctrico que pueda ocacionar que salte automaticamente la interrupción sin haber presionado el botón, se agrega un retardo de 1 segundo y se vuelve a comprobar el estado del botón. Si el botón después de 1 segundo sigue presionado, parpadea el led conectado y se procede al apagado seguro del sistema.
El código:
# Importar los módulos para enviar comandos al sistema y acceder al GPIO
import RPi.GPIO as gpio
import os
import time
#Configurar la numeración de pines a como están en la placa
gpio.setmode(gpio.BOARD)
#Configurar el pin 38 como salida en estado alto
gpio.setup(38, gpio.OUT, initial=gpio.HIGH)
#Configurar el pin 37 como entrada
gpio.setup(37, gpio.IN)
#Configura una interrupción cuando se presiona el botón
while True:
@gpio.wait_for_edge(37, gpio.RISING)
@#Delay de 1 segundo
@time.sleep(1)
@#Antirebote/antiruido
@if gpio.input(37) == True:
@@#Parpadea el led 3 veces
@@gpio.output(38, False)
@@time.sleep(0.2)
@@gpio.output(38, True)
@@time.sleep(0.2)
@@gpio.output(38, False)
@@time.sleep(0.2)
@@gpio.output(38, True)
@@time.sleep(0.2)
@@gpio.output(38, False)
@@time.sleep(0.2)
@@gpio.output(38, True)
@@time.sleep(0.2)
@@#Apaga el sistema de forma segura
@@os.system('shutdown now -h')
Nota: Recuerden que en Python es MUY importante poner la identación (tabulaciones). Taringa no me deja poner las tabulaciones así que tienen que ponerlas ustedes mismos. Reemplazen cada @ con una tabulación.
El script lo guardan con el nombre que quieran con extensión .py obviamente y de preferencia en el directorio /home/pi

Configurando el boot
Para que el script se ejecute solo debemos hacer una se pasos.
1) Abrir la configuración de Crontab del usuario root (sudo crontab -e -u root)
2) Agregar abajo de todo la siguiente linea
@reboot sudo python /home/pi/NOMBRE.py
3) Guardar y salir (Ctrl + X → S → Enter)
4) Reiniciar el sistema (sudo reboot)

Una vez hecho esto ya tendremos el script ejecutándose al inicio del sistema.
Espero que les sea útil. Ya estoy desarrrollando un sistema de UPS por si se corta la luz para que le de tiempo a apagarse correctamente sin tener problemas con los datos.
Si te gustó dejá puntos, compartí y comentá!
Saludos!
Espero que les sea útil. Ya estoy desarrrollando un sistema de UPS por si se corta la luz para que le de tiempo a apagarse correctamente sin tener problemas con los datos.
Si te gustó dejá puntos, compartí y comentá!
Saludos!