Arduino Modulino Pixelsチュートリアル


APDahlen Applications Engineer

Arduino Modulino Pixelsモジュールとは何ですか?

Arduino Modulino Pixelsモジュールは、個別にアドレス指定可能な8個のカラーLEDとQwiicインターフェースを搭載した、作り手に優しいモジュールです。Pixelsモジュール(Arduino品番ABX00109)は、当初はより規模の大きいArduino Plug and Make kitの一部として提供されていました。本モジュールは、Arduino UNO R4と個々の赤、緑、青(RGB)LED間の通信を処理する32-bit STMicroelectronics ARMマイクロコントローラを内蔵しているため、比較的複雑なモジュールとなっています。 ARM Cortex M0マイクロコントローラは、図1の左下隅に実装されています。

この技術記事では、ソフトウェアインターフェースと基本的なハードウェアの両方を説明します。この記事では、デフォルトのModulinoアドレッシング体系を使用した基本的な操作のみに限定しています。Pixelsモジュールのアドレスを変更したり、同じI2Cネットワーク上で複数のPixelsボードを操作するなどの高度な操作は含まれていません。これらの複雑な操作を実行することに興味がある場合は、以下のコメント欄にコメントを残してください。Arduinoが個別のModulinoボードを提供する場合、これらの高度な技術は今後ますます重要になるでしょう。

図1: Arduino Modulino Pixelsモジュールの画像。左下に32ビットSTM ARMマイクロコントローラが見えます。

The Arduino Modulino Pixelsのソフトウェアの説明

Arduinoは、Modulinoモジュール用の簡易ライブラリを提供しています。このコードは、Arduino instructionsに記載されているように、Arduino IDE’s Library Managerを使用してインストールできます。

Modulinoのクラス構造

Arduino Modulinoボードのソフトウェアインターフェースは、クラス構造を使用して処理されます。最初のステップは、コンストラクタを使用することです。

ModulinoPixels leds;

これにより、次のようなさまざまな方法で操作できるLEDオブジェクトが作成されます。

  • leds.clear( );これは、個々のLEDまたはすべてのLEDを消灯するためのオーバーロードされたメソッドです。パラメータなしで呼び出された場合、すべてのLEDが消灯されます。インデックスNで呼び出された場合、N番目のLEDが消灯されます。
  • leds.set( );これは、LEDの輝度と色を設定するために使用されるオーバーロードされたメソッドです。
  • leds.show( );このメソッドは、clear( )およびset( )メソッドで設定された内部データを物理的なLEDに転送します。

modulino Pixelssは、ダブルバッファのように動作します。Pixelsのメモリ内のレジスタを変更するために、clear( )およびset( )メソッドを使用します。これらの変更はバックグラウンドで実行され、表示には影響しません。show( )メソッドが呼び出されたときにのみ、データが物理的なLEDに転送されます。

技術的なヒント: ダブルバッファはシリアル通信に不可欠な構成要素です。これにより、データを1つずつ転送することができます。すべてのパーツが組み立てられたら、同時に表示することができます。例えば、LEDのインデックス番号、色、輝度のデータをロードするには時間がかかります。しかし、show( )メソッドによってトリガされる単一のイベントにより、すべてのLEDが同時に更新されます。

簡略化されたサンプルコード

Arduino Modulino Pixelsのコードをよりよく理解するために、この簡略化したコードのリストを考えてみましょう。これは、Arduino Modulino Pixelsモジュールの設定方法を示しています。色の設定方法も示しています。最後に、個々のLEDを点滅させる方法も示しています。このコードに関連する物理的な設定と視覚的な表示は、図2に示されています。

#include <Modulino.h>

ModulinoPixels leds;                      // Constructor
ModulinoColor OFF(0, 0, 0); 
int brightness = 10;                      // Set brightness to 10 % as LEDs are very bright	

void setup() {
  Modulino.begin();
  leds.begin();
  pinMode(LED_BUILTIN, OUTPUT);
}


void loop() {

// Example colors including the built in RED, GREEN, BLUE, VIOLET, and WHITE as well as 
// custom colors established using the 8-bit Red, Green, and Blue values

  leds.clear( );
  leds.set(0, RED, brightness);      
  leds.set(1, GREEN, brightness);
  leds.set(2, BLUE, brightness);
  leds.set(3, VIOLET, brightness);
  leds.set(4, WHITE, brightness);
  leds.set(5, 0, 128, 128, brightness);     // teal	
  leds.set(6, 255, 192, 203, brightness);   // pink
  leds.set(7, 100, 100, 0, brightness);     // yellow
  leds.show( );			                    // Transfers data from memory to the physical LEDs.


// Blink the RED LED located at position zero
 while (1) {
    leds.clear(0);
    leds.show( );
    delay(500);
    leds.set(0, RED, brightness);
    digitalWrite(LED_BUILTIN, HIGH);          // Trigger used to visualize communications protocol
    leds.show( );
    digitalWrite(LED_BUILTIN, LOW);
    delay(500);
  }
}

