Arduino UNO R4 ボード上のLEDマトリクスでアニメーション

Arduino
DSC_0781

ArduinoLEDMatrixでアニメーション

Arduino UNO R4ボード上のLEDマトリクスを制御するためのライブラリ Arduino_LED_Matrix.h には、アニメーションを表示するための機能があります。

早速、プログラムを作ってみましょう。

例1:アニメーションの実行

スケッチ

C++
#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クラスのインスタンスの生成
C++
#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

前記事で1フレームを表示した場合と同じく、まず Arduino_LED_Matrix.h をインクルードし、ArduinoLEDMatrix クラスのインスタンスを生成(変数を宣言)しておきます。この例ではインスタンス名(変数名)は matrix としています。

シーケンス(アニメーションの点灯パターン)配列の用意
C++
uint32_t animation[][4] = {
	{
		0x10,
		0x81080000,
		0xf0,
		1000
	},
	{
		0x10829,
		0x40000000,
		0x1080f0,
		1000
	}
};

アニメーションは複数のフレーム(点灯パターン)で構成されます。これは uint32_t 型の要素を持つ 2次元の配列で記述されます。

配列は『uint32_tの要素4つの配列』×任意の数となっており、それぞれのuint32_tの要素4つはフレームの点灯データ(3要素)+フレームの表示時間(1要素)で構成されています。各フレームの点灯パターンと表示時間を表すデータを並べたものを『シーケンス』といいます。この例では最小限の構成である2フレームのデータが用意されています。

C++
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フレームのデータは点灯パターンと表示時間をあわせたものです。

C++
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の使用開始
C++
void setup() {
  matrix.begin();
  matrix.loadSequence(animation);
  matrix.play(true);
}

アニメーションの場合も、ArduinoLEDMatrixクラスの begin()関数によってArduinoLEDMatrixクラスを初期化・使用開始します。

シーケンスのロード
C++
void setup() {
  matrix.begin();
  matrix.loadSequence(animation);
  matrix.play(true);
}

シーケンスをアニメーション用のバッファにセットするには、ArduinoLEDMatrixクラスの loadSequence()を使用します。

書式:

C++
ArduinoLEDMatrix.loadSequence(uint32_t[][4] sequence)

引数:

名前意味
sequenceuint32_t[][4]アニメーションのシーケンスを表す2次元配列名

loadSequence()は関数ではなくマクロとして定義されています。引数には必ず『シーケンスを表す配列名』を記述します。『結果が配列の先頭を指すポインタになる式』ではうまく動作しません。

loadSequence()を実行した時点では、まだデータが用意されるだけでアニメーションの表示は行われません。

アニメーションの表示
C++
void setup() {
  matrix.begin();
  matrix.loadSequence(animation);
  matrix.play(true);
}

ロードされたシーケンスに従ってアニメーションを表示するには、ArduinoLEDMatrixクラスの play()関数を使用します。

書式:

C++
void ArduinoLEDMatrix.play(bool loop)

引数:

名前意味
loopboolシーケンスを繰り返し表示するかどうかを表す。true=繰り返す/false=繰り返さない
省略時はfalseと見なされる。

この例では引数としてtrueを指定しているので、2フレームのシーケンスを繰り返し表示します。

やはりloop()ではなにもしない
C++
void loop() {

}

この例でも、setup()関数の中ですべての用事が済んでしまっているため、loop()関数の中には何も記述していません。

実行結果

相変わらず絵心皆無でスンマセン…。

例2:loop()の中でもなにかやってみる

今度は、アニメーションとは別にloop()関数の中でもなにか処理を行ってみましょう。

スケッチ

例1のスケッチに、下のソースのようにいくつかの処理を追加しましょう。

C++
#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の公式サイトで提供されています。

Led Matrix Editor

まとめ

・Arduino_LED_Matrix.h に定義された機能だけでアニメーションを実現できる
・アニメーションは loop()関数内の処理とは独立して動作する。

コメント

タイトルとURLをコピーしました