Antes de divertirme ocupándome de partes verdaderamente robóticas he tenido que encarar una cuestión importante relacionada con la alimentación de SAM-Z. Como anticipé en mi primer artículo, el cerebro del robot es una Raspberry PI 3, una verdadera computadora mono-tarjeta. Por lo tanto, para apagar el robot, no se puede cortar la alimentación directamente, sino que es necesario hacer antes el shutdown automatico.
El shutdown cierra en modo ordenado todos los procesos activos, desconecta memorias y periféricos y al final pone a dormir el microprocesador. Después del shutdown, que puede durar entre 10 y 20 segundos, podemos interrumpir la alimentación sin problemas. Si no hiciéramos el shutdown se corre el riesgo de corromper sectores del sistema operativo y que la Raspberry deje de funcionar. En el caso de SAM-Z, el shutdown debe ser automático, es decir, se debe anticipar automáticamente al corte de la alimentación. Existen dos condiciones que apagan el robot: la primera es cuando se acciona un simple interruptor ON/OFF que se encuentra debajo del robot, la segunda es en caso de emergencia, cuando la batería se ha descargado.
El sistema de apagado necesita de una parte electrónica y también de un programa que activa el shutdown en la raspberry. Primero veamos la parte electrónica. La figura siguiente representa un diagrama a bloques del sistema.
A la izquierda en alto, tenemos el cargador de baterías que puede ser simplemente una fuente de alimentación y que depende de la batería usada, en mi caso una de 12V ácido/plomo (espero de reemplazarla dentro de poco con una de litio). He indicado la conexión con una línea punteada porque durante la operación del robot el cargador puede estar desconectado. El diodo en esta línea del cargador sirve para evitar que pueda circular corriente al contrario si el cargador está apagado. A la derecha en alto tenemos la batería que alimenta el robot. Como se observa, para que el robot funcione es necesario que el relé en bajo a la derecha esté activado.
Cuando el interruptor ROBOT On / Off se cierra, llega tensión de la batería (12V) al comparador y este pone su salida a nivel lógico alto. Este nivel alto carga inmediatamente el capacitor interno del módulo delay y activa el relé que da alimentación al robot. El convertidor DC-DC sirve para alimentar la raspberry con 5V. Cuando el interruptor se abre, la salida del comparador pasa a nivel lógico bajo, advirtiendo inmediatamente a la raspberry de hacer el shutdown mientras que el módulo delay, gracias a la carga del capacitor, mantiene alimentado el relé por un minuto, dando tiempo a la ejecución completa del shutdown antes de cortar la alimentación.
El comparador tiene una segunda función: si la batería se descarga, el comparador activará el apagado del robot automáticamente. El umbral de detección de batería descargada se regula con el preset "threshold". Gracias a este sistema, el apagado correcto de la raspberry está siempre garantizado.
Aunque si parte del sistema electrónico podía ser hecho con un microcontrolador, he preferido usar electrónica discreta. Lo he dividido en dos plaquetas: una principal y una con el comparador. Estas son las conexiones:
En la figura siguiente podemos ver el circuito del comparador que usa el LM393. He tratado de hacerlo lo más simple posible, sin poner capacitares de filtro porque será el software y el resto de la electrónica que se encargará de filtrar posibles interferencias.
El LM339 es doble (una parte no se usa) y sus salidas son OC (open colector) por lo tanto he debido usar un transistor PNP de salida.
El siguiente circuito es el modulo principal de alimentación.
El transistor de abajo es un adaptador de niveles para el shutdown de la raspberry (esta trabaja con lógica de 3,3V), los dos transistores BC548 y BC558 con respectivos componentes periféricos son el temporizador de 1 minuto mientras que el transistor BC337 controla el relé. El tiempo de 1 minuto está determinado por el capacitor de 100uF y la resistencia de descarga de 470K Por último el convertidor DC-DC de 5V sirve para alimentar la Raspberry PI. Este convertidor es de 2A aunque si el consumo real de la raspberry PI está por debajo de 0,5A.
El software
El programa que se encarga de hacer automáticamente el shutdown lo he escrito en Python y este es el código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as io
import time
import os
power_in = 23
io.setmode(io.BCM)
io.setwarnings(False)
io.setup(power_in,io.IN)
shutdown_countdown = 10
while True:
if io.input(power_in):
shutdown_countdown -= 1
if shutdown_countdown < 0:
os.system("sudo shutdown -h now")
shutdown_countdown = 10
else:
shutdown_countdown = 10
time.sleep(1)
Para evitar interferencias o falsas alarmas, el programa espera 10 segundos con la linea GPI23 a nivel alto (pedido de apagado) antes de activar el shutdown del sistema. Como pueden ver el programa es muy simple.
Para obtener que este programa este siempre activo en background es necesario seguir los siguientes pasos
1. Salvar el programa en la carpeta "pi" con el nombre power_off.py
2. Abrir el terminal y escribir:
sudo leafpad /etc/rc.local
Se abrirá el editor para modificar "rc.local"
3. Antes del renglón con "exit 0" del file rc.local, agregar el siguiente texto:
sudo python3 /home/pi/power_off.py &
No olviden el símbolo "&" al final del renglón.
4. Hacer el reboot.
Bueno, aquí termino este post, agradezco mucho vuestros comentarios, me estimulan para continuar con el proyecto y con las publicaciones. Hasta pronto.
Gabriel
Artículos relacionados:
-SAM-Z: Primera parte
- El robot Calimaro
- El robot SAM
Indice de todos los artículos de Inventable
Los contenidos de este blog son originales y están bajo una licencia Creative Commons BY_NC_ND
Hola, el sistema que pensaste podría usarse para apagar automaticamente una raspi cuando falta la luz con la entrada low conectada a los 14V del cargador en vez de la bateria ¿el programa de detección no bloquea el resto de los puertos si quiero usarlos con otros programas?
Ezequiel
Hola Ezequiel. si no colocas una batería, al cortarse la energía la Raspberry deja de trabajar, así que, ¿cómo haría para reañizar el proceso? No se puede. En cuanto a los puertos, no creo que se bloquee el resto, pero como hasta ahora nunca usé la placa, no puedo asegurarlo. Espera una respuesta más autorizada.
Saludos
Juan
Gracias Juan, yo decía dejando conectada la batería para que alimente la raspi solo durante el apagado, serviría una batería que aguante al máximo un par de minutos.
Ah, ahora sí, no te había entendido, mis disculpas. Eso mismo es lo que pensaba hacer cuando haga el aparato para el cual compré la placa (que todavía ni enchufé 🙁 ).
Sí, lo que propones es totalmente válido y útil. Es más, le sugeriría a Gabriel que se podría hacer un pequeño artículo explotando esa idea. Sería utilísimo para cualquiera que use las Rasp.
Me ofrezco a prepararlo, así me hago famoso 🙂 .
Saludos cordiales,
Juan
Hola Ezequiel (y Juan que me lee también), justamente lo que has pensado es la función principal de la plaqueta con transistores que he desarrollado algunos años atrás para el apagado correcto de la raspberry en un proyecto por encargo. La he modificado ahora para usarla con el robot. El software funciona en ambos casos. No había puesto el proyecto en Inventable porque era parte de mi actividad profesional pero cuando decidí de publicar el desarrollo del robot no podía saltar esta parte (aunque si la aplicación original no era tan evidente).Ya que estamos notarás que la carga del capacitor de 100uF está limitada por una resistencia de 10K (originalmente de 470K) que servía para retardar un poquito el encendido porque algunos monitores eran perezosos cuando llegaba la corriente eléctrica y la raspberry en el boot no los veía. En origen había pensado de usar simplemente un PIC pero no era posible en ese proyecto.
Respecto a tu otra pregunta, el programa de shutdown no bloquea otros programas que usan los puertos, lo he ya comprobado.
Saludos
Gabriel
Buen dato el del monitor, ni se me habría ocurrido. Lo voy a tener en cuenta. Gracias.
Saludos cordiales,
Juan
Vega, no es un poco dura tu expresión «espero una respuesta mas autorizada»? Si Gabriel no fuera competente, vos lo estás? Te invito a que subas la respuesta.
José, no entiendo lo que querés decir.
No te preocupes Juan, es un simple comentario sin sentido de alguien que, evidentemente, no sabe interpretar un texto y para colmo de males cita tu comentario cambiando letras en las palabras, lo que le cambia el sentido totalmente.
Tu dices:
«, pero como hasta ahora nunca usé la placa, no puedo asegurarlo. Espera una respuesta más autorizada.»
Eso invitando a quien hizo la consulta a que espere una respuesta «mejor» que la tuya….
Pero claro, este «José Luis Brini» lo leyó mal, lo interpretó mal, y comentó mal…. En fin, no te hagas drama, que seguro ahora me insulta sin siquiera leer mi comentario…
Saludos
HJ
Hola Héctor: sí, al día siguiente me imaginé cómo venía la cosa, pero de todas formas, lo de «Si Gabriel no fuera competente, vos lo estás?», no lo entiendo ni haciendo fuerza. A lo mejor es que me estoy poniendo viejo, como decía Pablo Milanés 🙂
Un abrazo y felices fiestas!
Juan
También leo, pero en silencio….
¡Hola Héctor! Hace unos minutos pensé en vos porque murió mi querido VB6 (no sé por qué) y me acordé de las idas y vueltas que tuvimos para hacerlo andar en W7. Por suerte lo pude reparar, así que ya está bien.
¿Cómo andás de la vista? Hace rato que no hablamos.
Un abrazo,
Juan
Hola Juan, casi recuperado, todavía un poco sensible a la luz, pero bien.
Que bueno que pudiste resucitar el VB6!!!
Cuando quieras por mail o por whatsapp
Abrazo
HJ
Muchas gracias por las respuestas, otras dos preguntas ¿que batería chica de 12v me aconsejan y que convertidor dc?
Hola Ezequiel, se me pasó tu pregunta. Respecto a la batería estoy pensando de experimentar 3 pilas 18650 ion-litio de 4V con el formato de las pilas chicas y como cargador se encuentran en internet a muy bajo precio pero no se en Argentina donde se consiguen, yo estoy por comprarlos con Amazon. El tema del regulador del convertidor DC estoy usando uno muy pequeño de 2A porque el consumo de la raspberry es mucho más bajo del indicado en el manual. Es todo un tema este del consumo de la raspberry, veo si puedo dar más detalles próximamente.
Gabriel
Excelente proyecto y excelente post, me encantan las ilustraciones. Aunque soy un aficionado a la electronica y no entiendo del todo el funcionamientl de algunos esquemas, me encanta leer cada post que sale de inventables.eu.
Muchas gracias por ir comentando el avance de este gran proyecto.
Un saludo y sigue asi
Fran
Es un gusto Fran, gracias por tus palabras.
Gabriel
Muy bueno y estimulante que compartas estas experiencias che, agradezco el esfuerzo ya que cómo apasionado de estos temas (hobbysta digamos) abren mucho la cabeza a entender y a pensar proyectos personales! 🙂
Saludos!