図2: 紹介したPixelsのコードリストを使用した物理的な設定と結果です。

技術的なヒント: Arduino Modulino Pixelsのいくつかのメソッドはオーバーロードされています。 オーバーロードされた関数は、複数のメソッド定義が同じ名前を共有しているため、簡単に識別できます。 この例では、パラメータを指定せずにclear( )を呼び出すと、すべてのLEDが消灯します。 オーバーロードされたclear(N)を呼び出すと、N番目のLEDが消灯します。 同様に、set( )メソッドは、内蔵カラーまたは個別の8 ビットRGB値を受け入れます。

通信プロトコル

Modulino Pixelsボードの主なインターフェースはQwiic接続です。Arduino Pixelsボードには 2 つのQwiicコネクタがあり、複数のボードをデイジーチェーン接続することができます。

研究的な試みとして、Qwiicバスで通信を行う際に使用される通信プロトコルを探究するのは楽しいものです。もともと、この記事の前の部分で暗示したように、各メソッドが情報のバーストを送信すると想定していました。例えば、set( )メソッドとclear( )メソッドは、呼び出されるとすぐにデータをPixelsモジュールに送信すると想定していました。

実際にはそうではなく、図3で示されているように、show()メソッドのみがArduinoからModulino Pixelsにデータを送信しているように見えます(関連する設定は図4参照)。したがって、本記事で前述したダブルバッファリングはArduino自体の中で発生します。いずれにしても、show( )メソッドが呼び出されるまではデータは表示されません。図3では32バイトのデータが転送されていることに注目してください。おそらく、このフレームには各RGB LEDの8ビットの輝度データが含まれています。フレームの詳細については、批判的思考を使う問題で出題しています。

フレームは100kHzのクロックで送信されることに注意してください。したがって、フレーム全体を送信するには約3msかかります。

図3: show( )メソッドによって開始されたArduino Pixelsモジュールに向けてのI2Cフレームの一部です。 フレームはデフォルトのPixelsアドレス0x6Cで始まります。

技術的なヒント: Qwiicという用語は、「quick」と「Inter-Integrated Circuit」(I2C)という言葉を組み合わせたものです。このシステムは、多数のQwiicボードが利用可能であるため、確かに素早く簡単です。Qwiicプロトコルについての詳細は、こちらをクリックしてください。

図4: Arduino UNO R4とPixelsモジュール間の通信プロトコルを観察するために使用したセットアップです。後ろにDigilent Analog Discovery Proが確認できます。

技術的なヒント: 通信プロトコルを設計する際には、妥協が必要になることがよくあります。たとえば、Pixelsライブラリは、1つのLEDに1つの変更が加えられた場合、33バイトのパケット全体を送信します。これには広い帯域幅が必要ですが、汎用のメモリスキームで、ArduinoライブラリおよびPixelsファームウェアとしてプログラムおよび実装した方が簡単だったのではないかと思います。

おわりに

Arduino Modulino Pixelsを使用すると、ユーザーはすばやく接続して、三色RGB LEDを試すことができます。ハードウェアの接続は、Qwiic経由で非常に簡単です。オブジェクト指向のソフトウェアは、コンストラクタやドット記法のアクセス可能なメソッドを使用するため、初心者のプログラマーには難しいかもしれませんが、ほとんどのプログラマーはすぐにパターンを認識できるでしょう。しかし、構造を理解するまでにはかなりの時間がかかり、独自のクラスベースのプログラムを作成するにはさらに多くの時間がかかります。

個人的には、Pixelsボードに32ビットARM Cortex M0が搭載されていることに驚きました。また、私が想定していたよりもデータフレームが複雑でした。各メソッドに関連する小さなメッセージを送信するのではなく、Arduinoは、LEDを1つ変更する場合でも、33バイトのパック(アドレス+32バイト)全体を送信しているようです。

最後に、この記事に記載されている基本的な問題と批判的思考を使う問題を必ず確認してください。

以下のスペースにコメントや質問をお寄せください。

ご健闘をお祈りします。

APDahlen

関連情報

関連情報および役立つ情報については、以下のリンクをご参照ください。

問題

