배터리로 atmega328을 1 년 동안 작동 시키려면 어떻게해야합니까?


51

대본

기숙사 방에 멋진 전자 도어록을 만들었습니다. 현재는 도어를 잠그는 서보가 장착 된 Arduino Diecimila입니다. 3x4 버튼과 5 개의 LED (2 개의 직렬 쌍 및 1 개의 단일 LED)가있는 숫자 키패드가 있습니다. 또한 현재 휴대 전화 충전기에서 실행됩니다.

나는 이제 독립형 Arduino (ATmega328)에서 실행되도록 재 설계했지만 AA 배터리 또는 9V 배터리에서 실행되도록하고 싶습니다.

소프트웨어 부분의 경우, sleepATmega 전력 소비를 가능한 한 낮게 유지하기 위해 루프 방법 내에 특정 시간 동안 호출을 할 수 있다고 생각했습니다 . 그리고 가능한 한 오랫동안 꺼진 상태에서 LED가 "깜박이도록"하십시오.

질문 1

보드가 잠자기 몇 밀리 초 동안 버튼을 누르면, 잠자기 상태가 될 때까지 "기억"/ "보류"된 후 버튼 누름으로 선택됩니까?

절전 모드에서이 버튼 누름을 처리하는 가장 좋은 방법은 무엇입니까? 버튼 활동시 깨어나도록 코딩 할 수 있습니까? 예를 들어 10m.s 동안 잠자 게해야합니다. 모든 루프에서?

질문 2

이 장치를 10 개월 동안 작동시키는 데 필요한 AA 배터리 수를 계산하는 수학에 어떻게 접근 할 수 있습니까?

또한 분당 평균 전력 사용량을 빠르게 측정하는 방법을 모릅니다.

장치

내 도어 잠금 장치

답변:


35

Atmega328은 최소에서 우수 ( 이 포럼 게시물의 예상 전류 소비)에 따라 6 가지 절전 모드를 제공합니다 .

  • SLEEP_MODE_IDLE : 15mA
  • SLEEP_MODE_ADC : 6.5 mA
  • SLEEP_MODE_PWR_SAVE : 1.62mA
  • SLEEP_MODE_EXT_STANDBY : 1.62mA
  • SLEEP_MODE_STANDBY : 0.84 mA
  • SLEEP_MODE_PWR_DOWN : 0.36 mA

원래 질문을 인용 :

sleep루프 메소드 안에 특정 시간 동안 전화를 걸 수 있다고 생각했습니다. "

sleep_cpu()위 목록에서 필요한 절전 모드를 설정 한 후 사용해야 합니다. Arduino Playground에는 이것에 대한 유용한 게시물이 있습니다.

응용 프로그램은 인터럽트로 구동되고 위의 절전 모드를 광범위하게 사용하며 실제로 버튼을 눌러 프로세서를 깨우고 타이머 오버플로 및 워치 독 타이머 이벤트를 실행하여 실제로 작업을 실행해야합니다.

다음 단계를 통해 추가 절전 효과를 얻을 수 있습니다.

  • 마이크로 컨트롤러의 내부 발진기와 낮은 클럭 속도 (16 대신 8MHz)를 사용하십시오. 그러나 시간 및 타이밍 관련 코드가 여전히 예상대로 작동하는지 확인하십시오. 이를 위해 다른 버전의 부트 로더가 필요할 수 있습니다.
  • 응용 프로그램에서 LED를 사용하는 경우 LED를 오래 켜두 지 마십시오. 짧은 간격 (0.05 초 켜기, 0.5 초 끄기)의 빠른 이중 또는 삼중 플래시를 사용하여 간격이 초 단위로 최소화되어 전력 소비를 최소화하면서 눈에 띄는 표시를 보장합니다.
  • 레귤레이터가 필요한 경우 선형 레귤레이터 대신 스위칭 레귤레이터를 사용하십시오.
  • 지원되는 경우 낮은 전압에서 마이크로 컨트롤러를 실행하십시오 (예 : CR2032 리튬 셀, 레귤레이터 불필요) 또는 5V 대신 3.3V.
  • 최소 전력 낭비를위한 미사용 입력 및 출력 핀 설정에 대해서는 데이터 시트의 권장 사항을 따르십시오.

