Circuit pour éteindre le Raspberry Pi en toute sécurité


8

Je veux utiliser un Raspberry Pi comme serveur XBMC dans la voiture. Les documents XBMC disent que vous devez toujours utiliser la commande d' arrêt avant de déconnecter l'alimentation. Je ne veux pas avoir à dire à ma femme de se connecter au Pi et de l'éteindre avant d'éteindre la voiture - je veux pouvoir

J'ai pensé qu'il devrait être possible de créer un circuit simple avec un condensateur et probablement une diode pour détecter le moment où l'alimentation a été déconnectée (et déclencher une interruption sur l'une des broches GPIO) mais le condensateur fournirait du courant assez longtemps pour que le système s'arrête correctement.

Cela semble-t-il correct et suffisant?

deuxième brouillon

Le circuit sera alimenté par une batterie de voiture - 12,6 à 11,7 V. Le Raspberry Pi prend 5 V (5,25 à 4,75 V) et consomme 700-1200 mA. Je ne l'ai pas encore chronométré, mais je suppose que le processus d'arrêt prend probablement environ 5 secondes.

Je suppose donc que ce que je dois savoir est:

  • De quel type de condensateur aurais-je besoin pour stocker suffisamment de charge pour que le Pi fonctionne suffisamment longtemps pour que le XBMC s'arrête correctement?

  • Étant donné que le port GPIO du Rasperry Pi prend 3,3 V, quel est le meilleur comparateur / ampli opérationnel à utiliser (je suppose que je pourrais utiliser quelques résistances pour réduire la sortie de 5 à 3,3)

  • Y aurait-il un avantage à avoir la ligne GPIO normalement haute ou normalement basse?


Cet IC: linear.com/product/LTC2935 pourrait vous intéresser.
Bitrex

3
Selon la réponse ci-dessous dans le concept, votre idée est OK mais nécessitera de très grandes majuscules. Vous pouvez également envisager d'alimenter le Pi à partir de quelque chose tout le temps, puis utilisez simplement l'allumage pour démarrer un arrêt et peut-être une minuterie pour couper complètement l'alimentation après une minute ou deux.
PeterJ

C'est une bonne idée @PeterJ - serait probablement beaucoup moins cher. Pourriez-vous nous en parler sous forme de réponse?
Nicholas Albion

Plutôt que d'alimenter le RPi à partir d'un condensateur pendant plusieurs secondes après la coupure du contact, je pense qu'il est probablement plus logique d'utiliser un relais contrôlé et alimenté par un 555 pour passer à la batterie. J'ai créé une autre question: electronics.stackexchange.com/questions/61877/…
Nicholas Albion

Réponses:


4

Une stratégie alternative serait d'alimenter le Raspberry Pi en continu et d'utiliser la ligne d'allumage pour lancer la séquence de mise hors tension. Je l'ai fait dans le passé mais avec des systèmes où la solution exacte ne s'appliquerait pas à un Pi mais en général:

Utilisez un convertisseur DC-DC pour la meilleure efficacité, il existe de nombreux exemples, mais ce qui suit est un exemple de quelque chose qui serait pratique à utiliser et il peut fournir 1 A à 5 V d'une entrée de 6,5 V à 32 V:

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

Une alimentation de voiture peut être assez difficile, vous pouvez donc utiliser une diode TVS 30V sur l'entrée pour vous protéger contre les pointes avec une grosse diode Schottky avec l'anode à la masse et la cathode à l'entrée 12V pour vous protéger contre les tensions négatives avec un fusible normal ou un fusible réarmable PTC en série avec la connexion entre l'alimentation de la voiture et votre système. Sinon, vous pourrez peut-être pirater un chargeur de voiture vers USB qui devrait déjà avoir tout cela en place.

Je ne suis pas sûr de ce qu'un Raspberry Pi dessine en mode veille normal, mais probablement bien en dessous de 500mA, ce qui est le maximum que l'USB peut fournir et plus probablement 100mA. Supposons qu'il utilise 100mA à 5V qui sera inférieur à 50mA à 12V en utilisant ce circuit, une batterie de voiture est normalement de l'ordre de 50Ah, ce qui prend environ 20 jours pour décharger la batterie à 50%. Si la voiture est utilisée régulièrement, il n'est probablement pas nécessaire d'aller plus loin, et vous pouvez simplement la laisser en marche et éteindre tout périphérique que vous n'utilisez pas.

Sinon, pour détecter le changement d'allumage dans les deux sens et informer le Pi qu'il doit s'arrêter, puis couper l'alimentation une minute plus tard, le moyen le plus pratique est probablement d'utiliser un microcontrôleur externe qui pilote un FET. Cela peut être fait avec une logique discrète, mais vous devez également vous assurer que la puissance est rétablie lorsque le contact est élevé, donc ce n'est pas un exercice tout à fait banal, mais les coûts des pièces seront inférieurs à ceux d'un gros capuchon.


