Arduino UNO R4 WiFi内蔵のLEDマトリックスを使い始めましょう。LEDマトリックスの制御方法やアニメーションの作成、グラフィックス、さらには、ゲームの作成といった様々な技術を学びましょう。
AUTHOR: Jacob Hylén & Tom Igoe
Arduino UNO R4 WiFiは、12x8 LEDマトリックスが搭載されています。グラフィックスの表示やアニメーション、インターフェイスとしての動作、ゲームの作成などに利用できます。
目的
マトリックスとAPIは、いくつかの異なる方法でプログラムできるように開発されました。それぞれ異なるアプリケーションに適しています。このガイドでは、LEDマトリックスのプログラミングに関する基本的な概念を紹介し、あなた自身がアニメーションの作成ができるようになります。この際、アニメーションとイメージを作成するための、2つの異なるLEDの制御方法に焦点をあてます。これにより、どの方法があなたにとって最適かを決めやすくします。
必要なハードウェアとソフトウェア
マトリックスの初期化
LEDマトリックスライブラリを利用するには、スケッチの始めに、いくつかのことを追加する必要があります。
まず、以下のように、スケッチの先頭でライブラリをインクルードします。
|
|
次に、スケッチでLEDマトリックスオブジェクトを作成する必要があります。以下の行を、先ほどの行のすぐ下に追加します。
|
|
最後に、void setup()
に、以下の行を追加して、LEDマトリックスを開始します。
|
|
上記を全てまとめると、以下のようになります。
|
|
フレームの書き方
UNO R4 WiFiのLEDマトリックスライブラリはフレームを作成し、フレームを表示するバッファにロードすることにより動作します。
フレームは、任意の時点でマトリックスに表示される画像です。アニメーションが一連の画像であれば、フレームはこの一連の画像の一つです。
UNO R4 WiFiの12x8 LEDを制御するには、最低96ビットのメモリが必要です。ライブラリは2種類の方法でメモリを確保する方法を提供します。
|
|
この方法は、配列のパターンが画像になっているので、理解しやすいです。また、実行時に編集するのも容易です。上記の配列は、ハート型で、スクリーン上に表示される画像です。
個々のピクセルを指し示すには、アドレスを選択して値を変更します。0から数えることに注意してください。以下のプログラムは左から3番目、上から2番目のピクセルを点灯させます。
|
|
しかし、この方法は必要以上のメモリを消費します。各LEDは状態を格納するのに1ビットだけ必要ですが、8ビット(1バイト)使っています。フレームを格納するのに、よりメモリ効率の高い方法は、32ビット整数の配列をつかうことです。
このセクションでは、これらのフレームを自分でどのように作成するかを紹介します。しかし、これを実行するツールを作成したので、この演習をとばしたい場合は、ここをクリックしてください。
以下は、同じハートを32ビット整数の配列で表したものです。
|
|
unsigned long型の整数は32ビット保持します。96÷32は3なので、unsigned longの配列はLEDマトリックスが必要なすべてのビットを保持するのに効率的な手段です。
ところで、これらの16進数の変数はピクセルのどの部分に関係しているのでしょうか? 16進数を2進数にすると、わかります。以下のコードで実行できます。
|
|
これは、配列のビット値を表示します。出力は以下のようになります。
|
|
しかし、この方法では、全てのビットを表示できません。配列の各要素は32ビットなので、全てのビットを表示するには先頭に0を付け加えます。
|
|
次に、12ビットのグループに分割すると、以下のようなハートが復元されます。
|
|
いくつかのフレームを用意したら、以下のようにしてロードし、表示できます。
|
|
テストする
異なるフレームをボードに表示する2つの基本的なスケッチで、これらの概念を適用してみましょう。最初は、32ビット整数3つのフレームで、ひとつづつロードします。
以下は、最初に笑顔をマトリックスにロードし、ハートに変えます。
|
|
スケッチはとても単純です。そして、結果は非常に表現力豊かで、プロジェクトの状態を簡単に表示することができます。
次は、アプローチを変えて、実行時に変更するビットマップを作成しましょう。このスケッチは、顔の一部を表示するいくつかの関数を含んでいます。そして、特定のピクセルをオフにすることで、左目をウインクします。
|
|
スクロールするテキストの例
LEDマトリックスは、ArduinoGraphicsライブラリを使い、文字表示をサポートしています。以下のことが可能です。
matrix.beginText(x,y, 0xFFFFFF)
でテキストの開始位置を設定します。“0xFFFFFF"は、デフォルトの色(赤)を表します。ArduinoGraphicsライブラリは複数の色をサポートする他のハードウェアもサポートするので、色を指定する必要があります。matrix.printText("This message is printed")
でテキストを表示します。matrix.endText(direction)
で、表示を停止し、(オプションで)スクロールする方向を指定します。SCROLL_LEFT
とSCROLL_RIGHT
をサポートしています。スクロール不要であれば、何も指定しません。
以下の例は、“Hello World!“をマトリックスに表示します。
|
|
アニメーションの生成
フレームトアニメーションを生成し、ブラウザにLEDマトリックスを表示するツールを作成しました。このツールはArduino labsの一部で、実験的ソフトウェアに位置付けられています。
ツールを使うには、以下のスケッチをアップロードし、ブラウザが送信するシリアル通信を、ボードが受信できるようにする必要があります。
スケッチは、ファイル > スケッチ例 > LED_Matrix > LivePreview にもあります。
|
|
LEDマトリックスツールを起動するには、ここをクリックしてください。
自分でアニメーションを作成したら、先ほど説明したように、使用できる形式でツールからエクスポートすることができます。
そのサイトには、このツールを利用するための多くのヒントがあります。
結論
この記事では、Arduino UNO R4 WiFiのLEDマトリックスを使うための基本を一通り学びました。フレームとアニメーションの作成と、それらをボードにロードする方法を学習しました。
UNO R4 WiFiで、対話型インターフェイスやアニメーションの作成を楽しんでください。
API
より高度なスケッチを書くために、以下に示したライブラリの全APIが利用できます。
メンバー | 説明 |
---|---|
public ArduinoLEDMatrix() |
LEDマトリックスを制御するメインクラス。 |
public void autoscroll(int32_t interval_ms) |
各フレームが表示される時間をミリ秒単位で設定する。 |
public void begin() |
LEDマトリックスを開始する。 |
public void next() |
シーケンスの次のフレームに手動で移る。 |
public void loadFrame(const uint32_t buffer[3]) |
シーケンスにない新しい一つのフレームをロードする。 |
public void renderFrame(uint8_t frameNumber) |
ロードしたフレームを書く。 |
public void loadSequence(const uint32_t frames[][4]) |
アニメーションシーケンスをバッファに書く。ただし、表示しない。 |
public void play(bool loop = false) |
フレームのシーケンスを表示する。オプションは無限にループするか、一度だけ表示するか。 |
public bool sequenceDone() |
シーケンスが完了したか確認する。 |
メンバー
ArduinoLEDMatrix()
新しいLEDマトリックスオブジェクトを生成する。ライブラリのメソッドにアクセスするために利用される。
|
|
autoscroll()
シーケンス内のフレームをオートスクロールする。
パラメータ
interval_ms
シーケンス内のフレームが次のフレームに移るまでの時間をミリ秒単位で指定する。
begin()
LEDマトリックスを開始する。
|
|
next()
シーケンス内の次のフレームに移動する。
|
|
loadFrame()
シーケンスにない一つのフレームをロードする。
|
|
パラメータ
buffer[3]
32ビット整数の配列。各ビットがLEDを表す。
renderFrame()
シーケンス内の特定のフレームを表示する。
|
|
パラメータ
int
ロードするフレーム
loadSequence()
バッファにアニメーションのシーケンスをロードする。ただし表示しない。
|
|
パラメータ
frameNumber
シーケンスのどのフレームを表示するか指定する。
play()
ロードしたシーケンスをロードする。
|
|
パラメータ
loop
シーケンスをループさせるときはtrue、一度だけ表示するときはfalse。
sequenceDone()
シーケンスの表示が完了したのか、まだ完了していないのかを確認する。
リターン値
false
まだ完了していない、true
完了した。
オリジナルのページ
https://docs.arduino.cc/tutorials/uno-r4-wifi/led-matrix
最終更新日
January 12, 2024