Other

2017.08.18

AdafruitがCircuitPythonへ移行

Text by kanai

先日、Adafruitのエンジニア、Scott Shawcroftに話を聞き、私は大いに興奮した。Adafruit製品をCircuitPython対応に切り替えるというのだ。それによる利点も驚きだった。最大の利点は、パソコンに接続すれば通常のUSBメモリーのように認識され、その中にコードをドロップするだけでよいというのだ。IDEも必要ない。こうした機能は初めてではないが、Adafruitの最先端のツールにこれが導入されると聞けば、興奮しないわけにはいられない。

giphy

CircuitPythonとはなんですか?

CircuitPythonとは、MicroPythonをベースにしたマイクロコントローラーフレームワークのことです。ハードウェアのプログラムを、うんと簡単にしてくれます。Arduinoと違って、ユーザーが記述したコードはファームウェア自体には読み込まれず、チップまたはボードに搭載された小さなファイルシステムに格納されます。その結果、CircuitPythonは、コンピューターに接続して、そこに現れるドライブに保存されたファイルを編集するだけでよいというシンプルな形になったのです。

Arduinoは、コードを書き換える際に高価な書き込み装置を使わないで済むようにしたことが革新的でした。CircuitPythonは、さらに一歩進めて、専用のドライバーもソフトウェアも不要にしました。

CircuitPythonをできるだけ簡単に説明するとしたら、どう言いますか?

CircuitPythonもPythonも、まったく意識させないということでしょうか。ソフトウェアとハードウェアが単純に合体した形です。パソコンに接続して、ドライブを開いて、その中のコードを書き換えるだけです。ファイルを保存すれば、自動的にアップロードされます。USBドライブと同じように取り出して、持ち運べます。それだけで、コードはデバイスの一部になっています。

Adafruitの製品にCircuitPythonを実装しようと考えたのはなぜですか?

私にとって、CircuitPythonがもっとも簡単に使えるものだったからです。古いWindowsのシリアル接続は別として、特別なドライバーを必要としないため、入門の敷居が非常に低いのです。プログラミングのための専用のソフトウェアも必要ありません。通常のテキストエディターで行えます。どんなシリアルプログラムでも接続できます。プログラミングにインターネット接続も必要ありません。

初心者にハードウェアを作ったり実験したりして欲しいと考えているAdafruitにとって、その敷居の低さは最適でした。CircuitPythonのコードとハードウェアを一体化させる能力によって、ハードウェアは、これまでになくハックしやすいものになります。誰かにコードを送って、特別なソフトウェアを使って設定してもらうといった苦労は、もうなくなります。そのままで作動します。

Arduino IDEも使えますか?

もちろん! CircuitPython対応のSAMD21 Cortex-M0+マイクロコントローラーユニットをベースとした製品では、Arduino IDEもMicrosoft MakeCodeも使えます。子どもたちにコーディングを教えて、より複雑なコードへと発展させるには、まずMakeCodeから入って、次にCircuitPythonやArduino IDEに進むのがいちばんの方法だと私たちは考えています。

なぜもっと早く、そうしなかったのですか? 何か革新的なことが起きたのですか?

Pythonを埋め込み型で使う方式は、Python-on-a-ChipOwlで試みられていました。しかし、どちらも人気が出なかった。しかし、KickstarterでMicroPythonが登場して、やっと人気が出たのです。Damien GeorgeやPaul SokolovskyといったMicroPythonの開発者たちは、CircuitPythonの基礎を築いた称賛すべき人物です。彼らは大変な努力の末に、Python 3.4をマイクロコントローラーに再実装して、USBマスストレージでのコーディングを可能にしてくれました。私たちは、ただ彼らの努力の結果を私たちのハードウェアに導入して、使いやすく洗練させただけです。

Adafruit製品をCircuitPythonに対応させる上で、まずどんな困難がありましたか? 大変でしたか? それとも、それほどでもなかった?

大きな点で言えば、32ビットマイクロコントローラーへの移行です。CircuitPythonは8ビットには対応していません。そこで、at328pと32u4をSAMD21に変更することで、これが使えるようになりました。

ところがMicroPythonは、私たちのすべてのM0ボードに使われているSAMD21には対応していませんでした。MicroPythonがSAMD21に対応していなかったため、私たちはCircuitPythonを作ることになったのです。MicroPythonの「ポート」の概念は、STM32ファミリーやSAMDファミリーなどのマイクロコントローラー・ファミリーとほぼ揃っていました。どのファミリーも類似のCortex Mコアを採用していますが、USB、I2C、SPIなどのプロトコルを実装する周辺機器は大きく異なっています。この新しいマイクロコントローラーファミリーへの対応における最大の困難は、そうした周辺機器の対応にありました。

将来、これをもっと簡単にできるようにするために、私たちは分かりやすい機能指向型のハードウェアAPIを開発しました。このAPIを使えば、既存のドライバーが使える状態を保ちながら、新しいポートにハードウェアを段階的に追加することが簡単にできるようになります。将来、さらに新しいマイクロコントローラーを対応させる場合には、ポートの追加が楽にできます。

