ArduinoLEDMatrixでアニメーション
Arduino UNO R4ボード上のLEDマトリクスを制御するためのライブラリ Arduino_LED_Matrix.h には、アニメーションを表示するための機能があります。
早速、プログラムを作ってみましょう。
例1:アニメーションの実行
スケッチ
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
const uint32_t animation[][4] = {
{
0x10,
0x81080000,
0xf0,
1000
},
{
0x10829,
0x40000000,
0x1080f0,
1000
}
};
void setup() {
matrix.begin();
matrix.loadSequence(animation);
matrix.play(true);
}
void loop() {
}
プログラムの解説
ライブラリのインクルードおよびArduinoLEDMatrixクラスのインスタンスの生成
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
前記事で1フレームを表示した場合と同じく、まず Arduino_LED_Matrix.h をインクルードし、ArduinoLEDMatrix クラスのインスタンスを生成(変数を宣言)しておきます。この例ではインスタンス名(変数名)は matrix としています。
シーケンス(アニメーションの点灯パターン)配列の用意
uint32_t animation[][4] = {
{
0x10,
0x81080000,
0xf0,
1000
},
{
0x10829,
0x40000000,
0x1080f0,
1000
}
};
アニメーションは複数のフレーム(点灯パターン)で構成されます。これは uint32_t 型の要素を持つ 2次元の配列で記述されます。
配列は『uint32_tの要素4つの配列』×任意の数となっており、それぞれのuint32_tの要素4つはフレームの点灯データ(3要素)+フレームの表示時間(1要素)で構成されています。各フレームの点灯パターンと表示時間を表すデータを並べたものを『シーケンス』といいます。この例では最小限の構成である2フレームのデータが用意されています。
uint32_t animation[][4] = {
{
0x10,
0x81080000,
0xf0,
1000
},
{
0x10829,
0x40000000,
0x1080f0,
1000
}
};
この部分が1フレーム目です。
要素が4つありますが、このうち最初の3つの要素『0x10』『0x81080000』『0xf0』はLEDの点灯パターンを表しています。これらの数値は1フレームだけの描画の場合と同じ形式です。
この値をそれぞれ32桁の2進数に直し、12×8になるように並べ替えると、
000000000000
000000000000
000100001000
000100001000
000000000000
000000000000
000000000000
000011110000
となります。
4つめの要素『1000』は、このフレームを表示する時間をms単位で表しています。
このように、アニメーションの場合、1フレームのデータは点灯パターンと表示時間をあわせたものです。
uint32_t animation[][4] = {
{
0x10,
0x81080000,
0xf0,
1000
},
{
0x10829,
0x40000000,
0x1080f0,
1000
}
};
この部分が2フレーム目です。
1フレーム目と同じく、最初の3つの要素『0x10829』『0x40000000』『0x1080f0』がLEDの点灯パターンを表しています。これらを2進数に直し、12×8に並べ替えると
000000000000
000100001000
001010010100
000000000000
000000000000
000000000000
000100001000
000011110000
となります。
4つめの要素『1000』は、1フレーム目と同じくこのフレームを表示する時間を表しています。
ArduinoLEDMatrixの使用開始
void setup() {
matrix.begin();
matrix.loadSequence(animation);
matrix.play(true);
}
アニメーションの場合も、ArduinoLEDMatrixクラスの begin()関数によってArduinoLEDMatrixクラスを初期化・使用開始します。
シーケンスのロード
void setup() {
matrix.begin();
matrix.loadSequence(animation);
matrix.play(true);
}
シーケンスをアニメーション用のバッファにセットするには、ArduinoLEDMatrixクラスの loadSequence()を使用します。
書式:
ArduinoLEDMatrix.loadSequence(uint32_t[][4] sequence)
引数:
名前 | 型 | 意味 |
---|---|---|
sequence | uint32_t[][4] | アニメーションのシーケンスを表す2次元配列名 |
loadSequence()は関数ではなくマクロとして定義されています。引数には必ず『シーケンスを表す配列名』を記述します。『結果が配列の先頭を指すポインタになる式』ではうまく動作しません。
loadSequence()を実行した時点では、まだデータが用意されるだけでアニメーションの表示は行われません。
アニメーションの表示
void setup() {
matrix.begin();
matrix.loadSequence(animation);
matrix.play(true);
}
ロードされたシーケンスに従ってアニメーションを表示するには、ArduinoLEDMatrixクラスの play()関数を使用します。
書式:
void ArduinoLEDMatrix.play(bool loop)
引数:
名前 | 型 | 意味 |
---|---|---|
loop | bool | シーケンスを繰り返し表示するかどうかを表す。true=繰り返す/false=繰り返さない 省略時はfalseと見なされる。 |
この例では引数としてtrueを指定しているので、2フレームのシーケンスを繰り返し表示します。
やはりloop()ではなにもしない
void loop() {
}
この例でも、setup()関数の中ですべての用事が済んでしまっているため、loop()関数の中には何も記述していません。
実行結果
相変わらず絵心皆無でスンマセン…。
例2:loop()の中でもなにかやってみる
今度は、アニメーションとは別にloop()関数の中でもなにか処理を行ってみましょう。
スケッチ
例1のスケッチに、下のソースのようにいくつかの処理を追加しましょう。
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
int i=0;
const uint32_t animation[][4] = {
{
0x10,
0x81080000,
0xf0,
1000
},
{
0x10829,
0x40000000,
0x1080f0,
1000
}
};
void setup() {
matrix.begin();
matrix.loadSequence(animation);
matrix.play(true);
Serial.begin(9600);
}
void loop() {
Serial.println(i++);
delay(600);
}
プログラムの解説
アニメーションに関する処理は例1とまったく同じですが、『600ms間隔で変数iをカウントアップし、それをシリアルコンソールに出力する』処理を追加しました。
実行結果
このように、loop()関数内の処理とは独立にアニメーションの再生が続いていることが判ります。
フレーム&シーケンス製作ツール
フレームやシーケンスを簡単に作ることが出来るツールがArduinoの公式サイトで提供されています。
まとめ
・Arduino_LED_Matrix.h に定義された機能だけでアニメーションを実現できる
・アニメーションは loop()関数内の処理とは独立して動作する。
コメント