最近MicroPythonが流行ってきたので、一度、試してみたいと思っていました。MicroPythonを使用すれば、対象となっているモジュール(ESP8266、RP2040など)で少しの変更で同じように動作することができると思います。

そこで今回は、ESP-WROOM-02(ESP8266)を使用して、MicroPythonでのLちかに挑戦したいと思います。

用意するものは、

ESP-WROOM-02技適所得済みのもの (秋月電子、amazonなど)
 (ESP-WROOM-02+ESP-WROOM-02用2.54mmピッチ変換基板)を使用(秋月電子)

USBシリアルコンバータ 
  今回はKKHMF 3.3V 5.5V FT232RL USB-TTL シリアル コンバーター アダプター モジュール
  (amazon)を使用しました、(3.3V対応のものが必要です)

LED、抵抗、プッシュSWなど
電源は、3.3Vが必要です

回路図は下記のとおりです。
回路が簡単なのでブレッドボード上で作成しました。

ハードの準備ができたので、Raspberry Pi3をマザーにして、ソフトを準備していきたいと思います。

まずは、MicroPython本体の中からESP8266用のものを用意します。

MicroPythonのホームページから「DOWNLOAD」を選択、Portの欄の「esp8266」を選択、ESP8266の写真を選択
Firmwareから最新のもの選択してDOWNLOADします。
今回は、「ESP8266_GENERIC-20230426-v1.20.0.bin」を選択しました。

Raspberry Pi3本体でのESP8266書き込みソフトなどは、Python、pipを使用しますのでインストールされているか確認します。

$ sudo apt-get install python
[sudo] hogehoge のパスワード:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
python はすでに最新バージョン (2.7.16-1) です。

$ python --version
Python 2.7.16

$ sudo apt-get install python3
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
python3 はすでに最新バージョン (3.7.3-1) です。

$ python3 --version
Python 3.7.3

$ pip -V
pip 18.1 from /usr/lib/python2.7/dist-packages/pip (python 2.7)

ESP8266書き込みソフトを用意します。
$ sudo pip install esptool

$ sudo pip install esptool
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting esptool
  Downloading https://files.pythonhosted.org/packages/90/39/889d4d10c3a9a82ce6ecd0d5b6f4bfb64f904f8c37e1cf61e0e592de91d5/esptool-3.3.3.tar.gz (216kB)
    100% |████████████████████████████████| 225kB 851kB/s 
Requirement already satisfied: cryptography>=2.1.4 in /usr/lib/python2.7/dist-packages (from esptool) (2.6.1)
Collecting ecdsa>=0.16.0 (from esptool)
  Downloading https://files.pythonhosted.org/packages/09/d4/4f05f5d16a4863b30ba96c23b23e942da8889abfa1cdbabf2a0df12a4532/ecdsa-0.18.0-py2.py3-none-any.whl (142kB)
    100% |████████████████████████████████| 143kB 908kB/s 
Requirement already satisfied: pyserial>=3.0 in /usr/lib/python2.7/dist-packages (from esptool) (3.4)
Collecting reedsolo<=1.5.4,>=1.5.3 (from esptool)
  Downloading https://files.pythonhosted.org/packages/c8/cb/bb2ddbd00c9b4215dd57a2abf7042b0ae222b44522c5eb664a8fd9d786da/reedsolo-1.5.4.tar.gz (271kB)
    100% |████████████████████████████████| 276kB 671kB/s 
Collecting bitstring<4,>=3.1.6 (from esptool)
  Downloading https://files.pythonhosted.org/packages/2a/de/c831618fed7911cb5252de2cccd01fd7894574b4419be05aa6c125083de5/bitstring-3.1.9-py2-none-any.whl
