ラピッドマイクロコントローラベースのプロトタイピングと開発のためのCircuitPythonの基礎

著者 Steve Leibson氏

Digi-Keyの北米担当編集者 の提供

Python言語はプログラミングをよりアクセシブルにしましたが、たくさんの処理、メモリ、そして周辺リソースを持っているPCや他のマシン上で実行するように設計されています。リソースとインターフェースの制約がより厳しい組込みシステムでは、MicroPythonと呼ばれるマイクロコントローラ用に最適化されたバージョンが普及しています。オープンソースコミュニティが、MicroPythonを特定のマイクロコントローラや開発ボードに適応させて、深刻なマイクロコントローラの開発をサポートしているのは、そのためです。

この記事では、そのような適応策の1つ、AdafruitのCircuitPythonを紹介します。この記事では、Pythonについて簡単に説明した後、古典的な組み込み開発言語C++と比較しながら、PythonがどのようにMicroPython、そしてCircuitPythonに進化したかを説明します。それから、CircuitPython環境をサポートするAdafruitと他のベンダーからのいくつかの開発ボードを紹介する前に、CircuitPythonを使ってソフトウェアを書くプロセスを説明します。

Pythonの理由

オリジナルのArduino開発ボードとその多くの後継モデルは、メーカー、趣味、学生プロジェクト、そして組み込みプロトタイプのための非常に人気のあるマイクロコントローラ開発ボードです。しかし、Arduino IDEとプログラミング言語はC++に基づいています。C++は、奇妙に見える構文と厳格な句読規則を使用した強力で複雑なコンパイル言語で、初心者のプログラマには不自然に思われます。

Pythonは新しいプログラミング言語です。優れたプログラミング機能と非常に明確な構文を組み合わせた、インタープリット型の対話型オブジェクト指向言語です。これは、より簡単な構文と同様に、その書きやすさと読みやすさで知られています。これらの特性が組み合わさってプログラミングエラーの数が減り、コードの再利用が容易になり、ソフトウェア開発がスピードアップします。

言語の解釈的な性質は、実験と迅速な学習を促進するプログラマからのフィードバックを即座に提供します。これらの理由から、Pythonは現在多くの学生やメーカーが学ぶ最初のプログラミング言語です。

1つの欠点は、Pythonが、十分なRAM、大容量記憶装置、およびキーボード、大型ディスプレイ、マウスを持ち、総合的なユーザーインターフェースを備えたPCや大型マシン上で動作するように設計されていることです。組み込みプログラミング言語としては設計されていませんでした。しかし、MicroPythonと呼ばれるPython 3プログラミング言語の無駄のない効率的な実装は、マイクロコントローラの制約のあるリソース内で動作するように特別に作成され最適化されています。

MicroPythonが組込みプログラミング言語として期待されていることを認識して、オープンソースコミュニティは重大なマイクロコントローラ開発をサポートするために特定のマイクロコントローラと開発ボードに適応させてきました。たとえば、AdafruitはCircuitPythonと呼ばれる独自のMicroPythonフレーバーを開発しました。実験を簡素化し、低コストのマイクロコントローラボード上でプログラミングする方法を学ぶように設計されており、Adafruitの開発ボードで利用可能なマイクロコントローラおよびハードウェアリソースに合わせて調整されています。CircuitPythonはいくつかのAdafruitの開発ボードにプレインストールされており、他のボードにもインストール可能です。

C++とPythonの違い

Arduino IDEと現在入手可能な多数のArduino開発ボードの勢いと存在感を考えると、なぜ組み込みの開発にPythonのバージョンが必要なのかを尋ねるのは妥当です。言語を比較すると答えがわかります。

