Raspberry pi pico W と 秋月電子通商 AE-ESP32-WROOM-32E-MINI の消費電流を比較

電池で駆動でき、MicroPythonで気軽にプログラミングができ、WiFiも使えるマイコンボード Raspberry pi pico W と 秋月電子通商 AE-ESP32-WROOM-32E-MINI の消費電流を比較しました。

単3型のeneloop 3本または4本で、1ヶ月間電池交換無しで動くようにしたいのが目的です。

マイコンボードの使い方としては、間欠動作(何らかの測定、WiFi通信、deepsleep (15分) を繰り返す)により消費電力を節約することを想定しています。そのため、特に deepsleep 時の消費電流を抑えることが重要です。

測定対象のマイコンボード

Raspberry pi pico W

  • CPU frequency: 133MHz
  • SRAM: 264KB
  • Flash ROM: 2MB
  • WiFi: 802.11n, 2.4GHz

秋月電子通商 AE-ESP32-WROOM-32E-MINI

  • CPU frequency: 240MHz
  • SRAM: 520KB
  • Flash ROM: 16MB
  • WiFi: 802.11b/g/n, 2.4GHz

測定方法

測定回路

消費電流の測定には Digilent Analog Discovery 2 を使いました。Scope の Channel 1 で、シャント抵抗1Ωの両端の電圧を測定します。例えば、測定電圧が 10mVなら、消費電流は 10mA となります。
ANALOG DISCOVERY2 による測定

Raspberry pi pico WH

eneloop 4本(4.8V)から、シャント抵抗 1Ω、ショットキーダイオード 1S3 を経て、Raspberry pi pico W の VSYS に接続します。シャント抵抗 1Ωの両端電圧を、ANALOG DISCOVERY2 の Scope Channel 1 で計測します。また、動作確認用に GPIO16 に LED と抵抗 130Ω を接続します。動作のタイミングが分かるように、抵抗130Ωの両端を、ANALOG DISCOVERY2 の Scope Channel 2 で計測します。

AE-ESP32-WROOM-32E-MINI

eneloop 4本(4.8V)から、シャント抵抗 1Ω、ショットキーダイオード 1S3 を経て、AE-ESP32-WROOM-32E-MINI の 5V に接続します。シャント抵抗 1Ωの両端電圧を、ANALOG DISCOVERY2 の Scope Channel 1 で計測します。また、動作確認用に GPIO15 に LED と抵抗 130Ω を接続します。動作のタイミングが分かるように、抵抗130Ωの両端を、ANALOG DISCOVERY2 の Scope Channel 2 で計測します。




プログラム

起動、LED点滅(2回)、1秒 sleep、WiFi に接続、接続したらLED点滅(3回)、http アクセス、1秒 sleep、LED点滅(1回)、deepsleep(10秒) を繰り返すプログラムにしました。

Raspberry pi pico WH

リファレンス: https://sozorablog.com/raspberry-pi-pico-w-review/

main.py
import network
import urequests as requests
from time import sleep
from machine import Pin, deepsleep

# WiFi ssid and password
ssid = '0024A50722AC'
password = '3w4p127sv8rp9'

wlan_status_message = {
    network.STAT_IDLE: 'No connection and no activity',
    network.STAT_CONNECTING: 'Connecting in progress',
    network.STAT_WRONG_PASSWORD: 'Failed due to incorrect password',
    network.STAT_NO_AP_FOUND: 'Failed because no access point replied',
#    network.STAT_CONNECT_FAIL: 'failed due to other problems',
    network.STAT_GOT_IP: 'Connection successful'
}

def get_wlan_status_message(wlan_status):
    if wlan_status in wlan_status_message:
        return wlan_status_message[wlan_status]
    else:
        return str(wlan_status)

# Define blinking function for onboard LED to indicate error codes    
def blink_led(num_blinks):
    led = Pin(16, Pin.OUT)
    if num_blinks < 0:
        num_blinks = 8 + num_blinks
    for i in range(num_blinks):
        led.on()
        sleep(.2)
        led.off()
        sleep(.2)

try:
    blink_led(2)
    # Print the last result
    with open('result.txt') as f:
        print('last result:', f.read())

    
    # Turn on WiFi
    Pin(23, Pin.OUT).high()
    sleep(1)
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    
    # Wait for connect or fail
    max_wait = 10
    while max_wait > 0 and not wlan.isconnected():
        print('wlan: connecting')
        sleep(1)
        max_wait -= 1
        
    # Handle connection error
    wlan_status = wlan.status()
    if wlan_status == network.STAT_GOT_IP:
        print('wlan: connected')
        blink_led(3)
        status = wlan.ifconfig()
        print('ip = ' + status[0])
    else:
        blink_led(5)
        raise Exception(get_wlan_status_message(wlan_status))

    # Send information to the web server
    url = 'http://raspi1.home/updatestate.php?mail'
    print('request:', url)
    res = requests.get(url)
    print('response:', res.text)
    with open('result.txt', 'w') as f:
        f.write(res.text)
    res.close()
    
    wlan.disconnect()
    wlan.active(False)


