SSD1306 OLEDに必要な設定は?
ページ内の列ごと · LSBファースト 表示メモリにバイトを直接書き込む場合は、ページ内の列ごと、LSBファースト、点灯ピクセル = 1です。
英数字・かな・漢字のテキストや画像を、SSD1306・SH1106・ST7920・Adafruit GFX向けのC配列に変換。12×12/16×16のドットフォントで線がつぶれず、PCtoLCD2002の4種類の走査方式に対応。出所不明の配列の解析もできます。
システムフォントはアンチエイリアス付きのアウトラインなので、約20 px未満では線が途切れたりつぶれたりします。12 pxと16 pxには上のドットフォントを使ってください。
ここに画像をドロップ、またはクリックして選択
PNG、JPG、GIF、BMP、WebP、SVG — ロゴ、アイコン、スクリーンショットなど
画像の暗いピクセルがディスプレイ上の点灯ピクセルになります。透明部分は背景として扱います。
古いプロジェクトやチュートリアルから持ってきたフォント配列の生成方法がわからない?ここに貼り付けると、走査方向とビット順のすべての組み合わせが並べて描画され、正しく読めるものから設定がわかります。
SSD1306 / SSD1309 / SH1106 / ST7565のページメモリ、MicroPythonの framebuf.MONO_VLSB と同じ並びです。バイトをそのままディスプレイに書き込めます。
点灯ピクセル = 1、GNU Unifontの字形です。手元の配列とバイトを見比べれば、どの設定で作られたかがわかります。
| 走査方向 | ビット順 | バイト(16進数) |
|---|---|---|
| 行ごと(横バイト) | MSBファースト — 先頭ピクセルをbit 7に | 01 00 01 00 01 00 01 00 3F F8 21 08 21 08 21 08 21 08 21 08 3F F8 21 08 01 00 01 00 01 00 01 00 |
| 行ごと(横バイト) | LSBファースト — 先頭ピクセルをbit 0に | 80 00 80 00 80 00 80 00 FC 1F 84 10 84 10 84 10 84 10 84 10 FC 1F 84 10 80 00 80 00 80 00 80 00 |
| 列ごと(縦バイト) | MSBファースト — 先頭ピクセルをbit 7に | 00 00 00 00 0F F0 08 20 08 20 08 20 08 20 FF FF 08 20 08 20 08 20 08 20 0F F0 00 00 00 00 00 00 |
| 列ごと(縦バイト) | LSBファースト — 先頭ピクセルをbit 0に | 00 00 00 00 F0 0F 10 04 10 04 10 04 10 04 FF FF 10 04 10 04 10 04 10 04 F0 0F 00 00 00 00 00 00 |
| ページ内の列ごと(縦バイト、SSD1306のページ順) | MSBファースト — 先頭ピクセルをbit 7に | 00 00 0F 08 08 08 08 FF 08 08 08 08 0F 00 00 00 00 00 F0 20 20 20 20 FF 20 20 20 20 F0 00 00 00 |
| ページ内の列ごと(縦バイト、SSD1306のページ順) | LSBファースト — 先頭ピクセルをbit 0に | 00 00 F0 10 10 10 10 FF 10 10 10 10 F0 00 00 00 00 00 0F 04 04 04 04 FF 04 04 04 04 0F 00 00 00 |
| 帯ごとの行(横バイト、幅8ピクセルの帯) | MSBファースト — 先頭ピクセルをbit 7に | 01 01 01 01 3F 21 21 21 21 21 3F 21 01 01 01 01 00 00 00 00 F8 08 08 08 08 08 F8 08 00 00 00 00 |
| 帯ごとの行(横バイト、幅8ピクセルの帯) | LSBファースト — 先頭ピクセルをbit 0に | 80 80 80 80 FC 84 84 84 84 84 FC 84 80 80 80 80 00 00 00 00 1F 10 10 10 10 10 1F 10 00 00 00 00 |
ドットフォント:GNU Unifont(16 px)とFusion Pixel Font(12 px)。いずれもSIL Open Font License 1.1で提供されています。 ライセンス全文
Go Tools エンジニアリングチームが構築し、検証しています。
ページ内の列ごと · LSBファースト 表示メモリにバイトを直接書き込む場合は、ページ内の列ごと、LSBファースト、点灯ピクセル = 1です。
行ごと · MSBファースト 行ごと、MSBファースト、点灯ピクセル = 1。各行はバイト境界まで埋めます。
32バイト どの走査方向でも32バイトです。12 × 12は24バイト、8 × 16のASCII文字は16バイトです。
逆向 = LSBファースト 顺向 = MSBファースト(先頭ピクセルがbit 7)、逆向 = LSBファースト(先頭ピクセルがbit 0)です。
SSD1306、SH1106、ST7565をはじめ、グラフィック表示用のOLED/LCDコントローラーの多くはフォントを内蔵していません。文字を表示するには、ファームウェアがオン/オフのピクセルを並べた小さな格子を表示メモリに書き込みます。1ピクセルが1ビット、8ピクセルで1バイトです。字形をこのバイト列に変換する作業は、中国の組み込み系チュートリアルで「取模」と呼ばれ、Windows用ソフトPCtoLCD2002が長年担ってきました。
ただし、バイト列だけでは足りません。同じ16 × 16の文字でも詰め方は4通り(行ごと、列ごと、ページ内の列ごと、帯ごとの行)あり、それぞれ先頭ピクセルをbit 7に置くかbit 0に置くかを選べます。つまり同じ字形を表すバイト列が8種類でき、ディスプレイが正しく描けるのはそのうち1つだけです。チュートリアルからコピーしたフォントが左右反転したり、上下に割れたり、回転して表示されたりしやすいのはこのためです。
// 中 (16x16), pages of columns, LSB first, lit = 1 — SSD1306 page order
const unsigned char zhong[32] = {
0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00
};
// First 16 bytes = page 0 (rows 0-7), one byte per column, bit 0 = top row ブラウザのフォントはアンチエイリアス付きのアウトラインです。宋体(明朝系)を12 pxで2値化すると、「中」の横画がそっくり消えてしまいます。そこでこのツールは本物のビットマップフォントを同梱しています。16 × 16フォントはGB2312の6,763字をすべて収録し、12 × 12フォントには143のまれな字が欠けているため、それらはシステムフォントで代わりに描画し、その旨を表示します。
行ごと、列ごと、ページ内の列ごと、帯ごとの行の4方式に、それぞれMSBファースト/LSBファースト、点灯ピクセル = 1 / 0を組み合わせられます。名称はPCtoLCD2002に合わせ、その意味はSSD1306のデータシートや一般的なOLEDサンプルプロジェクトと照合してあるので、既存プロジェクトと同じ設定をそのまま選べます。
SSD1306、Adafruit GFX、XBMのいずれかを選べばオプションは自動で設定されます。手動でオプションを変えると、そのバイト順を読むディスプレイとライブラリが表示されます。該当なしの場合もそう表示されます。
出所不明のフォント配列を貼り付けると、走査方向とビット順の8通りの読み方がすべて並べて描画されます。正しく読めたものが設定を教えてくれ、ワンクリックでその設定を適用できます。
ロゴ、アイコン、写真をディスプレイのサイズに合わせて縮小し、しきい値、Floyd–Steinberg、Atkinsonのいずれかで2値化します。透明部分は背景として扱い、しきい値はどのモードでも効きます。
/*"中",0*/ コメント付きのC51形式2次元配列、オフセット付きのArduino PROGMEM、MicroPythonのbytearray辞書、A51のDB行、プレーンな16進数に対応。生成したCコードは -Wall -Wextra -pedantic でも警告なしでコンパイルできます。
中
00 00 F0 10 10 10 10 FF 10 10 10 10 F0 00 00 00 00 00 0F 04 04 04 04 FF 04 04 04 04 0F 00 00 00
32バイト:ページ0(0〜7行目)の16列分、続いてページ1(8〜15行目)の16列分です。7列目の0xFFは全ビットが1で、縦画が両ページの8行すべてを貫いていることを示します。
中
01 00 01 00 01 00 01 00 3F F8 21 08 21 08 21 08 21 08 21 08 3F F8 21 08 01 00 01 00 01 00 01 00
1行2バイトで16行。0x01 0x00 は中央の縦画だけの行です。左端のピクセルが1バイト目のbit 7なので、7列目のピクセルはbit 0に入ります。このバイト列をSSD1306のページ書き込みに渡すと表示が崩れます。字形は同じでも、詰め方が違うからです。
A
00 00 00 00 18 24 24 42 42 7E 42 42 42 42 00 00
ASCII文字は半角幅です。8 × 16は16バイトで、行ごとに走査すると1行1バイトになります。ドライバがすべての字形を16 × 16として扱う場合は、「半角文字(A〜Z、0〜9)も全角のセル幅にする」にチェックを入れてください。
中(12 × 12、行ごと、MSBファースト)
00 00 04 00 04 00 FF E0 84 20 84 20 84 20 FF E0 04 00 04 00 04 00 04 00
12ピクセルの各行には2バイト必要で、2バイト目の下位4ビットは埋め草です。12行 × 2バイト = 24。表示ライブラリはどれも1行を (width + 7) / 8 バイトとして扱うため、ビットをこれ以上詰めるとすべてのライブラリで読めなくなります。
テキストは本物のドットフォントで描画します。12 × 12(Fusion Pixel)または 16 × 16(GNU Unifont)で、ASCIIは半角幅です。ロゴやアイコンは「画像」タブに切り替え、128 × 64 などの出力サイズを指定します。
SSD1306 / SH1106 / ST7565 は、ページ順の縦バイトで最上段のピクセルがbit 0。Adafruit GFX、TFT_eSPI、U8g2 drawBitmap、LVGL は横バイトで左端のピクセルがbit 7。XBM / U8g2 drawXBM は横バイトで左端のピクセルがbit 0です。
プレビューには、実際にエンコードされるビットマップがそのまま表示されます。ピクセルをクリックすると点灯/消灯が切り替わり、シフト欄で字形の位置を微調整できます。
C(PCtoLCD2002のC51形式)、Arduino PROGMEM、MicroPython bytearray、A51アセンブリ、プレーンな16進数から選べます。出力の1行目に走査方向・ビット順・字形サイズが記録されるので、配列そのものが仕様書を兼ねます。
横バイトでビット順を間違えています。Adafruit GFXの drawBitmap() はMSBファースト、XBMとU8g2の drawXBM() はLSBファーストが必要です。
U8g2 drawXBM() にMSBファーストのバイトを渡す
drawXBM() → XBMプリセット(行ごと、LSBファースト)
縦バイトでビット順を間違えています。SSD1306系のコントローラはD0を最上段に置くので、LSBファーストが必要です。
ページ内の列ごと、MSBファースト → SSD1306
ページ内の列ごと、LSBファースト → SSD1306
列ごととページ内の列ごとを取り違えています。両者が同じバイト列になるのは高さ8ピクセル以下の字形だけで、16ピクセルではバイトの並びが変わります。
列ごと → SSD1306のページ書き込み
ページ内の列ごと → SSD1306のページ書き込み
対角線で裏返るのは、横バイトを縦バイトとして(またはその逆に)読んでいるためです。点灯部分が暗く背景が光るなら、ディスプレイが点灯 = 1を想定しているのに点灯 = 0を選んでいます。
行ごとのバイトをSSD1306のページに送る
配列をデコーダタブに貼り付け、正しく読めるプレビューを選ぶ
単位変換
無料オンライン進数変換ツール。2進数、8進数、10進数、16進数および任意の基数(2-36)間で数値を瞬時に変換。BigInt対応で桁数制限なし。登録不要・サーバー送信なし、すべての処理がブラウザ内で完結。コピーボタンやコードリテラル出力で開発作業を効率化。
単位変換
符号付き10進数を入力すると、符号絶対値表現・1の補数・2の補数・ゲタばき表現を4〜64ビットで同時に算出します。ビット列や16進バイトを貼り付ければ、同じパターンの5通りの読み方を並べて確認できます。8ビットの−128に符号絶対値表現と1の補数が存在しないことも明示。すべてブラウザ内で処理、無料、登録不要。
単位変換
Linux のファイル権限(パーミッション)を8進数(755・644)と rwx 記号で相互変換する無料計算ツール。chmod コマンドを自動生成し、chmod 755 の意味や 777 の危険な設定もひと目で確認。すべてブラウザ内で完結します。
単位変換
HEX を RGB、HSL、OKLCH、OKLAB、CMYK にブラウザで変換できます。任意の形式をワンクリックでコピー。無料・登録不要・色データはページから一切送信されません。
単位変換
緯度経度を10進数・度分秒(DMS)・度分(DDM)のどの形式でも、UTM、Web メルカトル、中国の GCJ-02(高徳地図)・BD-09(百度地図)へ変換。lat,lng と lng,lat を自動判別し、GCJ-02 の逆変換は誤差 1 mm 未満、CSV で一括出力。処理はすべてブラウザ内で完結します。
単位変換
HEX カラーを CMYK にブラウザで変換できます。印刷プレビュー向けの sRGB ベースの単純な近似値です。無料・登録不要、色データはローカルから出ません。