ドットマトリックスLEDで電光掲示板的なものを作りたい

スポンサーリンク
スポンサーリンク

電光掲示板

せっかくなので、電光掲示板的なものを作りたい。スクロールするやつ。

スポンサーリンク

作戦を練る

なんか参考サイト的なものを探したのだけれど、探し方が悪いのかあんまよく分からなかったので作戦を練る。電光掲示板の表示の流れを分解していくと、表示したいデータを作って、現在の表示を右にひとマスずつずらして、表示したいデータの一番左から順に、ひとマスずらした空きの所にはめ込んで、また表示してあげれば流れていくように見えるはず。…はず。

こんな感じ。

とりあえず、きれいなコードとか、再利用しやすいコードとか、汎用性のあるコードとか、意識せずにとにかくまず動くものを作ろう。

スポンサーリンク

表示したいデータを作る

フォントからビットデータ作るとか高尚なことが分からんので、美咲フォントを参考に、手打ちでエクセルを使いつつ配列データを作った。

これが

const boolean data[8][24] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0},
  {1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0}
};

こうなる。

スポンサーリンク

コード書く

#include <ht16k33.h>

HT16K33 HT;

uint8_t disptable[8][16][2] = {
  {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}, {7, 0}, {8, 0}, {9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0}},
  {{16, 0}, {17, 0}, {18, 0}, {19, 0}, {20, 0}, {21, 0}, {22, 0}, {23, 0}, {24, 0}, {25, 0}, {26, 0}, {27, 0}, {28, 0}, {29, 0}, {30, 0}, {31, 0}},
  {{32, 0}, {33, 0}, {34, 0}, {35, 0}, {36, 0}, {37, 0}, {38, 0}, {39, 0}, {40, 0}, {41, 0}, {42, 0}, {43, 0}, {44, 0}, {45, 0}, {46, 0}, {47, 0}},
  {{48, 0}, {49, 0}, {50, 0}, {51, 0}, {52, 0}, {53, 0}, {54, 0}, {55, 0}, {56, 0}, {57, 0}, {58, 0}, {59, 0}, {60, 0}, {61, 0}, {62, 0}, {63, 0}},
  {{64, 0}, {65, 0}, {66, 0}, {67, 0}, {68, 0}, {69, 0}, {70, 0}, {71, 0}, {72, 0}, {73, 0}, {74, 0}, {75, 0}, {76, 0}, {77, 0}, {78, 0}, {79, 0}},
  {{80, 0}, {81, 0}, {82, 0}, {83, 0}, {84, 0}, {85, 0}, {86, 0}, {87, 0}, {88, 0}, {89, 0}, {90, 0}, {91, 0}, {92, 0}, {93, 0}, {94, 0}, {95, 0}},
  {{96, 0}, {97, 0}, {98, 0}, {99, 0}, {100, 0}, {101, 0}, {102, 0}, {103, 0}, {104, 0}, {105, 0}, {106, 0}, {107, 0}, {108, 0}, {109, 0}, {110, 0}, {111, 0}},
  {{112, 0}, {113, 0}, {114, 0}, {115, 0}, {116, 0}, {117, 0}, {118, 0}, {119, 0}, {120, 0}, {121, 0}, {122, 0}, {123, 0}, {124, 0}, {125, 0}, {126, 0}, {127, 0}}
};

const boolean data[8][24] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0},
  {1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0}
};

void moveline() {
  for (int i = 0 ; i < 8; i++) {
    for (int j = 1; j < 16; j++) {
      disptable[i][j - 1][1] = disptable[i][j][1];
    }
  }
}

void dispset() {
  for (int i = 0 ; i < 8; i++) {
    for (int j = 0; j < 16; j++) {
      if (disptable[i][j][1] == 1) {
        HT.setLed(disptable[i][j][0]);
      } else {
        HT.clearLed(disptable[i][j][0]);
      }
    }
  }
}

void setup() {
  HT.begin(0x00);
}

void loop() {

  for (int i = 0 ; i < 24; i++) {

    moveline();

    for (int j = 0; j < 8; j++) {
      if (data[j][i]) {
        disptable[j][15][1] = 1;
      } else {
        disptable[j][15][1] = 0;
      }
    }

    HT.clearAll();
    dispset();

    HT.sendLed();
    delay(100);
  }

  for (int i = 0 ; i < 24; i++) {

    moveline();
    HT.clearAll();
    dispset();

    HT.sendLed();
    delay(100);
  }
}

そんで

動画だとちらついてるけど、実際目で見るといい感じです。コードきったないけどとりあえず動いた。次の段階に行けるだろうか。

