以前、Arduinoを使ってドットマトリクスLEDに文字を表示させましたが、今回はフォントライブラリを使って文字を表示させることに挑戦しました。

 

 

以前の記事はこちら

 

文字を手書きで作るのは大変でした。

フォントライブラリさえ使えば、文字の変更はサクッとできちゃいます。

 

 

参考にさせていただいた記事はこちら。

 

 

この記事にある美咲フォントを使用させていただきました。

GitHubにも公開されています。

 

 

 

フォントライブラリを使用するには、Arduinoだと容量が足りないのでESP32を使用しました。

MAX7219(ドットマトリクスLED)とESP32の配線図はこちら。

 

 

MAX7219のデータシートを確認すると、動作電圧は4.0~5.5Vのはずなのですが3.3Vでも動作しました

今回はこの配線で動作確認を行いましたが、別電源を準備した方が安心かもしれません。

 

 

実際の配線の様子

 

 

動作確認の様子がこちら。

 

 

プログラムは参考記事のものをほぼそのままですが、CS PINの設定文字表示の部分を変更しています。

こちらをArduino IDE でESP32に書き込みました。

#include <MD_MAX72xx.h>

#include <MD_Parola.h>

#include <misaki.hpp>

 

// MAX7219の設定

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW

#define MAX_DEVICES 4

 

// CSピンの設定

#define CS_PIN 5

 

// スクロールする文字列の最大長

#define MAX_LENGTH 256

 

// スクロールする文字列をMD_Parolaに登録するための変数

char messageCode[MAX_LENGTH];

 

// MD_Parolaに登録するフォントデータを格納するための配列

uint8_t rotatedFontData[9 * MAX_LENGTH];  // 90度回転したフォントデータを格納する領域

 

// MD_Parolaオブジェクトの作成

MD_Parola parola = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

 

// Parolaに指定した文字列(text)のフォントデータを登録する関数

void addFontToParola(const char* text) {

  uint16_t charIndex = 1;  // 文字列の先頭を1として順番にインデックスを割り当てる

  uint8_t charWidth;

 

  while (*text && charIndex < MAX_LENGTH) {

    // UTF-8をUnicodeに変換し、文字幅を取得

    uint16_t unicode = utf8ToUnicode(text, &charWidth);

 

    // フォントデータを取得

    const uint8_t* fontData = getFontData(unicode);

 

    // フォントデータを90度回転して格納

    // フォントデータの1バイト目は文字幅を格納する

    rotatedFontData[(charIndex - 1) * 9] = charWidth;

    // フォントデータの2バイト目以降は回転したデータを格納する

    for (uint8_t col = 0; col < 8; col++) {  // 8列分のデータを処理

      uint8_t rotatedByte = 0;

      for (uint8_t row = 0; row < 8; row++) {    // 8行分のデータを処理

        if (fontData[row] & (1 << (7 - col))) {  // 元データのビットを確認

          rotatedByte |= (1 << row);             // 回転後の位置にビットをセット

        }

      }

      rotatedFontData[(charIndex - 1) * 9 + col + 1] = rotatedByte;  // 回転したデータを格納

    }

 

    // MD_Parolaにフォントを登録

    parola.addChar(charIndex, &rotatedFontData[(charIndex - 1) * 9]);

    // フォントデータのインデックスを増加

    messageCode[charIndex - 1] = charIndex;

    charIndex++;  // 次の文字のインデックスを増加

  }

  // 文字列の終端を設定

  messageCode[charIndex - 1] = '\0';

}

 

void setup() {

 

  Serial.begin(115200);

  // while (!Serial) delay(10);  // シリアルモニタの準備を待つ

 

  // MD_Parolaの初期化

  parola.begin();

  parola.displayClear();

 

  // マトリクスに表示するメッセージ

  const char* message = "真野あゆみ";

 

  // フォントデータを登録

  addFontToParola(message);

 

  // メッセージを設定してスクロール開始

  parola.displayScroll(messageCode, PA_LEFT, PA_SCROLL_LEFT, 50);

}

 

void loop() {

  // アニメーションを更新

  if (parola.displayAnimate()) {

    parola.displayReset();

    delay(1500);

  }

}

 

これを使えば、電光掲示板のようなものがサクッと作れちゃいます。

何か楽しいものに仕上げたいですね~。