OLED(SSD1306)用の激軽arduinoライブラリを作る その1
■なぜOLED用の自前のライブラリ
今まで、SSD1306搭載の0.97インチOLED(SPI)とてもコスパが良く気に入っています。どんなのに使っているかというと、
このOLEDを使うことを前提とした「arduino互換のTynyBoard(ATmega328/AVR64DB32)」は言うまでもなく、
STM32F103を使った「ライブ用アームテルミンのサウンドモジュール」や「SynthScope」と、現在開発中のRP2040使用の「FrequencyShifter」など数多くあります。
これらのOLEDの制御ソフトには、ほとんどAdafruit製のライブラリを使用しています。
ATmega328では他に「u8g2」というライブラリも使えるので、スイッチサイエンスで販売しているarduino互換ボードの製品ページでは、両方のドライバの使い方を紹介しています。
https://www.switch-science.com/products/7683
https://www.switch-science.com/products/8276
Adafruitとu8g2のいずれのライブラリも、SRAMに確保したページメモリに描画し、まとめてSSD1306に転送するというごく普通の構成をとっています。
しかし私のような用途には、困った点が2つあります。
ひとつは、ATmega328の2KBしかないSRAMからページメモリを確保するので、半分以上がライブラリで使われてしまい、本来目的のアプリケーションの開発に制約を与えてしまいます。
もうひとつは、「サウンドモジュール」や「FrequencyShifter」は、32bitMPUなのでSRAM消費は気にしなくて良いが、このような音モノアプリでは、オフライン描画したものをまとめてSSD1306に転送する際のオーバーヘッドが問題になります。これらのマイコンでも数msecのオーバーヘッドがあり、その間の割り込みを使わない処理はストールするので、ノイズなど音質劣化に繋がります。
そこで、オフラインのページメモリを使わず、SSD1306の機能を直接使う低レベルライブラリを作ることにしました。