Circuito per lo spegnimento sicuro di Raspberry Pi


8

Voglio usare un Raspberry Pi come server XBMC in macchina. I documenti XBMC dicono che dovresti sempre usare il comando shutdown prima di scollegare l'alimentazione. Non voglio dover (dire a mia moglie) accedere al Pi e spegnerlo prima di spegnere la macchina - voglio essere in grado di

Ho pensato che dovrebbe essere possibile creare un semplice circuito con un condensatore e probabilmente un diodo per rilevare quando l'alimentazione è stata disconnessa (e aumentare un interruzione su uno dei pin GPIO) ma il condensatore fornirebbe corrente abbastanza a lungo affinché il sistema si spenga correttamente.

Sembra corretto e sufficiente?

seconda bozza

Il circuito sarà alimentato da una batteria dell'auto da 12,6 a 11,7 V. Il Raspberry Pi prende 5 V (da 5,25 a 4,75 V) e consuma 700-1200 mA. Non l'ho ancora cronometrato, ma suppongo che il processo di spegnimento probabilmente richiederà circa 5 secondi.

Quindi suppongo che ciò che devo sapere è:

  • Che tipo di condensatore avrei bisogno di immagazzinare abbastanza carica per mantenere il Pi in funzione abbastanza a lungo affinché XBMC si spenga correttamente?

  • Dato che la porta GPIO di Rasperry Pi impiega 3.3V, qual è il miglior comparatore / op-amp da usare (suppongo che potrei usare un paio di resistori per portare l'uscita da 5 a 3.3)

  • Ci sarebbe qualche vantaggio nell'avere la linea GPIO normalmente alta o normalmente bassa?


Questo IC: linear.com/product/LTC2935 potrebbe interessarti.
Bitrex

3
Come da risposta sotto nel concetto, la tua idea è OK ma richiederà tappi molto grandi. Potresti anche cercare di alimentare il Pi da qualcosa in qualsiasi momento, quindi utilizzare l'accensione per avviare uno spegnimento e forse un timer per estrarre del tutto l'energia dopo circa un minuto.
PeterJ

Questa è una buona idea @PeterJ - probabilmente sarebbe molto più economico. Potresti approfondire questo nella forma di una risposta?
Nicholas Albion,

Invece di alimentare l'RPi da un condensatore per diversi secondi dopo lo spegnimento dell'accensione, penso che probabilmente abbia più senso usare un relè controllato e alimentato da un 555 per passare alla batteria. Ho creato un'altra domanda: electronics.stackexchange.com/questions/61877/…
Nicholas Albion

Risposte:


4

Una strategia alternativa sarebbe quella di alimentare continuamente il Raspberry Pi e utilizzare la linea di accensione per avviare la sequenza di spegnimento. L'ho fatto in passato ma con sistemi in cui la soluzione esatta non si applica a un Pi ma in generale:

Usa un convertitore DC-DC per la migliore efficienza, ci sono molti esempi in giro ma il seguente è un esempio di qualcosa che sarebbe conveniente usare e può fornire 1A a 5V da un ingresso da 6,5 ​​V a 32 V:

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

Una fornitura di auto può essere piuttosto dura, quindi potresti voler usare un diodo TVS da 30 V attraverso l'ingresso per proteggere dai picchi con un grosso diodo Schottky con l'anodo a terra e il catodo all'ingresso da 12 V per proteggere contro le tensioni negative insieme a uno dei due un fusibile normale o un fusibile ripristinabile PTC in serie con la connessione tra l'alimentazione dell'auto e il sistema. Altrimenti potresti essere in grado di "hackerare" un'auto con un caricabatterie USB che dovrebbe già avere tutto questo a posto.

Non sono sicuro di cosa disegna un Raspberry Pi nella normale modalità inattiva, ma presumibilmente ben sotto i 500 mA, che è la massima USB in grado di fornire e più probabilmente 100 mA. Supponiamo che utilizzi 100 mA a 5 V che sarà inferiore a 50 mA a 12 V utilizzando quel circuito, una batteria dell'auto è normalmente nell'ordine di 50 Ah, quindi sarebbero circa 20 giorni per scaricare la batteria al 50%. Se l'auto è in uso regolare, probabilmente non c'è bisogno di andare oltre e potresti essere in grado di lasciarla in moto e spegnere semplicemente tutte le periferiche che non stai utilizzando.

Altrimenti per rilevare il cambio di accensione in entrambi i modi ed entrambi per informare il Pi che è necessario arrestarlo seguito da una interruzione dell'alimentazione un minuto dopo, il modo più pratico è probabilmente quello di utilizzare un microcontrollore esterno che guida un FET. Potrebbe essere fatto con una logica discreta, ma è anche necessario assicurarsi che la potenza venga riapplicata quando l'accensione aumenta, quindi non è un esercizio del tutto banale ma i costi delle parti saranno inferiori rispetto all'utilizzo di un cappuccio di grandi dimensioni.


Grazie, la tua risposta mi ha portato a cercare su Google "shutdown controller raspberry pi". Stavo guardando questo per $ 42 ma poi ho trovato questo appositamente progettato per il Raspberry Pi, ed è solo $ 15 e ne ha uno progettato per l'uso in auto.
Nicholas Albion,

Raspberry Pi Model A richiede 300ma (+ 100ma max su ciascuna porta USB), mentre il modello B richiede 700ma.
Passante dal

Quello che puoi anche fare è semplicemente collegare un pulsante ed eseguire un'app Python ogni volta che Raspberry Pi è acceso. Quindi nell'app Python, usa la funzione pulsante os ("halt") per spegnere semplicemente il tuo Raspberry Pi. Questo è quello che ho fatto e funziona bene. Non so come funzionerebbe con XBMC però.
Mozcelikors,

3

Non ho familiarità con il comportamento del Raspberry Pi per l'arresto e l'utilizzo di energia, quindi farò principalmente affidamento sui numeri che hai dato e lascerò le formule.

La curva di scarica esponenziale che mostri è per un circuito resistore-condensatore, ma il regolatore lineare fa sì che le cose agiscano in modo leggermente diverso. Supponiamo che l'RPi consumi sempre la massima corrente dichiarata: 1200 mA. In questo caso, quella corrente scorre sempre attraverso il regolatore e la resistenza effettiva del circuito cambia costantemente (diminuendo) mentre il condensatore si scarica. Questo è vero finché ci troviamo nel raggio operativo del regolatore lineare, il che va bene perché abbiamo bisogno che l'RPi sia spento prima di colpire quella regione.

L'equazione differenziale per un condensatore è:

I=CdVdt
che può essere riorganizzato per risolvere per C:
C=IdtdV
  • Sono semplicemente la corrente media per l'RPi. In questo caso, supponiamo che sia 1200 mA o 1,2 A.
  • dt è il tempo necessario per spegnere l'RPi. Usando il tuo esempio, sono 5 secondi.
  • dV è la variazione della tensione del condensatore. Supponiamo che la tensione iniziale sia la tensione minima specificata di 11,7 V e che la tensione finale sia 7,0 V. Sto impostando la tensione finale a 7,0 V perché il regolatore lineare 7805 richiede un headroom di due volt per un corretto funzionamento (5.0 V + 2,0 V = 7,0 V). Questo rende dV = 11,7 V - 7,0 V = 4,7 V.

Questo dà il seguente risultato:

C=1.2A5s4.7V=1.28F

Sì, sono 1.28 Farad (qui non ci sono micro o milli). Ciò comporterebbe probabilmente l'acquisto di diversi condensatori a bassa tensione e il loro posizionamento in serie

Quindi l'altro problema è il tuo circuito: non funzionerà nel modo desiderato, poiché l'unico modo in cui l'ingresso positivo del comparatore si avvicina alla tensione di ingresso negativa (quindi l'uscita può cambiare) è quando la tensione di ingresso è già morto. Come progettato, il comparatore non cambierebbe mai.

