Arduino UNO R4 ボード上のLEDマトリクスで文字を表示する

Arduino
DSC_0808

文字表示

図形表示のためのライブラリ ArduinoGraphics を利用して、Arduino UNO R4ボード上のLEDマトリクスに文字を表示することが出来ます。

例1:固定テキストの表示

まず、固定の文字列(といってもスクリーンが小さいので英数半角文字で2,3文字だけですが)を表示してみます。

スケッチ

C++
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.stroke(0xFFFFFF);
  matrix.textFont(Font_4x6);
  char str[] = "XYZ";
  matrix.text(str, 0, 1);
  matrix.endDraw();
  matrix.end();
}

void loop() {

}

プログラム解説

C++
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

Arduino UNO R4 ボード上のLEDマトリクスで図形を表示するには、”ArduinoGraphics.h” と ”Arduino_LED_Matrix.h” の2つが必要です。

“ArduinoGraphics.h” を先にインクルードしなければならないことに注意してください。内部的には、先に ArduinoGraphics.h をインクルードすることでArduinoLEDMatrixクラスがArduinoGraphicsクラスのサブクラスとして定義され、ArduinoLEDMatrixクラスのインスタンスがArduinoGraphicsクラスの関数を使用できるようになります。

フレーム表示の例と同様、ArduinoLEDMatrixクラスのインスタンスを生成しておきます。

ArduinoLEDMatrixの使用開始・終了
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.stroke(0xFFFFFF);
  matrix.textFont(Font_4x6);
  char str[] = "XYZ";
  matrix.text(str, 0, 1);
  matrix.endDraw();
  matrix.end();
}

begin()関数によってArduinoLEDMatrixクラスを初期化・使用開始、end()関数によって終了します。

描画オペレーションの開始・終了
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.stroke(0xFFFFFF);
  matrix.textFont(Font_4x6);
  char str[] = "XYZ";
  matrix.text(str, 0, 1);
  matrix.endDraw();
  matrix.end();
}

beginDraw()関数で描画オペレーションを開始し、endDraw()関数で描画オペレーションを終了します。

描画色の設定
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.stroke(0xFFFFFF);
  matrix.textFont(Font_4x6);
  char str[] = "XYZ";
  matrix.text(str, 0, 1);
  matrix.endDraw();
  matrix.end();
}

図形と同様、文字表示色の設定にはstroke()関数を使用します。

書式
void ArduinoGraphics.stroke(uint8_t r, uint8_t g, uint8_t b)
または
void ArduinoGraphics.stroke(uint32_t color)
引数
名前意味
ruint8_tRGB三原色のR(赤)の量を0~255で表す
guint8_tRGB三原色のG(緑)の量を0~255で表す
buint8_tRGB三原色のB(青)の量を0~255で表す
coloruint32_t0xRRGGBB形式の24bitカラー

実際には、Arduino UNO R4 では赤色LEDしか実装されておらず、各LEDは点灯/消灯の二値でしか制御されていないようです。つまり指定が#000000ならば消灯、それ以外の値なら点灯します。
#808080なら#FFFFFFの時の半分の明るさ、とはなりません。
またR要素が0でもG様子またはB要素が0でなければ点灯します。

他に色指定のための関数として、

背景色を指定する background()関数
塗りつぶし色を指定する fill()関数

が定義されています。引数による色指定の方法は同じです。

テキストフォントの設定
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.stroke(0xFFFFFF);
  matrix.textFont(Font_4x6);
  char str[] = "XYZ";
  matrix.text(str, 0, 1);
  matrix.endDraw();
  matrix.end();
}

テキスト表示に使用するフォントを指定するには、textFont()関数を使用します。

書式
void ArduinoLEDMatrix.textFont(Font& which)
引数
名前意味
whichFont&設定するフォントを表すFont構造体
動作

テキスト表示に、whichに指定したフォントを使用するように設定します。
現状、ArduinoGraphics.h+Arduino_LED_Matrix.h の環境では Font_4x6 と Font_5x7 が使用可能です。この2つのフォントについては、半角英数字の字形情報もライブラリに含まれています。

この例では、使用フォントを Font_4x6 に設定しています。

文字表示
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.stroke(0xFFFFFF);
  matrix.textFont(Font_4x6);
  char str[] = "XYZ";
  matrix.text(str, 0, 1);
  matrix.endDraw();
  matrix.end();
}

文字列を表示するには、text()関数を使用します。

書式
void ArduinoGraphics.text(char* str, int x, int y)
引数
名前意味
strchar*表示する文字列へのポインタ
xint表示位置(最初の文字の左上角)のx座標。省略可(x=0と見なされる)。
yint表示位置(最初の文字の左上角)のy座標。省略可(y=0と見なされる)。
動作

(x,y)の位置から文字列strを表示します。

この例ではchar[](要素をchar型とする1次元配列)として文字列を定義し、引数として与えています(C言語ではchar[]型変数の名前だけを記述すると&char[0]≒char[]領域の先頭へのポインタと同じ意味になります)。