C++は、オブジェクト指向の拡張機能を持つ古いC言語の拡張機能です。これらの拡張機能を使用しても、1960年代後半から1970年代初期にかけてBell LabsでKerniganとRitchieによって作成されたC構文を保持しているため、C++コードはやや謎めいています。Cは、ターゲットプロセッサの機械語命令に簡単にマッピングできるように意図的に設計されています。プログラマのニーズよりもマシンのニーズの方へのこの偏りは、言語の構文で明らかです。市販のマイクロプロセッサは1971年まで登場しなかったので、Cはもともとミニコンピュータ用に開発されました。マイクロプロセッサ用のCコンパイラは、1980年代に徐々に有用なツールに進化しました。C++と同様に、Cは常にコンパイル言語です。

デンマークのコンピュータ科学者であるBjarne Stroustrupは、1979年にC++の開発を始めました。1985年に、彼のこの言語の最初のテキストブックが登場しました。C++は1998年まで標準プログラミング言語にはなりませんでした。Cと同様に、StroustrupのC++言語はもともと大型のコンピュータを対象としていました。2003年に開発されたArduino IDE(統合開発環境)は、C++をマイクロコントローラにとって有用なものにしました。

Pythonもオブジェクト指向言語です。これはオランダのプログラマ、Guido van Rossuminによって開発され、1991年に最初にリリースされました。Pythonの構文設計は、コードの読みやすさを重視しています。これは、PythonとC++の大きな違いの1つです。書きやすさは、読みやすさと密接に関係していますが、Pythonが好まれるもう1つの特性です。書きやすさは、一般的にPythonがプログラマがより速くアプリケーションを書くことを可能にすると信じられていることを意味します。これにより実験を促進し、プロトタイピングと開発サイクルを短縮することができます。

2つ目の大きな違いは、Pythonはインタープリタ言語であるということです。これは、1960年代にミニコンピュータ用に初めて登場し、1970年代にマイクロコンピュータの登場で真に開花したBasicプログラミング言語によく似ています。Basicのように、Pythonの解釈的な性質は実験を奨励し、それゆえコンパイルされたプログラミング言語に使用される編集/コンパイル/ダウンロード/実行開発サイクルを省いて学習できます。ただし、Basicとは異なり、Pythonは、Basicが最初に開発されてから登場してきた半世紀にも及ぶコンピュータサイエンスの進歩を取り入れた、最新の高レベルのオブジェクト指向言語です。

たとえば、Pythonの変数は使用前に宣言または型指定する必要はありません。プログラマは、変数が整数か浮動小数点数かを心配する必要もありません。Pythonインタープリタはそれをすべて把握し、実行時に適切な選択をします。

C++とPythonのもう2つの違いは、文字列処理と句読点です。多くのプログラマは、C++での文字列処理が曖昧でわかりにくいと感じています。Pythonの文字列処理ははるかに単純で、長くBasicの長所と考えられているBasicの単純でよく知られた文字列処理機能を連想させます。

同様に、CおよびC++の句読点、特に波括弧({})は、熟練したばかりのプログラマでも経験豊富なプログラマでさえも頻繁に遭遇する障害の1つです。プログラムには常に奇数の波括弧があるように感じます。つまり、プログラマは、欠けている波括弧がどこに入るべきかを見つけるためにコードを詳しく調べなければなりません。Pythonはそのような気難しい句読点を持っておらず、Pythonコードに読みやすさを与えるインデントを使います。

MicroPythonの起源

CやC++のように、Pythonはもともと大型のコンピュータ上で動作するように設計されていました。その結果、この言語はマイクロコントローラのプログラミングに使用するには多すぎるリソースを必要としました。そのため、オーストラリアのプログラマ兼物理学者のDamien Georgeは、マイクロコントローラのより限られたリソースで実行できるMicroPythonと呼ばれるバージョンのPythonを開発しました。Arduino開発ボードはMicroPythonの初期のハードウェアターゲットでした。

MicroPythonのインタラクティブな機能は、正式にはREPL(read-eval-print-loop)ウィンドウと呼ばれるコマンドインターフェースに集中しています。REPLインターフェースは1970年代と1980年代の基本的なコマンドラインインターフェースに非常に良く似ています。ユーザー入力(単一の式またはステートメント)を受け取り、それらを評価してから、REPLウィンドウを介して結果をユーザーに返すか、ステートメントに埋め込まれたコマンドを実行します。

