3.29. 저전력 및 슬립 모드¶
배터리로 구동되는 카메라나 간헐적으로만 동작하는 센서는 항상 CPU를 최대 속도로 돌릴 필요가 없습니다. machine 모듈은 점점 더 깊어지는 네 단계의 절전 상태를 제공합니다. active, idle(), lightsleep(), deepsleep()가 그것입니다. 한 단계 더 깊이 들어갈 때마다 칩의 더 많은 부분이 꺼지고 더 많은 전력이 절약되지만, 대신 깨어나는 데 더 오래 걸립니다. 적절한 단계를 고르는 것은 카메라가 절약하는 전력과 어떤 일이 일어났을 때 얼마나 빨리 반응할 수 있는지 사이의 균형 문제입니다.
3.29.1. Active¶
기본 상태입니다. CPU가 Python을 실행하고, 모든 주변장치에 클록이 공급되며, 전류 소모가 가장 높습니다. 카메라 로직 레일에서 수십 밀리암페어를 쓰고, 여기에 연결된 액세서리가 끌어 쓰는 전류가 더해집니다.
3.29.2. idle()¶
machine.idle()는 어떤 인터럽트(주변장치, 타이머, 핀 IRQ)가 발생할 때까지 CPU 클록을 차단합니다. RAM은 살아 있고, 주변장치는 켜진 채로 유지되며, 클록은 계속 동작합니다. 오직 CPU 자체만 일시 정지되며, 할 일이 생기면 마이크로초 단위로 깨어납니다.
외부에서 무언가 일어나기를 기다리는 빡빡한 폴링 루프 안에서 사용하세요:
import machine
while not button_pressed():
machine.idle()
CPU는 while 검사 자체에 사이클을 낭비하지 않고, 다음 이벤트가 도착하면 자연스럽게 깨어납니다. 한 번의 절약은 작지만, 수백만 번 도는 루프에서는 누적되어 커집니다.
3.29.3. lightsleep()¶
machine.lightsleep()는 그 다음 단계입니다. CPU가 완전히 멈추고 칩 내부 클록의 대부분이 꺼지지만, RAM과 주변장치 상태는 보존됩니다. 웨이크 소스가 발생하면 스크립트는 lightsleep를 호출했던 바로 그 지점에서, 변수와 열린 핸들과 대기 중인 데이터가 모두 온전한 상태로, 밀리초 단위 뒤에 재개됩니다.
import machine
from machine import Pin
wake_pin = Pin("P0", Pin.IN, Pin.PULL_UP)
wake_pin.irq(lambda _: None, trigger=Pin.IRQ_FALLING, wake=machine.SLEEP)
while True:
do_work()
machine.lightsleep() # wakes on a falling edge on P0
웨이크 소스(여기서는 핀 IRQ)는 슬립 호출 전에 구성해야 합니다. 전력 소모는 active 모드에 비해 크게 떨어집니다. 정확한 수치는 보드와 여전히 구성되어 있는 주변장치에 따라 달라집니다.
3.29.4. deepsleep()¶
machine.deepsleep()는 가장 깊은 상태입니다. CPU가 멈추고, 주변장치는 전원이 차단되며, RAM 내용은 손실될 수 있습니다. 여전히 전력을 끌어 쓰는 것은 웨이크 회로와 약간의 상시 동작 로직뿐입니다.
웨이크 소스가 발생하면 칩은 메인 스크립트의 처음부터 부팅됩니다. deepsleep는 반환하지 않습니다. 스크립트는 machine.reset_cause()를 사용해 deepsleep 웨이크를 새로운 전원 인가나 하드 리셋과 구분합니다:
import machine
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
# Woke from deepsleep -- restore state from non-volatile storage,
# take a measurement, etc.
pass
else:
# Fresh boot
pass
do_work()
machine.deepsleep(60_000) # arm RTC wake for 60 s, sleep, then restart
deepsleep()에 전달하는 밀리초 인자는 내부적으로 온칩 RTC 알람을 설정합니다. 대부분의 다른 타이머가 전원 차단되기 때문에, 슬립 동안 웨이크업 타이밍을 유지하는 것은 바로 RTC입니다. 인자 없이 deepsleep()를 호출하면 웨이크업을 별도로 구성한 소스(핀 IRQ, 외부에서 설정한 RTC 알람)에 맡깁니다.
스크립트가 다시 시작되기 때문에, 다음 반복에 필요한 모든 것은 main.py 맨 위에서 재구성하거나 플래시(또는 그것을 갖춘 부품에서는 RTC의 백업 레지스터)에 저장해 두어야 합니다. Deepsleep는 가장 큰 전력 절약을 제공하지만 프로그램 구조를 가장 많이 바꾸도록 강제합니다. 애플리케이션은 RAM에 상태를 둔 장시간 실행 루프가 아니라, 슬립으로 구분된 짧은 “측정 버스트”의 연속처럼 동작해야 합니다.
3.29.5. 상태 선택하기¶
올바른 상태는 카메라가 무엇을 기다리고 있는지에 달려 있습니다:
밀리초를 기다리는 빡빡한 폴링 루프.
idle()를 사용하세요. 사이클당 절약은 작지만 합산하면 큽니다. 그리고 웨이크는 눈에 띄지 않습니다.이벤트 사이에 수 초에서 수 분간 유휴 상태.
lightsleep()를 사용하세요. 상태가 보존되고, 웨이크가 빠르며, 전력 소모는 active 모드의 일부에 불과합니다.짧은 작업 버스트 사이에 수 분 이상 유휴 상태.
deepsleep()를 사용하세요. 칩은 이벤트 사이에 사실상 꺼지며, 스크립트 구조는 깨어나서 측정하고 다시 자는 루프로 바뀝니다.
어떤 상태든 웨이크 소스는 상태 그 자체만큼이나 중요합니다. 타이머로만 깨어나는 deepsleep는 듀티 사이클 측정 루프이고, 핀 IRQ로 깨어나는 lightsleep는 이벤트 구동 센서입니다. machine 모듈의 슬립 함수들, RTC 알람, irq()가 함께 그 구성 요소를 제공합니다.