マイコン温度通知システムの製作24 Brounout エラー

インターネットに接続するコードの箇所で、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 属性が存在しないようです。

タイトルとURLをコピーしました