省電力・間欠動作機能

本章では、Armadillo-IoTゲートウェイ A6 の 省電力・間欠動作機能や動作モード、状態遷移について説明します。

7.1. 動作モードと状態遷移図

Armadillo-IoTゲートウェイ A6 の動作モードと状態遷移を次に示します。

images/aiot-mode1.svg

図7.1 状態遷移図


7.1.1. アクティブモード

「CPU:動作」、「LTE-Mモジュール:動作」 状態のモードです。

Armadillo-IoTゲートウェイ A6の電源投入後Linuxカーネルが起動し、まずはアクティブモードに遷移します。

任意のアプリケーションの実行や、外部センサー・デバイスの制御、LTE-MやEthernetでの通信が可能ですが、最も電力を消費するモードです。 アクティブモードの時間をより短くすることで、消費電力を押さえることができます。

7.1.2. シャットダウンモード

「CPU:停止」、「LTE-M停止」の状態であり最も消費電力を抑えることのできるモードです。

その反面、CPUを停止させ、Linuxカーネルをシャットダウンしている状態であるため、アクティブモードに起床するにはLinuxカーネルの起動分の時間がかかります。

シャットダウンモードからアクティブモードに遷移するには、RTCのアラーム割り込みを使用するか、一度電源を切断・再接続を行う必要があります。

7.1.3. スリープモード

「CPU:待機」、「LTE-M:停止」 状態のモードです。

CPU(i.MX6ULL)はパワーマネジメントのSuspend-to-RAM状態になり、LinuxカーネルはPauseの状態になります。 シャットダウンモードと比較すると消費電力は高いですが、Linuxカーネルの起動は不要であるため数秒程度でアクティブモードに遷移が可能です。 ユーザスイッチの投下、RTCアラーム割り込み、GPIO割り込み、USBデバイスの接続、UARTによるデータ受信、によってアクティブモードへの遷移ができます。

7.1.4. スリープ(SMS 起床可能)モード

「CPU:待機」、「LTE-M:待機」 状態のモードです。

スリープモードとの違いは、SMSの受信によって、アクティブモードへの遷移も可能である点です。 LTE-M:待機(PSM)の状態であるため、スリープモードよりも電力を消費します。

7.2. シャットダウンモードへの遷移と起床

シャットダウンモードへ遷移するには、poweroffコマンド、またはaiot-alarm-poweroffコマンドを実行します。

7.2.1. poweroffコマンド

poweroffコマンドを実行してシャットダウンモードに遷移した場合、電源の切断・接続のみでアクティブモードに遷移が可能です。 poweroffコマンドの実行例を次に示します。

[armadillo ~]# poweroff
[  OK  ] Stopped target Timers.
[  OK  ] Stopped Daily man-db regeneration.
[  OK  ] Stopped Daily rotation of log files.

※省略

[39578.876586] usb usb1: USB disconnect, device number 1
[39578.882754] ci_hdrc ci_hdrc.0: USB bus 1 deregistered
[39578.888133] reboot: Power down

7.2.2. aiot-alarm-poweroffコマンド

aiot-alarm-poweroffコマンドを実行することで、シャットダウンモードに遷移後、 RTCのアラーム割り込みをトリガで起床(アクティブモードに遷移)することができます。 コマンド書式を以下に示します。

[armadillo ~]# aiot-alarm-poweroff [現在時刻からの経過秒数]

図7.2 aiot-alarm-poweroff コマンド書式


シャットダウンモードに遷移し、300秒後にアラーム割り込みを発生させるには、次のようにコマンドを実行します。

[armadillo ~]# aiot-alarm-poweroff +300
aiot-alarm-poweroff: alarm_timer +300 second

現在時刻からの経過秒数は180秒以上を指定する必要があります。

7.3. スリープモードへの遷移と起床

aiot-sleepコマンドを実行することで、スリープモードに遷移することができます。 スリープモードからの起床(アクティブモードに遷移する)条件は、aiot-sleepコマンドを実行する前にaiot-set-wake-triggerコマンドで事前指定します。 ユーザースイッチによる起床は標準で有効になっています。また、起床条件はOR条件での設定が可能です。

7.3.1. RTCアラーム割り込み以外での起床

aiot-set-wake-triggerコマンドの書式と設定可能なパラメータを以下に示します。

[armadillo ~]# aiot-set-wake-trigger [TRIGGER] [enabled|disaabled]

図7.3 aiot-set-wake-trigger コマンド書式 (RTCアラーム割り込み以外での起床のとき)


表7.1 aiot-modem-control TRIGGER一覧

TRIGGER 説明

usb-lower

メインユニット CON5(USB ホストインターフェース)の上段にUSBデバイスを挿抜したとき

usb-upper

メインユニット CON5(USB ホストインターフェース)の下段にUSBデバイスを挿抜したとき

uart3

メインユニット CON3、CON4(シリアルインターフェース /dev/ttymxc2)にデータ受信があったとき


コンソール(/dev/ttymxc2)から入力があった場合にスリープモードから起床するには、次に示すコマンドを実行します。

[armadillo ~]# aiot-set-wake-trigger uart3 enabled
aiot-set-wake-trigger: uart3 enabled

