実家が農家で、ビニールハウスで苗を育てているのですが、稀に高温障害という温度が高くなりすぎて苗がダメになることがあります。
これを防ぐために以下のようなマイコンの温度通知システムを作ろうと思います。
- マイコンで温度を測定
- 測定した情報を送信し、インターネットブラウザでグラフで閲覧可能にする
- 指定した温度になったらメールかLINEへ通知する
- マイコンの電源は太陽光パネル
- マイコンのインターネット接続は屋外で使えるsim
まずマイコンで動作させるためにマイコンと温度センサーを買ってみました。
WayinTop ESP32開発ボード Wi-Fi + BLEモジュール ESP-WROOM-32実装済み デュアルコア 技適取得済み 2個入り 専用USBケーブル付き
DiyStudio 3個 DS18B20温度センサー温度プローブDS18B20のための防水デジタルサーマルプローブまたはセンサーラボ高感度温度測定材料 -55°C 〜 +125°C (3個 1M)
ここからプログラミングを開始しました。
まずマイコンをmacPCに接続するところから。
PCに接続すると発光し、電源が入ったことがわかります。
PCに接続確認のダイアログが出ます。
マイコンがESP-WROOM-32なので、以下のサイトからファームウェアをダウンロードします。
v1.21.0 (2023-10-05) .bin
以下のサイトからマイコンのドライバーをダウンロードし、インストールします。
以下のコマンドでドライバーがインストールされているか確認します。
cd /Library/Extensions
ls
SiLabsUSBDriver.kext
ここで詰まりました。
古いIntel macでは見つかりますが、M1macでは見つかりません。
また、Intel macの「システムレポート」の「USB」で、
「CP2102 USB to UART Bridge Controller」
と見つかりますが、M1macでは見つかりません。
調べると、どうやらM1macではドライバーは不要とのこと。
以下のコマンドで「/dev/tty.SLAB_USBtoUART」を確認できました(てっきりFinderに表示されると思っていた)。
ls /dev/tty.*
/dev/tty.SLAB_USBtoUART
MicroPythonでプログラムをしたいと思っていたので、以下でesptoolをインストールします。
pip3 install esptool
ここでマイコンのフラッシュを削除しようとしたところ、以下のエラーが出ました。
esptool.py --port /dev/tty.SLAB_USBtoUART erase_flash
ERROR:root:code for hash blake2b was not found.
Traceback (most recent call last):
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/hashlib.py", line 307, in <module>
globals()[__func_name] = __get_hash(__func_name)
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/hashlib.py", line 129, in __get_openssl_constructor
return __get_builtin_constructor(name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/hashlib.py", line 123, in __get_builtin_constructor
raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type blake2b
ERROR:root:code for hash blake2s was not found.
Traceback (most recent call last):
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/hashlib.py", line 307, in <module>
globals()[__func_name] = __get_hash(__func_name)
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/hashlib.py", line 129, in __get_openssl_constructor
return __get_builtin_constructor(name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/hashlib.py", line 123, in __get_builtin_constructor
raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type blake2s
esptool.py v4.6.2
Serial port /dev/tty.SLAB_USBtoUART
Traceback (most recent call last):
File "/Users/user/.pyenv/versions/3.11.6/bin/esptool.py", line 37, in <module>
esptool._main()
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/site-packages/esptool/__init__.py", line 1073, in _main
main()
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/site-packages/esptool/__init__.py", line 678, in main
esp = esp or get_default_connected_device(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/site-packages/esptool/__init__.py", line 956, in get_default_connected_device
_esp = detect_chip(
^^^^^^^^^^^^
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/site-packages/esptool/cmds.py", line 91, in detect_chip
detect_port = ESPLoader(port, baud, trace_enabled=trace_enabled)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/site-packages/esptool/loader.py", line 303, in __init__
self._port = serial.serial_for_url(port)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/site-packages/serial/__init__.py", line 90, in serial_for_url
instance.open()
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/site-packages/serial/serialposix.py", line 332, in open
self._reconfigure_port(force_update=True)
File "/Users/user/.pyenv/versions/3.11.6/lib/python3.11/site-packages/serial/serialposix.py", line 517, in _reconfigure_port
termios.tcsetattr(
termios.error: (22, 'Invalid argument')
chatGPTによると原因は以下らしいとのこと。
このエラーメッセージは、PythonのhashlibモジュールがBLAKE2ハッシュアルゴリズム(特にblake2bとblake2s)を認識できないために発生しているようです。hashlibはPythonの標準ライブラリで、さまざまなハッシュ関数を提供しています。この問題は、Pythonのインストールまたはその環境に関連している可能性が高いです。
具体的には、以下の原因が考えられます:
Pythonのインストールが不完全または破損している: インストールされたPythonがいくつかの標準ライブラリを含んでいない、またはそれらが正しく機能していない可能性があります。
OpenSSLのサポートが不足している: hashlibはOpenSSLを使用していくつかのハッシュアルゴリズムを提供します。お使いのシステムにOpenSSLが正しくインストールされていないか、PythonがOpenSSLを適切に利用できない可能性があります。
この問題を解決するためには、以下のステップを試してみてください:
Pythonの再インストール: 現在使用しているPythonのバージョンを完全にアンインストールし、再度インストールしてみてください。これにより、欠損しているかもしれないファイルやライブラリが補充される可能性があります。
OpenSSLの確認とインストール: システムにOpenSSLが正しくインストールされているか確認し、必要であればインストールまたはアップデートしてください。
異なるPythonのバージョンを試す: Python 3.11.6ではなく、別のバージョン(例えば3.10.xなど)を試してみると、問題が解決することがあります。
依存関係の再インストール: 必要な依存関係やライブラリ(esptoolや関連するもの)を再インストールしてみてください。
環境変数の確認: PythonやOpenSSLのパスが環境変数に正しく設定されていることを確認してください。
これらのステップによって問題が解決しない場合は、PythonのコミュニティフォーラムやStack Overflowなどの専門的なサイトで助けを求めることも検討してください。
そのため、Anaconda,pyenv,Home brewなどやシンボリックリンクも削除し、Anacondaを再インストールしました。
そして必要なライブラリをインストールし、以下を実行したところ、ようやくフラッシュの消去が実施できました。
esptool.py --port /dev/tty.usbserial-0001 erase_flash
esptool.py v4.6.2
Serial port /dev/tty.usbserial-0001
Connecting...........
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting......
Detecting chip type... ESP32
Chip is ESP32-D0WD-V3 (revision v3.1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 08:d1:f9:e8:22:ec
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 9.8s
Hard resetting via RTS pin...
上記でダウンロードしたファームウェアを同じポートにインストールします。
esptool.py --chip esp32 --port /dev/tty.usbserial-0001 --baud 460800 write_flash -z 0x1000 ESP32_GENERIC-20231005-v1.21.0.bin
esptool.py v4.6.2
Serial port /dev/tty.usbserial-0001
Connecting.......
Chip is ESP32-D0WD-V3 (revision v3.1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 08:d1:f9:e8:22:ec
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00001000 to 0x00196fff...
Compressed 1661872 bytes to 1104578...
Wrote 1661872 bytes (1104578 compressed) at 0x00001000 in 28.4 seconds (effective 468.8 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
これでファームウェアのインストールが完了しました。
一度screenコマンドを入力してexitしたあと、以下のコマンド接続して対話モードにしようとしました。
$ screen /dev/tty.usbserial-0001 115200
ところが、以下のようなエラーが出て対話モードにはなりませんでした。
Cannot open line '/dev/tty.usbserial-0001' for R/W: Resource busy
Sorry, could not find a PTY.
どうやらポートが使用中らしいので、以下のコマンドでポートが使用中か確認します。
$ lsof | grep tty.usbserial-0001
screen 11274 user 5u CHR 9,4 0t368 897 /dev/tty.usbserial-0001
使用中なので停止させるコマンドを入力しました。
$ kill 11274
$ lsof | grep tty.usbserial-0001
(何も表示されない)
これでポートが解放されました。
再び、を入力し、エンターを押すと、 >> と表示され対話モードにできました。
$ screen /dev/tty.usbserial-0001 115200
>>> print('hello esp32!')
hello esp32!