フォト
2024年9月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
無料ブログはココログ

« Arduino用フォントライブラリを更新しました | トップページ | Arduino Basicを改良してシリアルコンソール対応 »

2019年2月 2日 (土)

OLED(SSD1306)で美咲フォントを使った漢字表示

先日更新したArduino用フォントライブラリを使って、OLED(SSD1306)ディスプレイでの
漢字表示をやってみました。

OLEDは、0.96インチ ドライバSSD1306搭載 I2C接続タイプを使いました。

Dscn9578

0.96インチに8x8ドットの文字はちょっと小さいですが、表示出来ました。

Dscn9579

OLED制御には、AdafruitGFXAdafruit SSD1306ライブラリを使っています。

AdafruitGFXAdafruit SSD1306の使い方(インストール含む)については、
下記のお勧め参考文献を参照すると良いです。大変丁寧に解説されていています。

お勧め参考文献
Qiita - ArduinoでOLEDディスプレイを試す

その他関連サイト
adafruit/Adafruit_SSD1306
adafruit/Adafruit-GFX-Library
Learn The Adafruit_GFX library


サンプルスケッチ

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306_128_64.h>
#include <misakiUTF16.h>

Adafruit_SSD1306 OLED(128, 64, &Wire, -1); // OLEDドライバ作成
uint8_t font[8];                           // フォント格納バッファ

void setup() {
  Serial.begin(115200);
  if(!OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("Cannot work."));
    for(;;); 
  }
  OLED.clearDisplay();

  // "あ"の描画
  getFontData(font, "あ");              // "あ"のフォントを取得 
  OLED.drawBitmap(0, 0, font,8,8,1);    // フレームバッファにフォント書き込み 
  OLED.display();                       // 画面更新

  // 文字列の表示
  char *str="Abcあいうえお、埼玉 "      // 文字列
            "日本語表示できるかな? " 
            "Arduinoで漢字表示"
            "出来ますよ!";
  char *ptr = str;                      // 文字列参照位置
  uint16_t x = 0, y = 8;                // 表示位置

  while(*ptr) {                         // 文字列分ループ
     ptr = getFontData(font, ptr,true); // 1文字分のフォント取得
     if (!ptr)
        break;                          // エラーの場合は終

     OLED.drawBitmap(x,y,font,8,8,1);   // フレームバッファにフォント書き込み 

     if (128-8 > x) {                   // 表示位置更新
       x+=8;
     } else {
       x=0;
       y+=8;
     }
  }
  OLED.display();                       // 画面更新
}

void loop() {
  // put your main code here, to run repeatedly:

}
 

サンプルスケッチのAdafruit SSD1306用ヘッダファイル"Adafruit_SSD1306_128_64.h"は
オリジナルの "Adafruit_SSD1306.h" をコピーして修正したものです。
Adafruit SSD1306ライブラリ、ヘッダファイルを修正することを前提としているため、
オリジナル版を残し、用途別のコピー&名前変更して使っています。

修正は、単に #define SSD1306_128_32 をコメントアウトして、
#define SSD1306_128_64を有効にしました。

フォントの表示はdrawBitmap()関数を使っています。
引数に表示座標、取得したフォントデータ(font)、フォントサイズ、色(=1:ドットオン)を
指定するだけで、簡単にフォント表示出来ます。
Arduinoのフラシュメモリの制約で教育漢字しかサポートしていませんが、
お手軽に漢字表示が出来ると思います。


追記

文字が小さいので文字を大きく表示してみました。

Dscn9581

改良スケッチ

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306_128_64.h>
#include <misakiUTF16.h>

Adafruit_SSD1306 OLED(128, 64, &Wire, -1); // OLEDドライバ作成
uint8_t font[8];                           // フォント格納バッファ

// ビットマップの拡大描画
void drawBitmapEx(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h,
                  uint16_t color,uint16_t bgcolor, uint16_t ex) {
  int16_t i, j,b=(w+7)/8;
  for( j = 0; j < h; j++) {
    for(i = 0; i < w; i++ ) { 
      if(*(bitmap + j*b + i / 8) & (128 >> (i & 7))) {
        // ドットあり
        if (ex == 1)  OLED.drawPixel(x+i, y+j, color); //1倍
        else          OLED.fillRect(x + i * ex, y + j * ex, ex, ex, color); // ex倍
      } else {
        // ドットなし
        if (ex == 1)  OLED.drawPixel(x+i, y+j, bgcolor);
        else          OLED.fillRect(x + i * ex, y + j * ex, ex, ex, bgcolor);
       }
     }
   }
}

void setup() {
  Serial.begin(115200);
  if(!OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("Cannot work."));
    for(;;); 
  }
  OLED.clearDisplay();

  // "あ"の描画
  int16_t ex = 2;                       // 文字倍率
  getFontData(font, "あ");              // "あ"のフォントを取得 
  drawBitmapEx(0, 0, font,8,8,1,0,ex);  // フレームバッファにフォント書き込み 
  OLED.display();                       // 画面更新

  // 文字列の表示
  char *str="Abcあいうえお、埼玉 "      // 文字列
            "日本語表示できるかな? ";
  char *ptr = str;                      // 文字列参照位置
  uint16_t x = 0, y = 8*ex;             // 表示位置

  while(*ptr) {                         // 文字列分ループ
     ptr = getFontData(font, ptr,true); // 1文字分のフォント取得
     if (!ptr)
        break;                          // エラーの場合は終

     drawBitmapEx(x,y,font,8,8,1,0,ex); // フレームバッファにフォント書き込み 

     if (128-8*ex > x) {                // 表示位置更新
       x+=8*ex;
     } else {
       x=0;
       y+=8*ex;
     }
  }
  OLED.display();                      // 画面更新
}

void loop() {
  // put your main code here, to run repeatedly:

}

スケッチの変数 ex = 2 の値を変更することで3倍、4倍と変更出来ます。

« Arduino用フォントライブラリを更新しました | トップページ | Arduino Basicを改良してシリアルコンソール対応 »

arduino」カテゴリの記事

表示器制御関連」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: OLED(SSD1306)で美咲フォントを使った漢字表示:

« Arduino用フォントライブラリを更新しました | トップページ | Arduino Basicを改良してシリアルコンソール対応 »