ラズパイPicoでLチカ（３）VS Code + Pico-Go で入力補完あり 1/2

<img width="80
" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/fedc3aa2-1909-291e-eaf8-b1e910aeeacd.png">次は、JupyterNoteBook版を書くつもりでしたが、pyMakrのフォーク版、Pico-Goがいい感じなので、こちらを先に。長くなったので、次回、ツールのrshell、ampy、upydevを併せて完成かな。


 - VS Code内で完結
 - RP2版MicroPython対応の自動補完、文法チェックありのコード編集
 - ラズパイPico接続、コード転送
 - プラットフォームは、macOS、Windows、64ビットLinux。

残念ながら今のラズパイOSは、32ビットなのでサポート外。
Pico-Goの使う、Node.jsのシリアル通信モジュールのプリビルドが64ビットしか対応していないから。まぁ、これの32ビット版をビルドしたいところですが。

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/1a492af2-2343-1d12-d801-39e88d7747c3.gif">
MicroPythonのmachineモジュールも自動補完されています。当然、エラーも出ない。ついでに、pygameもエラーが出ない。


# Pico-Goについて
Chris Woodさんが作った、VS Code の拡張機能です。pyMakrという拡張機能のフォーク版になります。
<a href="https://github.com/cpwood/Pico-Go"><img width="120
" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/7a6cf1a6-cb12-91cc-f8cd-514b14ec1248.png"><img width="460px" src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/cpwood/Pico-Go.png" ></a>

