最新の CircuitPython を SparkFun の SAMD21 ボードで動かす

投稿者: | 2021/08/31

Running the latest CircuitPython (v6.3.0) on SparkFun SAMD21 Mini Breakout.

しばらく MicroPython から離れていたのですが、その間も、小さなお子さんが組込系プロセッサ(マイコン)のプログラミングに挑戦するとき、敷居の低いプラットフォームはないか、とずっと考えていました。

MicroPython(マイクロパイソン)は、「広く知られたスクリプト言語 Python をマイコン上で動かそう」という、大きな野心に溢れるプロジェクトだったのですが、ここ最近は、CircuitPython(サーキットパイソン)というプロジェクト(MicroPython からの枝分かれプロジェクト)の勢いに飲まれる形となってしまっています。私個人としてはやや残念なのですが、多くのマイコンに MicroPython をポーティングし、さらに、初心者でも利用しやすい形で提供しよう、という CircuitPython の活動も評価しなくてはいけないと思っています。

CircuitPython では、一つの共通したやり方として、マイコンボードが USB ポートでパソコンに繋がり、かつ mass storage device class(つまり、USB メモリ)として見えることを前提としています。そのため、USB インターフェイスをネイティブポートとして扱えないマイコンは、基本的に非サポートとなっています。

例えば、有名な Wi-Fi マイコンである Espressif ESP32(無印)にはネイティブの USB インターフェイスがないので、サポート対象から外されています。(ESP32 DevkitC には USB インターフェイスがありますが、これはネイティブポートではなく、Silicon Labs CP2102 を介して、UART(シリアルポート)に繋がるだけです。)

さて。私の手持ちのマイコンボードで、すぐに CircuitPython が試せるものはないでしょうか?

SparkFun SAMD21 Mini Breakout に決定!

こちらのサイトを見ると、CircuitPython が現在サポートしているマイコンボードの一覧があります。

また、技術的な見地からは、こちらのサイトに CircuitPython でサポートされるマイコンチップに関しての説明もあります。

私はこの中から、手持ちの SparkFun SAMD21 Mini Breakout を使うことにしました。このボードに搭載のマイコンは、ARM Cortex-M0+ 48MHz、256KB のフラッシュメモリ、32KB の RAM と、やや性能が低めなのですが、これで行きたいと思います。

なお、新しくボードを購入しようという方には、これなどはいかがでしょうか?

国内では、スイッチサイエンスさんなどで取り扱いがあるようです。

インストールの前に

慎重な方は、CircuitPython をインストールしたら、次からは Arduino IDE で使えなくなるんじゃないの? と心配なさるかも知れませんが、基本的には大丈夫です。(特殊なアダプタ等を使わずに)ちゃんと Arduino IDE で使えるように復元できます。ただし、CircuitPython のインストール手順にもあるように、UF2 Bootloader では必ず v3.9.0 以降のバージョンを使ってください。そうしないと、特殊なアダプタ(SWD インターフェイス)なしでは復元できなくなります。(いわゆる、オシャカになる、英語で言うと「ボードが brick になり」ます。)

興味ある方のために、少し技術的な説明をしましょう。(TL; DR)

SAMD21 系の ARM マイコンでは、通常、フラッシュ ROM の先頭(0x0〜0x1fff)に SAM-BA Bootloader というブートローダが入ります。BOSSA あるいは bossac というフラッシュプログラムソフトを御存知の方もあるかと思いますが、このソフトは、このブートローダとお話をすることで、ユーザーアプリケーションを後続のフラッシュ ROM(0x2000 以降)に書き込みます。

Arduino IDE でも、SAMD21 にプログラムを書き込むときには、背後で、この bossac を利用しています。SAM-BA ブートローダがフラッシュ ROM 上にありさえすれば、後続のフラッシュ ROM の内容がおかしくなってしまっても、基本的にはマイコンボードを復元できることになります。

CircuitPython のインストールは、2段構えのインストールになっています。

まず最初に、SAMD21 マイコン上に Arduino Sketch で書かれた UF2 Bootloader というものを書き込みます。)これは Arduino IDE から見るとアプリケーションに過ぎないので、仮に UF2 Bootloader をインストールしても、他のアプリ(Blink など)で上書きすることが可能です。)

次に、UF2 Bootloader を動作させると SAMD21 マイコンの USB インターフェイスが、パソコンから USB メモリに見えるようになるので(SPARKFUN という名前のドライブが見えるようになる)、その中に CircuitPython のリリースファイル(adafruit-circuitpython-sparkfun_なんとか-6.3.0.uf2 など)をコピーします。

しばらくするとマイコンにリセットがかかり、今度は CIRCUITPY という USB メモリが見えるようになります。インストールは、これで完了です。

なおこのとき、CircuitPython 自体もフラッシュメモリの 0x2000 から配置されますので、この時点で UF2 Bootloader はフラッシュメモリから消えて無くなっていることになります。 すみません。ウソのようです。CircuitPython をインストールしても、リセットボタンのダブルクリックで UF2 Bootloader が立ち上がります。どういうメモリ配置になっているのだろう。(元々入っている SAM-BA ブートローダーを書き換えているのだろうか?) 今度、時間があったら調べてみます。いずれにしても、CircuitPython をインストールしても、Arduino IDE が使えなくなる、ということはないようです。

インストールの方法

今回は、最新版(v6.3.0)の CircuitPython をインストールしてみます。実際のインストール方法ですが、こちらに説明があります。

英語ではないかですって?  そんなときは、Google センセイに翻訳して貰いましょう!(ファームロジックスでは、基本的に丸々翻訳だけの投稿はしません! あしからず。)

まずは、L チカ(LED 点滅)を試す

インストールが終わったら、上記手順の中にある、次のコードを試してみましょう。

import board
import digitalio
import time

pin_name = board.LED  # Sparkfun ボード用に変更済

led = digitalio.DigitalInOut(pin_name)
led.direction = digitalio.Direction.OUTPUT
while True:
    led.value = True
    time.sleep(0.1)
    led.value = False
    time.sleep(0.1)

これを、CIRCUITPY ドライブの中に code.pyとして保存(セーブ)します。保存すると、すぐにマイコンがリセットされ、LED が 0.2秒周期(0.1 + 0.1 = 0.2)で点滅するはずです。

動きましたか?  今日はここまで!

加筆(2021/9/1)

CircuitPython には、日本語にローカライズされたバージョンもあるようです。シリアルターミナルソフト(TeraTerm や screen など)で REPL にアクセスすると、Python のエラーメッセージなどが日本語で表示されます。もし、中学生以下のお子さんなどで、日本語のメッセージのほうが嬉しいという場合は、日本語版をインストールしても良いでしょう。ダウンロードページ(SAMD21 Mini の場合)の、以下のような画面からダウンロードできます。

ローカライズされた REPL の例

なお、私の今後のブログの説明では、英語版で行きたいと思います。御了承ください。

お問い合わせはお気軽に!

お問い合わせを頂いた後、継続して営業活動をしたり、ニュースレター等をお送りしたりすることはございません。
御返答は 24時間以内(営業時間中)とさせて頂いております。もし返答が届かない場合、何らかの事情でメールが不達となっている可能性がございます。大変お手数ですが、別のメールアドレス等で督促頂けますと幸いです。