Merci, votre réponse m'a conduit à googler pour "arrêt du contrôleur framboise pi". Je regardais celui-ci pour 42 $, mais j'ai trouvé celui-ci spécialement conçu pour le Raspberry Pi, et ce n'est que 15 $ et il en a un conçu pour une utilisation dans une voiture.
Nicholas Albion

Le Raspberry Pi modèle A prend 300 mA (+ 100 mA max sur chaque port USB), tandis que le modèle B prend 700 mA.
Passerby

Ce que vous pouvez également faire est de simplement brancher un bouton et d'exécuter une application python à chaque fois que votre Raspberry Pi est allumé. Ensuite, dans l'application python, utilisez la fonction de bouton os ("stop") pour simplement arrêter votre raspberry pi. C'est ce que j'ai fait et ça fonctionne bien. Je ne sais pas comment cela fonctionnerait avec XBMC.
mozcelikors

3

Je ne connais pas intimement le comportement du Raspberry Pi pour l'arrêt et la consommation d'énergie, je vais donc principalement compter sur les chiffres que vous avez donnés et laisser les formules.

La courbe de décharge exponentielle que vous montrez concerne un circuit résistance-condensateur, mais le régulateur linéaire fait que les choses agissent un peu différemment. Supposons que le RPi consomme toujours le courant maximum que vous avez indiqué: 1200 mA. Dans ce cas, ce courant traverse toujours le régulateur et la résistance effective du circuit change constamment (diminue) à mesure que le condensateur se décharge. Cela est vrai tant que nous sommes dans la plage de fonctionnement du régulateur linéaire, ce qui est bien car nous avons besoin que le RPi soit arrêté avant de toucher cette région.

L'équation différentielle pour un condensateur est:

je=CVt
qui peut être réorganisé pour résoudre pour C:
C=jetV
  • I est tout simplement le courant moyen du RPi. Dans ce cas, nous supposerons qu'il s'agit de 1200 mA ou 1,2 A.
  • dt est le temps qu'il faut pour arrêter le RPi. En utilisant votre exemple, cela fait 5 s.
  • dV est la variation de la tension du condensateur. Nous supposerons que la tension de démarrage est la tension spécifiée la plus basse de 11,7 V et que la tension de fin est de 7,0 V. Je règle la tension de fin à 7,0 V car le régulateur linéaire 7805 nécessite une marge de deux volts pour un fonctionnement correct (5,0 V + 2,0 V = 7,0 V). Cela fait dV = 11,7 V - 7,0 V = 4,7 V.

Cela donne le résultat suivant:

C=1.2UNE5s4.7V=1,28F

Oui, c'est 1,28 Farads (pas de micro ou milli ici). Cela impliquerait probablement l'achat de plusieurs bouchons basse tension et leur mise en série

Alors, l'autre problème est votre circuit - il ne fonctionnera pas comme vous le souhaitez, car la seule façon dont l'entrée positive du comparateur se rapproche de la tension d'entrée négative (afin que la sortie puisse changer) est lorsque votre tension d'entrée est déjà mort. Tel que conçu, le comparateur ne changerait jamais.

Ce que vous voulez faire, c'est mesurer votre tension d'entrée, avant les condensateurs et la diode, et comparer cette tension avec une "référence" que vous pouvez définir avec un potentiomètre. Voir l'exemple de circuit ci-dessous:

schématique

simuler ce circuit - Schéma créé à l'aide de CircuitLab


Vous avez raison - je voulais alimenter l'entrée positive du comparateur de l'autre côté de la diode D1. J'ai besoin de la broche GPIO pour déclencher une interruption au moment où l'alimentation 12V est déconnectée (la radio et les accessoires sont éteints). ... La tension de référence est donc 0, n'est-ce pas? À quoi sert la diode TVS?
Nicholas Albion

J'en ai plusieurs ici, seraient-ils parfaits pour ce travail? i.ebayimg.com/images/g/lF8AAOSwBP9UYdRb/s-l300.jpg
feedc0de

@danbru Aucune idée, c'est une image, pas une fiche technique. Si vous pensez que vos condensateurs eBay sont vraiment de 1,5 F à 5,5 V, vous devrez toujours en mettre plusieurs en série et en parallèle pour obtenir la capacité dont vous avez besoin.
W5VO

@ W5VO existe-t-il un moyen simple de tester la capacité?
feedc0de

2

Remarque: la réponse suivante a été écrite en supposant que seule l'utilisation par le système de fichiers d'une carte SD pouvait être corrompue. De nombreuses preuves anecdotiques ont été révélées depuis lors pour suggérer que l'état interne des cartes SD elles-mêmes, en dessous du niveau de tout système de fichiers, est potentiellement à risque de corruption en raison d'une perte d'alimentation intempestive, quelque chose qu'il peut ne pas être possible de contourner à niveau du système de fichiers.