이러한 제안을 통합하면 단일 CR2032 코인 셀에서 몇 주 또는 몇 달 동안 LR123 유형 리튬 셀에서 몇 년 동안 마이크로 컨트롤러 애플리케이션을 실행할 수 있습니다. 물론, 마일리지는 애플리케이션에 필요한 센서, 출력 및 실제 처리에 따라 달라질 수 있습니다.

유용한 참고 자료 :


내 경험에 따르면 SLEEP_MODE_PWR_DOWN에서는 모든 작은 것을 끄는 것에 현명한 경우 (갈색 감지와 같은) 0.1uA에서 6.0uA로 줄일 수 있습니다. 나는 알칼리성 AA 배터리 세트에서 3-5 년 동안 60uA 미만을 사용하는 빌드를 만들었습니다.
Tim Eckel

@TimEckel 나는 LED로 상태를 나타내는 것에 열중한다. 그것은 스타일에서 벗어나는 것처럼 전력 예산을 먹는 것이다.
Anindo Ghosh

3
필요하지 않습니다. 저항이 높은 고성능 LED를 사용하십시오. 20mA가 아닌 mA의 일부를 사용합니다. 또한 계속 켜져있는 대신 몇 초마다 상태 LED를 5-15ms 동안 깜박입니다. 나는 30mA를 사용하는 값싼 희미한 상태의 LED를 가지고 있었고, 3.3k Ohm 저항을 가진 고출력 LED로 변경하여 8 초마다 15ms 동안 깜박였습니다. 평균 전류 30mA에서 2.9uA, 1/1000의 전력으로 갔다!
Tim Eckel

4
@TimEckel 당신은 분명히 깜박 거리는 조명에 대한 나의 열정의 정도를 이해하지 못한다. 더 심각한 참고 사항 : 나는 그 작은 트릭을 알고 있으며 실제로 내 자신의 몇 가지를 만들어서 LED를 통한 전력을 줄이면서 시각적 경보 영향을 증가시킵니다. 그 이전의 의견은 여기에서 대답 하는 많은 재미있는 LED 질문 과 함께하기 위해 jest 에 ( 부분적으로 만 ) 있었습니다.
Anindo Ghosh

3
다른 전압과 주파수에서 ATMega328P의 전력 소비를 측정하고이 차트를 docs.google.com/spreadsheets/d/…
Cano64

19

책상에 Arduino Pro Mini가 장착되어 있으며 AA 배터리 2 개를 사용하고 필요할 경우 1 년 이상 사용할 수 있습니다.

이를 달성 한 디자인에는 세 가지 측면이 있습니다.

1. 다른 조정기

LTC3525 부스트 레귤레이터를 사용하고 있습니다. 대기 전류 (7uA)가 매우 낮고 효율 (> 90 % @ 0.2mA)이 매우 높습니다. 이 sparkfun 보드 https://www.sparkfun.com/products/8999 와 같은 것이 비슷한 작업을 수행해야합니다. Arduino 레귤레이터가 사용되지 않도록 VIN이 아닌 Arduino의 5V 핀에 연결하십시오.

2. Sleeeeeeep

장치가 활성화되는 시간의 비율은 작습니다. 나머지 시간 동안 장치는 SLEEP_MODE_POWER_DOWN에서 잠 들어야합니다. Rocketscreem 저전력 라이브러리 에서 수면 루틴을 수행 할 수 있습니다 . 이 링크에 따르면 ADC, BOD 및 WDT를 끄고 전원 차단 모드에서 1.7uA로 낮출 수 있습니다.

3. 인터럽트

수면의 나머지 절반은 잠에서 깨어납니다. Power Down 절전 모드에서는 INT1 및 INT2의 레벨 인터럽트 만 일치하며 TWI는 WDT에서 깨어납니다. 따라서 INT1 또는 INT2에 연결된 버튼이 있어야 버튼을 누르면 활성화됩니다.

다른 것들 :

꼭 필요한 경우가 아니면 모든 LED를 끄십시오. 잠금 장치가 실내에 있으면 LED가 밝아 질 필요가 없으므로 더 많은 전력을 절약 할 수 있습니다. 또한 MCU가 일부 작업을 정기적으로 수행해야하는 경우 워치 독 타이머를 사용하여 주기적으로 깨우십시오.

편집하다:

작동 할 수있는 한 가지 방법은 위의 저전력 라이브러리를 사용하고 워치 독 타이머 덕분에 루프마다 60ms 동안 대기하는 것입니다. 깨어날 때 버튼 누름을 확인하십시오. 호출 할 함수는

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

14

이 모든 의견이 제자리에 있습니다. 몇 가지 제안을 추가하고 싶습니다.

1) LED의 경우 고출력 20mA LED를 사용하십시오. 여기 논리가 있습니다. 8 초마다 깜박 거리는 희미한 상태 LED를 원한다고 가정합니다. 밝고 싶지 않기 때문에 임의의 LED를 사용하십시오. 문제는 희미한 LED가 여전히 20mc (또는 그 이상)를 사용하여 100mcd 만 출력한다는 것입니다. 대신, 여전히 20mA로 정격이지만 4000mcd를 출력 할 수있는 고출력 LED를 얻으십시오 (출력 각도를 확인하십시오, 여전히 30도 이상을 원할 것입니다). 이 4000mcd LED를 사용하면 3.3kΩ 저항과 연결하여 약 100mcd의 광 출력을 얻을 수 있지만 1mA 미만을 사용합니다. 따라서 상태 LED에 20mA를 사용하는 대신 단일 mA의 일부만 사용합니다. 또한 일반적으로 상태 LED 플래시를 5-15ms 동안 만 제 시간에 설정합니다. 이전에 100ms의 시간에 플래시를 켰을 경우 많은 전력을 절약 할 수 있습니다.

2) 선택한 전압 조정기는 Microchip MCP1700입니다. 1.6µA의 대기 전류 만 사용하며 매우 저렴합니다 (소량으로 약 $ 0.30). 단, 최대 입력 전압은 6 볼트이므로 9 볼트 배터리를 사용할 수 없습니다. 그러나 4 개의 AA 배터리, 단일 셀 LiPo 또는 2 개의 리튬 코인 셀에 적합합니다.

3) 4 개의 AA 배터리로 ATmega 회로에 전원을 공급하기 위해 VCC에서 1N4001 다이오드를 사용하여 4 개의 배터리의 최대 6V를 5.5V로 떨어 뜨립니다. 또한 다이오드는 ATmega를 역 전압으로부터 보호하므로 두 가지 유용한 목적을 제공합니다. 이렇게함으로써, 항상 전류를 소모하는 전압 레귤레이터가 없기 때문에 수면 중에 최소 0.1µA를 사용할 수있는 배터리 구동 회로를 만들 수있다.


8

RocketScream LowPower 라이브러리를 사용하여 브레드 보드에서 베어 atmega328P-PU 를 테스트했습니다.

이 스케치를 사용했습니다 :

#include "LowPower.h"

void setup(){}

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

uCurrent Gold를 사용하여 전원 차단 모드에있을 때 7.25 uA를 측정했습니다.


1
좋은! 최대한 빨리 시도하겠습니다. 이것이 CR2032 배터리로 몇 년 동안 atmega238을 실행할 수 있습니까?
Basj

6

여기에는 두 가지 질문이 있지만 두 번째 질문 만 실제로 질문 제목의 일부이므로 Arduino 프로그래밍 질문에 대해 다른 질문을 열면 더 좋습니다. 두 번째 질문에 답하겠습니다.

단일 최고급 알카라인 1.5V AA 배터리의 용량은 약 2600mAh입니다. 리튬 배터리를 사용한다면 운이 좋으면 약 3400mAh를 얻을 수 있습니다. 절대적인 최상의 경우를위한 기준으로이 수치를 살펴 보겠습니다.

부하에 대한 이론적 최대 작동 시간을 계산하는 방법은 단순히 용량을 부하로 나눈 것입니다. 부하가 1mA 인 경우 3400/1 = 3400 시간 = 141 일 = ~ 5 개월 동안 실행할 수 있습니다. 그러나 이것은 이론상 최대치에 불과합니다 . 그 때 상당한 전압이 약 65 % 떨어지기 시작하기 때문입니다. 출력을 조절하는 경우 배터리 전압이 낮을수록 전압을 조절하는 데 필요한 전류가 높아 배터리가 더 빨리 소모되는 폭주 효과가 나타납니다. 장치를 작동시키기에 충분한 전압으로 광고 용량의 80 % 이상을 얻을 수 있다면 놀랍습니다.