Requirement already satisfied: six>=1.9.0 in /usr/lib/python2.7/dist-packages (from ecdsa>=0.16.0->esptool) (1.12.0)
Building wheels for collected packages: esptool, reedsolo
  Running setup.py bdist_wheel for esptool ... done
  Stored in directory: /root/.cache/pip/wheels/f5/66/b7/67fbc57acb53ee484f581f1d7845ebd0ee5412f49148efbdb8
  Running setup.py bdist_wheel for reedsolo ... done
  Stored in directory: /root/.cache/pip/wheels/46/89/1a/0a99096e7310f4c2c150e02708622606f6094702e29cf6daeb
Successfully built esptool reedsolo
Installing collected packages: ecdsa, reedsolo, bitstring, esptool
Successfully installed bitstring-3.1.9 ecdsa-0.18.0 esptool-3.3.3 reedsolo-1.5.4

esptoolを動作させてみます。引数がないのでエラーになります。

 $ esptool.py
usage: esptool [-h]
               [--chip {auto,esp8266,esp32,esp32s2,esp32s3beta2,esp32s3,esp32c3,esp32c6beta,esp32h2beta1,esp32h2beta2,esp32c2}]
               [--port PORT] [--baud BAUD]
               [--before {default_reset,usb_reset,no_reset,no_reset_no_sync}]
               [--after {hard_reset,soft_reset,no_reset,no_reset_stub}]
               [--no-stub] [--trace] [--override-vddsdio [{1.8V,1.9V,OFF}]]
               [--connect-attempts CONNECT_ATTEMPTS]
               {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,merge_bin,get_security_info,version}
               ...
esptool: error: too few arguments

さて早速、esptoolを使用して、ESP8266のIDを読み取ってみます。

$ esptool.py flash_id
esptool.py v3.3.3
Found 2 serial ports
Serial port /dev/ttyUSB0
Connecting......................................
/dev/ttyUSB0 failed to connect: Failed to connect to Espressif device: No serial data received.
For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.html
Serial port /dev/ttyAMA0
Connecting...
Traceback (most recent call last):
  File "/usr/local/bin/esptool.py", line 5651, in <module>
    _main()
  File "/usr/local/bin/esptool.py", line 5644, in _main
    main()
  File "/usr/local/bin/esptool.py", line 4953, in main
    before=args.before)
  File "/usr/local/bin/esptool.py", line 112, in get_default_connected_device
    connect_attempts)
  File "/usr/local/bin/esptool.py", line 391, in detect_chip
    detect_port.connect(connect_mode, connect_attempts, detecting=True)
  File "/usr/local/bin/esptool.py", line 689, in connect
    last_error = self._connect_attempt(mode=mode, usb_jtag_serial=usb_jtag_serial, extra_delay=extra_delay)
  File "/usr/local/bin/esptool.py", line 642, in _connect_attempt
    waiting = self._port.inWaiting()
  File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 590, in inWaiting
    return self.in_waiting
  File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 467, in in_waiting
    s = fcntl.ioctl(self.fd, TIOCINQ, TIOCM_zero_str)
IOError: [Errno 25] Inappropriate ioctl for device

ですが、デバイスの準備ができていないようです。

Firmwareを書き込みために、UARTからのdownloadにはIO0をpull downにする必要があります。
先ほどの回路図上ではSW1(BOOT)を押すことになります。
(BOOTよりDOWNLOADのほうがよかったかも^^;)

Firmwareの書き込みの手順
1,SW1(BOOT)を押したままにする。
2,SW2(RESET)を押して、離す。
3,SW1(BOOT)を離す。

これで、UARTからのdownload modeになります。
再度、esptoolを使用して、ESP8266のIDを読み取ります。
シリアルポートを指定しています。
$ esptool.py --port /dev/ttyUSB0 flash_id

$ esptool.py --port /dev/ttyUSB0 flash_id
esptool.py v3.3.3
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting...
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: ??:??:??:??:??:??
Uploading stub...
Running stub...
Stub running...
Manufacturer: a1
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...

ESP8266内のフラッシュメモリを消去します。
$ esptool.py --port /dev/ttyUSB0 erase_flash

$ esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py v3.3.3
Serial port /dev/ttyUSB0
Connecting...
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting...
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC:  ??:??:??:??:??:??
Stub is already running. No upload is necessary.
Erasing flash (this may take a while)...
Chip erase completed successfully in 23.9s
Hard resetting via RTS pin...

ESP8266にMicroPythonを書き込みします。
flash_idで取得した「Detected flash size: 4MB」を書き込みの中で指定します。
$ esptool.py --port /dev/ttyUSB0 write_flash --flash_mode dio --flash_size 4MB 0x0 ESP8266_GENERIC-20230426-v1.20.0.bin

$ esptool.py --port /dev/ttyUSB0 write_flash --flash_mode dio --flash_size 4MB 0x0 ESP8266_GENERIC-20230426-v1.20.0.bin
esptool.py v3.3.3
Serial port /dev/ttyUSB0
Connecting...
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting...
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC:  ??:??:??:??:??:??
Stub is already running. No upload is necessary.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x0009afff...
Flash params set to 0x0240
Compressed 634016 bytes to 420365...
Wrote 634016 bytes (420365 compressed) at 0x00000000 in 38.5 seconds (effective 131.8 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

minicomなどのターミナル(Baud Rate 115200)を接続して、リセットボタンを押すと下記のようなメッセージとともにMicroPythonの入力待ちになります。

MicroPython v1.20.0 on 2023-04-26; ESP module with ESP8266

Type "help()" for more information.

>>>

print文を書き込んでみます。

>>> print("ESP8266 welcome MicroPython")

ESP8266 welcome MicroPython

>>>

次は開発環境を構築します。

Thonnyをインストールしますが、すでにインストール済みかもしれません。
ラズベリーのマークから、プログラミング→Thonny Python IDEを選択。

もしなかったら
$ sudo apt-get install thonny

$ sudo apt-get install thonny
[sudo] hogehoge のパスワード:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
thonny はすでに最新バージョン (3.3.10-1+rpt1) です。

thonnyを立ち上げます。
画面上部にメニューが出ていないときは、「Switch to reqular mode」をマウス左クリックしOKしたのち再度立ち上げます。

日本語化します。
1、Tools→Options... を選択 下記のようなダイヤログが出ます。
2、Generalダブをクリック
3、Languageのプルダウンメニューから日本語[ALPHA]を選択
4、OKキーで押す
再度thonnyを立ち上げます。 

日本語化になりました。

デバイスポートを設定します。
1、Tools→Options... を選択 下記のようなダイヤログが出ます。
2、「インタプリタ」を選択します。
3、デバイスのプルダウンメニューから「MicroPython(ESP8266)」を選択します
4、OKキーを押します。

画面右下の部分が「MicroPython(ESP8266)」に変更されました。
ESP-WROOM-02に電源を投入すると、Shellにメッセージが出力され、入力待ちになります。
試しに、「print("Welcome to the world of MicroPython")」と入力しました。
ちゃんとメッセージが出力されました。

表示→ファイルにチェックを入れます。
ローカルのファイル場所とデバイスに書き込まれているファイル名が表示されます。デバイスの初期はboot.pyのみです。
from machine import Pin
import utime
# The LED connection for ESP8266 is 14pin
led = Pin(14,Pin.OUT)
while True:
    led.on()
    utime.sleep_ms(200)
    led.off()
    utime.sleep_ms(200)

上部のプログラムをメイン部分に入力します。
ファイル→Save as ... を選択します。
下記のような「Where to save to?」ダイヤログが出ますので、「MicroPython device」を選択します。
ファイル名を main.py とします(main.pyは電源再投入後も実行されます)

緑色の開始ボタンを押すとLEDが点滅します。停止は赤色の停止ボタンです。
「Where to save to?」ダイヤログで This computerを選択するとRaspberry Pi3の指定の場所にファイルをセーブできます。

何とかESP-WROOM-02(ESP8266)で Lちかできました。MicroPythonについてもっと挑戦したいと思います。

おすすめの記事