Circuito para desligar com segurança o Raspberry Pi

8

Quero usar um Raspberry Pi como um servidor XBMC no carro. Os documentos do XBMC dizem que você sempre deve usar o comando shutdown antes de desconectar a energia. Não quero que (diga à minha esposa) faça login no Pi e desligue-o antes de desligar o carro - quero poder

Eu estive pensando que deveria ser possível criar um circuito simples com um capacitor e provavelmente um diodo para detectar quando a fonte de alimentação foi desconectada (e provocar uma interrupção em um dos pinos do GPIO), mas o capacitor forneceria corrente por tempo suficiente para o sistema desligar corretamente.

Isso parece correto e suficiente?

segundo rascunho

O circuito será alimentado por uma bateria de carro - 12,6 a 11,7V. O Raspberry Pi leva 5V (5,25 a 4,75V) e consome 700-1200mA. Ainda não cronometrei, mas acho que o processo de desligamento provavelmente leva cerca de 5 segundos.

Então, suponho que o que eu preciso saber é:

  • Que tipo de capacitor eu precisaria para armazenar carga suficiente para manter o Pi funcionando por tempo suficiente para o XBMC desligar corretamente?

  • Dado que a porta GPIO do Rasperry Pi leva 3,3V, qual é o melhor comparador / amplificador operacional a usar (suponho que eu poderia usar alguns resistores para reduzir a saída de 5 para 3,3)

  • Haveria algum benefício em ter a linha GPIO normalmente alta ou normalmente baixa?

Nicholas Albion
fonte
Este IC: linear.com/product/LTC2935 pode ser do seu interesse.
Bitrex
3
Conforme a resposta abaixo no conceito, sua ideia é boa, mas exigirá limites muito grandes. Você também pode ligar o Pi a partir de alguma coisa o tempo todo, em seguida, basta usar a ignição para iniciar um desligamento e talvez um temporizador para puxar a energia completamente depois de um minuto ou mais.
precisa
Essa é uma boa ideia @ PeterJ - provavelmente seria muito mais barata. Você poderia elaborar isso na forma de uma resposta?
Nicholas Albion
Em vez de ligar o RPi a partir de um capacitor por alguns segundos após o desligamento da ignição, acho que provavelmente faz mais sentido usar um relé controlado e alimentado por um 555 para alternar para a bateria. Eu criei uma outra pergunta: electronics.stackexchange.com/questions/61877/...
Nicholas Albion

Respostas:

4

Uma estratégia alternativa seria alimentar o Raspberry Pi continuamente e usar a linha de ignição para iniciar a sequência de desligamento. Eu fiz isso no passado, mas com sistemas em que a solução exata não se aplicaria a um Pi, mas em geral:

Use um conversor DC-DC para obter a melhor eficiência, existem muitos exemplos, mas a seguir é um exemplo de algo que seria conveniente usar e pode fornecer 1A a 5V de uma entrada de 6,5V a 32V:

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

Uma fonte de carro pode ser bastante dura, então você pode usar um diodo TVS de 30V na entrada para proteger contra picos com um diodo Schottky robusto com o ânodo no solo e o catodo na entrada de 12V para proteger contra tensões negativas junto com um fusível normal ou um fusível reinicializável da PTC em série com a conexão entre a energia do carro e o seu sistema. Caso contrário, você poderá "hackear" um carro no carregador USB que já deve ter tudo isso no lugar.

Não sei ao certo o que um Raspberry Pi desenha no modo ocioso normal, mas presumivelmente bem abaixo de 500mA, que é o máximo que o USB pode fornecer e, provavelmente, 100mA. Digamos que ele esteja usando 100mA a 5V e estará abaixo de 50mA a 12V usando esse circuito, uma bateria de carro é normalmente da ordem de 50Ah, de modo que levaria cerca de 20 dias para drenar a bateria para 50%. Se o carro estiver em uso regular, provavelmente não há necessidade de ir mais longe, e você poderá deixá-lo em funcionamento e desligar os periféricos que não estiver usando.

Caso contrário, para detectar a mudança de ignição de qualquer maneira e ao informar o Pi, ele precisa ser desligado, seguido pela remoção da energia um minuto depois, a maneira mais prática é provavelmente usar um microcontrolador externo que conduz um FET. Isso pode ser feito com lógica discreta, mas você também precisa garantir que a energia seja reaplicada quando a ignição subir, para que não seja um exercício totalmente trivial, mas os custos de peças serão mais baixos do que usar uma tampa grande.