同じ文字列を他の場所で使用する予定がなければ、

C++
  matrix.text("XYZ", 0, 1);

のように引数に直接文字列リテラルを記述しても動作します。

実行結果

Font_4x6(幅4ピクセルのフォント)なので、12×8のLEDマトリクスにギリギリ3文字並べて表示できます。まぁ可読性はいまいちですね…。

例2:文字をスクロール表示する

次に、電光掲示板のようにスクロールして長い文字列を表示することに挑戦します。

スケッチ

C++
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.textFont(Font_5x7);
  matrix.textScrollSpeed(100);
  matrix.beginText(11,1,0xFFFFFF);
  matrix.print("HELLO,WORLD!");
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  matrix.end();
}

void loop() {

}

プログラム解説

ライブラリのインクルードおよびArduinoLEDMatrixクラス変数の宣言
C++
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

Arduino UNO R4 ボード上のLEDマトリクスで図形を表示するには、”ArduinoGraphics.h” と ”Arduino_LED_Matrix.h” の2つが必要です。

“ArduinoGraphics.h” を “Arduino_LED_Matrix.h” より先にインクルードしなければならないことに注意してください。内部的には、先に ArduinoGraphics.h をインクルードすることでArduinoLEDMatrixクラスがArduinoGraphicsクラスのサブクラスとして定義され、ArduinoLEDMatrixクラスのインスタンスがArduinoGraphicsクラスの関数を使用できるようになります。

フレーム表示の例と同様、ArduinoLEDMatrixクラスのインスタンスを生成しておきます。

ArduinoLEDMatrixの使用開始・終了
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.textFont(Font_5x7);
  matrix.textScrollSpeed(100);
  matrix.beginText(11,1,0xFFFFFF);
  matrix.print("HELLO,WORLD!");
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  matrix.end();
}

begin()関数によってArduinoLEDMatrixクラスを初期化・使用開始、end()関数によって終了します。

描画オペレーションの開始・終了
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.textFont(Font_5x7);
  matrix.textScrollSpeed(100);
  matrix.beginText(11,1,0xFFFFFF);
  matrix.print("HELLO,WORLD!");
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  matrix.end();
}

beginDraw()関数で描画オペレーションを開始し、endDraw()関数で描画オペレーションを終了します。

描画に使用するフォントの設定
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.textFont(Font_5x7);
  matrix.textScrollSpeed(100);
  matrix.beginText(11,1,0xFFFFFF);
  matrix.print("HELLO,WORLD!");
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  matrix.end();
}

textFont()関数で使用するフォントを設定します。関数の詳しい使い方は別記事を参照してください。

この例では使用するフォントとして Font_5x7 を設定しています。

スクロール速度の設定
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.textFont(Font_5x7);
  matrix.textScrollSpeed(100);
  matrix.beginText(11,1,0xFFFFFF);
  matrix.print("HELLO,WORLD!");
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  matrix.end();
}

文字スクロールの速度を設定するには、textScrollSpeed()関数を使用します。

書式
void ArduinoGraphics.textScrollSpeed(int speed)
引数
名前意味
speedintスクロール速度。1ピクセルの移動にかかる時間をms単位で指定
動作

textScrollSpeed()関数はスクロールの速度を設定します。引数は1ピクセルの移動にかかる時間をms単位で指定します。

この例では、1ピクセルの移動に100msを指定しています。12×8のマトリクスを端から端まで移動するのに100×12=1200ms=1.2秒となります。

スクロール文字列描画の開始
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.textFont(Font_5x7);
  matrix.textScrollSpeed(100);
  matrix.beginText(11,1,0xFFFFFF);
  matrix.print("HELLO,WORLD!");
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  matrix.end();
}

スクロールする文字列を描画するには、静止文字列とはまったく違う手順が必要です。

まず、beginText()関数によってスクロール文字列の描画を開始します。

書式
void ArduinoGraphics.beginText()
または
void ArduinoGraphics.beginText(int x, int y)
または
void ArduinoGraphics.beginText(int x, int y, uint8_t r, uint8_t g, uint8_t b)

または
void ArduinoGraphics.beginText(int x, int y, int color)
引数
名前意味
xint表示文字列の初期位置のx座標
yint表示文字列の初期位置のy座標
ruint8_t文字色のR(赤)要素の値(0~255)
guint8_t文字色のG(緑)要素の値(0~255)
buint8_t文字色のB(青)要素の値(0~255)
coloruint32_t文字色を0xRRGGBBで指定する24bitの値

座標について:(x,y)を書かない形式では(0,0)を指定したものと見なされます。
なお、初期位置とは
左スクロールの場合は表示文字列を囲む矩形の左上隅
右スクロールの場合は表示文字列を囲む矩形の右上隅
上スクロールの場合は表示文字列を囲む矩形の左上隅
下スクロールの場合は表示文字列を囲む矩形の左下隅
のことのようです。

この例では、初期位置として(11,1)を指定し、画面右端から文字が表れるようにしています。

