Bagaimana saya bisa membuat atmega328 saya berjalan selama satu tahun dengan baterai?


51

Skenario

Saya telah membuat kunci pintu elektronik yang bagus untuk kamar asrama saya. Saat ini merupakan Arduino Diecimila dengan servo [un] mengunci pintu. Ini memiliki keypad numerik dengan tombol 3x4 dan 5 LED (2 pasang seri dan satu LED tunggal). Saat ini juga berjalan pada pengisi daya ponsel.

Saya sekarang telah mendesain ulang untuk berjalan pada Arduino mandiri (ATmega328), tetapi benar-benar ingin menjalankannya pada baterai AA atau bahkan baterai 9V.

Untuk bagian perangkat lunak, saya pikir saya bisa melakukan sleeppanggilan untuk waktu-waktu tertentu di dalam metode loop untuk menjaga konsumsi daya ATmega serendah mungkin. Dan biarkan LED "flash" dengan waktu istirahat selama mungkin.

pertanyaan 1

Ketika sebuah tombol ditekan selama beberapa milidetik dimana papan tidur, apakah akan "diingat" / "ditahan" sampai keluar dari tidur dan kemudian diambil sebagai tombol tekan?

Apa cara terbaik untuk menangani tombol ini saat tidur? Dapatkah saya mengkodekannya untuk bangun setelah aktivitas tombol, atau haruskah saya membiarkannya tidur misalnya 10m.s. di setiap loop?

Pertanyaan 2

Bagaimana saya mendekati matematika menghitung berapa banyak baterai AA yang diperlukan untuk menjalankan perangkat ini selama 10 bulan?

Juga, saya tidak tahu bagaimana mengukur penggunaan daya rata-rata per menit, karena ia berganti dengan cepat dll.

Perangkat

Perangkat kunci pintu saya

Jawaban:


35

Atmega328 menyediakan enam mode hemat daya, dipesan dari minimal hingga sangat baik (perkiraan konsumsi saat ini dari pos forum ini ):

  • SLEEP_MODE_IDLE: 15 mA
  • SLEEP_MODE_ADC: 6,5 mA
  • SLEEP_MODE_PWR_SAVE: 1,62 mA
  • SLEEP_MODE_EXT_STANDBY: 1,62 mA
  • SLEEP_MODE_STANDBY: 0,84 mA
  • SLEEP_MODE_PWR_DOWN: 0,36 mA

Mengutip pertanyaan asli:

Saya pikir saya bisa melakukan sleeppanggilan untuk waktu tertentu di dalam metode loop "

Anda harus menggunakan sleep_cpu()setelah mengatur mode tidur yang Anda butuhkan, dari daftar di atas. Arduino Playground memiliki pos yang berguna tentang ini .

Aplikasi perlu didorong oleh interupsi, gunakan mode tidur di atas secara ekstensif, dan bangun prosesor dengan menekan tombol, waktu berlebih, dan acara pengawas waktu untuk benar-benar menjalankan tugas.

Penghematan daya tambahan dapat diperoleh melalui langkah-langkah berikut:

  • Gunakan osilator internal mikrokontroler dan laju clock rendah (8MHz alih-alih 16) - tetapi pastikan kode waktu dan waktu terkait masih berfungsi seperti yang diharapkan. Versi bootloader yang berbeda mungkin diperlukan untuk ini.
  • Hindari menyalakan LED dalam waktu lama jika aplikasi menggunakannya. Menggunakan flash ganda atau tripel cepat dengan durasi singkat (0,05 detik aktif, 0,5 detik mati), dengan jeda detik di antaranya, memastikan indikasi nyata dengan konsumsi daya minimal
  • Gunakan regulator switching alih-alih yang linier, jika diperlukan regulator.
  • Jalankan mikrokontroler pada tegangan yang lebih rendah jika didukung, 3,0 Volt (misalnya sel Lithium CR2032, tidak diperlukan regulator) atau 3,3 Volt bukannya 5 Volt.
  • Ikuti rekomendasi dalam lembar data untuk pengaturan pin input dan output yang tidak digunakan untuk pemborosan daya minimum.

Memasukkan saran-saran ini memungkinkan untuk menjalankan aplikasi mikrokontroler selama berminggu-minggu atau berbulan-bulan pada sel koin CR2032 tunggal, dan bertahun-tahun pada sel lithium jenis LR123. Tentu saja, jarak tempuh Anda dapat bervariasi tergantung pada sensor apa, output dan pemrosesan aktual yang dibutuhkan aplikasi Anda.

