Sirkuit untuk mematikan Raspberry Pi dengan aman

8

Saya ingin menggunakan Raspberry Pi sebagai server XBMC di dalam mobil. Dokumentasi XBMC mengatakan bahwa Anda harus selalu menggunakan perintah mematikan sebelum memutuskan daya. Saya tidak ingin (menyuruh istri saya) masuk ke Pi dan mematikannya sebelum mematikan mobil - Saya ingin dapat

Saya sudah berpikir bahwa itu seharusnya mungkin untuk membuat rangkaian sederhana dengan kapasitor dan mungkin dioda untuk mendeteksi ketika catu daya terputus (dan meningkatkan interupsi pada salah satu pin GPIO) tetapi kapasitor akan memberikan arus yang cukup lama bagi sistem untuk dimatikan dengan benar.

Apakah ini terlihat benar dan memadai?

draft kedua

Sirkuit ini akan ditenagai oleh aki mobil - 12,6 hingga 11,7V. Raspberry Pi membutuhkan waktu 5V (5,25 hingga 4,75V) dan menarik 700-1200mA. Saya belum menghitung waktunya, tapi saya kira proses mematikan mungkin memakan waktu sekitar 5 detik.

Jadi saya kira yang perlu saya ketahui adalah:

  • Kapasitor macam apa yang saya perlukan untuk menyimpan muatan yang cukup agar Pi berjalan cukup lama sehingga XBMC dapat dimatikan dengan benar?

  • Mengingat bahwa port GPIO Rasperry Pi membutuhkan 3.3V, apa pembanding / op-amp terbaik untuk digunakan (saya kira saya bisa menggunakan beberapa resistor untuk menurunkan output dari 5 menjadi 3,3)

  • Apakah akan ada manfaat memiliki garis GPIO yang biasanya tinggi atau biasanya rendah?

Nicholas Albion
sumber
IC ini: linear.com/product/LTC2935 mungkin menarik bagi Anda.
Bitrex
3
Sebagai per jawaban di bawah ini dalam konsep ide Anda baik-baik saja tetapi akan membutuhkan topi yang sangat besar. Anda juga bisa melihat menyalakan Pi dari sesuatu di sepanjang waktu, lalu gunakan kunci kontak untuk memulai pematian dan mungkin timer untuk menarik daya sama sekali setelah sekitar satu menit atau lebih.
PeterJ
Itu adalah ide bagus @PeterJ - kemungkinan akan jauh lebih murah. Bisakah Anda menguraikannya dalam bentuk jawaban?
Nicholas Albion
Daripada menyalakan RPi dari kapasitor selama beberapa detik setelah kunci kontak dimatikan, saya pikir mungkin lebih masuk akal untuk menggunakan relay yang dikendalikan dan ditenagai oleh 555 untuk beralih ke baterai. Saya telah membuat pertanyaan lain: electronics.stackexchange.com/questions/61877/…
Nicholas Albion

Jawaban:

4

Strategi alternatif adalah untuk menyalakan Raspberry Pi terus menerus dan menggunakan jalur pengapian untuk memulai urutan penurunan daya. Saya telah melakukan itu di masa lalu tetapi dengan sistem di mana solusi yang tepat tidak berlaku untuk Pi tetapi secara umum:

Gunakan konverter DC-DC untuk efisiensi terbaik, ada banyak contoh di sekitar tetapi berikut ini adalah salah satu contoh dari sesuatu yang nyaman untuk digunakan dan dapat memasok 1A pada 5V dari input 6,5V ke 32V:

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

Suplai mobil bisa sangat keras, jadi Anda mungkin ingin menggunakan dioda TVV 30V melintasi input untuk melindungi terhadap paku dengan dioda chottky Schottky dengan anoda di tanah dan katoda pada input 12V untuk melindungi terhadap tegangan negatif bersama dengan salah satu dari keduanya. sekering normal atau sekering PTC yang dapat disetel ulang secara seri dengan koneksi antara daya mobil dan sistem Anda. Kalau tidak, Anda mungkin dapat 'meretas' mobil ke pengisi daya USB yang seharusnya sudah memiliki semuanya.

