電音の歩み

電子楽器を中心とし、ものづくり関係も含めて紹介していきます。

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の機能を直接使う低レベルライブラリを作ることにしました。