[備忘録]ESP32-VSCode-microPythonでの開発環境の構築

# 参考情報

VScodeのアップデート等で、Global Settingsの設定できない場合があります。
VScodeではなく、ThonnyでのmicroPython環境の構築について↓に記載しました。

https://zenn.dev/kotaproj/articles/d969fb39100da443f41f




# はじめに

ESP32のコーディングをMicroPythonで行うことができます。
今回、VScode上での環境構築を紹介させていただきます。


# 紹介する内容

- MicroPython用ファームウェアの書き込み
- VSCode上で環境構築
- hello worldとLチカ

# 確認した環境

- ホストPC
	- windows10 64bit Home
	- Anaconda - Python3.6
	- VSCode - 1.41.1
  - NodeJS - 12.14.1 LTS
- ターゲットボード
	- ESP32-WROOM-32 開発ボード

# 手順

## 大まかな流れ

以下が大まかな流れです。

- MicroPython用ファームの書き込み
- VSCodeのセッティング
- .pyファイルのアップロードおよび実行


## MicroPython用ファームウェアのダウンロード

MicroPythonページ↓より、ファームウェアをダウンロードします。

[MicroPython downloads - esp32](https://micropython.org/download#esp32)

今回使用するESP32ボードは、SPIRAM(pSRAM)が搭載されていないモデルです。
ボード名：SP32-DevKitC Core Board ESP32

esp32-idf4-20191220-v1.12.bin
をダウンロードしました。

ファイル名：esp32-idf4-20191220-v1.12.bin

## ファームウェアの書き込み準備

下記のコマンドで、書き込み用のモジュールをインストールします。

- Anaconda環境
```
>conda install -c conda-forge esptool
```
- Python環境
```
>pip install esptool
```

デバイスマネージャーにて、接続されているポートを確認します。

![002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/f6b1dbc6-7628-5385-e873-9ba4aa739a3e.png)

=>COM4


下記のコマンドで、ESP32のROMをイレースします。

```
>esptool --port COM4 erase_flash
esptool.py v2.8
Serial port COM4
Connecting........_____....._____....._____....._____.....__
Detecting chip type... ESP32
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, Coding Scheme None
Crystal is 40MHz
MAC: 30:ae:a4:9c:d6:c4
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 8.0s
Hard resetting via RTS pin...
```

次に先ほど、ダウンロードしたファームウェアを書き込みます。

```
>esptool --chip esp32 --port COM4 write_flash -z 0x1000 esp32-idf4-20191220-v1.12.bin
esptool.py v2.8
Serial port COM4
Connecting......
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
WARNING: Detected crystal freq 41.01MHz is quite different to normalized freq 40MHz. Unsupported crystal in use?
Crystal is 40MHz
MAC: 24:6f:28:b4:94:fc
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 1408512 bytes to 894711...
Wrote 1408512 bytes (894711 compressed) at 0x00001000 in 79.3 seconds (effective 142.1 kbit/s)...
Hash of data verified.

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

## VSCode環境下でhello world

VSCodeで作業を行う際、
Pymakrという拡張機能を使用します。
Pymakrは、NodeJSを使用しているため、事前にインストールが必要です。

### NodeJSのインストール

下記のサイトより、インストーラをダウンロードし、インストールを行います。

[NodeJS Download](https://nodejs.org/en/)

※インストール後、環境パスを通すために再起動しました。

インストールおよびパスが通っていることをコマンドプロンプトで確認します。

```
>node -v
v12.14.1
```

### Pymakrのインストール

拡張機能をインストールします。

![003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/28bc213c-2420-e557-4ce9-d306624071c4.png)


### Pymakrの設定

コマンドパレット(Ctrl + Shift + P)より、
"Pymakr > Global Settings"を選択します。

![004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/2b6b6447-e1e4-32d2-d21a-1168ed96373e.png)



下記の設定を変更します。

"address"をデバイスマネージャーで確認したCOMポートを指定します。
また、"auto_connect"をfalseにします。
※trueの場合、他のポートを勝手に見に行き、エラーとなってしまい接続されないようです。

![005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/4a6b2604-28fa-095b-5d45-10510b918ef5.png)

#### mac os時の補足

mac osを使用した場合は、"address"には、"/dev/tty.***"を指定します。
私の場合は、"/dev/tty.SLAB_USBtoUART"を指定しました。

```pymakr.json
{
    "address": "/dev/tty.SLAB_USBtoUART",　←変更
    "username": "micro",
    略
    "auto_connect": false,　←変更
    略
}
```

### 接続して、hello world

接続する場合は、画面下の①"Pycom Console"をクリックします。
②の箇所に、インタプリタ">>>"が表示されます。

![006.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/10d7807e-5602-78fa-80ce-8994778ec76f.png)

※もう一回押すと切断されます。

直接入力し、"hello world"が表示されます。

```
>>> print("hello world")
hello world
```

## Lチカ（.pyファイルのアップロード）


### 回路図とLチカのコード

以下の回路として、Lチカのコードを記載します。

回路図:
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/bc7affe8-3d14-51dc-ba56-567160bbc859.png)


コード:blink.py

```
import time
from machine import Pin

led = Pin(27, Pin.OUT)        

def run():
    for i in range(10):
        led.value(1)
        time.sleep(1)
        led.value(0)
        time.sleep(1)
```

### ファイルのアップロード

ファイルのアップロードは、下記から実施します。

![008.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/9d712d38-2456-b0e1-78e0-a8276bf23740.png)

アップロードが完了すると、再起動が実行されます。
再起動後、ファイルを確認します。

```
>>> import os
>>> os.listdir()
['boot.py', 'blink.py', 'project.pymakr']
```

blinck.pyが追加されていることがわかります。

Lチカを実施します。

```
>>> import blink
>>> blink.run()
```

LEDがチカチカしたかと思います。


# 参考

[microPython ESP32 用クイックリファレンス](https://micropython-docs-ja.readthedocs.io/ja/latest/esp32/quickref.html)