先日買いましたM5StackシリーズATOM Liteをニッケル水素電池で稼働させてみました。
結果としては、エネループ3本で、30分に1度Wifiでサイトにアクセスさせてみたところ、171時間(約7日)稼働することができました。
■ 電池
使ったのはスタンダードタイプのエネループ3本。新品ではありません。
見込み容量は、1900mAh✕1.2V✕3本=6.84Whです。
下記サイトによると、動作範囲は5.3〜2.6Vで、上限が結構シビアだったので、3本にしました。
(電池3本の仕様なら乾電池も使えるからというのもありますが)
M5Stack ATOMシリーズの外部電源を調べた
https://lang-ship.com/blog/work/m5stack-atom-in/#toc12
■ 構成
電池は直結。G33ピンのADCで電圧を取っています。入力範囲が3.3Vなので、10kΩの抵抗で分圧しました。なので、そこで20kΩ分、電力消費してます。
ATOM LiteのGPIO
PIN | G22 | G19 | G23 | G33 | G21 | G25 | G26 | G32 |
digitalRead() | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
analogRead() | ○※1 | ○ | △※2 | △※2 | ○ | |||
touchRead() | ○ | ○ | ||||||
dacWrite() | ○ | ○ | ||||||
digitalWrite() | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
ledcWrite() | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
※1 GPIO34として使用
※2 無線使用時不可
参考サイト:
ATOM Lite、Matrix、Echo GPIO比較
https://lang-ship.com/blog/work/atom-gpio/
ADC (アナログ/デジタル変換)
https://micropython-docs-ja.readthedocs.io/ja/latest/esp32/quickref.html#adc-analog-to-digital-conversion
■ プログラム
比較のため、常時稼働とディープスリープを行いました。双方、30分ごとにWIFIでサイトにアクセスして、電圧をログしています。
def do_connect(): import network sta_if = network.WLAN(network.STA_IF) if not sta_if.isconnected(): print('connecting to network...') sta_if.active(True) sta_if.connect('SSID','PASSWORD') #要変更 while not sta_if.isconnected(): pass print('connected!') else: print('already connecting') print('network config:', sta_if.ifconfig()) def http_get(url): import socket _, _, host, path = url.split('/', 3) addr = socket.getaddrinfo(host, 80)[0][-1] s = socket.socket() s.connect(addr) s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8')) while True: data = s.recv(100) if data: print(str(data, 'utf8'), end='') else: break s.close() def get_voltage(): import machine from machine import Pin, ADC adc = machine.ADC(Pin(33)) adc.atten(ADC.ATTN_11DB) conv_factor = 3.6 / 65535 * 2.0 return adc.read_u16()*conv_factor def send_data(): import machine,neopixel pin = machine.Pin(27, machine.Pin.OUT) np = neopixel.NeoPixel(pin, 1) np[0] = (0, 255, 0) np.write() do_connect() v = str(get_voltage()) http_get('http://webapps.tiblab.net/device/alive-monitor/?p=input-XXXXXXXX&d1='+v) #要変更 np[0] = (0, 0, 0) np.write() def normal_loop(): import time while True: send_data() time.sleep(60*30) def deepsleep_loop(): import time import machine,neopixel if machine.reset_cause() != machine.DEEPSLEEP_RESET: pin = machine.Pin(27, machine.Pin.OUT) np = neopixel.NeoPixel(pin, 1) np[0] = (0, 0, 255) np.write() btn_pin = machine.Pin(39, machine.Pin.IN, machine.Pin.PULL_UP) while btn_pin.value(): time.sleep(0.1) np[0] = (0, 0, 0) np.write() machine.deepsleep(1) else: send_data() machine.deepsleep(60*30*1000) #normal_loop() deepsleep_loop()
ディープスリープ間欠動作の開始方法として、通常起動時は、ボタンが押されるまで待機し、ボタンが押されたらディープスリープによる間欠動作を開始するようにしました。また、ボタン押し待ちではLEDは青く光り、WIFI通信中は緑色に光るようにしました。
こういったインターフェイスが標準装備でできるのは良いですね。
デバイスの稼働時間はサイトのアクセス時間で把握しているので、デバイスは動いてるけど、通信できていない状態はカウントしません。
参考サイト:
ESP32へのピン入力でMicroPythonのスリープを解除する方法
https://blog.goediy.com/?p=1135
■ 結果
稼働時間は39.5時間でした。RaspberryPi Zero W は13時間だったので、3倍程度。伸びましたが、思ったよりは短い。
この理由は下限電圧がZeroより高いことにありそうです。取得した電圧によると下限電圧は3.5Vあたり。ADCによる電圧は微調整はしていないものの、テスターでざっと確認している限りは、0〜-10%くらいの誤差でした。
ちなみに、通信しなくなった状態の電池でラズパイ ZeroWを稼働してみると、まだ2時間程度は稼働しました。
電池の電圧が公称電圧と大差ないところで通信できなくなっているので、ちょっと勿体ない感じです。ATOMをニッケル水素電池で動かす時は4本の方が良いかもしれません。
動作電圧範囲を確認するため、5Vで充電したスーパーキャパシタで稼働させる実験を3回ほど実施してみたところ、下記の結果となりました。
3.5V程で一旦アクセスしなくなり、3.0V程で復活する動作が2回ありました。最後のは復活しませんでした。
はっきりしたことは分かりませんが、3.3Vに変換するDC-DCコンバータの昇降圧の切替の影響でWIFIモジュールが安定しないんじゃないかと推測してます。エラー分岐をちゃんとすれば、確実に復活するのかもしれませんが、3.5V程度を限度と考えた方が良さそうです。
(2)ディープスリープ
稼働時間は、171時間。1週間持ちました。常時稼働時と比べると約4.3倍です。
電池容量を6.84Whと仮定して、消費電力を逆算すると、0.04Wになります。
ATOM Liteでは、マイコン以外にも電源直結のパーツも多いので、ディープスリープ時でも12mA程消費するとのことで、消費電力にすると0.06W。電圧が低い分、消費電力が小さくなってこんなとこになったのかな。
さすがマイコン、ラズパイに比べたらかなり長持ちしますが、下記サイトによりますと、電力を食うデバイスの少ない、最小構成であるM5Stamp Picoなら、ディープスリープ時の消費電力が0.3mAともっと小さいとの事。ATOM Liteの1/40程なので、もっと長持ちできそうです。
ああ、また触りたいものが増えてしまった。
M5Stamp Picoでできること 〜M5Stamp Picoの消費電流値
https://msr-r.net/m5stamp-current/