Saya tidak yakin apa yang digambarkan oleh Raspberry Pi dalam mode siaga normal, tetapi mungkin di bawah 500mA yang merupakan USB maksimum yang dapat memasok dan lebih mungkin 100mA. Katakanlah menggunakan 100mA pada 5V yang akan berada di bawah 50mA pada 12V menggunakan sirkuit itu, aki mobil biasanya berada di urutan 50Ah sehingga akan menjadi sekitar 20 hari untuk menguras baterai hingga 50%. Jika mobil digunakan secara teratur, mungkin tidak perlu melangkah lebih jauh, dan Anda mungkin dapat membiarkannya berjalan dan matikan saja periferal yang tidak Anda gunakan.

Kalau tidak, untuk mendeteksi perubahan kunci kontak dengan cara apa pun dan keduanya memberi tahu Pi, maka perlu dimatikan, diikuti dengan melepas daya semenit kemudian, cara paling praktis mungkin menggunakan mikrokontroler eksternal yang menggerakkan FET. Ini bisa dilakukan dengan logika diskrit, tetapi Anda juga perlu memastikan daya diterapkan kembali ketika kunci kontak tinggi, jadi itu bukan latihan yang sepenuhnya sepele, tetapi biaya suku cadang akan lebih rendah daripada menggunakan tutup besar.

PeterJ
sumber
Terima kasih, jawaban Anda mengarahkan saya ke Googling untuk "shutdown controller raspberry pi". Saya melihat ini untuk $ 42 tetapi kemudian menemukan ini dirancang khusus untuk Raspberry Pi, dan itu hanya $ 15 dan dia punya satu yang dirancang untuk digunakan dalam mobil.
Nicholas Albion
Raspberry Pi Model A membutuhkan 300mA (maks + 100mA di setiap port usb), sedangkan Model B membutuhkan 700mA.
Pejalan kaki
Yang juga bisa Anda lakukan adalah cukup dengan menghubungkan sebuah tombol dan menjalankan aplikasi python setiap kali raspberry pi Anda dihidupkan. Kemudian di aplikasi python, gunakan tombol fungsi os ("berhenti") untuk mematikan pi raspberry Anda. Itu yang saya lakukan dan berfungsi dengan baik. Saya tidak tahu bagaimana itu akan bekerja dengan XBMC.
mozcelikors
3

Saya tidak terlalu akrab dengan perilaku Raspberry Pi untuk shutdown dan penggunaan daya, jadi saya terutama akan mengandalkan angka yang Anda berikan dan tinggalkan formula.

Kurva pelepasan eksponensial yang Anda tunjukkan adalah untuk rangkaian resistor-kapasitor, tetapi regulator linier menyebabkan segala sesuatu bekerja sedikit berbeda. Misalkan RPi selalu mengkonsumsi arus maksimum yang Anda nyatakan: 1200 mA. Dalam hal ini, arus selalu mengalir melalui regulator, dan resistansi efektif rangkaian terus berubah (menurun) ketika kapasitor dilepaskan. Ini benar selama kita berada dalam jangkauan operasi regulator linier, yang baik-baik saja karena kita perlu RPi dimatikan sebelum kita mencapai wilayah itu.

Persamaan diferensial untuk kapasitor adalah:

I=CdVdt
yang dapat diatur ulang untuk menyelesaikan C:
C=IdtdV
  • Saya hanyalah arus rata-rata untuk RPi. Dalam hal ini, kami akan menganggap itu adalah 1200 mA, atau 1,2 A.
  • dt adalah waktu yang diperlukan untuk mematikan RPi. Menggunakan contoh Anda, ini 5 detik.
  • dV adalah perubahan tegangan kapasitor. Kita akan mengasumsikan bahwa tegangan awal adalah tegangan terendah yang ditentukan yaitu 11,7 V, dan tegangan akhir adalah 7,0 V. Saya mengatur tegangan akhir menjadi 7,0 V karena regulator linier 7805 memerlukan dua ruang kepala volt untuk operasi yang benar (5.0 V + 2.0 V = 7.0 V). Ini membuat dV = 11.7 V - 7.0 V = 4.7 V.

