Circuito para apagar de forma segura Raspberry Pi

Quiero usar una Raspberry Pi como servidor XBMC en el automóvil. Los documentos de XBMC dicen que siempre debe usar el comando de apagado antes de desconectar la alimentación. No quiero tener que (decirle a mi esposa) iniciar sesión en el Pi y apagarlo antes de apagar el automóvil; quiero poder

He estado pensando que debería ser posible crear un circuito simple con un capacitor y probablemente un diodo para detectar cuándo se desconectó la fuente de alimentación (y generar una interrupción en uno de los pines GPIO), pero el capacitor proporcionaría corriente el tiempo suficiente para que el sistema se apague correctamente.

¿Parece esto correcto y suficiente?

segundo borrador

El circuito será alimentado por una batería de automóvil - 12.6 a 11.7V. El Raspberry Pi toma 5V (5.25 a 4.75V) y consume 700-1200mA. Todavía no lo he cronometrado, pero supongo que el proceso de apagado probablemente tarde alrededor de 5 segundos.

Así que supongo que lo que necesito saber es:

  • ¿Qué tipo de capacitor necesitaría para almacenar suficiente carga para mantener el Pi funcionando el tiempo suficiente para que XBMC se apague correctamente?

  • Dado que el puerto GPIO de Rasperry Pi toma 3.3V, ¿cuál es el mejor comparador/amplificador operacional para usar (supongo que podría usar un par de resistencias para reducir la salida de 5 a 3.3)

  • ¿Habría algún beneficio en tener la línea GPIO normalmente alta o normalmente baja?

Este IC: linear.com/product/LTC2935 podría ser de su interés.
Según la respuesta a continuación, en concepto, su idea está bien, pero requerirá mayúsculas muy grandes. También podría considerar encender el Pi desde algo encendido todo el tiempo, luego simplemente use el encendido para iniciar un apagado y tal vez un temporizador para obtener energía por completo después de un minuto más o menos.
Esa es una buena idea @PeterJ, probablemente sería mucho más barato. ¿Podría dar más detalles sobre eso en forma de respuesta?
En lugar de alimentar el RPi desde un condensador durante varios segundos después de apagar el encendido, creo que probablemente tenga más sentido usar un relé controlado y alimentado por un 555 para cambiar a la batería. Creé otra pregunta: electronics.stackexchange.com/questions/61877/…

Respuestas (4)

Una estrategia alternativa sería encender la Raspberry Pi continuamente y usar la línea de encendido para iniciar la secuencia de apagado. Lo hice en el pasado, pero con sistemas en los que la solución exacta no se aplicaría a un Pi, pero en general:

Use un convertidor DC-DC para obtener la mejor eficiencia, hay muchos ejemplos, pero el siguiente es un ejemplo de algo que sería conveniente de usar y puede suministrar 1A a 5V desde una entrada de 6.5V a 32V:

http://www.digikey.com/product-detail/en/V7805-1000/102-1715-ND/1828608

El suministro de un automóvil puede ser bastante duro, por lo que es posible que desee usar un diodo TVS de 30 V en la entrada para protegerse contra picos con un diodo Schottky grueso con el ánodo en tierra y el cátodo en la entrada de 12 V para proteger contra voltajes negativos junto con cualquiera un fusible normal o un fusible reiniciable PTC en serie con la conexión entre la alimentación del automóvil y su sistema. De lo contrario, es posible que pueda 'piratear' un automóvil a un cargador USB que ya debería tener todo eso en su lugar.

No estoy seguro de lo que dibuja una Raspberry Pi en modo inactivo normal, pero presumiblemente muy por debajo de 500 mA, que es el máximo que puede suministrar USB y más probablemente 100 mA. Digamos que está usando 100mA a 5V que estará por debajo de 50mA a 12V usando ese circuito, una batería de automóvil normalmente es del orden de 50Ah, por lo que tomaría alrededor de 20 días agotar la batería al 50%. Si el automóvil se usa con regularidad, probablemente no haya necesidad de ir más lejos, y es posible que pueda dejarlo funcionando y simplemente apagar los periféricos que no esté usando.

De lo contrario, para detectar el cambio de encendido de cualquier manera y ambos informar al Pi que debe apagarse y luego desconectar la alimentación un minuto más tarde, la forma más práctica es probablemente usar un microcontrolador externo que controle un FET. Se puede hacer con una lógica discreta, pero también debe asegurarse de que se vuelva a aplicar energía cuando el encendido suba, por lo que no es un ejercicio del todo trivial, pero los costos de las piezas serán más bajos que usar una tapa grande.

