macOS X で Raspberry Pi Pico の MicroPython を使って気温、気圧、湿度を OLED に表示させてみた

Raspberry Pi Pico （以下、Pico と略）を入手したので、手元にある BME280 センサー と SSD1306 OLED ディプレイを繋いで、気象モニターを作ってみた記録。
![IMG_7040.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/f3e91798-61f1-e1c4-396e-53af3ecb1f90.jpeg)

## Pico の開発環境（ ArduinoIDE）
　Pico は初めてなのでネット検索で、まずは馴染んでいる ArduinoIDE で使う方法を試してみた。
参考にしたサイトは
「Raspberry Pi Pico（ラズパイPico）をArduino IDE環境で使ってみる」
 https://qiita.com/7L4QOI/items/437bc16fd7d982343ca9 
　このサイトにあるとおり、ボードマネージャで Pico を追加して、スケッチ例を実行すると、問題無く内蔵LEDがフェードした。

## Pico の開発環境（ MicroPython ）
　一番参考になったのは
「【ラズパイPico】MicroPythonをラズパイから書き込む/Lチカ」
　https://hellobreak.net/raspberrypi-pico-micropython-0205/
　ただ、ここで参照している情報から少しアップデートされているようで、少し違っているので、次のようにしました。
### Macに MicroPythonIDE (Thonny )アプリをインストール
　MicroPythonIDEである Thonny アプリを、本家のサイト（ https://thonny.org/ ) の Download 欄の Mac をクリックしてダウンロード、インストールする。
### Pico が MicroPythonで動作するようファームウェアを書き込む
　Pico の白いボタンを押しながら USB ポートに接続する。（USBメモリーのようにマウントされる）
本家のサイトの「MicroPython」のページを開く
　https://www.raspberrypi.com/documentation/microcontrollers/micropython.html#what-is-micropython
　このページの下方にある「Drag-and-Drop MicroPython」のセクションの下方にある「MicroPython UF2」ファイルをダウンロードする。
【直リンク】 https://micropython.org/download/rp2-pico/rp2-pico-latest.uf2
　ダウンロードした UF2 ファイルを Pico にドラッグ＆ドロップする。
そうすると、 Pico のマウントが外れ、MicroPython の動作を待つようになる。
### ちょっと解説（Pico の動作モード）
　Pico は、USB端子に接続する際、白いボタンを押しながら接続すると、USBメモリーのようにマウントされる。この外部メモリーにプログラムをドラッグ＆ドロップすると、自動的にアプリとしてインストールするという、MBED や、Micro:bit のように動作する。
ArduinoIDE で、ボードを Pico に設定してコンパイル＆Go しようとすると、コンパイル結果をUSBポートでコピーするようになっている。コピーされるとマウントが外れ動作モードになる。
　MicroPythonIDE(Thonny)では、この動作モード（USBメモリーとして認識されていない状態）で動作するようになっている。

## Thonny の起動と必要なライブラリーの組み込み
　今回使用するのはセンサーとして BME280、OLEDディスプレイは SSD1306 なのでその二つのライブラリーを Thonny にインストールする。
MicroPython 用の UF2 をインストールした Pico を接続してから Thonny を起動します。
画面右下には、「MicroPython (Raspberry Pi Pico)」が表示されているはずです。表示されていない場合は、ツール - Options...を開いて、インタプリタータブで「MicroPython (Raspberry Pi Pico)」を選択し、Portは```<Try to detect port automatically>```」 を選択します。
### ライブラリー（パッケージ）の組み込み
　ツール（Tool） - Manage Packages... メニューを開いて、検索フィールドに BME280 と入力すると幾つか候補が出ますので、その中から 「micropython-bme280」を選択して「インストール」ボタンを押します。（BME280だけのものだとダメでした）
同様の手順で、ssd1306 を検索して「micropython-ssd1306」をインストールします。