Beberapa referensi yang bermanfaat:


Dengan pengalaman saya, di SLEEP_MODE_PWR_DOWN Anda dapat menurunkannya menjadi 0,1uA hingga 6,0uA jika Anda pandai mematikan setiap hal kecil (seperti deteksi brown-out). Saya telah membuat build yang menggunakan kurang dari 60uA yang bertahan 3-5 tahun dengan baterai alkaline AA.
Tim Eckel

@ TimEckel Saya tergila-gila dengan menunjukkan status dengan LED - yang memakan anggaran daya seperti itu keluar dari gaya.
Anindo Ghosh

3
Tidak harus. Gunakan LED berdaya tinggi dengan resistansi tinggi. Akan menggunakan sebagian kecil dari mA alih-alih lebih dari 20 mA. Juga, nyalakan LED status selama 5-15 ms setiap beberapa detik, bukannya terus-menerus menyala. Saya memiliki LED status redup murah yang menggunakan 30 mA, saya mengubahnya menjadi LED bertenaga tinggi dengan resistor 3.3k Ohm yang saya flash selama 15 ms setiap 8 detik. Pergi dari 30 mA ke 2,9 uA arus rata-rata, 1/1000 daya!
Tim Eckel

4
@TimEckel Anda jelas tidak mengerti seberapa besar hasrat saya untuk lampu yang berkedip :-D Bukannya saya ingin mengurangi intensitas, saya suka hal-hal kecil yang berkilauan seperti api Hades, anggaran daya terkutuk! Pada catatan yang lebih serius: Saya menyadari trik-trik kecil itu, dan bahkan telah membuat beberapa trik saya sendiri, yang meningkatkan dampak alarm visual sekaligus mengurangi daya melalui LED. Komentar sebelumnya itu ( hanya sebagian ) bercanda, untuk pergi dengan banyak pertanyaan LED menyenangkan saya jawab di sini.
Anindo Ghosh

3
Saya mengukur konsumsi daya ATMega328P pada voltase dan frekuensi yang berbeda dan menjadikan bagan ini docs.google.com/spreadsheets/d/…
Cano64

19

Saya memiliki Arduino Pro Mini di meja saya sekarang yang kehabisan 2 baterai AA dan dapat berjalan selama lebih dari setahun jika diperlukan.

Ada tiga aspek desain yang telah mencapai ini.

1. Regulator yang berbeda

Saya menggunakan penguat penguat LTC3525. Ini memiliki arus diam sangat rendah (7uA) dan efisiensi tinggi (> 90% @ 0,2mA). Sesuatu seperti papan sparkfun ini https://www.sparkfun.com/products/8999 harus melakukan pekerjaan serupa. Pastikan untuk menghubungkannya ke pin 5V pada Arduino, bukan VIN, sehingga regulator Arduino tidak digunakan.

2. Sleeeeeeep

Proporsi waktu perangkat aktif akan menjadi kecil. Selama sisa waktu perangkat harus tertidur di SLEEP_MODE_POWER_DOWN. Anda dapat mendasarkan rutinitas tidur Anda dari Rocketscreem Low Power Library . Menurut tautan itu Anda harus bisa turun ke 1.7uA dengan ADC, BOD dan WDT mati dan dalam mode power down.

3. Mengganggu

Setengah lainnya tidur terganggu untuk membangunkannya. Dalam mode Power Down sleep, hanya level yang mengganggu INT1 dan INT2, TWI cocok, dan WDT akan membangunkannya. Jadi, Anda harus memiliki tombol yang terhubung ke INT1 atau INT2 sehingga menekan tombol akan membangunkannya.

Hal-hal lain:

Matikan semua LED kecuali benar-benar diperlukan. Jika kunci di dalam ruangan, LED tidak harus cerah, menghemat lebih banyak daya. Juga jika Anda perlu membuat MCU melakukan beberapa tugas secara teratur, gunakan pengawas waktu untuk membangunkannya secara berkala.

Sunting:

Salah satu metode yang dapat bekerja adalah dengan menggunakan perpustakaan Low Power di atas, dan tidur untuk mengatakan 60 ms setiap loop berkat pengawas waktu. Saat bangun periksa untuk tombol tekan. Fungsi yang akan dipanggil

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

14

Semua komentar ini tepat. Saya ingin menambahkan beberapa saran lagi:

