MECHATRAXのブログ
Raspberry Pi や関連する製品、通信・クラウドに関する技術情報や
それらを業務に活用する際に有用なノウハウなどを発信しています。
MicroCat.1の3V3(OUT)の負荷が大きいとモデム起動時に停止する原因と対処法
MicroCat.1の3V3(OUT)の負荷が大きいとモデム起動時に停止する原因と対処法
MicroCat.1 の3V3(OUT)から外部回路へ電源を供給するときの出力電流は最大50mAです。
今回は、外部回路に50mAを超える負荷を繋ぎたい場合のワークアラウンドをご紹介します。
MicroCat.1の仕様はこちらから確認ください。
概要
MicroCat.1をUSB給電した状態で、3V3(OUT)に50mAを超える負荷をつなぎ、SIM7672を起動すると、ボードが停止する場合があります。
対処法
VSYS に 4.0~5.5V を入力することで本事象を回避できます。
MicroCat.1の電源構成
MicroCat.1では、VSYSに入力された+5Vから、2つのDC/DCコンバータで+4Vと+3.3Vを生成しています。
+4V系と+3.3V系は、どちらも同じVSYSから電源を取っているため、3V3(OUT)に外部回路をつなぐと、その分VSYS側の負荷も増えます。
SIM7672の起動時には、+4V系に瞬間的に大きな電流が流れます。このとき3V3(OUT)に50mAを超える負荷がつながっていると、両系の電流によりVSYSの電圧が大きく低下し、MicroCat.1がリセットされることがあります。
なお、VSYS 入力時の回路の保護についてはなお、USB給電(VBUS)とVSYSの間をショットキーダイオードで分離しています。
VSYS 入力時の回路の保護についてはRaspberry Pi Pico 2 Datasheetの5.5. Powering Pico 2 を参照してください。
検証
MicroCat.1の3V3(OUT)に抵抗を直列させた状態で、USB給電時、安定化電源からVSYSに給電時でそれぞれ下記スクリプトを実行し、モデムを起動させ一定時間Soracom Harvest DataへPostさせます。
検証スクリプト
import microcat1
import urequests
import ujson
import utime
APN = "soracom.io"
USER = "sora"
PASSWORD = "sora"
URL = "http://harvest.soracom.io"
LOAD_OHM = 30 # 3V3(OUT)-GND間の負荷抵抗
TEST_SEC = 60 # 疎通確認の時間
POST_INTERVAL_MS = 5000 # POST間隔
MODEM_WARMUP_SEC = 20 # m.active(True) 後の待機時間
IP_WAIT_SEC = 60 # IP取得の待ち時間
LOG_FILE = "result.log"
def has_ip(m):
try:
ip = m.ifconfig()[0]
return ip not in (None, "", "0.0.0.0")
except Exception:
return False
load_ma = 3.3 / LOAD_OHM * 1000
ok = 0
ng = 0
error = None
m = None
try:
# モデム起動
print("Modem activating...")
m = microcat1.modem(debug=False)
m.active(True)
print("Modem active, warm-up {} sec".format(MODEM_WARMUP_SEC))
utime.sleep(MODEM_WARMUP_SEC)
# PPP接続
print("PPP connecting...")
m.connect(apn=APN, user=USER, key=PASSWORD, pdp="IP")
for _ in range(IP_WAIT_SEC):
if has_ip(m):
break
utime.sleep(1)
else:
raise RuntimeError("no IP address")
# 疎通確認(約1分間HTTP POST)
print("PPP connected, HTTP POST test {} sec".format(TEST_SEC))
start = utime.ticks_ms()
seq = 0
while utime.ticks_diff(utime.ticks_ms(), start) < TEST_SEC * 1000:
seq += 1
data = ujson.dumps({"load_ohm": LOAD_OHM, "seq": seq})
try:
r = urequests.post(URL, data=data,
headers={"Content-Type": "application/json"})
if r.status_code == 201:
ok += 1
else:
ng += 1
r.close()
except Exception as e:
error = e
break
utime.sleep_ms(POST_INTERVAL_MS)
except Exception as e:
error = e
finally:
if m is not None:
try:
m.disconnect()
except Exception:
pass
try:
m.active(False)
except Exception:
pass
if error is None and ng == 0 and ok > 0:
judge = "PASS"
else:
judge = "NETWORK FAIL"
print("=== RESULT ===")
print("load resistor : {} ohm ({:.1f} mA est.)".format(LOAD_OHM, load_ma))
print("HTTP success : {}/{}".format(ok, ok + ng))
print("error : {}".format(error))
print("TEST RESULT : {}".format(judge))
結果が以下になります。
| 負荷抵抗 | 3.3V側の電流 | USB給電 | VSYS+5V給電 |
|---|---|---|---|
| 100Ω | 約33mA | スクリプト成功 | スクリプト成功 |
| 60Ω | 約55mA | スクリプト成功 | スクリプト成功 |
| 50Ω | 約66mA | スクリプト停止 | スクリプト成功 |
| 40Ω | 約82mA | スクリプト停止 | スクリプト成功 |
| 30Ω | 約110mA | スクリプト停止 | スクリプト成功 |
| 20Ω | 約165mA | スクリプト停止 | スクリプト成功 |
| 10Ω | 約330mA | スクリプト停止 | スクリプト成功 |
負荷抵抗ごとの試験結果。3.3V側の電流は、3.3V÷負荷抵抗値で求めた推定値で、ケーブルなどの抵抗は考慮していません。結果は、USBの給電元やケーブルなどの使用環境によって変わる場合があります。
失敗する場合には、SIM7672を起動処理後、MicroCat.1がリセットしました。

このときのVSYSをオシロスコープで確認すると、5V付近から2.5V付近までドロップしていることがわかります。

一方、VSYSに+5Vを供給した場合は、モデムの起動後もスクリプトが最後まで実行され、以下のように表示されます(30Ω時)。

このときのVSYSをオシロスコープで確認すると、大きなドロップは発生していませんでした。

まとめ
USB給電時、MicroCat.1の3V3(OUT)から外部回路へ供給できる電流は、50mAまでです。USB給電の状態で50mAを超える負荷をつなぐと、SIM7672の起動時にVSYSの電圧が低下し、ボードが停止する場合があります。
50mAを超える外部回路を使う場合は、USB給電ではなく、VSYSに4.0~5.5V を入力してください。今回の検証では、この方法で300mA程度の負荷をつないだ状態でも、SIM7672の起動と通信に問題がないことを確認しました。