Ini memberikan hasil sebagai berikut:

C=1.2A5s4.7V=1.28F

Ya, itu 1,28 Farad (tidak ada mikro atau mili di sini). Ini kemungkinan akan melibatkan pembelian beberapa topi tegangan rendah dan menempatkannya secara seri

Jadi masalah lainnya adalah rangkaian Anda - sirkuit itu tidak akan berfungsi seperti yang Anda inginkan, karena satu-satunya cara input positif komparator mendekati tegangan input negatif (sehingga output dapat berubah) adalah ketika tegangan input Anda sudah mati. Seperti yang dirancang, pembanding tidak akan pernah beralih.

Yang ingin Anda lakukan adalah mengukur tegangan input Anda, sebelum kapasitor dan dioda, dan membandingkan tegangan itu dengan "referensi" yang dapat Anda atur dengan pot trim. Lihat contoh sirkuit di bawah ini:

skema

mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab

W5VO
sumber
Anda benar - saya bermaksud untuk memberi makan input positif dari komparator dari sisi lain diode D1. Saya membutuhkan pin GPIO untuk memicu interupsi saat suplai 12V terputus (radio dan aksesori dimatikan). ... Jadi tegangan referensi adalah 0, bukan? Apa tujuan dari dioda TVS?
Nicholas Albion
Saya punya banyak dari ini di sini, apakah mereka akan sempurna untuk pekerjaan ini? i.ebayimg.com/images/g/lF8AAOSwBP9UYdRb/s-l300.jpg
feedc0de
@ Danbru Tidak tahu, itu gambar, bukan lembar data. Jika Anda berpikir kapasitor eBay Anda benar-benar 1.5F pada 5.5V, maka Anda masih perlu memasukkan beberapa seri dan paralel untuk mendapatkan kapasitansi yang dibutuhkan.
W5VO
@ W5VO apakah ada cara mudah saya dapat menguji kapasitansi?
feedc0de
2

Catatan: jawaban berikut ini ditulis dengan asumsi bahwa hanya penggunaan sistem file kartu SD bisa menjadi rusak. Banyak bukti anekdotal sejak itu muncul untuk menunjukkan bahwa keadaan internal kartu SD itu sendiri, di bawah tingkat sistem file apa pun berpotensi berisiko korupsi dari kehilangan daya yang tidak tepat waktu, sesuatu yang tidak mungkin untuk dilakukan di sekitar tingkat sistem file.


Saya tergoda untuk melihat pendekatan yang sama sekali berbeda, salah satu pemecahan masalah pada sumbernya. Pada dasarnya, tidak ada yang salah secara mendasar dengan hanya menarik kekuatan dari pi; masalahnya adalah keadaan sistem file yang berpotensi tidak berkomitmen yang mengarah ke kerusakan sistem file, dan kegagalan boot selanjutnya hingga Anda memperbaiki / mem-image ulang volume.

Tetapi ini adalah sesuatu yang dapat diperbaiki pada sisi perangkat lunak, dengan beberapa kombinasi:

  • Buat lebih banyak partisi pada kartu SD, dan jangan pernah memasang boot atau partisi sistem operasi dalam mode yang dapat ditulis. Jika Anda ingin melangkah lebih jauh, jangan pernah menulis apa pun pada kartu SD sama sekali, simpan semua data yang dapat berubah pada USB stick.

  • Gunakan sistem file penjurnalan untuk menyimpan data yang sebenarnya akan dimodifikasi dalam operasi.

  • Cukup simpan kartu cadangan, secara opsional ini bisa berupa skema pencadangan dan pemulihan otomatis dari kartu yang terhubung dengan aturan di mana hanya satu kartu yang dapat dipasang yang dapat ditulisi pada waktu tertentu (dikombinasikan dengan aturan pertama sistem boot / sistem operasi partisi tidak pernah dapat ditulisi)

