ATtiny202でSSD1306を動かす!RAMわずか16バイトの超軽量「TinySSD1306」ライブラリを公開しました

ATtiny202・ATtiny402・ATtiny404で使用できる超軽量SSD1306 OLEDライブラリ「TinySSD1306」の紹介イメージ。RAM約16バイトで動作するOLED表示ライブラリを表現したアイキャッチ画像。ATtiny202でSSD1306を動かす!RAMわずか16バイトの超軽量「TinySSD1306」ライブラリを公開しました
スポンサーリンク

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対応
APISSD1306系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()
{
}

実際のコンパイル結果(サンプルプログラム)

まとめ

TinySSD1306は、ATtiny202のような小容量RAMしか持たないマイコンでもSSD1306 OLEDを利用できることを目標に開発した超軽量ライブラリです。

画面バッファを持たないシンプルな構成にすることで、RAM使用量約16バイトという非常に小さなメモリ消費で動作します。

また、AQM1602ライクな使いやすいAPIを採用しているため、文字列や数値を簡単に表示できるのも特徴です。

ライブラリはGitHubで公開していますので、ATtiny202やATtiny402、ATtiny404でSSD1306を使ってみたい方はぜひ試してみてください。
今後も機能追加や改善を行いながら、より使いやすいライブラリへ育てていきたいと思います。

タイトルとURLをコピーしました