Raspberry Pi Pico + CircuitPytnon 入門

この記事は主に Adafruit からの情報をまとめたものとなります。

https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython

CircuitPython は Adafruit が MicroPython をフォークして作成したものでプログラム初心者が Raspberry Pi Pico を含む安価なマイクロコントローラーを使用しプログラムの学習や実験ができるようにデザインされています。MicroPython を知っていればその知識の 95% は CircuitPython でも使用することができます。CircuitPython の誕生秘話は [ここ](https://makezine.jp/blog/2017/08/circuitpython-snakes-way-adafruit-hardware.html) が興味深いです。

CircuitPython はマイクロコントローラを含む [多くのデバイス](https://circuitpython.org/downloads) で動作し Raspberry Pi Pico でも動作します。また Raspberry Pi でも動作し多数のライブラリが Adafruit などによって作成されています。

Raspberry Pi Pico で CircuitPython を使えるようにするには以下のサイトからまず UF2 ファイルをダウンロードします。

https://circuitpython.org/board/raspberry_pi_pico/

次に Raspberry Pi Pico ボード上の BOOTSEL ボタンを押しながら PC と USB 接続をします。すると RPI-RP2 というディスクが PC から見えるようになります。このディスクにダウンロードした UF2 ファイルをコピーします。すると Raspberry Pi Pico が自動で再起動し今度は CIRCUITPY というディスクが PC から見えるようになります。

以下は MicroPython の例ですが UF2 ファイルをコピーする手順は同じです。ただ①の手順でコピーするファイルは[上記の CircuitPython のもの](https://circuitpython.org/board/raspberry_pi_pico/)を使用します。

https://www.raspberrypi.com/documentation/microcontrollers/micropython.html#drag-and-drop-micropython

CircuitPython の特徴として Raspberry Pi Pico が CIRCUITPY という名前のディスクとして PC から見えます。Raspberry Pi Pico が起動すると CIRCUITPY 直下にある code.py を実行します。このファイルはどのエディタを使用しても編集可能です。また、Raspberry Pi Pico を USB で PC に接続すると COM6 などのシリアルデバイスとして見えます。[TeraTerm](https://www.j-oosk.com/teraterm/serial/346/) などを使って Serial Port の Speed を 115200 としエンターキーを押すと REPL と呼ばれる Python の対話モードにアクセスできます。この状態で Ctrl-D を押すと再度 code.py が実行されます。

![teraterm3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/e9b3ec02-1d67-78b0-c609-bb7373312400.jpeg)

この REPL には Thonny、Mu, VSCode などを使うとエディタからアクセスできるので便利です。

[元ネタ](https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython/installing-mu-editor) に沿って [Mu](https://codewith.mu/en/) を使ってみることにします。下記の Download ページから Mu をダウンロードしてインストールしてください。

https://codewith.mu/en/

Mu はメニューを日本語にすることもできます。これは初回起動に出てくるモードの選択で CircuitPython を選択してください。これはモードアイコンから選択することもできます。尚、初回起動時は数分かかります。

![mu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/9d1fc5a2-dff7-55fa-b09d-0161771a0e31.jpeg)

CircuitPython がインストールされた Raspberry Pi Pico を接続すると自動的に Mu が認識します。PEPL アイコンをクリックすると画面下に CircuitPython REPL の下のウィンドウが表示されます。このウィンドウで Enter キーを押すと Raspberry Pi Pico で動作する CircuitPython の対話モードにアクセスできます。

開くアイコンをクリックし CIRCUITPY というディスクの下にある code.py を開いてください。実行アイコンはありませんがこのファイルを保存する度に code.py が実行されます。ただし、CircuitPython REPL に以下のような表示がされ対話モードとなっている場合は Ctrl-D を押すと Raspberry Pi Pico がソフトリブートし code.py が実行されます。

```
Press any key to enter the REPL. Use CTRL-D to reload.

Adafruit CircuitPython 7.2.0 on 2022-02-24; Raspberry Pi Pico with rp2040
>>> 
```

試しに code.py に以下のようなプログラムを書き保存してみてください。

```
print("Hello, world!")
```

CircuitPython REPL に以下のように表示され Hello, world! と表示されたことが確認できます。プログラムが終了すると Code done running. の文字が表示され Enter キーなどを押すと対話モードとなります。

```
soft reboot

Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.
code.py output:
Hello, world!

Code done running.

Press any key to enter the REPL. Use CTRL-D to reload.
```

Raspberry Pi Pico 上には LED がありますがこれを点滅させるには以下のようなプログラムとなります。

```
import board
import digitalio
import time

led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)
```

Raspberry Pi Pico の [ピン配列]((https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf)) は以下のとおりです。

![pinout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/57527637-04f1-152f-1320-7026f5e88c13.png)

上記プログラムではまず board モジュールを import しています。試しに以下のプログラムを REPL の対話モードから実行してみてください。

```
>>> import board
>>> dir(board)
['__class__', '__name__', 'A0', 'A1', 'A2', 'A3', 'GP0', 'GP1', 'GP10', 'GP11', 'GP12', 'GP13', 'GP14', 'GP15', 'GP16', 'GP17', 'GP18', 'GP19', 'GP2', 'GP20', 'GP21', 'GP22', 'GP23', 'GP24', 'GP25', 'GP26', 'GP26_A0', 'GP27', 'GP27_A1', 'GP28', 'GP28_A2', 'GP3', 'GP4', 'GP5', 'GP6', 'GP7', 'GP8', 'GP9', 'LED', 'SMPS_MODE', 'VBUS_SENSE', 'VOLTAGE_MONITOR', 'board_id']
```

board.XXX として指定可能なピンの一覧が表示されます。[元ネタ](https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython/circuitpython-pins-and-modules) と違うのは SDA, SCL, TX, RX などの記述が無いことです。(元ネタは別のハードウェアの記述が混ざっているのかもしれません。。)

このため、以下のような記述のプログラムは動作しません。

```
i2c = busio.I2C(board.SCL, board.SDA)
```

[ここ](https://qiita.com/tkarube/items/58a706a595b1c74b2b3a) のサンプルにもありますが具体的な GPIO の番号を指定し以下のような記述とする必要があります。

```
SDA = board.GP0
SCL = board.GP1
i2c = busio.I2C(SCL, SDA)
```

実際に LED のプラス側を例えば GP16 に繋いで点滅させる場合にはピンの指定は以下のようになります。

```
led = digitalio.DigitalInOut(board.GP16)
```

CircuitPython のデフォルトで使用可能なモジュール名は以下のようにして一覧を得ることができます。

```
>>> help("modules")
__main__          board             micropython       storage
_bleio            builtins          msgpack           struct
<snip>
```

例えば os モジュールを使用すると以下のような出力が得られます。

```
>>> import os
>>> os.uname()
(sysname='rp2040', nodename='rp2040', release='7.2.0', version='7.2.0 on 2022-02-24', machine='Raspberry Pi Pico with rp2040')
```

また、CircuitPython では Raspberry Pi Pico 内のストレージなどにデータを書くことができます。ストレージにデータを書くには boot.py という名前のプログラムを元ネタのプログラムのそのままの引用となりますが例えば以下のように書きます。

https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython/data-logger

``` boot.py
"""
boot.py file for Pico data logging example. If pin GP0 is connected to GND when
the pico starts up, make the filesystem writeable by CircuitPython.
"""
import board
import digitalio
import storage

write_pin = digitalio.DigitalInOut(board.GP0)
write_pin.direction = digitalio.Direction.INPUT
write_pin.pull = digitalio.Pull.UP

# If write pin is connected to ground on start-up, CircuitPython can write to CIRCUITPY filesystem.
if not write_pin.value:
    storage.remount("/", readonly=False)
```

上記のプログラムが読み込まれると GP0 が GND と接続されている場合に / を書き込み可能なストレージとして使用します。 boot.py は Raspberry Pi Pico に電源を接続した時に読み込まれます。ソフトリセット (code.py の保存や Ctrl-D など) では読み込まれません。

なぜ「GP0 を GND に接続された場合に」という条件をつけているかというと / をプログラムから読み込み可能なストレージとして使用する場合 PC などから Raspberry Pi Pico のストレージにアクセスできなくなるためです。つまり boot.py を含めて PC からプログラムの変更ができなくなります。

このため、上記のプログラムでは GP0 と GND の接続をせずに Raspberry Pi Pico を起動すれば boot.py などの変更を PC からできるように書いています。

因みにまだ試せてませんが CircuitPython では [マイクロ SD リーダー](https://learn.adafruit.com/adafruit-microsd-spi-sdio) を繋ぐと FAT32 でフォーマットした SD カードもストレージとしてを使うこともできるようです。

もし上記 boot.py で 「GP0 を GND に接続された場合に」という条件をつけないで / を書き込み可能なストレージとして使用するようにしてしまった場合など Raspberry Pi Pico を PC に繋いでもドライブすら見ないという場合には [ここ](https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython/circuitpython) または [ここ](https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html#resetting-flash-memory) の Resetting Flash memory のリンクから flash_nuke.uf2 ダウンロードし Raspberry Pi Pico で CircuitPython を使えるようにした Raspberry Pi Pico にコピーします。すると再度 RPI-RP2 としてディスクが見えるので CircuitPython の UF2 ファイルをコピーしてください。

CircuitPython の UF2 ファイルをコピーしただけでは CIRCUITPY の中身は消えませんが flash_nuke.uf2 をコピーした場合は CIRCUITPY の中身が全て消えます。

では良い Raspberry Pi Pico ライフをお過ごしてください。