1) Untuk LED, gunakan LED 20 mA output tinggi. Inilah logikanya. Katakanlah Anda menginginkan LED status redup yang berkedip setiap 8 detik. Anda tidak ingin itu cerah, jadi Anda menggunakan beberapa LED acak. Masalahnya, LED redup masih menggunakan 20 mA (atau lebih) untuk output hanya 100 mcd. Alih-alih, dapatkan LED output tinggi yang masih memiliki rating 20 mA tetapi dapat menghasilkan 4000 mcd (pastikan Anda melihat pada sudut output, Anda mungkin masih menginginkannya 30 derajat atau lebih). Dengan LED 4000 mcd ini, Anda menghubungkannya dengan sesuatu seperti resistor 3,3 k Ohm dan Anda mendapatkan output cahaya sekitar 100 mcd, tetapi menggunakan kurang dari 1 mA. Jadi, alih-alih menggunakan 20 mA untuk status LED, Anda menggunakan sebagian kecil dari satu mA. Saya juga biasanya mengatur status lampu kilat LED tepat waktu hanya 5-15 ms, yang juga dapat menghemat banyak daya jika sebelumnya Anda memiliki lampu kilat tepat waktu pada 100 ms.

2) Pengatur tegangan pilihan saya adalah Microchip MCP1700. Hanya menggunakan 1,6 μA arus diam dan super murah (sekitar $ 0,30 dalam jumlah kecil). Satu-satunya batasan adalah tegangan input maksimum hanya 6 volt, jadi Anda tidak bisa menggunakan baterai 9 volt. Tapi, ini sempurna untuk 4 baterai AA, satu sel LiPo atau dua sel koin lithium.

3) Untuk menyalakan rangkaian ATmega dengan 4 baterai AA, saya biasanya menggunakan dioda 1N4001 pada VCC untuk menjatuhkan maksimum 6 volt dari 4 baterai menjadi 5,5 volt. Selain itu, dioda melindungi ATmega dari tegangan balik, sehingga melayani dua tujuan yang bermanfaat. Melakukan ini, saya dapat membuat sirkuit bertenaga baterai yang dapat menggunakan hanya 0,1 μA saat tidur karena tidak ada regulator tegangan memakan arus sepanjang waktu.


8

Saya melakukan tes pada atmega328P-PU telanjang di papan tempat memotong roti menggunakan perpustakaan RocketScream LowPower

Gunakan sketsa ini:

#include "LowPower.h"

void setup(){}

void loop()
{
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);         
    delay(5000);
}

Dengan uCurrent Gold, saya mengukur 7,25 uA saat dalam mode mati.


1
Bagus! Saya akan mencoba ini sesegera mungkin. Apakah ini memungkinkan untuk menjalankan atmega238 selama bertahun-tahun dengan baterai CR2032?
Basj

6

Ada dua pertanyaan di sini, tetapi hanya yang kedua yang benar-benar bagian dari judul pertanyaan, jadi mungkin lebih baik jika Anda membuka satu lagi untuk pertanyaan pemrograman Arduino. Saya akan menjawab pertanyaan kedua di sini.

Baterai 1.5V AA alkaline top-end tunggal memiliki kapasitas sekitar 2600mAh. Jika Anda menggunakan baterai lithium, Anda bisa mendapatkan sekitar 3400mAh jika beruntung. Mari kita gunakan angka itu sebagai dasar untuk kasus terbaik mutlak.

Cara Anda menghitung waktu berjalan maksimum teoretis untuk suatu beban cukup dengan kapasitas dibagi dengan beban. Jika beban Anda adalah 1mA, Anda dapat menjalankannya selama 3400/1 = 3400 jam = 141 hari = ~ 5 bulan. Namun, ini hanya maksimum teoretis , karena Anda akan mulai mendapatkan tegangan signifikan terkulai sekitar 65% pada waktu itu. Jika Anda mengatur output, Anda akan mendapatkan efek pelarian di mana semakin rendah tegangan baterai, semakin tinggi arus yang dibutuhkan untuk mempertahankan tegangan yang diatur, yang menguras baterai lebih cepat. Saya akan terkejut jika Anda bisa mendapatkan lebih dari 80% kapasitas yang diiklankan dengan tegangan yang cukup tinggi untuk menjalankan perangkat Anda.

