文字表示
図形表示のためのライブラリ ArduinoGraphics を利用して、Arduino UNO R4ボード上のLEDマトリクスに文字を表示することが出来ます。
例1:固定テキストの表示
まず、固定の文字列(といってもスクリーンが小さいので英数半角文字で2,3文字だけですが)を表示してみます。
スケッチ
#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() {
}
プログラム解説
#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の使用開始・終了
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()関数によって終了します。
描画オペレーションの開始・終了
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()関数で描画オペレーションを終了します。
描画色の設定
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)
引数
名前 | 型 | 意味 |
---|---|---|
r | uint8_t | RGB三原色のR(赤)の量を0~255で表す |
g | uint8_t | RGB三原色のG(緑)の量を0~255で表す |
b | uint8_t | RGB三原色のB(青)の量を0~255で表す |
color | uint32_t | 0xRRGGBB形式の24bitカラー |
実際には、Arduino UNO R4 では赤色LEDしか実装されておらず、各LEDは点灯/消灯の二値でしか制御されていないようです。つまり指定が#000000ならば消灯、それ以外の値なら点灯します。
#808080なら#FFFFFFの時の半分の明るさ、とはなりません。
またR要素が0でもG様子またはB要素が0でなければ点灯します。
他に色指定のための関数として、
背景色を指定する background()関数
塗りつぶし色を指定する fill()関数
が定義されています。引数による色指定の方法は同じです。
テキストフォントの設定
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)
引数
名前 | 型 | 意味 |
---|---|---|
which | Font& | 設定するフォントを表すFont構造体 |
動作
テキスト表示に、whichに指定したフォントを使用するように設定します。
現状、ArduinoGraphics.h+Arduino_LED_Matrix.h の環境では Font_4x6 と Font_5x7 が使用可能です。この2つのフォントについては、半角英数字の字形情報もライブラリに含まれています。
この例では、使用フォントを Font_4x6 に設定しています。
文字表示
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)
引数
名前 | 型 | 意味 |
---|---|---|
str | char* | 表示する文字列へのポインタ |
x | int | 表示位置(最初の文字の左上角)のx座標。省略可(x=0と見なされる)。 |
y | int | 表示位置(最初の文字の左上角)のy座標。省略可(y=0と見なされる)。 |
動作
(x,y)の位置から文字列strを表示します。
この例ではchar[](要素をchar型とする1次元配列)として文字列を定義し、引数として与えています(C言語ではchar[]型変数の名前だけを記述すると&char[0]≒char[]領域の先頭へのポインタと同じ意味になります)。
同じ文字列を他の場所で使用する予定がなければ、
matrix.text("XYZ", 0, 1);
のように引数に直接文字列リテラルを記述しても動作します。
実行結果
Font_4x6(幅4ピクセルのフォント)なので、12×8のLEDマトリクスにギリギリ3文字並べて表示できます。まぁ可読性はいまいちですね…。
例2:文字をスクロール表示する
次に、電光掲示板のようにスクロールして長い文字列を表示することに挑戦します。
スケッチ
#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クラス変数の宣言
#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の使用開始・終了
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()関数によって終了します。
描画オペレーションの開始・終了
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()関数で描画オペレーションを終了します。
描画に使用するフォントの設定
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 を設定しています。
スクロール速度の設定
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)
引数
名前 | 型 | 意味 |
---|---|---|
speed | int | スクロール速度。1ピクセルの移動にかかる時間をms単位で指定 |
動作
textScrollSpeed()関数はスクロールの速度を設定します。引数は1ピクセルの移動にかかる時間をms単位で指定します。
この例では、1ピクセルの移動に100msを指定しています。12×8のマトリクスを端から端まで移動するのに100×12=1200ms=1.2秒となります。
スクロール文字列描画の開始
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)
引数
名前 | 型 | 意味 |
---|---|---|
x | int | 表示文字列の初期位置のx座標 |
y | int | 表示文字列の初期位置のy座標 |
r | uint8_t | 文字色のR(赤)要素の値(0~255) |
g | uint8_t | 文字色のG(緑)要素の値(0~255) |
b | uint8_t | 文字色のB(青)要素の値(0~255) |
color | uint32_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消灯・それ以外の値なら点灯します。
スクロール文字列の表示
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)
引数
名前 | 型 | 意味 |
---|---|---|
string | char[] | 表示する文字列 |
※引数の型は他にも多くの種類でオーバーロード(多重定義)されています。
返却値
型 | 意味 |
---|---|
size_t | 実際に出力された文字列のバイト数 |
動作
実はprint()関数はArduinoGraphicsクラスの関数ではなく、そのスーパークラスであるPrintクラスで定義されています。引数の型も文字列を表す代表的な型であるchar[]だけではなく、char、int、long、doubleなどでオーバーロード定義されています。数値型の場合は第2引数に基数を指定して数値の出力が可能です。
print()関数の他にprintln()関数も定義されています。print()関数との違いは、引数で与えられた内容の出力後に改行(\r\n)を出力することです。
スクロール文字列描画の終了
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)
引数
名前 | 型 | 意味 |
---|---|---|
scrollDirection | int | 文字をスクロールする方向。 |
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:スクロール文字列関数の実行タイミング
スケッチ
#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()関数に移し、繰り返しスクロール文字列を描画するように改造しました。
シリアル出力を追加
#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のアニメーション機能と異なり、表示が終わるまで他のことが出来ない
コメント