Je serais tenté d'envisager une approche entièrement différente, celle de résoudre le problème à sa source. Essentiellement, il n'y a rien de fondamentalement mauvais à retirer simplement le pouvoir du pi; le problème est un état du système de fichiers potentiellement non engagé entraînant une corruption du système de fichiers et un échec de démarrage ultérieur jusqu'à ce que vous répariez / réimagiez le volume.

Mais c'est quelque chose qui peut être résolu du côté logiciel, par une combinaison de:

  • Créez plus de partitions sur la carte SD et ne montez jamais la partition de démarrage ou de système d'exploitation en mode accessible en écriture. Si vous voulez aller plus loin, n'écrivez jamais rien sur la carte SD, gardez toutes vos données mutables sur une clé USB.

  • Utilisez un système de fichiers de journalisation pour stocker les données qui seront réellement modifiées en cours de fonctionnement.

  • Gardez simplement une carte de sauvegarde à portée de main, éventuellement cela pourrait être un schéma de sauvegarde et de récupération automatique à partir d'une carte connectée avec une règle selon laquelle une seule des cartes peut être montée en écriture à tout moment (combinée avec la première règle du système de démarrage / d'exploitation) partitions jamais inscriptibles)

En fin de compte, cela se résume à une question de philosophie de conception - le choix entre:

A) Un système délicat qui doit être protégé des coupures de courant moins qu'il ne subisse de corruption

ou

B) Un système conçu de telle sorte qu'une perte d'alimentation inattendue ne peut pas entraîner une corruption irrécupérable.

La plupart des systèmes embarqués sont plus dans le sens de (B).


Des partitions séparées sur une carte SD avec une lecture seule ne résoudront pas entièrement le problème. Porter le nivellement sur les cartes SD peut détruire N'IMPORTE QUEL bloc sur la carte (quand il échange des blocs). Ce niveau d'usure est complètement caché dans le SD et il n'y a aucun moyen de le contrôler. En fait, avec la partition du système de fichiers en lecture seule, elle aura le plus petit nombre d'écritures et sera la cible privilégiée avec quoi échanger lors du nivellement de l'usure.
darron

BTW - Je suis arrivé à la conclusion que les cartes SD sont impossibles à concevoir des solutions intégrées robustes à moins que vous ne puissiez garantir des arrêts propres. La spécification est vraiment nulle pour les cas d'utilisation intégrés ... ce qui, compte tenu du nombre de composants intégrés, est une situation assez triste.
darron

@darron: C'est triste, étant donné qu'il y a plusieurs façons d'éviter les problèmes. Par exemple, la spécification aurait pu spécifier une commande "shutdown" et exiger que tout périphérique doit pouvoir se mettre dans un état sûr, par exemple 250 ms après sa réception. Je pense que la plupart des implémentations de cartes SD pratiques n'auraient eu aucun problème avec une telle spécification même si la commande d'arrêt venait au milieu d'une opération de «défragmentation en arrière-plan» qui aurait pris quelques minutes.
supercat

@darron - c'est précisément à cause de ces problèmes de partition croisée que j'ai mentionné la possibilité de ne jamais écrire sur la carte SD.
Chris Stratton

Lorsqu'il est arrêté correctement, XBMC enregistre le point actuel du morceau / film en cours de lecture sur le disque afin qu'il puisse reprendre à partir du même point au redémarrage. J'aimerais vraiment éviter "Papa, nous avons déjà vu ce morceau, peux-tu t'arrêter et avancer rapidement vers le morceau où cet homme fait la chose?"
Nicholas Albion

0

Comme d'autres l'ont souligné, il y a quelques problèmes avec les circuits proposés jusqu'à présent, et vous pouvez également obtenir un condensateur assez grand pour contenir l'alimentation. Si vous êtes prêt à construire un petit circuit, vous pouvez envisager un contrôleur de mise sous / hors tension à verrouillage qui est actionné par bouton-poussoir. Pour éteindre le serveur XBMC, vous pouvez appuyer sur un bouton qui signale au Pi de s'arrêter, il peut alors faire ce dont il a besoin pour un arrêt ordonné et propre, puis émettre un signal GPIO vers le circuit qui se coupe lui-même. Cela donne au RPi autant de temps qu'il le faut pour faire des choses comme arrêter la carte SD en toute sécurité. Le circuit n'a pas besoin d'être aussi complexe qu'un relais et une minuterie.

Voici un circuit simple pour le faire , qui utilise uniquement un double mosfet comme contrôleur. Le circuit est décrit sur la page Web.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.