Jadi, katakanlah Anda mendapatkan 80% dari waktu setelah tegangan terkulai dan ketidakefisienan regulator. Kami akan menganggap bahwa Anda berjalan pada 3.3V dari tiga baterai secara seri. Ini masih akan memberi Anda kapasitas yang sama, tetapi tegangan akan cukup untuk regulator. Jika perangkat Anda berjalan pada 15mA (itu perkiraan yang agak konservatif) angkanya akan terlihat seperti ini:

  • Kapasitas setelah efisiensi 80% = 3400 * 0,8 = 2720mAh
  • Waktu = 2720/15 = 181 jam = 7,54 hari

Jadi Anda membutuhkan sekitar 144 baterai lithium (48 set 3) untuk menjalankannya selama setahun. Tidak begitu baik!

Saya sarankan menggunakan pasokan DC yang diatur dari listrik sebagai gantinya. Cadangan baterai dapat dimasukkan, yang mudah diatur dengan relai SPDT - cukup sambungkan koil ke DC utama dan sambungkan kontak "off" ke baterai. Ketika DC gagal, kontak jatuh dan baterai digunakan sebagai gantinya.


Mimpi tanpa kabel saya hancur;) Terima kasih atas jawaban terperinci. Ini sepertinya pilihan terbaik bagi saya juga.
LouwHopley

Secara kebetulan, ini adalah pertanyaan yang sama dengan yang saya ajukan pada diri sendiri ketika merancang kunci pintu elektronik. Bahkan dengan baterai isi ulang 10.000 mAh yang tebal tidak sepadan. Akhirnya hanya menggunakan adaptor DC 250mA dan baterai ponsel lama sebagai cadangan.
Polinomial

4
Rata-rata 15 mA tidak terdengar terlalu konservatif bagi saya! 328 dapat berjalan di microamps satu digit dalam mode tidur, dan tentunya Anda bisa lolos dengan setidaknya dalam tidur semi-mendalam banyak waktu. Juga, pada frekuensi rendah (misalnya 0,5 MHz) Anda dapat bertahan dengan <1 mA dalam mode aktif. Tentu saja, komponen lain (pengatur tegangan dll.) Perlu dipilih agar sesuai dengan sifat berdaya rendah.
exscape

4
@ Polinomial Saya tidak melihat dengan cermat skema, tapi pasti proyek dapat dibangun tanpa "LED daya". Atau Anda bisa mengedipkannya, sehingga menyala misalnya dengan setengah kecerahan (melalui PWM), hanya untuk mengatakan 25 ms setiap 2 detik, sehingga penggunaan saat ini akan turun menjadi rata-rata ~ 0,09 mA bukannya 15.
exscape

1
Arduino sangat haus kekuasaan. Membangun papan Anda sendiri akan menyelesaikan ini. Atmega328 menarik 0,2 mA saat 32kH dan 0,75 uA pada mode hemat daya.
Vorac

4

Sesuatu yang belum pernah disebutkan: Anda harus memiliki cara untuk mematikan pasokan + 5V yang menyalakan servo, saat Anda tidak menggunakannya. Bahkan ketika itu tidak bergerak, servo masih akan menarik daya.

FET dengan gerbang yang dikendalikan oleh pin I / O dari Arduino adalah cara yang baik untuk melakukannya.


Saya biasanya menggunakan 2N3904 untuk setiap sensor atau apa pun untuk menyalakan / mematikannya. Atau, jika sensor berdaya rendah dan tegangan yang sama dengan apa yang saya jalankan ATmega, saya hanya menggunakan pin secara langsung untuk mengontrol status daya.
Tim Eckel

1
Gunakan 2n7000 untuk menggunakan daya yang jauh lebih sedikit daripada 2n3904 dan Anda tidak perlu resistor dasar.
John Meacham

3

Anda mungkin mempertimbangkan untuk menggunakan pengontrol-mikro yang khusus dioptimalkan untuk konsumsi daya rendah untuk desain Anda berikutnya. Untuk konsumsi daya yang rendah perlu untuk mengambil daya yang sangat rendah saat tidur. Apa yang sering diabaikan adalah penting juga seberapa cepat ia dapat bangun dari tidur ini.

Yang penting adalah berapa banyak biaya yang diperlukan dari tidur yang paling dalam untuk menangani interupsi secepat mungkin (karena kekuatan ledakan akan sangat singkat) dan kembali tidur lagi.

Salah satu contoh pengendali mikro semacam itu adalah MSP430 dari Texas Instruments. Di situs web mereka, Anda akan menemukan catatan aplikasi cara menghemat energi dan aplikasi pemanenan energi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.