APDahlen Applications Engineer
UNO R4 WiFiは、Arduinoの従来のマイクロコントローラのシリーズに追加された最新の製品です。強力なRenesasのRA4M1マイクロコントローラに加え、新しいボードには12 x 8 LEDディスプレイマトリックスが搭載されています。おそらく、LEDマトリックスに表示さ れている象徴的なハートマークを見たことがあるでしょう。これは、図1に示されているように、すべてのArduino UNO R4 WiFiに含まれているデフォルトのプログラムです。
Arduino UNO R4 WiFiの動作は、ユーザーフレンドリーなAPIによって十分に文書化されています。しかし、私たちはLEDディスプレイマトリックスの背後にある動作理論をハードウェアレベルで検討する機会をもうけました。これは、マイクロコントローラのI/Oと多重化技術の特性についてより深く学ぶ絶好の機会です。
図1: Arduino Uno R4のLEDディスプレイマトリックスに表示さているハートマーク
11本のコントロールラインで96個のLEDをどのように制御するのでしょうか?
その簡単な答えは、発明者のCharles Allenにちなんで名付けられたと思われるCharlieplexing(チャーリープレクシング)として知られている技術です。この技術は、マイクロコントローラの出力ピンが有するトライステートの特性に依存します。各ピンは次のように設定できます。
- 出力:ロジックロー
- 出力:ロジックハイ
- 入力:ハイインピーダンス
この動作は、一連のスイッチを使用して図2で説明されています。例えば、TRI_0などのマイクロコントローラのトライステートスイッチは、それぞれのピンが入力になるか、出力になるかを決定します。これが開いている場合、各マイクロコントローラのI/Oピンはフローティング(高インピーダンス)になり、外部回路が電圧を決定できるようになります。閉じているときは、ROW_0ドライバがピンの出力電圧を決定します。図2に基づくインタラクティブなMultisimLiveシミュレーションは、このリンクを参照してください。LED1からLED6を順番に作動させることにチャレンジしてください。
図2: Arduino UNO R4 WiFiのLEDディスプレイマトリックスの最初の6個のLEDの簡略化された回路図。インタラクティブなシミュレーションについては、このリンクに従ってください。
図2では、LED1が点灯していることがわかります。これは、ROW_0が電流を供給し、ROW_1が電流を吸い込むときに起こります。ROW_0とROW_1のロジックの両方を反転させることで、LED2を点灯させることができます。この時、ROW_1は電流を供給し、ROW_0 は電流を吸い込みます。
ROW_2はハイインピーダンス入力として設定されていることに注意してください。これは、複数のLEDが同時に点灯するのを防ぐために重要です。例えば、図2において、TRI_2がアクティブになった(閉じた)とします。
- ROW_2がハイのとき:LED1とLED6の両方が点灯
- ROW_2がローのとき:LED1とLED3の両方が点灯
技術的なヒント: 「ソース」(電流吐き出し)と 「シンク 」(電流吸い込み)という用語は、電子工学の初心者を混乱させることがあります。これは、物理学の歴史に部分的に起因する考え方の問題です。これは、1750年代にBenjamin Franklinがソースであるプラス端子からマイナス端子への電流の流れを提案した実験から始まります。それから約150年後の1897年、J.J. Thomsonが電子を発見します。それ以来、Franklinの従来の電流の流れ(プラスからマイナスへ)と電子の流れ(マイナスからプラスへ)という観点から電気について考えてきました。
これは解決済みの問題だと考えている方が多いでしょう。しかし、現在でも、両方の表記の教科書があり、選ぶことができます。調べてみると、2種類の教科書では、すべての電流ベクトルが逆になっており、すべての右手ルールが左手ルールに置き換えられ、他方ではその逆になっています。
繰り返しになりますが、ソースとシンクという用語は、あなたの考え方に依存します。ここではわかりやすくするため、プラス側の電源端子が電流を「ソース」するとし、マイナス側の端子が電流を「シンク」するとの従来の電流の流れに従うことにします。図2では、5V DCがソースで、グラウンドがシンクです。
Arduinoのコードの例
Arduinoのコードを使えば、図2の動作をより理解しやすくなります。便宜上、LEDマトリックスがROW_0、ROW_1、およびROW_2に対応するピンD0、D1、およびD2に接続されていると仮定します。このコードに示されているように、LED1は以下の場合に点灯します。
pinMode(D0, OUTPUT); // Tri state configuration
pinMode(D1, OUTPUT);
pinMode(D2, INPUT);
digitalWrite(D0, HIGH); // Logic assertion when the Tri state buffer is active
digitalWrite(D1, LOW);
別の例として、LED5を点灯させたい場合には以下の様になります。
pinMode(D0, INPUT);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
多重化
ここまでは、単一のLEDの制御について説明してきました。実際には、複数のLEDを同時にオンにすることが望ましいです。たとえば、LED1とLED5を同時に点灯させるとします。図2の回路図では、これは直接的には不可能です。LED1がオンの場合、図2をよく見ると、他の可能性はLED3またはLED6のみであることがわかります。実際、8つの可能性すべてを検討すると、任意のスイッチ状態で同時に点灯できるLEDは2つだけであることがわかります。
この解決策は、LEDを多重化することです。
この多重化技術では、常に1つのLEDだけが点灯します。それぞれのLEDを短時間だけ点灯させながら、LEDを素早く切り替えていきます。例えば、LED1とLED5を点灯させるには、前のセクションのコードスニペットを交互に切り替えることで実現できます。人間の目は、ラウンドロビンシーケンスが約30Hzより速い速度で行われる限り、両方のLEDが同時に点灯しているように見えます。この視覚の残像性(フリッカ融合)により、LEDが同時に点灯しているように錯覚します。
この技術の重要な問題の1つは、LEDの輝度です。多重化は、各LEDにタイムスロットが割り当てられる時分割プロセスであることを思い出してください。2つのLEDの場合は、各LEDは50%の時間、点灯しています。図2に示す6個のLEDの場合は、各LEDは16%の時間、点灯しています。50%の時間で点灯しているLEDは、16%の時間で点灯しているLEDよりも明るくなるのは当然のことです。明るさ、時間、およびパルス電流の分析によるLED多重化の詳細については、この記事を参照してください。
Arduino UNO R4におけるCharlieplexing方式
Arduino UNO R4 WiFiのデータシートをざっと見ると、LEDディスプレイマトリックスは11本のマイクロコントローラのI/Oピンで駆動されていることがわかります。また、それぞれのLEDのペアがアノードとカソード、およびカソードとアノードが接続されるコンプリメンタリLEDのマトリックスを示しています。回路図の一部を図3に示します。これは図2の例とほぼ同じであることに注意してください。Charlieplexing方式の動作原理は、先ほど説明したものと同じです。
図3: Arduino UNO R4 WiFiの回路図のこの小さな部分は、図2に対応しています。
Arduino UNO R4 WiFiのディスプレイの輝度を上げるにはどうすればよいでしょうか?
その簡単な答えは、LEDの輝度はCharlieplexing方式の限界によって制限され、さらにそのCharlieplexing方式は、マイクロコントローラのI/Oピンの電流限界によって制限されることを認識することです。また、使いやすいLEDマトリクスライブラリの改造に伴うオーバーヘッドも考慮しなければなりません。
ディスプレイは可能な限り明るくなります。
しかし、見かけの明るさを増すために赤いレンズ(カバー)を追加することができます。例えば、赤い半透明のHammondの1591STRDは、エンクロージャとレンズの2つの役割を果たします。結果は動画1でご覧いただけます。
動画1: Hammondのエンクロージャ1591STRDをArduino UNO R4の赤いレンズとして使用した動画
Charlieplexing方式の限界は何でしょうか?
Arduino UNO R4の限界をよりよく理解するためには、Charlieplexing方式の限界を検討する必要があります。
-
Charlieplexing方式は、多数のLEDを制御するために使用されるコスト効率のよい方法です。駆動電力は、行ドライバや列ドライバに頼ることなく、マイクロコントローラから直接得られます。その結果、輝度(LED電流)はマイクロコントローラの駆動ピンの「出力パワー」に直接依存します。これは厳然たる物理的限界であり、ディスプレイのハードウェアを根本的に変更しない限り変更できません。
-
それぞれのLEDの明るさは、点灯時間(デューティサイクル)によって決まります。12 × 8表示の96個のLEDでは、各LEDは約1%の時間だけ点灯しています。各LEDは順番に明るく光らなければなりませんが、それは一瞬です。これも物理的な限界であり、変更することはできません。これは、ディスプレイ全体の明るさを一定に保ちたい場合に特に当てはまります。例えば、2つのピクセルしか点灯しない場合、そのピクセル間で時間を分割することができます。しかし、追加のLEDが点灯するにつれて、ディスプレイの輝度は低下します。
つまり、明るさを増すには、行と列のドライバを追加してハードウェアを再設計するか、あるいは仕様を下げてアレイ内のLED数を減らすかしかありません。必ずしも比例するわけではありませんが、一般的には、LEDの総数を半分にすれば、各LEDが2倍の時間で点灯する可能性があるため、目に見える明るさは2倍になります。
技術的なヒント: それぞれのピン電流はRenesasのR7FA4M1AB3CFM#AA0のような複雑なマイクロコントローラでは単一の仕様ではありません。しかし、一般的な記述として、RA4M1はピンあたり8mAを扱うことができますが、すべてのピン電流の合計は60mAに制限されています。この他にも多くの考慮すべき事項や 制約事項がありますので、データシートを参照してください。
Arduino UNO R4のLEDマトリックスからLEDに直接アクセスするにはどうすればよいでしょうか?
通常、Arduinoライブラリを使用してLEDディスプレイを制御しますが、私たちはもう上級者の領域にいるのでRenesas Flexible Software Package(FSP)を使ってRA4M1の各特殊機能レジスタ(SFR:Special Function Registers)にアクセスします。この手法は、特に直接ポートに高速でアクセスする必要がある場合など、将来の実験に役立つ可能性があります
技術的なヒント: RenesasのFlexible Software Package(FSP)は、ハードウェア抽象化レイヤ(HAL:Hardware Abstraction Layer)です。多くの点でArduino言語と似ており、どちらも基礎となるハードウェアを抽象化/単純化するように設計されているため、コードの移植性が向上します。
UNO R4 MinimaとWiFiへのArduinoの実装は、 RenesasのFSPの基盤上に構築されることに興味をもたれるでしょう。
Arduino UNO R4 WiFiの回路図を注意深く見れば以下のことがわかります。
- ROW_0 はP205(ポート2のピン5)に対応
- ROW_1 はP012(ポート0のピン12)に対応
- ROW_2 はP013(ポート0のピン13)に対応
例えば、LED1を点灯させるには、以下のコードスニペットを使うことができます。
R_IOPORT_PinCfg(NULL, ROW_0, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
R_IOPORT_PinCfg(NULL, ROW_1, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
R_IOPORT_PinCfg(NULL, ROW_2, IOPORT_CFG_PORT_DIRECTION_INPUT);
// Assume all other row drivers are inputs (high impedance)
R_IOPORT_PinWrite(&g_ioport_ctrl, ROW_0, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, ROW_1, BSP_IO_LEVEL_LOW);
LED5を点灯させるには、以下のコードスニペットを使うことができます。
R_IOPORT_PinCfg(NULL, ROW_0, IOPORT_CFG_PORT_DIRECTION_INPUT);
R_IOPORT_PinCfg(NULL, ROW_1, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
R_IOPORT_PinCfg(NULL, ROW_2, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
R_IOPORT_PinWrite(&g_ioport_ctrl, ROW_1, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, ROW_2, BSP_IO_LEVEL_LOW);
以下のコードを使って、LED0とLED5を多重化することができます。
#define ROW_0 BSP_IO_PORT_02_PIN_05
#define ROW_1 BSP_IO_PORT_00_PIN_12
#define ROW_2 BSP_IO_PORT_00_PIN_13
void setup() {
;
}
void loop() {
R_IOPORT_PinCfg(NULL, ROW_0, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
R_IOPORT_PinCfg(NULL, ROW_1, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
R_IOPORT_PinCfg(NULL, ROW_2, IOPORT_CFG_PORT_DIRECTION_INPUT);
R_IOPORT_PinWrite(&g_ioport_ctrl, ROW_0, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, ROW_1, BSP_IO_LEVEL_LOW);
delay(20);
R_IOPORT_PinCfg(NULL, ROW_0, IOPORT_CFG_PORT_DIRECTION_INPUT);
R_IOPORT_PinCfg(NULL, ROW_1, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
R_IOPORT_PinCfg(NULL, ROW_2, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
R_IOPORT_PinWrite(&g_ioport_ctrl, ROW_1, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, ROW_2, BSP_IO_LEVEL_LOW);
delay(20);
}
このコードを実行すると、LEDがちらつくように見えます。遅延時間を10ms程度にすると、ちらつきは解消さ れます。
まとめ
Arduino UNO R4 WiFiには、楽しいという表現がぴったりの12 x 8 LEDディスプレイマトリックスが搭載されています!Arduinoは使いやすいライブラリを提供していますので、数分でディスプレイを設定し、使用することができます。
個人的には、UNO R4 WiFiハードウェア設計は、Charlieplexing方式を探求する学びの機会を提供してくれますので、高く評価しています。このハードウェアアプリケーションは、マイクロコントローラのトライステート出力、多重化、およびRenesasのFSPなどのツールへの扉を開いてくれます。併せて、LED電流とパルス動作の理解を深めることができます。
この記事の最後にある問題と批判的思考を使う問題に答えて、あなたの知識を試してみてください。ご質問やご意見は以下の欄にご記入ください。
最後に、何か学んだことがあれば、いいね!をお願いします。
ご健闘をお祈りします。
APDahlen
お役立ちリンク
以下のリンクから、関連する有益な情報をご覧ください。
- Digikey’s product selection guides
- Arduino education content
- Using the Arduino UNO R4 WiFi LED Matrix
- Arduino UNO R4 WiFi Documentation
- Renesas RA4M1 documentation
- Renesas Flexible Software Package (FSP)
著者について
Aaron Dahlen氏、LCDR USCG(退役)は、DigiKeyでアプリケーションエンジニアを務めています。彼は、技術者およびエンジニアとしての27年間の軍役を通じて構築されたユニークなエレクトロニクスおよびオートメーションのベースを持っており、これは12年間(一部、軍での経験を織り交ぜて)教鞭をとったことによってさらに強化されました。ミネソタ州立大学Mankato校でMSEEの学位を取得したDahlen氏は、ABET認定EEプログラムで教鞭をとり、EETプログラムのプログラムコーディネーターを務め、軍の電子技術者にコンポーネントレベルの修理を教えてきました。彼はミネソタ州北部の自宅に戻り、このような記事のリサーチやエレクトロニクスとオートメーションに関する啓蒙記事の執筆を楽しんでいます。
注目すべき経験
Dahlen氏は、DigiKey TechForumに積極的に貢献しています。この記事を書いている時点で、彼は170以上のユニークな記事を作成し、さらにTechForumへ570にものぼる投稿を提供しています。Dahlen氏は、マイクロコントローラ、VerilogによるFPGAプログラミング、膨大な産業用制御に関する研究など、さまざまなトピックに関する見識を共有しています。
問題
以下の問題は、記事の内容の理解を深めるのに役に立つでしょう。
-
トライステートバッファとは何ですか?
-
典型的なマイクロコントローラの物理的な出力ピンの回路を説明 してください。
ヒント: 3つの状態を含めて定義してください。 -
Arduino UNO R4 WiFiの12 x 8 LEDマトリックスを制御するために必要なI/Oピンはいくつですか?
-
前の質問で特定したI/Oピンの数を考えると、いくつのLEDを制御できますか?例えばこの制御方法は、別の行または別の列も制御しやすいですか?
-
Charlieplexingはマイクロコントローラの出力部の特性にどのように依存しますか?
-
フリッカ融合について調べて、錯覚を維持するための注意点を少なくとも2つ挙げてください。
-
表示マトリックス内のそれぞれのLEDに関連する用語「デューティサイクル」について説明してください。
-
ポートの直接操作とは何ですか?HALとは何ですか?それらの技術とArduino APIとの関連はどのようになっていますか?
-
URenesas FSPベースのコードを使用して、最初の12個のLEDを順番にサイロンスキャン(Cylon scan、宇宙空母ギャラクティカ - 1個のLEDが前後に動くように見える表示)を行って下さい。
-
RenesasのFSPベースのコードを使用して、12個の奇数列のLEDと12個の偶数列のLEDを交互に点灯させてください。.
-
Arduino APIを使用して、最初の12個のLEDに、同じサイロンスキャンを実行してください。
-
「ドライバ」という用語は、ハードウェアを設定/制御するコードを指す場合によく使われます。Renesasの環境ではどのように使われていますか?
批判的思考を使う問題
これらの批判的思考の問題は、記事の内容を発展させ、その内容や隣接するトピックとの関係を全体像として理解することができます。このような問題は、自由回答形式であることが多く、リサーチが必要であり、エッセイ形式で答えるのが最適です。
-
コードの移植性とはどういう意味ですか?ポートの直接操作、HAL、およびArduino APIの観点から例を示してください。
-
Charlieplexing方式と74595 ICのような独立したLEDドライバとを対比し、比較してください。
-
Arduino UNO R4の改良のために、Arduinoチームに2つのハードウェア推奨項目を提示してください。コストと利点を考慮し、しっかりとしたビジネスケースを作成してください。
-
Arduino言語とRenesasのFSPはどちらもHALの例です。この2つの抽象化を比較してください。 ヒント: 移植性には複数の意味があります。また、対象のプログラマーのニーズも特定してください。
-
連続動作とパルス動作を区別するために、LEDのパラメータを検討してください。この知識をもとに、Charlieplexing方式と行/列の駆動構成の推奨項目を示してください。