Quello che vuoi fare è misurare la tensione di ingresso, prima dei condensatori e del diodo, e confrontare quella tensione con un "riferimento" che puoi impostare con un potenziometro. Vedi esempio di circuito sotto:

schematico

simula questo circuito - Schema creato usando CircuitLab


Hai ragione - intendevo alimentare l'ingresso positivo del comparatore dall'altro lato del diodo D1. Ho bisogno del pin GPIO per innescare un interruzione nel momento in cui l'alimentazione a 12V è scollegata (la radio e gli accessori sono spenti). ... Quindi la tensione di riferimento è 0, non è vero? Qual è lo scopo del diodo TVS?
Nicholas Albion,

Ne ho molti qui, sarebbero perfetti per questo lavoro? i.ebayimg.com/images/g/lF8AAOSwBP9UYdRb/s-l300.jpg
feedc0de 1o16

@danbru Nessuna idea, questa è una foto, non una scheda tecnica. Se pensi che i tuoi condensatori eBay siano in realtà 1,5F a 5,5 V, dovrai comunque metterne multipli in serie e in parallelo per ottenere la tua capacità necessaria.
W5VO,

@ W5VO c'è un modo semplice per testare la capacità?
feedc0de

2

Nota: la seguente risposta è stata scritta partendo dal presupposto che solo l'uso del file system di una scheda SD potrebbe essere danneggiato. Da allora sono emerse molte prove aneddotiche che suggeriscono che lo stato interno delle schede SD stesse, al di sotto del livello di qualsiasi file system, è potenzialmente a rischio di corruzione a causa di una perdita di alimentazione non tempestiva, qualcosa che potrebbe non essere possibile aggirare livello del filesystem.