REPLインターフェースを使用すると、変数のクエリ、I/Oラインの切り替え、または接続されている周辺機器への文字列の送信を行うことができます。その行は解釈され、エンターキーが押されるとすぐに実行されます。それがインタープリタ言語の本質です。

このMicroPythonの機能は予備的なプログラミングとデバッグを容易にし、初心者と経験豊富なプログラマの両方にとって言語を使いやすくするMicroPythonの側面の1つです。REPLユーザーインターフェースは、Arduino IDEの古典的な編集 - コンパイル - 実行 - デバッグサイクルと比較して、より速い開発サイクルをサポートします。経験豊富なプログラマでも、MicroPythonのREPLユーザーインターフェースを使用してインタラクティブに新しい周辺機器タイプを試すことができるというメリットがあります。

開発ボード向けCircuitPythonサポート

各マイクロコントローラには固有の周辺機器セットがあり、各開発ボードはそのリストに追加されています。これらの周辺機器はサポートライブラリを必要とします。これはArduino IDEとMicroPythonの両方に当てはまります。さらに、Adafruitの1655 NeoPixelアドレス指定可能なRGB LEDなど、ライブラリのサポートを必要とする多くの周辺機器があります。

高度なサポートを提供するために、AdafruitはCircuitPythonと呼ばれる独自バージョンのMicroPythonを開発し、同社のいくつかの安価なマイクロコントローラ開発ボードの特定の要件を満たしました。同社はまた、数多くの周辺ライブラリをその膨大なArduinoコレクションからCircuitPythonライブラリに変換し、CircuitPython用の多数の周辺サポートライブラリをすでに備え、その数は益々増え続けています。

Adafruitは、CircuitPythonを具体的にサポートするために一連のマイクロコントローラ開発ボードを設計しました。これらには次が含まれます。

  • 3333 アドレス指定可能で制御可能な10個のRGB LEDを備えたCircuit Playground Express(図1)

Adafruitの3333 Circuit Playground Expressの画像

図1:Adafruitの3333 Circuit Playground Expressには、アドレス指定、制御可能な10個のRGB LEDがあります。(画像提供:Adafruit)

  • 3500 わずか27mm x 15.3mm x 2.75mmのTrinket M0開発ボード(図2)

Adafruitの3500 Trinket M0開発ボードの画像

図2:Adafruitの3500 Trinket M0開発ボードは、わずか27mm x 15.3mm x 2mmです。(画像提供:Adafruit)

  • 3501 Gemma M0は、およそ25セント(クオータ)硬貨の大きさで、USBポートまたは別のバッテリポートから電力を供給することが可能(図3)

Adafruitの3501 Gemma M0の画像

図3:Adafruitの3501 Gemma M0は、およそ25セント硬貨の大きさで、USBポートまたは別のバッテリーポートから電源を供給できます。(画像提供:Adafruit)

  • 3403 Feather M0 Expressは、カスタム回路用の小さなブレッドボード領域を備えた開発ボード(図4)

Adafruitの3403 Feather M0 Express開発ボードの画像

図4:Adafruitの3403 Feather M0 Express開発ボードには、カスタム回路用の小さなブレッドボード領域があります。(画像提供:Adafruit)

これら4つのAdafruitマイクロコントローラ開発ボードはすべて、ネイティブUSBサポートを備えたMicrochip Technology(旧Atmel)のSAMD21マイクロコントローラに基づいています。ただし、CircuitPythonは、Adafruitの開発ボードとSAMD21マイクロコントローラ以上のものをサポートしています。Adafruitの3406 Feather NRF52およびNordic SemiconductornRF52-DK開発ボード(これらは両方ともNordic SemiconductorのnRF52832に基づきます)を含む他の開発ボード用のCircuitPythonのバージョンも登場し始めています。さらに、Nordic SemiconductorのnRF52840マイクロコントローラをベースにしたnRF52840-DK開発ボード(図5)もCircuitPythonによってサポートされています。これら3つのボードの基になっている両方のマイクロコントローラは、適切なソフトウェアサポートと共に、Bluetooth Low Energy(BLE)をチップ上に統合しています。