以下の問題は、記事の内容の理解を深めるのに役に立つでしょう。

  1. メソッドと関数を対比して比較してください。

  2. ステートメントleds.show( );内の各コンポーネントを識別してください。

  3. Arduino Modulino Pixelsに適用されるダブルバッファ方式について説明してください。

  4. プログラマーがshow( )メソッドの使用を忘れた場合、何が起こるでしょうか?

  5. プログラマーがclear( )メソッドの使用を忘れた場合、何が起こるでしょうか?

  6. Qwiicの物理的接続の特性を説明してください。 ヒント: 誤って接続される可能性はありますか?

  7. I2Cバスにおけるプルアップ抵抗の目的は何ですか? ヒント: オープンドレイン回路

  8. Arduino UNO R4と関連するModulinoボードの回路図を調べてください。I2Cバスのプルアップ抵抗はどこにあるでしょうか? ヒント: ほとんどのボードには抵抗用のスペースが用意されていますが、必ずしも抵抗が取り付けられているとは限りません。

  9. Qwiicシステムの電流と距離に関する制限事項は何ですか? ヒント: Qwiic Connect System - SparkFun Electronics

  10. Modulino Pixelsの32ビットマイクロプロセッサを8ビットマイクロコントローラに置き換えることは可能でしょうか?より小型の8ビットマイクロコントローラを使用するメリットとデメリットは何でしょうか?

  11. 電磁妨害(EMI)と方形波の高調波スペクトル(フーリエ級数)を調査してください。Qwiic信号、100kHzクロック、シールドされていないワイヤに関連する潜在的なEMIの問題を特定してください。

批判的思考を使う問題

これらの批判的思考の問題は、記事の内容を発展させ、その内容や隣接するトピックとの関係を全体像として理解することができます。このような問題は、自由回答形式であることが多く、リサーチが必要であり、エッセイ形式で答えるのが最適です。

  1. Modulino Pixelsライブラリは、show( )メソッドが呼び出されたときにのみデータを送信しているようです。このプロトコルの利点と欠点は何でしょうか?

  2. I2CとSPI通信プロトコルを対比して比較してください。デバイスの総数、使用されるワイヤ、通信速度の観点からプロトコルを識別してください。

  3. 本記事では、簡略化のため、discover( ) メソッドについては説明していません。そのメソッドについて説明し、どのような場合に利用されるかを説明してください。ヒント: Modulino.h

  4. 図3は、ArduinoからModulino Pixelsボードに32バイトのデータが転送されることを示唆しています。各バイトの意味を決定するために、Pixelsのフレームを逆方向に読み取ってください。 ヒント: すべてのLEDの明るさは同じです。また、コードリストでは、LEDが赤、緑、青の順に連続して動作します。最後に、単一のデータを切り替えて、おそらく1バイトの変化を観察することが役立つかもしれません。

  5. Arduino Pixels用の2つの新しいプロトコルを推奨してください。例えば、単一のLEDを頻繁に変更するユーザーと、すべてのLEDを変更する頻度が低いユーザーなど、異なるユーザー要件に合わせてプロトコルを調整してください。

  6. Arduino Plug and Makeは、ブレッドボードの必要性や複雑さを排除し、さまざまな電子モジュールを導入できるように設計されています。この製品の利便性を、製作者と高等教育機関のユーザーの両方に伝えてください。ユーザーの体験と学習成果について必ず説明してください。

  7. Arduino Modulinoソフトウェアはどのようなライセンスでリリースされていますか?ソフトウェアをコピーして再配布する場合、どのような影響がありますか?

  8. チェックサムとは何ですか?このアプリケーションに追加の帯域幅が必要でしょうか?

著者について

Aaron Dahlen氏、LCDR USCG(退役)は、DigiKeyでアプリケーションエンジニアを務めています。彼は、技術者およびエンジニアとしての27年間の軍役を通じて構築されたユニークなエレクトロニクスおよびオートメーションのベースを持っており、これは12年間(一部、軍での経験を織り交ぜて)教鞭をとったことによってさらに強化されました。ミネソタ州立大学Mankato校でMSEEの学位を取得したDahlen氏は、ABET認定EEプログラムで教鞭をとり、EETプログラムのプログラムコーディネーターを務め、軍の電子技術者にコンポーネントレベルの修理を教えてきました。彼はミネソタ州北部の自宅に戻り、このような記事のリサーチやエレクトロニクスとオートメーションに関する啓蒙記事の執筆を楽しんでいます。

注目すべき経験

Dahlen氏は、DigiKeyのTechnical Forumに積極的に貢献しています。この記事を書いている時点で、彼は190以上のユニークな記事を作成し、さらにForumへ600にものぼる投稿を提供しています。Dahlen氏は、マイクロコントローラ、VerilogによるFPGAプログラミング、膨大な産業用制御に関する研究など、さまざまなトピックに関する見識を共有しています。

LinkedInでAaron Dahlenとつながります。




オリジナル・ソース(English)