ディープスリープでRaspberry Pi Pico Wを低電力化する

前回までの調査で、一定時間毎にセンサデータをWebサーバに送信するIoTデバイスとして「Raspberry Pi Pico W」を使える見込みが得られました(記事は こちら)。

ただ、電池駆動のIoTデバイスをつくる場合、ディープスリープなどの低電力化のための対策が必須となります。
そのため今回は、「Raspberry Pi Pico W」をディープスリープさせたときの消費電流値を調査してみようと思います。


これまで参考にしてきた こちら のドキュメントなどには、ディープスリープについての説明はありません。
ただ、「Raspberry Pi Pico W」に搭載されているマイコンである「RP2040」のデータシート(こちら)には、一応ディープスリープに関する簡単な記載があります。
また、MicroPythonライブラリのドキュメント(こちら)によれば、「machine.deepsleep([time_ms])」という関数があるとのことです。
なお、ディープスリープの動作と省電力機能は、ハードウェアに大きく依存するとのことです。

そのため、まずはこのコマンドをそのまま使って、消費電流値を調べてみようと思います。

以下のプログラムを準備しました。

import machine
import time

led = machine.Pin("LED", machine.Pin.OUT)

led.value(1)
time.sleep(5)
led.value(0)
machine.deepsleep(5000)

これで、「Raspberry Pi Pico W」に搭載されているLEDが5秒毎にON/OFFし、OFFの間はディープスリープモードに移行するはずです。

このプログラムを「Raspberry Pi Pico W」に保存したら、パソコンとのUSB接続を外して、パソコンから電源供給されないようにします。
代わりに、実際に「Raspberry Pi Pico W」をIoTデバイスとして使用することを想定し、単三型Ni-MH電池4本を「Raspberry Pi Pico W」の「VSYS-GND間」につなぎます。
こちら の方法で、消費電流波形を確認することにします。

電池ボックスのスイッチをONにすると、「Raspberry Pi Pico W」のLEDが5秒毎にON/OFFしました。動作としては問題ないようです。

その時の消費電流波形は以下のとおりです。

消費電流値は動作中で30mA程度、ディープスリープ中でも10mA程度ありました。
ディープスリープ中の消費電流値は非常に大きく、これでは電池駆動のIoTデバイスとして使えそうにはありません(2000mAhのNi-MH電池で動かす場合、常時ディープスリープだとしても、「2000mAh / 10mA = 200h = 8.3日」と、1週間ちょっとで電池がなくなってしまう計算になります)。

何か良い方法はないかといろいろ調べていたところ、こちら に「Raspberry Pi Pico W」のディープスリープ時の消費電流値を低減させる方法が紹介されていました。
「Raspberry Pi Pico W」に搭載されているWi-Fi通信チップをOFFにしてからディープスリープに移行することで、Wi-Fi通信チップによる電力消費を低減させるというものです。
具体的には、「GPIO23」をLowにすることで、Wi-Fi通信チップをOFFにできるようです。
こちら のドキュメントにも「GPIO23 : OP wireless power on signal」と書いてありました。

プログラムを以下のように変更しました。

import machine
import time

led = machine.Pin("LED", machine.Pin.OUT)

led.value(1)
time.sleep(5)
led.value(0)
machine.Pin(23, machine.Pin.OUT).low()
machine.deepsleep(5000)

ディープスリープに移行する前に、「GPIO23」をLowにする処理を追加しただけです。

このプログラムに変更しても、「Raspberry Pi Pico W」のLEDは問題なくON/OFFしました。

その時の消費電流波形は以下のとおりです。

動作中の消費電流値は30mA程度のままですが、ディープスリープ中の消費電流値は2mA程度まで削減できました。
これなら電池駆動のIoTデバイスとしても、十分に使えそうです。

これを踏まえて、前回つくったIoTデバイスとしてのプログラム(こちら)に対し、「time.sleep(60)」の代わりにディープスリープするように変更してみました。

import machine
import time
import network
import urequests
from dht20 import DHT20

i2c = machine.I2C(1)
dht20 = DHT20(i2c)

led = machine.Pin("LED", machine.Pin.OUT)
led.value(1)

ssid = 'XXXXXXXX'
password = 'XXXXXXXX'

machine.Pin(23, machine.Pin.OUT).high()
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
chipid = int.from_bytes(wlan.config('mac'), 'big') % 65536
wlan.connect(ssid, password)

max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    time.sleep(1)
    
if wlan.status() != 3:
    raise RuntimeError('network connection failed')
else:
    print('connected')
    status = wlan.ifconfig()
    print('ip = ' + status[0])

while True:
    led.value(1)
    value = round(dht20.dht20_temperature(), 1)
    url = "http://XXXXXXXX?chipid=RPI" + str(chipid) + "&val0=" + str(value)
    r = urequests.get(url)
    print(r.content)
    r.close()
    led.value(0)
    wlan.disconnect()
    wlan.active(False)
    machine.Pin(23, machine.Pin.OUT).low()
    machine.deepsleep(10000)

このプログラムを「Raspberry Pi Pico W」に書き込んだところ、問題なく動作しました。

その時の消費電流波形は以下のとおりです。

動作中の消費電流値は60mA程度、ディープスリープ中は2mA程度となりました。

こちら に記載している方法で、消費電流値を詳細に調べました。
8回測定し、それらの波形を重ね合わせてExcelでグラフ表示しました。

1回の処理にかかる平均動作時間は 6.12秒、動作中の平均消費電流値は 51.01mA、ディープスリープ中の平均消費電流値は 1.24mA でした。

例えば、1分毎に温度を測定する場合、平均消費電流値は「( 51.01mA * 6.12s + 1.24mA * 53.88s ) / 60s = 6.32mA」となります。
2000mAhの単三型Ni-MH電池で動かした場合、「2000mAh / 6.32mA = 316.5h = 13.2日」と、およそ13日間にわたり連続稼働できる計算になります。

また、10分毎に温度を測定するなら、平均消費電流値は「( 51.01mA * 6.12s + 1.24mA * 593.88s ) / 600s = 1.75mA」で、2000mAhの単三型Ni-MH電池で「2000mAh / 1.75mA = 1142.9h = 47.6日」と、1ヶ月以上連続稼働できることになります。

ちなみに、私が電池駆動のIoTデバイスをつくるときによく利用している「M5Stamp Pico」の場合、ディープスリープ中の平均消費電流値は 0.69mA、10分毎に温度を測定する場合の平均消費電流値は 1.02mA でした。

「Raspberry Pi Pico W」の消費電流値は、「M5Stamp Pico」に比べると大きな値になりましたが、それでも十分に低電力であり、小型のソーラーパネルでも常時稼働できそうです。

これでようやく、IoTデバイスをつくる際に、「M5Stamp Pico」などのESP32ボードの代替として「Raspberry Pi Pico W」を使うことができそうな見込みが得られました。

追記

実際に、どのくらいの期間にわたり連続稼働できるか調べてみました。
プログラムは上記のものを使い、1分毎に温度データをWebサーバに送信するようにしました。
単三型Ni-MH電池4本で動かすことにします。上記の計算ではおよそ13日間にわたり連続稼働できる見込みです。
接続は以下のとおりで、Raspberry Pi Pico Wに電池と温度センサをつないでいるだけです。

調査の結果、この構成で14.6日間にわたり連続稼働できました。概ね机上計算どおりの結果となりました。

このくらい低電力であれば、さまざまな用途に有効活用できそうです。