SSD1306 OLEDディスプレイはArduinoやESP32などで広く使われていますが、多くのライブラリは画面バッファを使用するため、小容量RAMしか持たないATtiny202では利用が難しいという問題があります。
そこで今回、ATtiny202やATtiny402、ATtiny404でも利用できる超軽量SSD1306ライブラリ「TinySSD1306」を作成しました。
このライブラリは画面バッファを持たず、文字データを直接OLEDへ送信する方式を採用しています。そのためRAM使用量はわずか約16バイトで動作します。
また、AQM1602液晶モジュールのような感覚で利用できるシンプルなAPIを採用しており、初心者の方でも簡単に扱うことができます。
今回はライブラリの特徴や使い方、GitHubからの導入方法について紹介します。
TinySSD1306
TinySSD1306とは
TinySSD1306は、ATtiny202・ATtiny402・ATtiny404などの小容量RAMを搭載したAVRマイコン向けに開発した超軽量SSD1306 OLEDライブラリです。
一般的なSSD1306ライブラリでは画面全体をメモリ上に保持するフレームバッファ方式を採用していますが、TinySSD1306は文字データを直接OLEDへ送信することでメモリ使用量を大幅に削減しています。
そのため、RAM容量がわずか128バイトしかないATtiny202でも利用できるのが大きな特徴です。
また、AQM1602液晶モジュールのような感覚で扱えるシンプルなAPIを採用しており、
oled.begin();
oled.setCursor(0,0);
oled.print("Hello");のように簡単なコードで文字表示を行うことができます。
現在は英数字や記号の表示、数値表示に対応しており、温度計や時計、センサー表示などの用途に適しています。
開発した理由
ATtiny202やATtiny402、ATtiny404は非常に小型で低価格なマイコンですが、RAM容量が限られているため、一般的なSSD1306ライブラリをそのまま使用することが難しい場合があります。
SSD1306 OLEDディスプレイ用のライブラリの多くは、画面全体の表示内容をメモリ上に保持するフレームバッファ方式を採用しています。128×64ドットのSSD1306では、画面バッファだけで約1024バイトのRAMが必要になります。
しかし、ATtiny202のRAMは128バイトしかありません。そのため、一般的なSSD1306ライブラリを使用することは現実的ではなく、OLED表示をあきらめるか、より大きなマイコンを選択する必要がありました。
そこで、「必要最小限の機能に絞ればATtiny202でもSSD1306を扱えるのではないか」と考え、このライブラリの開発を始めました。
TinySSD1306では画面バッファを持たず、表示したい文字データを直接OLEDへ送信する方式を採用しています。そのためRAM使用量を大幅に削減でき、小容量RAMしか持たないATtiny202でも利用できるようになりました。
また、私自身がAQM1602液晶をよく使用していることから、
oled.print("TEMP=");
oled.print(temp);
oled.setCursor(0,2);
oled.print("Hello");のように、AQM1602ライクな感覚で扱えるシンプルなAPIを目指しました。
高機能なグラフィック表示や描画機能はありませんが、「温度表示」「時計表示」「カウンター表示」など、文字中心の用途であれば十分実用的に使用できます。
ATtiny202クラスの小さなマイコンでも気軽にOLED表示を利用できるようにしたい、という思いから開発したライブラリです。
一般的なSSD1306ライブラリとの違い
SSD1306 OLEDディスプレイ用のライブラリとしては、Adafruit SSD1306やU8g2などが広く利用されています。これらのライブラリは文字表示だけでなく、線や円の描画、ビットマップ表示など多彩な機能を備えています。
しかし、その高機能さと引き換えに画面全体をメモリ上に保持する「フレームバッファ」を使用しています。128×64ドットのSSD1306では約1024バイトのRAMが必要になるため、ATtiny202のような小容量RAMのマイコンでは利用が困難です。
TinySSD1306は、この問題を解決するために設計しました。
最大の特徴はフレームバッファを持たないことです。表示したい文字データを直接SSD1306へ送信するため、大量のRAMを必要としません。
その結果、
- RAM使用量:約16バイト
- Flash使用量:約1.8KB
- ATtiny202 / ATtiny402 / ATtiny404対応
という軽量な構成を実現しています。
また、一般的なSSD1306ライブラリでは、
display.clearDisplay();
display.setCursor(0,0);
display.print("Hello");
display.display();のように画面バッファへ描画した後、最後に画面へ転送する処理が必要です。
一方、TinySSD1306ではAQM1602液晶と同じ感覚で、
oled.clear();
oled.setCursor(0,0);
oled.print("Hello");と記述するだけで表示できます。
そのため、小型AVRマイコンで温度表示や時計表示、センサー値表示などを行う用途に適しています。
高機能なグラフィック描画には向きませんが、「文字を表示するための超軽量SSD1306ライブラリ」として設計されていることが、一般的なSSD1306ライブラリとの大きな違いです。
| 項目 | 一般的なSSD1306ライブラリ | TinySSD1306 |
|---|---|---|
| フレームバッファ | 必要 | 不要 |
| RAM使用量 | 約1024バイト以上 | 約16バイト |
| グラフィック描画 | ○ | × |
| 文字表示 | ○ | ○ |
| ATtiny202対応 | △ | ○ |
| API | SSD1306系 | AQM1602ライク |
動作環境
- ATtiny202
- ATtiny402 (202でも動きますがこちらを推奨します)
- ATtiny404
- SSD1306 128×64 OLED
- SoftI2C_VPORT対応
今回の接続図です。

GitHubからライブラリをダウンロード
ライブラリーはGitHubここからダウンロードしてください
GitHub
↓
Code
↓
Download ZIP
通常はダウンロードフォルダに下図のようにダウンロードされます。

次にRdのideにダウンロードファイルをライブラリーとして指定します。

ライブラリの主な機能
対応している機能
oled.begin();
oled.clear();
oled.home();
oled.setCursor();
oled.print("Hello");
oled.print(123);対応文字
A-Z
a-z
0-9
- . : , ; ! ? + = / * ( ) % # & _サンプルプログラム
#include <SoftI2C_VPORT.h>
#include <TinySSD1306.h>
SoftI2C_VPORT i2c(1, 2);
TinySSD1306 oled(i2c);
int counter = 0;
void setup()
{
i2c.begin();
oled.begin();
oled.print("TinySSD1306");
}
void loop()
{
}実際のコンパイル結果(サンプルプログラム)
最大2048バイトのフラッシュメモリのうち、スケッチが1694バイト(82%)を使っています。
最大128バイトのRAMのうち、グローバル変数が16バイト(12%)を使っていて、ローカル変数で112バイト使うことができます。

まとめ
TinySSD1306は、ATtiny202のような小容量RAMしか持たないマイコンでもSSD1306 OLEDを利用できることを目標に開発した超軽量ライブラリです。
画面バッファを持たないシンプルな構成にすることで、RAM使用量約16バイトという非常に小さなメモリ消費で動作します。
また、AQM1602ライクな使いやすいAPIを採用しているため、文字列や数値を簡単に表示できるのも特徴です。
ライブラリはGitHubで公開していますので、ATtiny202やATtiny402、ATtiny404でSSD1306を使ってみたい方はぜひ試してみてください。
今後も機能追加や改善を行いながら、より使いやすいライブラリへ育てていきたいと思います。


