インターネットに接続するコードの箇所で、Brownoutというエラーが出て止まってしまいます。
どうやら電力供給が不安定なため発生しているようです。
このエラーが発生するとプログラムがリセットされてしまい、またエラーハンドリングもできないので完全にマイコンの駆動が止まってしまいます。
chatGPTの回答は以下です。
ESP32は、電力供給が不安定な状況で動作する際に発生する可能性があるブラウンアウト(電圧降下)に対処するために、内蔵のブラウンアウト検出器を備えています。ブラウンアウトが検出されると、ESP32は自動的にリセットされ、再起動します。
このためコードで修正することはできないようです。
ただ、ブラウンアウト検出機能を無効にすることで再起動を抑えることができるようです。
以下のコード(誤りあり)で試してみました。
# RTC_CNTL_BROWN_OUT_REGのアドレス
# RTC_CNTL_BROWN_OUT_REG_ADDR = 0x3ff48018
# レジスタを書き換える関数
def write_reg(addr, val):
machine.mem32[addr] = val
するとマイコンがクラッシュしてしまいました。
マイコンのbootとresetのスイッチを押し、micropythonの削除と再インストールを行いました。
そしてレジスタの値が誤っていたので修正すれば大丈夫だろうともう一度レジスタを変更するコードのmicropythonプログラムを実行したところ、またエラーが出てクラッシュしてしまいました。
% ampy --port /dev/tty.usbmodem101 run main.py
----- program start -----
Guru Meditation Error: Core 0 panic'ed (Store access fault). Exception was unhandled.
Core 0 register dump:
MEPC : 0x4204c226 RA : 0x4200c334 SP : 0x3fca8770 GP : 0x3fc97e00
TP : 0x3fc6e924 T0 : 0x4005890e T1 : 0x4039184e T2 : 0xfffffffe
S0/FP : 0x3c158708 S1 : 0x3c158708 A0 : 0x00000000 A1 : 0x000001b1
A2 : 0x00000001 A3 : 0x0000002e A4 : 0x00000002 A5 : 0x00000004
A6 : 0x0000ffff A7 : 0x00000000 S2 : 0x00000000 S3 : 0x000000d8
S4 : 0x00000004 S5 : 0x3ffffffe S6 : 0x3fffffff S7 : 0x3fca98ab
S8 : 0x3c149a0c S9 : 0x00000327 S10 : 0x3c141000 S11 : 0x3c141000
T3 : 0x00000022 T4 : 0xffffffff T5 : 0xffffffff T6 : 0x00000002
MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000007 MTVAL : 0x000000d8
MHARTID : 0x00000000
そこで別のコードを実行してみましたが、以下のようなエラーになりました。
・コード
# Brownout検出を無効化する
rtc = machine.RTC()
rtc.BROWN_OUT_DET = 0 # Brownout検出を無効化
rtc.init() # RTC設定を永続化
# 再起動
machine.soft_reset()
・エラー
ampy --port /dev/tty.usbmodem101 run main.py
Traceback (most recent call last):
File "/Users/user/anaconda3/bin/ampy", line 8, in <module>
sys.exit(cli())
^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/cli.py", line 338, in run
output = board_files.run(local_file, not no_output, not no_output)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/files.py", line 309, in run
self._pyboard.execfile(filename, stream_output=True)
File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/pyboard.py", line 285, in execfile
return self.exec_(pyfile, stream_output=stream_output)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/pyboard.py", line 279, in exec_
raise PyboardError('exception', ret, ret_err)
ampy.pyboard.PyboardError: ('exception', b'', b'Traceback (most recent call last):\r\n File "<stdin>", line 172, in <module>\r\n File "<stdin>", line 36, in brownout_off\r\nAttributeError: \'RTC\' object has no attribute \'BROWN_OUT_DET\'\r\n')
machine.RTC() オブジェクトに BROWN_OUT_DET 属性が存在しないようです。