Chris Woodさん、とてもわかり易い記事を書いてくれています。オススメ。
1. [Developing for the Raspberry Pi Pico in VS Code — Getting Started](https://medium.com/all-geek-to-me/developing-for-the-raspberry-pi-pico-in-vs-code-getting-started-6dbb3da5ba97)
2. [Developing for the Raspberry Pi Pico in VS Code — Start Coding!]
(https://medium.com/all-geek-to-me/developing-for-the-raspberry-pi-pico-in-vs-code-start-coding-bb3834233eff)

pyMakrは、元々Pycomボード用ですが、ESP32などでもよく使われてきました。開発がちょっと停滞気味だったので、フォークした、とのこと。実際、VS Codeが1.53にアップデートして、動かなくなってしまった際には、Pico-Goの方が速く対応できました。
<a href="https://github.com/pycom/pymakr-vsc"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/pycom/pymakr-vsc.png" width="460px"></a>


## 準備（VS Codeを起動して、主にターミナルで作業）

### 最初に一度だけやる作業

- VS Codeの拡張機能インストール

Pico-Go、Python、Pylance、Visual Studio intellicodeを入れます。
![VSE_pico_go.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/0bfee934-ce11-e9b2-1990-dc8d52f40d39.png)

- Node.jsのインストール

Pico-GoはNode.jsで書かれているので、LTS版をインストール。Macの場合は、macbrewでnodebrewをインストールして、好きなバージョンに切り替えることができます。

```
  brew install nodebrew      # nodebrewインストール
  nodebrew ls                # インストール済のバージョンリスト
  nodebrew ls-remote         # リリースされているバージョンリスト
  nodebrew install v14.15.5  # バージョンを指定してインストール
  nodebrew use v14.15.5      # バージョンを指定して、切り替え

  node -v
  v14.15.5
  npm -v
  6.14.11
```


 - pylintのインストール

Pythonの文法やコーディング作法のチェッカーのひとつ。flake8でも良い。私は両方使ってますが、拡張機能のintellicodeだけでも（甘く）チェックしてくれます。

```
pip3 install pylint
あるいは、
pip3 install pylint flake8
```

- micropy-cliのインストール

環境設定ツールをインストール。cli = command line interface、ターミナルで使います。

```
pip3 install micropy-cli
```


 - スタブ (MicroPthon/RP2)のインストール

スタブ(stub)とは、木の切り株、チケットのもぎった残り、煙草の吸殻、ちびた鉛筆みたいな意味。プログラミングの世界では、抜け殻みたいなかんじ。
MicroPython内蔵モジュールのクラスや関数の名前などが入力補完用として格納されています。残念ながら引数の情報は無い。

以下の操作で、~/.micropyにスタブがセットされます。作業が終わったら、Pico-Stub-mainフォルダは捨てても構いません。

```
wget https://github.com/cpwood/Pico-Stub/archive/main.zip
unzip main.zip
rm main.zip
micropy stubs add Pico-Stub-main/stubs/micropython-rp2-1_13-290
```

ラズパイPico自身を使ってスタブを作り直すことができますが、Chris Woodさんが作ってくれたものがあるので、ダウンロードしてセットします。私は最新版1.14を作って入れています。


### 新しいプロジェクトを始める時にやる作業

#### VS Codeを起動して、プロジェクトフォルダを作成

1. 「新しいウィンドウを開く」
1. 「新しいフォルダを開く」
1. 置き場所を指定して、「新規フォルダ作成」
1. フォルダ名をpico_blinkにして
1. pico_blinkを「開く」

#### micropy-cliで環境設定、設定項目の選択

ホントは、```micropy init```で良いのですが、Python機能拡張のバージョンチェックでエラーが出るため、```--skip-checks```を付けています。付けなくても結果は一緒。

```
micropy --skip-checks init
あるいは、
micropy -s init
あるいは、
micropy init
```

![outputB_400_slow.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/432c68c1-342b-d338-2c8e-fce6d5553246.gif)

```
   ● VSCode Settings for Autocompletion/Intellisense
   ○ Pymakr Configuration
 » ● Pylint MicroPython Settings
   ○ Git Ignore Template
   ○ main.py & boot.py files
```

上下矢印キーで項目移動、スペースキーで選択／非選択。
必須なのは、VS CodeとPylintです。
PymakrはPico-Goでやるので、不要。
GitHub.comで履歴管理やるなら、Git Ignore設定も。後でもできますが。
boot.pyとmain.pyは、Picoのルートに置くと、リセット後に自動で走るコードです。ここで設定しなくても良い。

```
   ○ rp2-micropython-1.14.0
 » ● rp2-micropython-1.13.0
   ○ esp32-micropython-1.12.0
```
最後にスタブを選択して、エンター。こんなフォルダ、ファイルが生成されます。
micropi-cliとしては、srcフォルダをラズパイPicoのルートと同期するというつもりですね。

```
project_xxxx
├── .gitignore     gitで無視するフォルダ、ファイル
├── .micropy
│   ├── .gitignore
│   ├── BradenM-micropy-stubs-e1b8ce6 -> ~/.micropyへのリンク MicroPython共通のスタブ
│   ├── micropython-rp2-1_13-290 -> ~/.micropyへのリンク      RP2独自のスタブ
│   └── project_xxxx
├── .pylintrc      Pythonのlinter、pylintの設定ファイル
├── .vscode
│   ├── extensions.json    オススメ拡張機能の指定
│   └── settings.json      linter、ランゲージサーバーの設定、スタブのpathなど
├── dev-requirements.txt
├── micropy.json              
├── requirements.txt          
└── src          ラズパイPicoのルートと同期するフォルダ            
    ├── boot.py    起動時に自動で走るコード
    └── main.py    boot.pyの次に走るコード
```

# ラズパイPicoと接続して、
ラズパイPicoをUSB接続して、左下の[x Pico Disconnected]を押します。
通信が確立すると、[✓ Pico Connected]に変わります。

[All commands]で、上部コマンドパレットのところで、コマンド一覧にアクセスできます。
コマンド
Pico-Go > Project settings
pymakr.confができます。

Pico-Goは、デフォルトでプロジェクトフォルダのルートと、ラズパイPicoのルートを同期するつもり。

自分の感覚に合うフォルダをラズパイPicoとの同期フォルダにすると良いです。
GitHub.comでの公開などを考えると、プロジェクトフォルダのルートが良いかなとは思います。

ルート同士の同期だと、以下のファイルがラズパイPicoにアップロードされてしまうので、py_ignoreに追記しましょう。
dev-requirements.txt
micropy.json
requirements.txt


```json




{
    "sync_folder": "",             # ラズパイPicoのルートと同期するフォルダ
    "open_on_start": false,        # プロジェクトを開いた時など機能拡張の有効化と同時に接続を開始するかどうか
    "safe_boot_on_upload": false,  # ラズパイPicoへアップロードする前に再起動するかどうか
    "py_ignore": [                 # アップロード時に無視するフォルダ、ファイル
        "pymakr.conf",
        ".vscode",
        ".gitignore",
        ".git",
        "project.pymakr",
        "env",
        "venv"
    ]
}
```

自動接続のあたりは、まだうまく動かない場合が多いです。手動で、すかっとつながります。

# やっと、コーディング

新規ファイルでblink.pyを作って、編集開始。
「ランゲージサーバーの設定が変わったので、リロードが必要」というメッセージが複数、出ます。
エラーぽいことも言ってますが、無視してリロード。

冒頭のムービーみたいに、自動補完が効くかどうか確認してください。LEDの点灯/消灯は、on/off、value(1)/(0)、high/low、などと書けます。回路構成によっては点灯/消灯が逆にもなるので、on/offはあまりオススメではありません。

あるいは、led25(1)／led25(0)と書くこともできます。この書き方は警告が出ますが。

```python:blink.py

from machine import Pin
from utime import sleep

led25 = Pin(25, Pin.OUT)

while True:
    led25.high()
    sleep(0.125)
    led25.value(0)
    sleep(0.375)
```

# まずは、コードを書き込まずに、実行

Pico-Go > Run current file をやると、書き込まずに実行できます。rawREPL経由ですね。あまり大きかったり、日本語混じりだとうまく行かない気がする。

Pico-Go > Run current selection というものあります。複数行を選択して、送り込んで実行。REPLへのコピペを楽にできるイメージ。

![スクリーンショット 2021-02-13 4.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/af0eb8e8-b757-c3ef-9962-de22fa794f9a.png)


# コードを書き込んで（アップロード）、実行

ふつうは、コマンドパレットのこれでオッケー。編集中のファイルのみアップロードします。右クリックでも可能。

     Pico-Go > Upload current file only

これを実行するには、replで、`import blink.py`

     >>> import blink.py

ちなみに、boot.pyの場合は、replで、ctrl-Dのsoft resetをやると、実行されます。boot.pyが終わると、main.pyが実行されます。

いずれも、停止は、ctrl-Cです。

## 次回予告

次回は、plintの調整と、ファイルのマネジメントツール、rshell／ampy（有線）、upydev（無線）などを併せた開発環境を紹介します。