except Exception as e:
    print('error:', str(e))
    with open('result.txt', 'w') as f:
        f.write(str(e))
except KeyboardInterrupt:
    print('Interrupted!')    
        
# Go to deep sleep
sleep(1)
blink_led(1)
s = Pin(0, Pin.IN, Pin.PULL_UP)
if s.value() == 1:  # If GPIO0 is open (not connected to GND), fall in to deep sleep
    print('Fall in deep sleep')
    Pin(23, Pin.OUT).low() # Turn off the power supply to the wifi
    deepsleep(10 * 1000)
else:
    print('End') 

AE-ESP32-WROOM-32E-MINI

main.py
import network
import urequests as requests
from time import sleep
from machine import Pin, deepsleep

# WiFi ssid and password
ssid = '0024A50722AC'
password = '3w4p127sv8rp9'

wlan_status_message = {
    network.STAT_IDLE: 'No connection and no activity',
    network.STAT_CONNECTING: 'Connecting in progress',
    network.STAT_WRONG_PASSWORD: 'Failed due to incorrect password',
    network.STAT_NO_AP_FOUND: 'Failed because no access point replied',
#    network.STAT_CONNECT_FAIL: 'failed due to other problems',
    network.STAT_GOT_IP: 'Connection successful'
}

def get_wlan_status_message(wlan_status):
    if wlan_status in wlan_status_message:
        return wlan_status_message[wlan_status]
    else:
        return str(wlan_status)

# Define blinking function for onboard LED to indicate error codes    
def blink_led(num_blinks):
    led = Pin(15, Pin.OUT)
    if num_blinks < 0:
        num_blinks = 8 + num_blinks
    for i in range(num_blinks):
        led.on()
        sleep(.2)
        led.off()
        sleep(.2)

try:
    blink_led(2)
    # Print the last result
    with open('result.txt') as f:
        print('last result:', f.read())

    sleep(1)
    
    # Turn on WiFi
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    
    # Wait for connect or fail
    max_wait = 10
    while max_wait > 0 and not wlan.isconnected():
        print('wlan: connecting')
        sleep(1)
        max_wait -= 1
        
    # Handle connection error
    wlan_status = wlan.status()
    if wlan_status == network.STAT_GOT_IP:
        print('wlan: connected')
        blink_led(3)
        status = wlan.ifconfig()
        print('ip = ' + status[0])
    else:
        blink_led(5)
        raise Exception(get_wlan_status_message(wlan_status))

    # Send information to the web server
    url = 'http://raspi1.home/updatestate.php?mail'
    print('request:', url)
    res = requests.get(url)
    print('response:', res.text)
    with open('result.txt', 'w') as f:
        f.write(res.text)
    res.close()
    
    wlan.disconnect()
    wlan.active(False)


except Exception as e:
    print('error:', str(e))
    with open('result.txt', 'w') as f:
        f.write(str(e))
except KeyboardInterrupt:
    print('Interrupted!')    
        
# Go to deep sleep
sleep(1)
blink_led(1)
s = Pin(13, Pin.IN, Pin.PULL_UP)
if s.value() == 1:  # If GPIO13 is open (not connected to GND), fall in to deep sleep
    print('Fall in deep sleep')
    deepsleep(10 * 1000)
else:
    print('End')



測定結果

Raspberry pi pico W

定常時 (time.sleep()): 約18mA
WiFi利用時: 約60mA
deepsleep時: 約1.5mA

消費電流は、WiFi利用時は 60mA まで上がりますが、deepsleep中は 約1.5mA でした。計算上は、1900mAh の eneloop で、1900[mAh]÷1.5[mA]=1266[時間]=52[日] 持つことになります。動作時の消費電流を考慮しても、1ヶ月くらいは持ちそうです。

Raspberry pi pico W の測定結果: C1(オレンジ)が消費電流[mA]、C2(青)がLED電流


AE-ESP32-WROOM-32E-MINI

定常時 (time.sleep()): 約33mA
WiFi利用時: 約120mA
deepsleep時: 約4.2mA

消費電流は、WiFi利用時は 120mA まで上がり、deepsleep中は 約4.2mA でした。このマイコンボードに搭載されている電圧レギュレータIC AZ1117CH-3.3TRG1 の静消費電流(Quiescent Current) が 4mA のため、ほとんどが電圧レギュレータで消費されているようです。計算上は、1900mAh の eneloop で、1900[mAh]÷1.5[mA]=452[時間]=19[日] ですが、WiFi動作時の消費電流が大きいことや、電圧レギュレータICのドロップ電圧が大きい(1.2V)ことも考慮すると、1週間ぐらいで電池切れになりそうです。このマイコンボードを電池駆動にする際は、消費電力とドロップ電圧の小さい電圧レギュレータを外付けにするのが良さそうです。


AE-ESP32-WROOM-32E の測定結果: C1(オレンジ)が消費電流[mA]、C2(青)がLED電流





コメント