PeterJ
fonte
Obrigado, sua resposta me levou a pesquisar no Google por "shutdown controller raspberry pi". Eu estava olhando para este por US $ 42, mas depois encontrei este projetado especificamente para o Raspberry Pi, e custa apenas US $ 15 e ele tem um projetado para uso em um carro.
Nicholas Albion
O Raspberry Pi Modelo A leva 300ma (+ 100ma no máximo em cada porta USB), enquanto o Modelo B leva 700ma.
Transeunte
O que você também pode fazer é simplesmente conectar um botão e executar um aplicativo python toda vez que o seu raspberry pi for ligado. Em seguida, no aplicativo python, use a função de botão os ("halt") para simplesmente desligar o seu raspberry pi. Foi o que fiz e está funcionando bem. Eu não sei como isso funcionaria com o XBMC.
mozcelikors
3

Eu não estou intimamente familiarizado com o comportamento do Raspberry Pi para desligamento e uso de energia, por isso vou confiar principalmente nos números que você forneceu e deixar as fórmulas.

A curva de descarga exponencial que você mostra é para um circuito resistor-capacitor, mas o regulador linear faz as coisas agirem de maneira um pouco diferente. Suponha que o RPi sempre consuma a corrente máxima que você declarou: 1200 mA. Nesse caso, essa corrente sempre flui através do regulador e a resistência efetiva do circuito muda constantemente (diminuindo) à medida que o capacitor descarrega. Isso é verdade enquanto estivermos na faixa de operação do regulador linear, o que é bom porque precisamos que o RPi seja desligado antes de atingirmos a região.

A equação diferencial para um capacitor é:

I=CdVdt
que pode ser reorganizado para resolver C:
C=IdtdV
  • Eu sou simplesmente a corrente média para o RPi. Nesse caso, assumiremos que é de 1200 mA ou 1,2 A.
  • dt é o tempo que leva para desligar o RPi. Usando seu exemplo, são 5 s.
  • dV é a mudança na tensão do capacitor. Vamos supor que a tensão inicial seja a mais baixa tensão especificada de 11,7 V e que a tensão final seja 7,0 V. Estou configurando a tensão final para 7,0 V porque o regulador linear 7805 requer dois volts de altura livre para operação adequada (5,0 V + 2,0 V = 7,0 V). Isso faz com que dV = 11,7 V - 7,0 V = 4,7 V.

Isso fornece o seguinte resultado:

C=1.2A5s4.7V=1.28F

Sim, isso é 1,28 Farads (sem micro ou milli aqui). Isso provavelmente envolveria a compra de várias tampas de baixa tensão e a colocação em série

Portanto, a outra questão é o seu circuito - ele não funcionará da maneira que você deseja, porque a única maneira pela qual a entrada positiva do comparador se aproxima da tensão de entrada negativa (para que a saída possa mudar) é quando a tensão de entrada já está morto. Conforme projetado, o comparador nunca mudaria.

O que você quer fazer é medir sua tensão de entrada, antes dos capacitores e diodo, e comparar essa tensão com uma "referência" que você pode definir com um pote de compensação. Veja o exemplo de circuito abaixo:

esquemático

simular este circuito - esquemático criado usando o CircuitLab

W5VO
fonte
Você está certo - eu pretendia alimentar a entrada positiva do comparador do outro lado do diodo D1. Preciso do pino GPIO para acionar uma interrupção no momento em que a fonte de 12V for desconectada (o rádio e os acessórios estão desligados). ... Então a tensão de referência é 0, não é? Qual é o objetivo do diodo TVS?
22613 Nicholas Albion
Eu tenho vários desses aqui, eles seriam perfeitos para este trabalho? i.ebayimg.com/images/g/lF8AAOSwBP9UYdRb/s-l300.jpg
feedc0de
@danbru Não faço ideia, isso é uma imagem, não uma folha de dados. Se você acha que seus capacitores do eBay são realmente 1.5F a 5.5V, ainda precisará colocar vários em série e paralelo para obter a capacitância necessária.
W5VO
@ W5VO, existe alguma maneira fácil de testar a capacitância?
feedc0de
2

Nota: a resposta a seguir foi escrita assumindo que apenas o uso de um cartão SD no sistema de arquivos pode ser corrompido. Muitas evidências anedóticas surgiram desde então, sugerindo que o próprio estado interno dos cartões SD, abaixo do nível de qualquer sistema de arquivos, está potencialmente em risco de corrupção devido à perda de energia em tempo oportuno, algo que talvez não seja possível contornar. nível do sistema de arquivos.


