Raspberry Pi PicoでCircuitPythonを動かす

個人的に電子工作用途のプログラミングと言えばMicroPythonだったのだが、今回はCircuitPythonを試す。ESP32など手持ちのマイコンはCircuitPython未対応のため、以前から気になっていたRP2040搭載のRaspberry Pi Picoを購入し、CircuitPythonをインストールして遊んでみた。

スポンサーリンク

ファームウエアのインストール

Raspberry Pi PicoへCircuitPythonファームウエアをインストールするのはとても簡単。Windowsのエクスプローラーからドラッグ&ドロップするだけで済んでしまう。

新規インストール

買って来てすぐの状態のRaspberry Pi Picoボードなら以下の手順でインストール出来る。

  1. Windows PCにRaspberry Pi PicoをUSB接続する。すると、RPI-RP2という名前のUSBドライブが認識される。
  2. Raspberry Pi Pico用CircuitPythonダウンロードサイトで”DOWNLOAD .UF2 NOW”ボタンを押してファームウエアをダウンロード(言語はJAPANESEを選択)
  3. ダウンロードした.UF2ファイルをRPI-RP2ドライブにコピーする(エクスプローラーのドラッグ&ドロップでOK)
  4. .UF2のコピーが完了するとRaspberry Pi Picoが再起動し、CUICUITPYという名前のUSBドライブが認識される

一度書き込んだボードの場合

一度書き込んで以降はそのファームウエアが自動起動するようになる。書き込み2回目以降の場合は本体のBOOTSELボタンを押しながらUSB接続をすると、再度RPI-RP2のUSBドライブ名でボードが起動するので、上記手順2〜4を行えば良い。

MicroPythonへの書き換えも簡単

PicoはMicroPythonにも対応しており、下記サイトから.rp2形式のファームウエアをドラッグ&ドロップで書込みすれば、MicroPythonとして使うことも出来る。

MicroPython - Python for microcontrollers
MicroPythonisaleanandefficientimplementationofthePython3programminglanguagethatincludesasmallsubsetofthePythonstandardlibraryandisoptimisedtorunonmicrocontrolle...

MicroPythonの場合はファームウエアを書き込んだ後にUSBドライブがマウントされる事もなく、ESP32版のMicroPythonと使い勝手は全く同じだ。

REPLでPythonコード実行

MicroPython同様、CircuitPythonでもCOMポート経由でREPL(Read-Eval-Print Loop)が使える。PuTTYなどから115000bpsでシリアル接続すればOK。

PuTTY設定

シリアル接続すると「オートリロードがオンです。ファイルをUSB経由で保存するだけで実行出来ます。REPLに入ると無効化します。」とのメッセージが。ほほう、便利そうですな(後でやります)。

REPL初期画面

キー入力するとREPLモードに入り対話形式でコードを実行出来る。REPL動作中にCTRL-Dを押すとソフトリブートが掛かって、再度オートリロード モードに入る。

REPL初期画面

本体LEDを点滅させる

お約束の「Lチカ」をやってみよう。

Lチカと言えばGPIO。MicroPythonの場合はGPIOの操作にmachineライブラリに定義されているPinクラスを使うのだが、CircuitPythonの場合は若干違っていてdigitalioライブラリに定義されているDigitalInOutクラスを使う。

以下のコードでledという名前の変数を初期化する。

import board
import digitalio

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

MicroPython同様、CircuitPythonのREPLにはCTRL-Eで貼付けモードに入ることが出来る。上記コードをクリップボードにコピーしたうえで、貼り付けモードでコードを貼り付ける。

REPL貼付けモード

CTRL-Dを押して貼り付けモードを終了させた後は、

led.value = True

を実行するとLEDが点灯し、

led.value = False

でLEDが消灯する。

オートリロードでPythonプログラムを実行する

CircuitPythonにはプログラムをドラッグアンドドロップで書き換えると自動実行してくれるオートリロードという仕組みがある(上記シリアル接続時のメッセージで案内されてた物)。MicroPythonにもboot.pyもしくはmain.pyという名前のプログラムがリセット後に自動実行される仕組みはあるが、CircuitPythonの場合は以下の表のように若干異なっている。(詳細は本家ドキュメントに記載されている)。

USB接続時に一回だけ実行起動時orファイル書き換えのたびに自動実行
boot.py(boot.txt)main.py(main.txt)もしくはcode.py(code.txt)

ファイル拡張子は.pyだけでなく.txtでも構わないので、プログラムはメモ帳で編集可能だ。例えば、以下のようなプログラムをファイル名code.txtで保存しておく。

import time
import board
import digitalio

period = 0.5

print(f'Blink Period: {period}sec')

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

while True:
    led.value = not(led.value)
    time.sleep(period)

そして、以下の操作を行う。

  1. code.txtをCIRCUITPYドライブにドラッグアンドドロップでコピー
  2. CIRCUITPYドライブにコピーしたcode.txtをメモ帳で開く
  3. メモ帳で開いたcode.txtの5行目を”period = 0.2″に書き換えてファイルを保存

すると、1.が完了した時点で0.5秒間隔のLED点滅が開始し、3.が完了するとLEDの点滅間隔が0.5秒から0.2秒に変わる。この時のシリアルコンソールは以下のような出力になる。

REPL貼付けモード

まとめ

Raspberry Pi PicoへのCircuitPythonファームウエアインストールからPythonプログラムの実行まで、ひととおりやってみた。特別なツールは一切不要で、ファイルのドラッグアンドドロップで全て完結してしまう仕組みは非常に良く出来ていて感動モノだ。電子工作初心者には間違いなく最初の選択肢となるプログラミング環境だろう。

とはいえ、PCとのUSB接続を前提とせず、シリアル接続だけで使えるMicroPythonも捨てがたい魅力がある。状況に応じて使い分けて行こうと思う。

コメント