[armadillo ~]# aiot-sleep
aiot-sleep: Power Management suspend-to-ram
[ 1767.050404] PM: suspend entry (deep)
[ 1767.054019] PM: Syncing filesystems ...
[ 1767.236546] fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full -
flow control rx/tx
[ 1767.428714] done.
[ 1767.431262] Freezing user space processes ... (elapsed 0.001 seconds) done.
[ 1767.439582] OOM killer disabled.
[ 1767.442834] Freezing remaining freezable tasks ... (elapsed 0.001
seconds) done.
[ 1767.451485] Suspending console(s) (use no_console_suspend to debug)

※ コンソールに入力

[ 1767.567686] OOM killer enabled.
[ 1767.570875] Restarting tasks ... done.
[ 1767.606048] PM: suspend exit
aiot-sleep: change mode CPU Idle

7.3.2. RTCアラーム割り込みでの起床

RTCアラーム割り込みでの起床を行う場合、パラメーター設定が異なります。

[armadillo ~]# aiot-set-wake-trigger rtc [enabled|disaabled] <現在時刻からの経過秒数>

図7.4 aiot-set-wake-trigger コマンド書式 (RTCアラーム割り込みでの起床の場合)


現在時刻からの経過秒数 は60秒以上を指定する必要があります。

300秒後にRTCアラーム割り込みを発生させ、スリープモードから起床させるコマンド実行例を以下に示します。

[armadillo ~]# aiot-set-wake-trigger rtc enabled +300
aiot-set-wake-trigger: rtc enabled
aiot-set-wake-trigger: alarm_timer +300 second

[armadillo ~]# aiot-sleep
aiot-sleep: Power Management suspend-to-ram
[ 1767.050404] PM: suspend entry (deep)
[ 1767.054019] PM: Syncing filesystems ...
[ 1767.236546] fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full -
flow control rx/tx
[ 1767.428714] done.
[ 1767.431262] Freezing user space processes ... (elapsed 0.001 seconds) done.
[ 1767.439582] OOM killer disabled.
[ 1767.442834] Freezing remaining freezable tasks ... (elapsed 0.001
seconds) done.
[ 1767.451485] Suspending console(s) (use no_console_suspend to debug)

※ 約300秒待つ

[ 1767.567686] OOM killer enabled.
[ 1767.570875] Restarting tasks ... done.
[ 1767.606048] PM: suspend exit
aiot-sleep: change mode CPU Idle

7.3.3. 起床要因のクリア

すべての起床要因をクリアするには次に示すコマンドを実行します。ユーザースイッチによる起床設定は無効化できません。

[armadillo ~]# aiot-set-wake-trigger all disabled
aiot-set-wake-trigger: clear_all disabled

7.4. スリープ(SMS 起床可能)モードへの遷移と起床

aiot-sleep-smsコマンドを実行することで、スリープ(SMS 起床可能)モードに遷移することができます。 スリープモードからの起床(アクティブモードに遷移する)条件は、aiot-sleep-smsコマンドを実行する前にaiot-set-wake-triggerコマンドで事前指定します。 ユーザースイッチによる起床は標準で有効になっています。aiot-sleep-smsコマンドを実行した場合SMS受信による起床は強制的に有効になります。 また、起床条件はOR条件での設定が可能です。

aiot-sleep-smsコマンドの実行例を次に示します。

[armadillo ~]# aiot-sleep-sms
aiot-sleep-sms: Power Management suspend-to-ram
AT+CMGF=1
OK

AT^SIND="message",0
^SIND: message,0,0

OK

AT+CMGD=1,4
OK

AT+CMGL="ALL"
OK

[ 3508.609638] PM: suspend entry (deep)

^SIND: message,1,0

OK

[ 3508.613982] PM: Syncing filesystems ... done.
[ 3508.637946] Freezing user space processes ... (elapsed 0.001 seconds) done.
[ 3508.646276] OOM killer disabled.
[ 3508.649527] Freezing remaining freezable tasks ... (elapsed 0.001
seconds) done.
[ 3508.658161] Suspending console(s) (use no_console_suspend to debug)

※ SMS受信

[ 1767.567686] OOM killer enabled.
[ 1767.570875] Restarting tasks ... done.
[ 1767.606048] PM: suspend exit
aiot-sleep: change mode CPU Idle

7.5. スリープモードへの遷移・起床時にスクリプトを実行する

/lib/systemd/system-sleep/ に以下のようなスクリプトを配置することで、スリープモードへの遷移時や、スリープモードからの起床時に独自の処理を行うことが可能です。

#!/bin/sh
case $1/$2 in
    pre/*)
        # スリープモードへの遷移時に実行する処理
    ;;
    post/*)
        # スリープモードからの起床時に実行する処理
    ;;
esac

図7.5 スリープモードの遷移・起床時に実行されるスクリプトの例


スクリプト名を example.sh とする場合、以下のように配置してください。

[armadillo ~]# cp example.sh /lib/systemd/system-sleep/
[ティップ]

この機能を利用するには、ems31-utilsのバージョンが1.0.3以降である必要があります。

[armadillo ~]# dpkg -l |grep ems31-utils
ii  ems31-utils                   1.0.3                        armhf        Utilities for Thales EMS31 on Armadillo board