Nordic SemiconductorのnRF52840-DK開発ボードの画像

図5:Nordic SemiconductorのnRF52840-DK開発ボードは、BLEサポートを統合しました。(画像提供:Nordic Semiconductor

CircuitPythonでの開発

AdafruitはCircuitPythonを、言語をサポートするように設計された開発ボードに直接搭載するという独自のアプローチを取っています。これらのボードの1つをホストPCのUSBポートに接続すると、ボードはPCのディスクドライブとして表示されます。このディスクドライブのルートディレクトリには、インタープリタ、ユーザープログラム、およびライブラリファイルのフォルダを含む重要なCircuitPythonファイルが表示されます。この配置により、ホストPCが既存のファイルシステムとドライバを使用して開発ボードにアクセスすることが容易になります。

ホストPCのCircuitPythonユーザーインターフェースには、無料でダウンロード可能なオープンソースのエディタとREPLインターフェースが必要です。Adafruitは、図6に示すMuというオープンソースアプリケーションをお勧めします。Mu画面は、編集が行われるコードウィンドウと、プログラマが開発ボードのCircuitPythonインタープリタを制御するREPLコントロールおよびモニタウィンドウに分割されています。

Muと呼ばれるAdafruitのオープンソースプログラミングインターフェースの画像

図6:AdafruitはMuと呼ばれるオープンソースプログラミングインターフェースの使用を推奨します。Mu画面は、編集が行われるコードウィンドウと、プログラマが開発ボードのCircuitPythonインタープリタを制御するREPLコントロールおよびモニタウィンドウに分割されています。(画像提供:codewith.mu/en/tutorials/1.0/adafruit)

プログラムをコードウィンドウに入力してMuの「Save」ボタンをクリックすると、コードはAdafruitのCircuitPython開発ボードのSAMD21マイクロコントローラの大容量オンチップフラッシュメモリに保存されます。CircuitPythonのコードはすべてマイクロコントローラのフラッシュメモリ内の開発ボード上にあります。CircuitPythonボードはPCにとってディスクドライブのように見えるので、これはオペレーティングシステムの観点から不自然な行為ではないことを忘れないでください。

結論

Python言語は、対話型プログラミング、実験、およびデバッグを含む多くの利点をプログラマに提供します。変数の宣言や型付けの必要がなく、そして巧妙な句読点もなく、単純化された、より人間的な言語構文を持っています。MicroPythonはPython 3の変形で、Pythonでのマイクロコントローラプログラミングを可能にします。

ここに示されているように、Adafruitは直接のハードウェアサポートのためにMicroPythonからCircuitPythonを派生させ、実験と学習をさらに単純化し、ソフトウェア開発を加速するようにしました。CircuitPythonは、MicrochipのSAMD21マイクロコントローラをベースにしたいくつかの低コストマイクロコントローラ開発ボード、およびNordic SemiconductorのBLE対応nRFマイクロコントローラをベースにした他の開発ボードをすでにサポートしています。

免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、Digi-Key Electronicsの意見、信念および視点またはDigi-Key Electronicsの公式な方針を必ずしも反映するものではありません。

著者について

Steve Leibson氏

Steve Leibson氏は、HPとCadnetixでシステムエンジニアを務め、EDNとMicroprocessor Reportで編集長として活躍し、XilinxとCadenceなどの企業では技術ブロガーを担当しました。また、同氏は、「The Next Wave with Leonard Nimoy」の2つのエピソードで技術専門家を務めました。同氏は、33年間にわたって、高速でかつ信頼性の高い優れたシステムを設計技術者が開発することを支援しています。

出版者について

Digi-Keyの北米担当編集者