## プログラムのソース
　とりあえず、動いたソースをそのまま公開します。
（ソース中にコメントや解説はありません）

```Python:BME280OLED.py
import machine
import ssd1306
import time
import sys
from bme280 import BME280

sda = machine.Pin(0)
scl = machine.Pin(1)
i2c = machine.I2C(0,sda=sda, scl=scl, freq=400000)

bme = BME280(i2c = i2c)

oled = ssd1306.SSD1306_I2C(128, 64, i2c)

def sensor_read():
    oled.init_display()
    t, p, h = bme.read_compensated_data()
    p = p // 256
    pi = p // 100
    pd = p - pi * 100
    hi = h // 1024
    hd = h * 100 // 1024 - hi * 100

    oled.text("Temp: ", 0, 5)
    oled.text(str(t)+"C", 40, 5)
    oled.text("Pres: ", 0, 25)
    oled.text(str(pi)+"."+str(pd)+"hPa", 40, 25)
    oled.text("Hum: ", 0, 45)
    oled.text(str(hi)+"."+str(hd)+"%", 40, 45)
    oled.show()

if __name__ == '__main__':
    while True:
        try:
            sensor_read()
        except KeyboardInterrupt:
            sys.exit()
        time.sleep(5)
    
```
## Thonny のライブラリはどこ？
　ライブラリ（パッケージ）のソースを見ようとして Macの中を探しても見つからなかった。
パッケージは /lib にインストールしたと Thonny が言っているが、見当たらない。
Thonny の Open メニューを選ぶとこんなダイアログが出てくる。
![スクリーンショット 2021-10-08 16.06.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/dce35b80-980c-6d49-32a8-0de55b394151.png)
ここで Rasoberry Pi Pico を選ぶと、Pico の内部ファイルが見えるが、何とこの中に Lib フォルダーがある。そう、実は Pico の内部にインストールされているのだった。
考えてみたら、Python が実行時に読み込むので、ここにあるのが当たり前だ。
　この (Pico) /lib にあるソースを参考にしたり、場合によっては I2C アドレスなどを変更することができるのだ。

## 起動時に自動実行させるには
　Macに接続せずに単体で動作させるには、電源が接続された時に自動的に実行するプログラムを指定する必要がある。
MicroPythonの場合、ソースのファイル名に「main.py」のものがあると自動で起動する。
そのためには先のソースを一旦保存してから、ファイルメニュー - Move/rename... を選択して、main.py として保存する。
### 自動実行の際の注意事項
　自動実行させるプログラムでは Ctrl-C による割り込みなどで終了できるようにしておかないと、Macに接続すると自動実行し、Thonny を受け付けなくなるので、注意が必要だ。
実際、私も困ってしまって、BME280センサーを外してエラー終了させることで難を逃れるのだった。（汗）
追記：　ctrl+C による割り込みで終了するように書いても受け付けられませんでした。USBシリアルポートを見に行かないようです。どなたか改善策をご存知でしたらコメントをお願いします。

【追記】：
「Raspberry Pi Pico の main.py を実行していると Thonny が認識できない問題」
https://qiita.com/ynomura/questions/c2d71e3cdf0603aec673

上記サイトに質問を掲載しておりましたが、その後、試行錯誤の末、停止させる方法を見つけました。（自己解決しました）

####見つけた解消法：
　main.py が自動実行されて Thonny が Pico を認識できない状態（画像の赤枠1のエラーが出て使えない状態）で、CTRL-D をタイプ（CTRL-C ではダメでした）
　次に Pico が繋がっている USB ケーブルを一旦抜いて、再度接続する
　そうすると画像の赤枠2が表示される。
　そこで、停止ボタンを押すか、CTRL-C でプロンプトが表示され Thonny が使用できるようになりました。
![ThonnyPico.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/ee87e218-3ad3-6b40-8a7d-3410f694586c.jpeg)
とりあえず、これで解決しましたが、もっと良い方法をご存知の方のコメントをお待ちします。