Eu ficaria tentado a olhar para uma abordagem totalmente diferente, a de resolver o problema na fonte. Essencialmente, não há nada de fundamentalmente errado em apenas arrancar o poder do pi; o problema é o estado do sistema de arquivos potencialmente não confirmado, causando corrupção no sistema de arquivos e subsequente falha de inicialização até você reparar / recriar novamente a imagem do volume.

Mas isso é algo que pode ser corrigido no lado do software, por alguma combinação de:

  • Crie mais partições no cartão SD e nunca monte a partição de inicialização ou sistema operacional no modo gravável. Se você quiser dar um passo adiante, nunca grave nada no cartão SD, mantendo todos os seus dados mutáveis ​​em um pendrive.

  • Use um sistema de arquivos de diário para armazenar dados que serão realmente modificados em operação.

  • Simplesmente mantenha um cartão de backup à mão; opcionalmente, esse pode ser um esquema automático de backup e recuperação de um cartão conectado com uma regra em que apenas um dos cartões pode ser montado como gravável a qualquer momento (combinado com a primeira regra do sistema operacional / de inicialização) partições nunca sendo graváveis)

Em última análise, tudo se resume a uma questão de filosofia do design - a escolha entre:

A) Um sistema delicado que deve ser protegido contra perda de energia, a menos que sofra corrupção

ou

B) Um sistema projetado de modo que a perda inesperada de energia não possa resultar em corrupção irrecuperável.

A maioria dos sistemas embarcados é mais parecida com (B).

Chris Stratton
fonte
Partições separadas em um cartão SD com apenas leitura não resolverão completamente o problema. O nivelamento de desgaste nos cartões SD pode destruir QUALQUER bloco no cartão (quando estiver trocando de bloco). Esse nivelamento de desgaste está completamente oculto no SD e não há como controlá-lo. De fato, com a partição do sistema de arquivos somente leitura, ela terá as contagens de gravação mais baixas e será o principal alvo do que trocar ao nivelar o desgaste.
22413 darron
BTW - Cheguei à conclusão de que os cartões SD são impossíveis de projetar soluções embarcadas robustas, a menos que você possa garantir desligamentos limpos. A especificação é realmente péssima para casos de uso incorporados ... que, considerando quantos SÃO incorporados, é um estado de coisas bastante triste.
21413 darron
@ Darron: É triste, dado que existem muitas maneiras pelas quais os problemas poderiam ter sido evitados. Por exemplo, a especificação poderia ter especificado um comando "shutdown" e exigido que qualquer dispositivo possa se colocar em um estado seguro dentro de, por exemplo, 250ms após o recebimento. Acho que a maioria das implementações práticas de cartão SD não teria problemas com essa especificação, mesmo que o comando shutdown viesse no meio de uma operação de "desfragmentação em segundo plano" que levaria alguns minutos para ser concluída.
Supercat 12/13 /
@ Darron - foi especificamente por causa desses problemas de partição cruzada que mencionei a possibilidade de nunca gravar no cartão SD.
Chris Stratton
Quando desligado corretamente, o XBMC salva o ponto atual da música / filme que está sendo reproduzido no disco, para que possa retomar do mesmo ponto quando reiniciado. Eu realmente gostaria de evitar "Papai, nós já vimos essa parte, você pode encostar e avançar rapidamente para a parte em que aquele homem faz a coisa?"
22613 Nicholas Albion
0

Como outros já apontaram, existem alguns problemas com os circuitos propostos até agora, e você pode obter um capacitor grande o suficiente para suportar a fonte. Se você estiver disposto a construir um pequeno circuito, considere um controlador de ligar / desligar a alimentação com trava que é acionado por botão. Para desligar o servidor XBMC, você pode pressionar um botão que sinaliza o Pi para desligar, ele pode fazer o que for necessário para um desligamento ordenado limpo e emitir um sinal GPIO no circuito que desliga a energia para si mesmo. Isso dá ao RPi o tempo necessário para fazer coisas como desligar o cartão SD com segurança. O circuito não precisa ser tão complexo quanto um relé e um temporizador.

Aqui está um circuito simples para fazer isso , que usa apenas um mosfet duplo como controlador. O circuito é descrito na página da web.

user22047
fonte