色について:色を指定しない形式では前回のbeginText()で指定された色がそのまま引き継がれます。プログラム中で一度もbeginText()関数により色を指定しないままだとスクロール文字の描画が行われません。

text()関数ではstroke()で設定した描画色で文字が描画されるのに対して、スクロール文字列はbeginText()関数で色を設定しないと描画されません。

なお、Arduino UNO R4のLEDマトリクスでは、色が(r,g,b)=(0,0,0)またはcolor=0x000000ならLED消灯・それ以外の値なら点灯します。

スクロール文字列の表示
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.textFont(Font_5x7);
  matrix.textScrollSpeed(100);
  matrix.beginText(11,1,0xFFFFFF);
  matrix.print("HELLO,WORLD!");
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  matrix.end();
}

スクロール文字列の表示にはprint()関数を使用します。

書式
size_t ArduinoGraphics.print(char[] string)
引数
名前意味
stringchar[]表示する文字列

※引数の型は他にも多くの種類でオーバーロード(多重定義)されています。

返却値
意味
size_t実際に出力された文字列のバイト数
動作

実はprint()関数はArduinoGraphicsクラスの関数ではなく、そのスーパークラスであるPrintクラスで定義されています。引数の型も文字列を表す代表的な型であるchar[]だけではなく、char、int、long、doubleなどでオーバーロード定義されています。数値型の場合は第2引数に基数を指定して数値の出力が可能です。

print()関数の他にprintln()関数も定義されています。print()関数との違いは、引数で与えられた内容の出力後に改行(\r\n)を出力することです。

スクロール文字列描画の終了
C++
void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.textFont(Font_5x7);
  matrix.textScrollSpeed(100);
  matrix.beginText(11,1,0xFFFFFF);
  matrix.print("HELLO,WORLD!");
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  matrix.end();
}

endText()関数でスクロール文字列描画の終了します。このとき、スクロール方向の指定を行います。

書式
void ArduinoGraphics.endText(int scrollDirection)
引数
名前意味
scrollDirectionint文字をスクロールする方向。

scrollDirectionは型としてはintですが、指定可能な値は定数(正確にはenum型)として判りやすい名前で定義されていますので、通常はそちらを使えばいいでしょう。

定数名スクロール動作
NO_SCROLLスクロールしない(text()で描画したのと同じになる)
SCROLL_LEFT左へスクロール
SCROLL_RIGHT右へスクロール
SCROLL_UP上へスクロール
SCROLL_DOWN下へスクロール

この例では SCROLL_LEFT で左スクロールを指定しています。

動作

endText()関数を実行した時点でスクロール文字列の表示が開始されます。

endText()関数の使用については、注意すべき点が2つあります。

・Arduino_LED_Matrixクラスのアニメーション機能と異なり、スクロール文字列がすべて表示されるまでendText()関数が実行されたままの状態になります。自力で割り込みタイマー処理などを記述しない限り、スクロール文字列の表示と並行して別の処理を行うことはできません。

・SCROLL_UP と SCROLL_DOWN については処理に問題があるようで、println()関数を用いて複数行テキストを表示し映画のEDクレジットのような表示をしようとしてもうまく動作しません。最初の2行程度で止まってしまいます。

実行結果

例3:スクロール文字列関数の実行タイミング

スケッチ

C++
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(9600);
  matrix.begin();
  matrix.beginDraw();
  matrix.textFont(Font_5x7);
  matrix.textScrollSpeed(100);
  matrix.endDraw();
}

void loop() {
  matrix.beginDraw();
  matrix.beginText(11,1,0xFFFFFF);
  matrix.print("HELLO,WORLD!");
  matrix.endText(SCROLL_LEFT);
  Serial.println("done");
  matrix.endDraw();
}

プログラム解説

基本的なプログラムの流れは例2と同じですが、実際に文字を描画している部分をloop()関数に移し、繰り返しスクロール文字列を描画するように改造しました。

シリアル出力を追加
C++
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(9600);
  matrix.begin();
  matrix.beginDraw();
  matrix.textFont(Font_5x7);
  matrix.textScrollSpeed(100);
  matrix.endDraw();
}

void loop() {
  matrix.beginDraw();
  matrix.beginText(11,1,0xFFFFFF);
  matrix.print("HELLO,WORLD!");
  matrix.endText(SCROLL_LEFT);
  Serial.println("done");
  matrix.endDraw();
}

endText()関数の実行後にシリアルモニタに”done”という文字列を出力するようにコードを追加しました。

実行結果

”HELLO,WORLD!”という文字列が左端から消えた瞬間に、シリアルモニタに”done”と表示されるのが判ります。先に説明したとおり、スクロール文字列の表示が終わるまで endText()関数が終了しないことが判ります。

まとめ

・ArduinoGraphics.h の機能で、LEDマトリクスにスクロールする文字列を表示することが出来る
・ただし、ArduinoLEDMatrix.hのアニメーション機能と異なり、表示が終わるまで他のことが出来ない

コメント

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