Pada akhirnya muncul pertanyaan tentang filosofi desain - pilihan antara:

A) Sistem yang rapuh yang harus dilindungi dari kehilangan daya lebih sedikit jika menderita korupsi

atau

B) Suatu sistem yang dirancang sedemikian rupa sehingga kehilangan daya yang tidak terduga tidak dapat mengakibatkan korupsi yang tidak dapat dipulihkan.

Sebagian besar sistem embedded lebih sejalan (B).

Chris Stratton
sumber
Memisahkan partisi pada kartu SD dengan read-only tidak akan sepenuhnya menyelesaikan masalah. Leveling memakai kartu SD dapat menghancurkan blok APAPUN pada kartu (ketika itu bertukar blok). Levelling aus ini sepenuhnya tersembunyi di SD dan tidak ada cara untuk mengendalikannya. Faktanya, dengan partisi filesystem read-only, partisi ini akan memiliki jumlah tulis terendah dan akan menjadi target utama untuk pertukaran dengan apa ketika memakai leveling.
darron
BTW - Saya sampai pada kesimpulan kartu SD tidak mungkin untuk merancang solusi tertanam yang kuat untuk kecuali Anda dapat menjamin shutdown yang bersih. Spesifikasi ini sangat menyebalkan untuk kasus penggunaan tertanam ... yang mengingat berapa banyak yang tertanam itu adalah keadaan yang cukup menyedihkan.
darron
@dron: Menyedihkan, mengingat ada banyak cara masalahnya bisa dihindari. Sebagai contoh, spek bisa menentukan perintah "shutdown" dan mensyaratkan bahwa perangkat apa pun harus dapat menempatkan dirinya dalam keadaan aman dalam mis. 250 ms menerimanya. Saya pikir implementasi SD-card paling praktis tidak akan memiliki masalah dengan spesifikasi seperti itu bahkan jika perintah shutdown datang di tengah-tengah operasi "defragmentasi latar belakang" yang akan membutuhkan waktu beberapa menit untuk menyelesaikannya.
supercat
@dronon - itu secara khusus karena masalah lintas-partisi yang saya sebutkan kemungkinan tidak pernah menulis ke kartu SD sama sekali.
Chris Stratton
Ketika dimatikan dengan benar, XBMC menyimpan titik saat ini dalam lagu / film yang sedang diputar ke disk sehingga dapat melanjutkan dari titik yang sama ketika dimulai kembali. Saya benar-benar ingin menghindari, "Ayah, kita sudah melihat bagian ini, dapatkah Anda menepi dan maju cepat ke tempat pria itu melakukan hal itu?"
Nicholas Albion
0

Seperti yang telah ditunjukkan orang lain, ada beberapa masalah dengan sirkuit yang diusulkan sejauh ini, dan Anda bisa mendapatkan kapasitor yang cukup besar untuk menahan pasokan. Jika Anda ingin membuat sirkuit kecil, Anda dapat mempertimbangkan pengendali daya hidup / mati pengunci yang dioperasikan tombol tekan. Untuk mematikan server XBMC Anda bisa menekan tombol yang memberi sinyal Pi untuk dimatikan, kemudian bisa melakukan apa yang diperlukan untuk shutdown tertib bersih, kemudian mengeluarkan sinyal GPIO ke sirkuit yang mematikan daya untuk dirinya sendiri. Itu memberi RPi waktu sebanyak yang diperlukan untuk melakukan hal-hal seperti mematikan kartu SD dengan aman. Rangkaian tidak harus serumit relay dan timer.

Inilah rangkaian sederhana untuk melakukannya , yang hanya menggunakan MOSFET ganda sebagai pengontrol. Sirkuit dijelaskan di halaman web.

pengguna22047
sumber