マイコンArduinoを使って電光掲示板を作る。

 

 

マイコン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];     // 元に戻す
  }
}

予想通り、文字が流れてきました。


www.youtube.com

無作為に選んで貼り付けたデータは「サ」でした。

これなら頻繁に書き替えたりするのは辛いですが、使える方法では無いでしょうか。

 

#define WORD_COUNT 5はここを書き換えるだけで文字数に対応出来ます。

一文字増えたので4→5に変更

 

如何だったでしょうか。

 

「jiskan16.bdf」の最初の方にCHARS 6877と言う記載が有るのでおそらく6877文字分収録されていると思われます。

 

利用規約を見ましたが使うのは問題なさそうです。

ただ、まねされる場合はご自身でご確認ください。

 

では、また。

 

mckeechan.hatenadiary.com