전압 강하 및 레귤레이터 비 효율성으로 인해 그 시간의 80 %가 발생한다고 가정 해 봅시다. 3 개의 배터리를 직렬로 연결하여 3.3V로 작동한다고 가정합니다. 그래도 같은 용량을 제공하지만 레귤레이터에는 전압이 충분합니다. 장치가 15mA에서 작동하면 (보통 추정치) 숫자는 다음과 같습니다.

  • 80 % 효율 후 용량 = 3400 * 0.8 = 2720mAh
  • 시간 = 2720/15 = 181 시간 = 7.54 일

따라서 1 년 동안 작동하려면 약 144 개의 리튬 배터리 (48 세트 3 개)가 필요합니다. 너무 좋지 않아!

대신 주전원에서 조정 된 DC 전원을 사용하는 것이 좋습니다. SPDT 계전기로 쉽게 설정할 수있는 배터리 백업을 포함 할 수 있습니다. 코일을 메인 DC에 연결하고 "오프"접점을 배터리에 연결하기 만하면됩니다. DC가 고장 나면 접점이 떨어지고 배터리가 대신 사용됩니다.


나의 무선 꿈은 으스러졌다;) 자세한 답변을 주셔서 감사합니다. 이것은 나에게도 가장 좋은 옵션 인 것처럼 보였다.
LouwHopley

우연히도, 이것은 전자 도어락을 설계 할 때 나에게 제기했던 것과 같은 질문이었습니다. chunky 10,000mAh 충전식 배터리로도 가치가 없습니다. 250mA DC 어댑터와 오래된 휴대 전화 배터리를 백업으로 사용했습니다.
다항식

4
15 mA 평균은 나에게 매우 보수적 인 것처럼 들리지 않습니다! 328은 휴면 모드에서 한 자리 수의 마이크로 암페어로 실행될 수 있으며, 적어도 반 깊은 수면 상태에서 많은 시간을 할애 할 수 있습니다. 또한 저주파수 (예 : 0.5 MHz)에서는 활성 모드에서 <1 mA로 얻을 수 있습니다. 물론 저전력 특성에 맞게 다른 구성 요소 (전압 조정기 등)를 선택해야합니다.
탈출

4
@Polynomial 나는 회로도를 자세히 보지 않았지만 프로젝트는 "전원 LED"없이 구축 될 수 있습니다. 또는 2 초마다 25ms 동안 만 예를 들어 PWM을 통해 절반 밝기로 켜져 있도록 전류를
깜빡

1
Arduino는 배가 고파요. 자신의 보드를 구축하면이 문제를 해결할 수 있습니다. Atmega328은 절전 모드에서 32kH 및 0.75uA 일 때 0.2mA를 소비합니다.
Vorac

4

아직 언급하지 않은 사항 : 서보를 사용하지 않을 때는 + 5V 전원을 끄는 방법이 필요합니다. 움직이지 않더라도 서보는 여전히 전력을 소비합니다.

arduino의 I / O 핀으로 게이트를 제어하는 ​​FET가 좋은 방법입니다.


나는 일반적으로 각 센서 또는 2 / 3904를 켜거나 끌 때마다 2N3904를 사용합니다. 또는 센서가 저전력이고 ATmega를 실행하는 것과 동일한 전압 인 경우 직접 핀을 사용하여 전력 상태를 제어합니다.
Tim Eckel

1
2n7000을 사용하여 2n3904보다 훨씬 적은 전력을 사용하며 기본 저항이 필요하지 않습니다.
John Meacham

3

다음 설계에서 저전력 소비에 최적화 된 마이크로 컨트롤러 사용을 고려할 수 있습니다. 낮은 전력 소비를 위해서는 수면 중에 매우 낮은 전력을 소비해야합니다. 종종 간과되는 것은이 수면에서 얼마나 빨리 깨어날 수 있는지가 중요하다는 것입니다.

가장 중요한 것은 (파열이 매우 짧기 때문에) 가능한 가장 빠른 인터럽트를 처리하고 다시 잠자기 상태로 돌아 가기 위해 가장 깊은 수면에서 걸리는 충전량입니다.

이러한 마이크로 컨트롤러의 한 예는 Texas Instruments의 MSP430 입니다. 웹 사이트에는 에너지 및 에너지 수확 응용 프로그램을 보관하는 방법에 대한 응용 자료가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.