技術の木

CircuitPythonでRaspberry Pi Picoをプログラミング(Lチカ)

スポンサーリンク

CircuitPythonって?

低コストなマイコンボード上で動作する、実験や学習のシンプル化を目的に設計されたオープンソースのプログラミング言語で、Pythonをベースとしています。

またAdafruit社が支援をしており、同社が開発・販売している電子部品などもCircuitPythonに対応しています。

オープンソースとしては、まだまだ活気のある状態なのでバージョンアップする毎に新たな機能が追加されたり、コミュニティーでの議論も盛んなようです。

下記に公式HPへのリンクを貼っておきますので詳しくはそちらを参照してください。

MicroPythonとの違い

以前の記事でMicroPythonを使ったプログラミングをご紹介しましたが、CircuitPythonはMicroPythonと似てはいますが、使えるAPIなどが違っているので別のライブラリーを使っていると考えたほうが良いです。

APIドキュメントに違いについて書かれていますのでリンクを貼っておきます。

私が気になった点としては(Google翻訳で日本語訳しています)

  • すべてのボードでネイティブUSBをサポートし、特別なツールなしでファイル編集を可能にします。

CircuitPythonでセットアップしたPicoはPC上でUSBメモリとしてファイルエクスプローラーなどでアクセス可能となります。
MicroPythonの場合はThonnyなどのIDEを使ってプログラムデータの書き出しを行っていましたが、それが不要となるため、好みのコードエディタを使用することが出来ると言うことになります。

  • Python内の同時実行性(割り込みとスレッド化を含む)をサポートしていません。
  • machine APIはありません。

スレッド化のサポートがないのには驚きました、ただコミュニティでは対応を議論しているようなので、もしかすると今後サポートされる可能性はあるかもしれません。
またmachine APIがない点については、機能毎に変わりとなるAPIが提供されているからのようですが、MicroPythonとはプログラミングの内容が変わってしまうので注意が必要だと思います。

以前紹介したMicroPythonでLチカする方法を書かせてもらいましたので、今回はCircuitPythonでどのように変わるかを例として紹介させていいただこうと思います。

CircuitPythonをRaspberry Pi Picoにセットアップ

まず初めにRaspberry Pi Pico本体にCircuitPythonをインストールします。と言ってもMicroPythonをインストールした時と流れは同じなので難しくはありません。

公式サイトに詳しく掲載されていますので、ここでは流れだけを簡単に説明します。

1.UF2ファイルのダウンロード

まずはcircuitpython.orgサイトからRaspberry Pi Pico用のUF2ファイルをダウンロードします。
下記のリンク先より「JAPANESE」を選択し、「DOWNLOAD .UF2 NOW」を押してください。

2021年5月時点のバージョンは「6.2.0」で、ファイル名は「adafruit-circuitpython-raspberry_pi_pico-ja-6.2.0.uf2」となります。

2.PicoのBOOTSELボタンを押しながらPCと接続する

Pico本体にあるBOOTSELボタンを押しながらUSBをPCと接続します。

3.PRI-RP2というストレージがPCにマウントされる

無事に接続されると、ストレージとして認識されます。
※エクスプローラーなどで確認してください。

4.UF2ファイルをPRI-RP2ストレージにコピーする

先程ダウンロードしてきたUF2ファイルをPRI-RP2直下にコピーしてください。
コピー後、自動的にPicoが再起動されます。

以上が、CircuitPythonのRaspberry Pi Picoへのインストールの流れとなります。
使用するUF2ファイルが違うだけでMicroPythonの時と同じですね。

MicroPythonとの違い

MicroPythonの時はPicoが再起動されるとPRI-RP2がマウントされなくなりましたが、CircuitPythonではCIRCUITPYという名前でマウントされます

CircuitPythonでLチカする

では早速、下記にCircuitPythonでLチカさせるコード例をご紹介します。

from board import *

import digitalio
import time

###
#LED定義Pin25
led = digitalio.DigitalInOut(GP25)
led.direction = digitalio.Direction.OUTPUT

#LED On Off
def toggleLED():
    if led.value is True:
    led.value = False

### main ###
power_on()
while True:
    toggleLED()
    time.sleep(0.2)
ポイント

MicroPythonでLEDを点灯する場合、machine.Pinクラスを使用しましたが、CircuitPythonにはmachine APIがありません
変わりに使用するのがdigitalio.DigitalInOutクラスとなります。
使い方は、Pinクラスとさほど変わらず、ピンの番号と出力か入力モードを指定します。(8~9行目)

8行目のピン番号には、board APIの値を参照するとGP25という定数が定義されているので使用しています。

12行目のtoggleLED関数はdigitalio.DigitalInOutクラスにはtoggle()メソッドが無かったため、自作しています。

そしてもう1点大きな違いとして、前述のとおりCircuitPythonは現在のところ、スレッド機能をサポートしていないため、コールバックを使った呼び出しができません。

今回のサンプルのような、単純に繰り返し続けたいだけであれば、whileを使用してループ処理し、定期的に実行させるため、time.sleepによって指定秒間処理を中断させることで、似たような動作を実現することができます。

[追記]Picoへの書き出しについて

自動起動するためにファイル名をcode.py(またはmain.py)にしてPico本体へ保存してください。

Picoへの書き出しができない場合

ThonnyなどでPicoにファイルの保存できない場合は次の方法で回避(許可)することができます。

以下のソースコードをboot.pyというファイル名で作成し、ファイルエクスプローラー等で保存してください。

# boot.py
import storage
storage.remount("/", False)

MicroPythonとCircuitPythonのどちらを使っていくと良いか?

正直、どちらか一方だけ使っていれば大丈夫。とはならず、プログラミングで何が出来るようにしたいか?の内容によって選択することになると思います。

例えば、サンプルのようなLチカがやりたい事だとした場合、MicroPythonでもCircuitPythonでも実現は可能なため、単純な好みだけで決めてしまえば良いでしょう。

しかしながら、どちらか一方では実現が難しいケースの場合は、クラスが提供されている方を選択することになるかと思います。

次回予告

次回はCircuitPythonを使うことで簡単に実現できる、マウスエミュレータについてご紹介したいと思います。


タイトルとURLをコピーしました