LoginSignup
1
1

More than 1 year has passed since last update.

LogyanGFXでテキストを横スクロールする

Last updated at Posted at 2022-12-16

はじめに

この記事では、LogyanGFXを使ってテキストの横スクロールの方法について記載します。
News等の長いテキストのスクロール等に使えます。

  • LovyanGFX for Windowsでのデバッグ環境の構築
  • ソースの修正
  • Windows環境でのビルド・デバッグ
  • 実機での動作確認

LovyanGFX for Windowsの環境構築

LovyanGFX for Windowsを使ってみた(https://qiita.com/pokibon/items/4f6f9b1f733ad60c708a )を参考にPC上に環境を構築します。

ソースの修正

テキストの横スクロールの参考になるサンプルソフトウェアは、LogyanGFXのサンプルに含まれている「LovyanGFX\examples\Standard\LongTextScroll\LongTextScroll.ino」を参考に、LoyanGFX for Winodwsのコードを追加します。

  • Arduino固有のソースをWindowsAPIに修正
    delay() → sleep()
    StringクラスをC++のstringクラスに変更
  • LovyanGFX固有のコード修正
    デバッグ時の可視化性向上のため、インスタンス作成時に表示倍率に4倍を指定しています。
  • 文字のスクロール
    このソースでは漢字を含む文字列を32ドットの明朝体で表示しています。ターゲットとなるLEDパネルのスクロールエリアは64x32ドットですが、これより1文字分多い96x32ドット分のスプライトを作成しています。スプライトを1ドット左にスクロールした後に描画エリアにpushSprite()で描画を繰り返すことにより横スクロールを実現しています。
#include <windows.h>    // Sleep()を使うために追加
#include <string>       // string変数を使うために追加
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
#include <LGFX_AUTODETECT.hpp>

#define SCREEN_SIZE_X 64   // 64x32のHUB75 LEDパネルを想定
#define SCREEN_SIZE_Y 32

LGFX gfx ( SCREEN_SIZE_X, SCREEN_SIZE_Y, 4);    // 縦横4倍の拡大表示
static lgfx::LGFX_Sprite cBuf;
#define FONT          &fonts::lgfxJapanMincho_32
#define FONT_SIZE       32
#define FONT_MULTI     1.0


void setup()
{
    gfx.init();
    cBuf.createSprite(SCREEN_SIZE_X + FONT_SIZE, FONT_SIZE);
    cBuf.setTextSize(FONT_MULTI, FONT_MULTI);
    cBuf.setFont(FONT);
    cBuf.setTextWrap(false);
    cBuf.setTextColor(TFT_YELLOW, TFT_BLUE);
    cBuf.clear(TFT_BLUE);
}

const std::string str = "◇AKBONE2022 Break Out News - ◇秘密結社オープンフォースの河野総統は、LEDパネルキットAKB2022をAVTOKYO2022で発表した。◇AKB2022のグラフィックライブラリにはLovyanGFXを使用、漢字表示や高速な描画を実現。◇搭載しているセンサモジュールは、BME280、MPU6500、およびReal Time Clock。◇Linux ボードとして、Sipeed Lichee Nanoを搭載。◇2023年1月 BitTradeOneより発売予定!";
size_t textlen = 0;
size_t textpos = 0;

void loop()
{
    //=====================================================================
    // 文字列をスクロール表示
    //=====================================================================
    textlen = str.length();
    while (1) {
        int32_t cursor_x = cBuf.getCursorX() - 1;   // 現在のカーソル位置を取得し、1ドット左に移動
        if (cursor_x <= 0) // カーソル位置が左端に到達している場合は一周したと判断
        {
            textpos = 0;            // 文字列の読取り位置をリセット
            cursor_x = gfx.width(); // 新たな文字が画面右端に描画されるようにカーソル位置を変更
        }
        cBuf.setCursor(cursor_x, 0); // カーソル位置を更新
        cBuf.scroll(-1, 0);          // キャンバスの内容を1ドット左にスクロール
        while (textpos < textlen && cursor_x <= gfx.width()) // 画面右端に文字が書けるか判定
        {
            //Serial.print(str[textpos]);
            cBuf.print(str[textpos++]);   // 1バイトずつ出力 (マルチバイト文字でもこの処理で動作します)
            cursor_x = cBuf.getCursorX();  // 出力後のカーソル位置を取得
        }
        cBuf.pushSprite(&gfx, 0, 0);
        Sleep(10);
    }
}

Windows環境でのデバッグ

Visual Studio上でデバッグ可能です。表示を拡大することにより、ドット単位で表示位置を確認することができます。
https://twitter.com/pokibon/status/1603533710460067843?s=20&t=8OfZQdGjVuRVe9Aw3BinEA

実機での動作確認

デバッグが完了したソースをAKBONE2022+HUB75のLED PANELで実行してみました。
再現性もばっちりですね。動画でとるとLEDパネルのきれいな色が再現できないのが残念です。
https://twitter.com/pokibon/status/1603534370710507520?s=20&t=8OfZQdGjVuRVe9Aw3BinEA

まとめ

  • LovyanGFX for Windowsを使うことにより、組込みデバイス書き込み前にPC上で動作確認、デバッグができるようになった。
  • LovyanGFXのスプライトを使うことにより、テキストの横スクロールをちらつきなしに実現できた。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1