CircuitPythonをAdafruit製品に対応させるために、ハードウェアの変更は必要でしたか?

arduino_3403_iso_ORIG

32ビットマイクロコントローラーが必須でしたが、CircuitPythonより以前に、私たちにはSAMD21ベースのFeatherという別のセットがありました。CircuitPythonの最初の開発はFeather M0 BASICとArduino Zeroで行っていたのです。さらに、CircuitPlayground、Metro、Gemma、TrinketをSAMD21用にアップデートして、これらのプラットフォームでも CircuitPythonが使えるようにしました。

CircuitPythonの使い勝手をよりよくするために、ボードにExpressシリーズを追加しました。Expressには外部SPIフラッシュチップが搭載されいて、Pythonのコードを、マイクロコントローラー内にではなく、外部に格納できるようになっています。コードの格納容量を64KBから2MBに拡大したことで、ファームウエア自体の機能も使いやすくなりました。さらに、Adafruitでは初めて、状態を示すLEDにRGB LEDを採用しています。Gemma M0とTrinket M0のExpress以外の機種にもRGB LEDが搭載されますが、外部フラッシュはありません。

CircuitPythonを使った開発において、ユーザーが気をつけるべき短所はありますか?

Python全般に言えることですが、CircuitPythonの最大の短所は、開発速度を優先させるか、メモリーフットプリントと実行速度を優先させるかを選ばなければならない点にあります。Arduinoのように、メモリーと実行速度に制限を加えれば、コンパイルには時間がかからなくなります。この場合、たとえばNeoPixelのアニメーション表示では、CircuitPythonはArduinoよりも遅くなります。また、数多くのライブラリーに依存したプロジェクトでは、コンパイラーで最適化できるコードと比較して、機能が少なくなります。

とは言え、それはCircuitPythonを諦める理由にはなりません。開発速度は、Arduinoのようなコンパイラーベースのソリューションよりもずっと高速です。とにかく、CircuitPythonですべての開発を行い、必要ならば後で最適化すればよいのです。十分に高速なはずです。みなさん、コンピューターの速度を過小評価してますから。

コードを書いた後からの最適化には、基本的に次の3つの方法があります。

1. Pythonコードを最適化する。
2. 必要に応じてPythonから使えるようにCircuitPythonファームウエアにCの機能を追加する。
3. より速いハードウェアを買う(マイクロコントローラーのCPU処理速度では、まだムーアの法則が生きています。SAMD21は48 MHzですが、同程度のサイズのマイクロコントローラーには200 MHz以上で駆動するものもあります)。

そんなわけで、こうした短所はあったとしても、CircuitPythonは入門用のフレームワークとして間違いありません。

どこでCircuitPythonを学べばよいのでしょう? learn.adafruit.comがそのひとつだと思いますが、他にありますか?

今のところは、Feather M0 ExpressGemma M0の製品解説書がいちばんです。Learnシステムにも、すでにCircuitPythonのためのプロジェクトがいくつか載っています。(アーケードボタンボックス、MPR121 タッチコントローラーLIS3DHガイドです。Tonyは、彼のMicroPythonのガイドをCircuitPython用に書き換えていますが、まだ作業の途中です。たとえば、このガイドは更新される予定です。私たちのAPI解説書でも、小さな例がたくさん紹介されています。また、CircuitPythonのハードウェア関連でない部分については、一般のPythonのチュートリアルが便利です。

今回の動きは、私たちのコミュニティにインパクトを与えるでしょうか?

CircuitPythonへの移行は、今のAdafruitのコミュニティを広げるものになると私は考えています。敷居が低いため、より多くの初心者が集まることでしょう。CircuitPlayground Expressのような汎用性の高いボードとの相性は抜群です。簡単に使えるために、プロジェクトやライブラリーを通して、さらに多くの人がコミュニティに貢献してくれるようになると思います。

私たちのコミュニティの今のメンバーは、よりクリエイティブで革新的な製品やプロジェクトの開発を私たちに期待しています。オープンソースのソフトウェアとハードウェアの使い勝手の向上という面で、CircuitPythonはひとつのステップに過ぎません。

これは、それぞれ独自のコア開発チームを持つArduinoやRaspberry Piに対抗する、Adafruitの最初のコアプラットフォームです。新しいコア開発コミュニティを方向づけるチャンスでもあります。そう考えるとワクワクします。私たちのプロジェクトはすべて、行動規範としての貢献者協定に準拠しています。これは、さらにオープンソース開発を進めながら、フレンドリーで開放的で協力的なAdafruitコミュニティを保ってゆくために重要な協定です。Rust言語のコミュニティは、オープンソースプロジェクトの適切な進め方に関して大変に参考になりました。Emily Dunhamは、それに関して素晴らしい講演をいくつも行っています。

こうした動きによって、CircuitPython、CircuitPythonライブラリー、Learnガイドに貢献してくれる人が多く現れることを楽しみにしています。

原文