電源管理 V2

このモジュールを使うと、micro:bit V2 の電源モードを管理できます。

MicroPython から要求できる micro:bit ボードの低電力モードには2つあります:

  • ディープスリープ: 複数のソース(端子、ボタン押下、UART データ、タイマー)
  • オフ: 最も消費電力が少ない電源モードで、ボードを起動させる唯一の方法は、リセットボタンを使うか、バッテリー駆動中にUSBケーブルを接続することです。ボードが起床すると、再起動してプログラムを最初から実行します。

これらの低電力モードがどのように機能するかについて詳しくは 詳細情報の章 を参照してください。

関数

power.off()

ボードを可能な限り低い電力モードに電源ダウンさせます。

これは、リセットボタンを数秒間押してボードを「オフモード」にするのと同じです。

micro:bit はリセットボタンが押された場合、または電池駆動の場合は USB ケーブルが接続された場合にのみ起動します。

ボードは起動するとリセット状態を開始するので、プログラムは最初から実行されます。

power.deep_sleep(ms=None, wake_on=None, run_every=True)

micro:bit 起床時に動作を継続できる低電力モードに設定します。

プログラムの状態は保持され、起床すると中断したところから動作を再開します。

ディープスリープモードはオフモードよりも多くのバッテリー電力を消費します。

起床させるソースは引数で設定します。

ボードは、UARTデータを受信したとき、(ボードをリセットするときに使う)リセットボタンを押したとき、バッテリー駆動している場合においては USB ケーブルを挿入したときに、常に起床します。

run_every パラメータを True に設定すると(デフォルト)、 microbit.run_every でスケジュールした関数は、ボードを一瞬だけ起こして実行し、終了するとスリープに戻ります。

パラメータ:
  • ms -- 起床するまでの時間(ミリ秒単位)。
  • wake_on -- ボードを起床するためのピン/ボタンの単一インスタンスまたはタプル。例: deep_sleep(wake_on=button_a) または deep_sleep(wake_on=(pin0, pin2, button_b))
  • run_every -- microbit.run_every による関数実行のスケジュールをディープスリープ中でも有効にするかを設定するブール値です。

サンプルコード

電源管理 API の使い方を示すプログラム例:

"""
10秒ごとにディスプレイに「へん顔」を表示する。
Aボタンを押すとディープスリープになり、30分経過するか、もう一度ボタンAを押すと、
スリープを解除します。
Bボタンを押すとオフモードになります。
"""
from microbit import *
import power

@run_every(s=10)
def silly_face():
    display.show(Image.SILLY)
    sleep(400)

while True:
    if button_b.is_pressed():
        display.scroll("Off")
        # このモードでは、リセットボタンを押すことでしかmicro:bitは目覚めません。
        power.off()
        # このモードからのウェイクアップはプログラムを最初から開始するため、
        # このコード行は決して実行されません。
        display.show(Image.SURPRISED)
    elif button_a.is_pressed():
        display.show(Image.ASLEEP)
        sleep(300)
        # 複数の起床ソースを指定してディープスリープに入ります
        power.deep_sleep(
            wake_on=(pin0, pin1, button_a),
            ms=30*1000,        # 30秒後に起床します
            run_every=False,   # run_everyによるボードの起床を停止します
        )
        # micro:bit が起床したら、ここから実行を継続します
        # 数回点滅して起床を知らせます
        display.show([Image("99099:09090:99099:09990"), Image.ASLEEP] * 3, 250)
    display.show(Image.HAPPY)
    sleep(200)

データログを使用した例:

from microbit import *
import power
import log

# 5分ごとに温度を記録する
@run_every(min=5)
def log_temperature():
    log.add(temp=temperature())

while True:
    # Aボタンを押したときの温度を表示します
    if button_a.is_pressed():
        display.scroll(temperature())
    # ディープスリープに入り、Aボタンを押すと起床するようにし、run_every で
    # スケジューリングした関数がバックグラウンドで実行されるようにする
    power.deep_sleep(wake_on=button_a, run_every=True)

詳細情報

micro:bit ボードには2つのマイクロコントローラ(MCU)があり、それぞれ独立してスリープ/起床できます。

  • ターゲット MCU - MicroPython とそのコードを実行します。
  • インタフェース MCU - MICROBIT USB ドライブなど、USB 機能および USB のシリアルインタフェースを提供する二次マイクロコントローラ。
_images/power-mcus.png

各 MCU は、次の「MCU 電源モード」のいずれかにできます:

  • 覚醒 (Awake): 通常の動作モードです。
  • スリープ (Sleep): MCU が異なるソースから起床され、動作を継続することができる低電力モードです。
  • 電源ダウン (Power Down): 個々の MCU にとって最も低い電力モードであり、起動するとリセットから開始されます。

Python コードは「ボード電源モード」(この場合は ディープスリープ または オフ)を要求でき、ターゲットを指定の「MCU 電源モード」に設定しますが、インタフェース MCU モードは micro:bit の電源、つまり USB (コンピュータへのコネクタ)またはバッテリー経由で電源供給されているかどうかに依存します。

要するに、バッテリー電源の場合、インタフェース MCUは 低電力モードに移行できますが、USB でコンピュータに接続されている場合、USB 接続を維持するために起きていることになります。

USB Powered (Interface always awake)

ボード電源モード ターゲット MCU モード インタフェース MCU モード
ディープスリープ 💤 スリープ ⏰ 覚醒
オフ 📴 電源ダウン ⏰ 覚醒 (赤 LED 点滅)

Battery Powered

ボード電源モード ターゲット MCU モード インタフェース MCU モード
ディープスリープ 💤 スリープ 💤 スリープ
オフ 📴 電源ダウン 📴 電源ダウン

ディープスリープと run_every

「ディープスリープ」中も microbit.run_every 関数が実行されるように、micro:bit は正しい時刻に起床して次にスケジュールされている run_every を実行し、その run_every が完了すると同時に「ディープスリープ」モードに戻ります。 ms のタイムアウトに達するか wake_on イベントが発生して、ディープスリープが終了するまで、この動作が続きます。