マイコンArduinoを使って電光掲示板を作る。
続き
前回、
「次回は表示データを手入力ではない方法を模索していきます。」とコメントしましたが結局手入力で行くこととしました。
フォントをデータで持つにはサイズ的に厳しい、そして何よりも難しい。
いろいろなサイトを訪れて見ましたがよくわからないが本音です。
手入力と言っても「あ」「い」の様にパターンを1点1点読んで数値に置き換える作業は大変なので、半自動化で入力していきます。
いろいろなサイトを巡っているうちに「jiskan16.bdf」と言うファイルに出会いました。
このファイルをメモ帳で開いてみると見慣れた数字の並びが有ります。
一部抜粋
ENDCHAR
STARTCHAR 2535
ENCODING 9525
SWIDTH 96 0
DWIDTH 16 0
BBX 16 16 0 -2
BITMAP
0000
0810
0810
0810
FFFF
0810
0810
0810
0810
0030
0020
0060
00C0
0180
0700
0000
ENDCHAR
STARTCHAR 2536
ENCODING 9526
SWIDTH 96 0
DWIDTH 16 0
BBX 16 16 0 -2
BITMAP
16進数の並びの数字が16個
これはどう見てもドットパターンでしょう。
太字の部分をコピーしてプログラムのデータ部に貼り付け、そして後ろに「,」前に「0x」を足してプログラムを実行。
#define WORD_COUNT 5 // 文字数+2
int num = 0;
int scroll = 0;
int count = 0;
short data_hex[] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000,
0x0810,
0x0810,
0x0810,
0xFFFF,
0x0810,
0x0810,
0x0810,
0x0810,
0x0030,
0x0020,
0x0060,
0x00C0,
0x0180,
0x0700,
0x0000,
0x0000, 0x0200, 0x0200, 0x3ff8, 0x0200, 0x0220, 0x03f0, 0x0628,
0x1a44, 0x1244, 0x2284, 0x2304, 0x260c, 0x3d18, 0x0070, 0x0000,
0x0000, 0x0000, 0x0000, 0x2010, 0x2018, 0x2008, 0x200c, 0x2004,
0x3004, 0x3004, 0x1186, 0x1106, 0x1b00, 0x0e00, 0x0400, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
void setup() {
// put your setup code here, to run once:
pinMode(3,OUTPUT); // デジタルピンのD3を出力に設定する
pinMode(4,OUTPUT); // デジタルピンのD4を出力に設定する
pinMode(5,OUTPUT); // デジタルピンのD5を出力に設定する
pinMode(6,OUTPUT); // デジタルピンのD6を出力に設定する
pinMode(7,OUTPUT); // デジタルピンのD7を出力に設定する
pinMode(8,OUTPUT); // デジタルピンのD8を出力に設定する
cls();
change();
}
void loop() {
// put your main code here, to run repeatedly:
for (int i = 0;i < 16;i++) {
if (i == num)
digitalWrite(3,HIGH); // コモン
else
digitalWrite(3,LOW); // コモン
if ((data_hex[i + scroll + 16] & 0x8000 >> num) != 0)
digitalWrite(4,HIGH); // カラムA
else
digitalWrite(4,LOW); // カラムA
if ((data_hex[i + scroll] & 0x8000 >> num) != 0)
digitalWrite(5,HIGH); // カラムB
else
digitalWrite(5,LOW); // カラムB
clock();
}
digitalWrite(7,HIGH); // ラッチ
digitalWrite(8,LOW); // イネーブル
digitalWrite(7,LOW); // ラッチ
// delay(100);
num++;
if(15 < num) {
num = 0;
count++;
if (count > 10) { // 10を書き替えるとスクロール速度が変る
count = 0;
scroll++;
if (scroll > 16 * WORD_COUNT)
scroll = 0;
}
}
}
void cls() {
digitalWrite(3,LOW); // コモン
digitalWrite(4,LOW); // カラムA
digitalWrite(5,LOW); // カラムB
clock();clock();clock();clock();clock();clock();clock();clock();
clock();clock();clock();clock();clock();clock();clock();clock();
digitalWrite(7,HIGH); // ラッチ
digitalWrite(7,LOW); // ラッチ
}
void clock() {
digitalWrite(6,HIGH); // クロック
digitalWrite(6,LOW); // クロック
}
void change() {
short local_hex[16 * WORD_COUNT]; // 4は移動文字数
// データをクリア
for (int n = 0;n < 16 * WORD_COUNT;n++) { // 16はデーター数
local_hex[n] = 0; // ビット数は不要 0で16ビット全て0
}
for (int i = 0;i < WORD_COUNT;i++) { // 4は移動文字数
for (int j = 0;j < 16;j++) { // 16はデーター数
for (int k = 0;k < 16;k++) { // 16はビット数
if ((data_hex[j + i * 16] & 0x8000 >> k) != 0) // 横データを
local_hex[k + i * 16] |= 0x0001 << j; // 縦データに
}
}
}
for (int n = 0;n < 16 * WORD_COUNT;n++) {
data_hex[n] = local_hex[n]; // 元に戻す
}
}
予想通り、文字が流れてきました。
無作為に選んで貼り付けたデータは「サ」でした。
これなら頻繁に書き替えたりするのは辛いですが、使える方法では無いでしょうか。
#define WORD_COUNT 5はここを書き換えるだけで文字数に対応出来ます。
一文字増えたので4→5に変更
如何だったでしょうか。
「jiskan16.bdf」の最初の方にCHARS 6877と言う記載が有るのでおそらく6877文字分収録されていると思われます。
利用規約を見ましたが使うのは問題なさそうです。
ただ、まねされる場合はご自身でご確認ください。
では、また。