Sarei tentato di guardare a un approccio completamente diverso, quello di risolvere il problema alla fonte. In sostanza, non c'è nulla di fondamentalmente sbagliato nel solo strappare il potere dal pi; il problema è potenzialmente lo stato del file system senza commit che porta alla corruzione del file system e al successivo errore di avvio fino a quando non si ripristina / reimmagina il volume.

Ma questo è qualcosa che può essere risolto dal lato software, mediante una combinazione di:

  • Crea più partizioni sulla scheda SD e non montare mai la partizione di avvio o del sistema operativo in modalità scrivibile. Se vuoi fare un passo avanti, non scrivere mai nulla sulla scheda SD, mantenendo tutti i tuoi dati mutabili su una chiavetta USB.

  • Utilizzare un file system di journaling per archiviare i dati che verranno effettivamente modificati durante il funzionamento.

  • Tieni semplicemente a portata di mano una scheda di backup, facoltativamente questo potrebbe essere uno schema automatico di backup e ripristino da una scheda connessa con una regola in cui solo una delle schede può mai essere montata scrivibile in qualsiasi momento (combinato con la prima regola del sistema operativo / di avvio le partizioni non sono mai scrivibili)

Alla fine si tratta di una questione di filosofia del design: la scelta tra:

A) Un sistema delicato che deve essere protetto dalla perdita di potenza meno che subisca la corruzione

o

B) Un sistema progettato in modo tale che una perdita di potenza imprevista non possa provocare una corruzione irrecuperabile.

La maggior parte dei sistemi integrati è più simile a (B).


Separare le partizioni su una scheda SD con alcuni di sola lettura non risolverà completamente il problema. Indossare il livellamento su schede SD può distruggere QUALSIASI blocco sulla scheda (quando si scambia blocchi). Questo livellamento dell'usura è completamente nascosto nella SD e non c'è modo di controllarlo. In effetti, con la partizione del filesystem di sola lettura, avrà il numero più basso di scritture e sarà il bersaglio principale per cosa scambiare quando si indossa il livellamento.
darron,

A proposito, sono giunto alla conclusione che le schede SD sono impossibili da progettare soluzioni integrate robuste per meno che non sia possibile garantire arresti puliti. Le specifiche fanno davvero schifo per i casi d'uso incorporati ... che, dato il numero di ARE incorporati, è uno stato di cose piuttosto triste.
darron,

@darron: è triste, dato che ci sono molti modi in cui i problemi avrebbero potuto essere evitati. Ad esempio, la specifica avrebbe potuto specificare un comando "shutdown" e richiedeva che qualsiasi dispositivo dovesse essere in grado di mettersi in uno stato sicuro entro 250 ms dalla ricezione. Penso che la maggior parte delle implementazioni pratiche della scheda SD non avrebbero avuto problemi con una tale specifica anche se il comando shutdown fosse arrivato nel mezzo di un'operazione di "deframmentazione in background" che avrebbe richiesto minuti per essere completata.
supercat

@darron - è stato proprio a causa di tali problemi di partizione che ho menzionato la possibilità di non scrivere mai sulla scheda SD.
Chris Stratton,

Se spento correttamente, XBMC salva il punto corrente nel brano / film riprodotto su disco in modo che possa riprendere dallo stesso punto quando riavviato. Vorrei davvero evitare "Papà, abbiamo già visto questo pezzo, riesci a fermarti e ad avanzare rapidamente al punto in cui quell'uomo fa la cosa?"
Nicholas Albion,

0

Come altri hanno sottolineato, ci sono alcuni problemi con i circuiti proposti finora e puoi anche avere un condensatore abbastanza grande da sostenere l'alimentazione. Se sei disposto a costruire un piccolo circuito, potresti considerare un controller di accensione / spegnimento con accensione a scatto azionato da un pulsante. Per spegnere il server XBMC è possibile premere un pulsante che segnala lo spegnimento del Pi, quindi può fare ciò di cui ha bisogno per un arresto pulito e ordinato, quindi emettere un segnale GPIO al circuito che interrompe l'alimentazione a se stesso. Questo dà all'RPi tutto il tempo necessario per fare cose come spegnere in sicurezza la scheda SD. Il circuito non deve essere così complesso come un relè e un timer.

Ecco un semplice circuito per farlo , che utilizza solo un doppio mosfet come controller. Il circuito è descritto nella pagina web.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.