ArduinoでOLEDの表示テストをします。使うのは、Amazonから購入したHeiLetgoの0.96インチ128×64ドットのI2C接続のもので、文字色は白です。
このOLEDに使われてるコントローラは、SSD1306です。同じようなものが秋月電子でも販売されています。
SSD1306を使ったOLEDの表示に利用できるArduinoのライブラリは、いくつかありますが、今回は、Adafruit_SSD1306.h u8glib.h SSD1306AsciiAvrI2c.h で文字「Hello World!」を表示させてみます。
Arduinoは、Arduino Pro Miniを使い次の回路図のように配線します。
まず、Adafruitのライブラリを使ってみます。まず、ライブラリーマネージャ、またはGitHubから「Adafruit GFX Library」と「Adafruit SSD1306」をインストールします。 GitHubは、こちら。
Qiitaのこちらのページのスケッチで。「Hello World!」を表示させてみました。
フォントがやや粗いのですが、setCursor(x,y) (x=0~128,y=0~63)でディスプレイ内のどの位置からも表示可能です。文字の大きさは、setTextSize(n) n=1,2,3・・で設定できます。グラフィックスの表示できますが、今回は文字だけのテストをしました。
このライブラリーは、メモリをたくさん使います。この文字を表示するだけで、フラッシュメモリの42%を使いました。
==========================================================
次に、u8glibを使って「Hello World!」を表示してみます。
u8glibをライブラリマネージャまたはGitHubからインストールします。GitHubは、こちら。
サンプルスケッチの中から「HelloWorld.ino」をArduino Pro Miniに書き込んでOLEDに表示させました。
Adafruitより、なめらかな表示になりました。サンプルスケッチから必要な部分だけ取り出したスケッチは次のようになります。
-------------------------------------------------------------------------------
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
void draw(void) {
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 0, 22, "Hello World!");
}
void setup() {
u8g.setColorIndex(1); // pixel on
}
void loop() {
// picture loop
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
delay(50);
}
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
void draw(void) {
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 0, 22, "Hello World!");
}
void setup() {
u8g.setColorIndex(1); // pixel on
}
void loop() {
// picture loop
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
delay(50);
}
-------------------------------------------------------------------------------
文字の位置は、u8g.drawStr( x, y, " ");のx=0~128,y=0~63で設定します。
フォントもいろいろ利用でき、グラフィックスも表示できます。
この表示で、フラッシュメモリの約30%を使います。
このライブラリは、コンパイルに長い時間がかかりました。
============================================================
最後に、SSD1306Asciiというライブラリを使ってみます。
このライブラリは、文字表示専用のライブラリで、グラフィックスは使えないのですが、様々なフォントが使え、メモリの消費量が少ないのが特徴です。
これもライブラリーマネージャまたは、GitHubからライブラリをインストールします。GitHubは、こちら。
サンプルスケッチの中から、HelloWorldAvrI2c.inoを選び、フォントをTimesNewRoman16にして、「Hello World!」を表示させました。
サンプルスケッチから必要な部分だけを抜き出したスケッチです。
----------------------------------------------------------------------------------
#include <SSD1306AsciiAvrI2c.h>
SSD1306AsciiAvrI2c oled;
void setup() {
oled.begin(&Adafruit128x64, 0x3C);
oled.setFont(TimesNewRoman16);
oled.clear();
oled.setCursor(0, 2);
oled.print("Hello World!");
}
void loop() {
}
SSD1306AsciiAvrI2c oled;
void setup() {
oled.begin(&Adafruit128x64, 0x3C);
oled.setFont(TimesNewRoman16);
oled.clear();
oled.setCursor(0, 2);
oled.print("Hello World!");
}
void loop() {
}
----------------------------------------------------------------------------------
このスケッチで、フラッシュメモリの11%を使いました。さすがに文字だけだとメモリの消費量は少ないです。
前の2つのライブラリがグラフィックスで、文字の表示位置を任意に設定できたのに対し、このライブラリは、x方向は、0~127で設定できますが、y方向は0~7の設定で、8ドットごとの位置になります。これは、SSD1306のPage0~Page7に相当します。
以上、3つのライブラリでテストしました。グラフィックスも使う場合は、ug8libが良さそうです。文字だけでメモリの消費量を小さくするには、SSD1306Asciiが良さそうです。
この後、Arduino Pro Mini+Si5351A+OLEDで7MHz VFOを試作してみようと思っています。OLED表示は、SSD1306Asciiを使おうと考えています。