スポンサーリンク

縦方向も

#include <ht16k33.h>

HT16K33 HT;

uint8_t disptable[16][8][2] = {
  {{112, 0}, {96, 0}, {80, 0}, {64, 0}, {48, 0}, {32, 0}, {16, 0}, {0, 0}},
  {{113, 0}, {97, 0}, {81, 0}, {65, 0}, {49, 0}, {33, 0}, {17, 0}, {1, 0}},
  {{114, 0}, {98, 0}, {82, 0}, {66, 0}, {50, 0}, {34, 0}, {18, 0}, {2, 0}},
  {{115, 0}, {99, 0}, {83, 0}, {67, 0}, {51, 0}, {35, 0}, {19, 0}, {3, 0}},
  {{116, 0}, {100, 0}, {84, 0}, {68, 0}, {52, 0}, {36, 0}, {20, 0}, {4, 0}},
  {{117, 0}, {101, 0}, {85, 0}, {69, 0}, {53, 0}, {37, 0}, {21, 0}, {5, 0}},
  {{118, 0}, {102, 0}, {86, 0}, {70, 0}, {54, 0}, {38, 0}, {22, 0}, {6, 0}},
  {{119, 0}, {103, 0}, {87, 0}, {71, 0}, {55, 0}, {39, 0}, {23, 0}, {7, 0}},
  {{120, 0}, {104, 0}, {88, 0}, {72, 0}, {56, 0}, {40, 0}, {24, 0}, {8, 0}},
  {{121, 0}, {105, 0}, {89, 0}, {73, 0}, {57, 0}, {41, 0}, {25, 0}, {9, 0}},
  {{122, 0}, {106, 0}, {90, 0}, {74, 0}, {58, 0}, {42, 0}, {26, 0}, {10, 0}},
  {{123, 0}, {107, 0}, {91, 0}, {75, 0}, {59, 0}, {43, 0}, {27, 0}, {11, 0}},
  {{124, 0}, {108, 0}, {92, 0}, {76, 0}, {60, 0}, {44, 0}, {28, 0}, {12, 0}},
  {{125, 0}, {109, 0}, {93, 0}, {77, 0}, {61, 0}, {45, 0}, {29, 0}, {13, 0}},
  {{126, 0}, {110, 0}, {94, 0}, {78, 0}, {62, 0}, {46, 0}, {30, 0}, {14, 0}},
  {{127, 0}, {111, 0}, {95, 0}, {79, 0}, {63, 0}, {47, 0}, {31, 0}, {15, 0}}

};

const boolean data[24][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 1, 0, 1, 0},
  {1, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 0, 1, 1, 1, 0},
  {0, 1, 0, 0, 0, 0, 0, 0},
  {0, 1, 0, 0, 1, 0, 0, 0},
  {1, 0, 0, 1, 0, 0, 0, 0},
  {1, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 0, 0},
  {1, 0, 0, 0, 0, 0, 1, 0},
  {0, 0, 0, 0, 0, 0, 1, 0},
  {0, 0, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 0, 0, 0, 1, 0},
  {0, 0, 1, 0, 0, 0, 1, 0},
  {0, 0, 0, 1, 1, 1, 0, 0}
};

void moveline() {
  for (int i = 1; i < 16; i++) {
    for (int j = 0 ; j < 8; j++) {
      disptable[i - 1][j][1] = disptable[i][j][1];
    }
  }

  for (int k = 0; k < 8; k++) {
    disptable[15][k][1] = 0;
  }
}

void dispset() {
  for (int i = 0; i < 16; i++) {
    for (int j = 0 ; j < 8; j++) {
      if (disptable[i][j][1] == 1) {
        HT.setLed(disptable[i][j][0]);
      } else {
        HT.clearLed(disptable[i][j][0]);
      }
    }
  }
}

void setup() {
  HT.begin(0x00);
  HT.setBrightness(1);
}

void loop() {

  for (int j = 0 ; j < 24; j++) {

    moveline();

    for (int i = 0; i < 8; i++) {
      if (data[j][i]) {
        disptable[15][i][1] = 1;
      } else {
        disptable[15][i][1] = 0;
      }
    }

    HT.clearAll();
    dispset();

    HT.sendLed();
    delay(100);
  }

  for (int i = 0 ; i < 24; i++) {

    moveline();
    HT.clearAll();
    dispset();

    HT.sendLed();
    delay(100);
  }
}

縦でもやってみた。moveline()に最後の行が繋がっちゃうバグが有ったので対処した。あと眩しいので暗くした。

スポンサーリンク

参考

8×8 ドット日本語フォント「美咲フォント」

コメント

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