goo blog サービス終了のお知らせ 
Sabotenboy's *sigh*
Goo Blog 2025/11で終了... 引っ越しとかどうしよう...




こんな感じで結線します^^;
I2Cのクロックはi/o5とかだと動きません、
チップの制約だと思うのですがいまいち手探り、
この組み合わせならSPI/I2C同時使用出来ました

SSD1306の表示に使うライブラリはWeather Stationと同じくコレ
ピンアサインも変更出来ますので(Adafruitと違ってReset端子もいらず、I2Cな2線接続)

漢字ROMサンプルスケッチではグローバル変数 byte rowdata[32]; というのが冒頭に宣言されており、(rawdataの方がいいかもと思いましたが、オリジナルのままになっています)これをそのままポインタで渡します

メインのスケッチにはまず、インクルードを追加、OLEDを初期化

  #include
  #include "SSD1306.h"
  #include "Adafruit_GFX.h"
 SSD1306   display(0x3c, 2, 4);

Setup()の冒頭で

 display.init();

その後は元々の漢字ROMテストスケッチのままですが、
シリアルコンソールへの出力をする都度(displayChar()を呼んだ直度)、

 半角なら dislpay.drawKanji16(x座標, y座標, rowdata);
 全角なら dislpay.drawKanji32(x座標, y座標, rowdata);

を呼ぶとrowdata[]の中のフォントデータをライブラリのsetPixelで指定の位置に描画します
書き終えたら、

   display.display();
   display.displayOn();

ライブラリのヘッダには、

  void drawKanji16(int x, int y, byte*);
  void drawKanji32(int x, int y, byte*);

を追加、コードの方には、

void SSD1306::drawKanji16(int x, int y, byte *rowdata) {
  int z;
  z = x - 8;
  for (int i = 0; i < 8; i++) {
    if (bitRead(rowdata[i], 0)) setPixel(x+i,y + 7);
    if (bitRead(rowdata[i], 1)) setPixel(x+i,y + 6);
    if (bitRead(rowdata[i], 2)) setPixel(x+i,y + 5);
    if (bitRead(rowdata[i], 3)) setPixel(x+i,y + 4);
    if (bitRead(rowdata[i], 4)) setPixel(x+i,y + 3);
    if (bitRead(rowdata[i], 5)) setPixel(x+i,y + 2);
    if (bitRead(rowdata[i], 6)) setPixel(x+i,y + 1);
    if (bitRead(rowdata[i], 7)) setPixel(x+i,y + 0);
  }
  y = y + 8;
  for (int i = 8; i < 16; i++) {
    if (bitRead(rowdata[i], 0)) setPixel(z+i,y + 7);
    if (bitRead(rowdata[i], 1)) setPixel(z+i,y + 6);
    if (bitRead(rowdata[i], 2)) setPixel(z+i,y + 5);
    if (bitRead(rowdata[i], 3)) setPixel(z+i,y + 4);
    if (bitRead(rowdata[i], 4)) setPixel(z+i,y + 3);
    if (bitRead(rowdata[i], 5)) setPixel(z+i,y + 2);
    if (bitRead(rowdata[i], 6)) setPixel(z+i,y + 1);
    if (bitRead(rowdata[i], 7)) setPixel(z+i,y + 0);
  }
}

void SSD1306::drawKanji32(int x, int y, byte *rowdata) {
  int z;
  z = x - 16;
  for (int i = 0; i < 16; i++) {
    if (bitRead(rowdata[i],  0)) setPixel(x+i,y + 7);
    if (bitRead(rowdata[i],  1)) setPixel(x+i,y + 6);
    if (bitRead(rowdata[i],  2)) setPixel(x+i,y + 5);
    if (bitRead(rowdata[i],  3)) setPixel(x+i,y + 4);
    if (bitRead(rowdata[i],  4)) setPixel(x+i,y + 3);
    if (bitRead(rowdata[i],  5)) setPixel(x+i,y + 2);
    if (bitRead(rowdata[i],  6)) setPixel(x+i,y + 1);
    if (bitRead(rowdata[i],  7)) setPixel(x+i,y + 0);
  }
  y = y + 8;
  for (int i = 16; i < 32; i++) {
    if (bitRead(rowdata[i], 0)) setPixel(z+i,y + 7);
    if (bitRead(rowdata[i], 1)) setPixel(z+i,y + 6);
    if (bitRead(rowdata[i], 2)) setPixel(z+i,y + 5);
    if (bitRead(rowdata[i], 3)) setPixel(z+i,y + 4);
    if (bitRead(rowdata[i], 4)) setPixel(z+i,y + 3);
    if (bitRead(rowdata[i], 5)) setPixel(z+i,y + 2);
    if (bitRead(rowdata[i], 6)) setPixel(z+i,y + 1);
    if (bitRead(rowdata[i], 7)) setPixel(z+i,y + 0);
  }
}

やっつけですが動きます^^; (文字間1pixel空けたら縦64pixelで納まらなかったので横並びです)

 

真面目にするなら以下の改良を...

1. 今はいちいちシリアルコンソールにビットパターンを表示させているが、
一旦コードが動いたらOLEDへの描画のみに変更する

2. 漢字ROMはJIS区分コード指定なので、
これをどうにかしないとネットから呼んだ非ASCIIな文字を表示出来ない

 解決方法は2つのうちいずれか

  a. UTF8とかからJIS区分コードに変換する
     テーブルを使うしか無く、Arduinoではメモリの問題で難しかったがESP8266では容量はいけそう、
     あと最近みつけたコレがあるので、UTF8-->Shift JISは出来ます
     Shift JIS-->JIS区分コード はココ辺りを参考に計算出来ます
     少し作業すればテーブルを直接、UTF8-->JIS区分コードに出来るでしょう

  b. 漢字ROMをUTF8やらUNICODEで検索出来るよう再構築する

 漢字ROMの再構築は作業中で、既にやった人もいるので今回は手持ちのROMを活用すべくコード変換で

 

そもそもESP8266のflash内にファイルシステムを作って(上述のテーブルで既にやってるし、IDEにプラグイン導入済み)フォント自体を持つ方法もあるが、それはそれということで^^;

おまけ

文字間隔 0pixelでもまあ大丈夫か
しかしスピードが駄目だ、1文字ずつdispaly.displayしてみたら、
感覚的には1文字0.5秒くらいかかってる^^;

やはりROMは内蔵か、アクセススピードは相当速いはず

 

追記
外付けSPI漢字ROMの読み込みの感じを見るのに、一回読み込んだフォントを
連続で画面一杯書いてみた

これだと目で追えるが大分早い
ROMの格納フォーマットがbitを縦方向にしてるので、素早く縦横入れ替えがしんどい
ROMを丸ごとESP8266のflashに入れてしまおうか...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 






コメント ( 0 ) | Trackback ( )


« ESP-WROOM-02... ESP8266でQVGA... »
 
コメント(10/1 コメント投稿終了予定)
 
コメントはありません。
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。