Gracias, su respuesta me llevó a buscar en Google "controlador de apagado raspberry pi". Estaba mirando este por $42 pero luego encontré este diseñado específicamente para Raspberry Pi, y solo cuesta $15 y tiene uno diseñado para usar en un automóvil.
Raspberry Pi Model A toma 300ma (+ 100ma max en cada puerto usb), mientras que Model B toma 700ma.
Lo que también puede hacer es simplemente conectar un botón y ejecutar una aplicación de python cada vez que se enciende su raspberry pi. Luego, en la aplicación python, use la función de botón os ("detener") para simplemente apagar su raspberry pi. Eso es lo que hice y funciona bien. Sin embargo, no sé cómo funcionaría eso con XBMC.

No estoy íntimamente familiarizado con el comportamiento de la Raspberry Pi para el apagado y el uso de energía, por lo que confiaré principalmente en los números que proporcionó y dejaré las fórmulas.

La curva de descarga exponencial que muestra es para un circuito de resistencia-condensador, pero el regulador lineal hace que las cosas actúen de manera un poco diferente. Suponga que el RPi siempre consume la corriente máxima que indicó: 1200 mA. En este caso, esa corriente siempre fluye a través del regulador y la resistencia efectiva del circuito cambia constantemente (disminuye) a medida que se descarga el capacitor. Esto es cierto siempre que estemos en el rango operativo del regulador lineal, lo cual está bien porque necesitamos que el RPi se apague antes de llegar a esa región.

La ecuación diferencial de un capacitor es:

yo = C d V d t
que se puede reorganizar para resolver para C:
C = yo d t d V

  • I es simplemente la corriente promedio para el RPi. En este caso, supondremos que es de 1200 mA o 1,2 A.
  • dt es el tiempo que tarda en apagarse el RPi. Usando su ejemplo, esto es 5 s.
  • dV es el cambio en el voltaje del capacitor. Asumiremos que el voltaje inicial es el voltaje especificado más bajo de 11,7 V y que el voltaje final es 7,0 V. Estoy configurando el voltaje final en 7,0 V porque el regulador lineal 7805 requiere un margen de dos voltios para un funcionamiento adecuado (5,0 V). V + 2,0 V = 7,0 V). Esto hace que dV = 11,7 V - 7,0 V = 4,7 V.

Esto da el siguiente resultado:

C = 1.2 A 5 s 4.7 V = 1.28 F

Sí, eso es 1,28 faradios (aquí no hay micro ni mili). Esto probablemente implicaría comprar varias tapas de bajo voltaje y colocarlas en serie

Entonces, el otro problema es su circuito: no funcionará de la manera que desea, porque la única forma en que la entrada positiva del comparador se acerca al voltaje de entrada negativo (para que la salida pueda cambiar) es cuando su voltaje de entrada ya esta muerto Tal como fue diseñado, el comparador nunca cambiaría.

Lo que quiere hacer es medir su voltaje de entrada, antes de los condensadores y el diodo, y comparar ese voltaje con una "referencia" que puede configurar con un potenciómetro. Vea el circuito de ejemplo a continuación:

esquemático

simular este circuito : esquema creado con CircuitLab

Tienes razón: quise alimentar la entrada positiva del comparador desde el otro lado del diodo D1. Necesito el pin GPIO para activar una interrupción en el momento en que se desconecta el suministro de 12 V (la radio y los accesorios están apagados). ... Entonces, el voltaje de referencia es 0, ¿no es así? ¿Cuál es el propósito del diodo TVS?
Tengo varios de estos aquí, ¿serían perfectos para este trabajo? i.ebayimg.com/images/g/lF8AAOSwBP9UYdRb/s-l300.jpg
@danbru No tengo idea, es una imagen, no una hoja de datos. Si cree que sus capacitores de eBay son realmente de 1.5F a 5.5V, aún necesitará poner varios en serie y en paralelo para obtener la capacitancia que necesita.
@W5VO, ¿hay alguna manera fácil de probar la capacitancia?

Nota: la siguiente respuesta se escribió asumiendo que solo el uso del sistema de archivos de una tarjeta SD podría corromperse. Desde entonces, ha salido a la luz una gran cantidad de evidencia anecdótica que sugiere que el estado interno de las propias tarjetas SD, por debajo del nivel de cualquier sistema de archivos , está potencialmente en riesgo de corrupción debido a una pérdida de energía inoportuna, algo que puede no ser posible solucionar en nivel del sistema de archivos.


Me sentiría tentado a buscar un enfoque completamente diferente, uno de resolver el problema en su origen. Esencialmente, no hay nada fundamentalmente malo con simplemente sacar la energía del pi; el problema es un estado del sistema de archivos potencialmente no comprometido que conduce a la corrupción del sistema de archivos y la posterior falla de arranque hasta que repare / vuelva a crear una imagen del volumen.

Pero esto es algo que se puede solucionar en el lado del software, mediante alguna combinación de:

  • Cree más particiones en la tarjeta SD y nunca monte la partición de arranque o del sistema operativo en modo de escritura. Si quiere ir un paso más allá, nunca escriba nada en la tarjeta SD, guarde todos sus datos mutables en una memoria USB.

  • Utilice un sistema de archivos de diario para almacenar datos que realmente se modificarán en funcionamiento.

  • Simplemente tenga a mano una tarjeta de respaldo, opcionalmente, esto podría ser un esquema automático de respaldo y recuperación desde una tarjeta conectada con una regla en la que solo una de las tarjetas puede montarse para escritura en un momento dado (combinado con la primera regla del arranque/sistema operativo las particiones nunca se pueden escribir)

En última instancia, todo se reduce a una cuestión de filosofía de diseño: la elección entre:

A) Un sistema delicado que debe protegerse de la pérdida de energía para que no sufra corrupción

o

B) Un sistema diseñado de tal manera que una pérdida de energía inesperada no pueda resultar en una corrupción irrecuperable.

La mayoría de los sistemas integrados están más en la línea de (B).

Las particiones separadas en una tarjeta SD con algunas de solo lectura no resolverán el problema por completo. La nivelación de desgaste en las tarjetas SD puede destruir CUALQUIER bloque en la tarjeta (cuando está intercambiando bloques). Esta nivelación de desgaste está completamente oculta en el SD y no hay forma de controlarla. De hecho, con la partición del sistema de archivos de solo lectura, tendrá los recuentos de escritura más bajos y será el objetivo principal con el que intercambiar cuando se nivele el desgaste.
Por cierto, he llegado a la conclusión de que es imposible diseñar soluciones integradas sólidas para tarjetas SD a menos que pueda garantizar apagados limpios. La especificación realmente apesta para los casos de uso incrustados... lo cual, dada la cantidad de incrustados que ESTÁN integrados, es una situación bastante triste.
@darron: Es triste, dado que los problemas podrían haberse evitado de muchas maneras. Por ejemplo, la especificación podría haber especificado un comando de "apagado" y requerir que cualquier dispositivo pueda ponerse en un estado seguro dentro de, por ejemplo, 250 ms después de recibirlo. Creo que la mayoría de las implementaciones prácticas de tarjetas SD no habrían tenido problemas con tal especificación incluso si el comando de apagado se produjera en medio de una operación de "desfragmentación en segundo plano" que hubiera tardado unos minutos en completarse.
@darron: fue específicamente debido a estos problemas de partición cruzada que mencioné la posibilidad de nunca escribir en la tarjeta SD.
Cuando se apaga correctamente, XBMC guarda el punto actual de la canción/película que se está reproduciendo en el disco para que pueda continuar desde el mismo punto cuando se reinicia. Realmente me gustaría evitar "Papá, ya hemos visto esta parte, ¿puedes detenerte y avanzar rápidamente hasta la parte donde ese hombre hace la cosa?"

Como han señalado otros, hay algunos problemas con los circuitos propuestos hasta ahora, y también puede obtener un condensador lo suficientemente grande como para sostener el suministro. Si está dispuesto a construir un pequeño circuito, podría considerar un controlador de encendido/apagado de encendido con enclavamiento que funciona con un botón. Para APAGAR el servidor XBMC, puede presionar un botón que indique que Pi se apague, luego podría hacer lo que necesita para un apagado limpio y ordenado, luego emitir una señal GPIO al circuito que se apaga a sí mismo. Eso le da al RPi todo el tiempo que necesita para hacer cosas como apagar de manera segura la tarjeta SD. El circuito no tiene que ser tan complejo como un relé y un temporizador.

Aquí hay un circuito simple para hacerlo , que usa solo un mosfet dual como controlador. El circuito se describe en la página web.