ArduinoでOLEDディスプレイに文字を表示する方法。配線からハマりどころまで一気に解決する。
配線を合わせたはずなのに画面が真っ白のまま——ArduinoのOLED表示で最初につまずくポイントを、原因の仕組みから実際のコード例まで初心者向けに解説します。
01なぜOLED表示でつまずくのか
結論から言うと、Arduinoで有機ELディスプレイ(OLED)に何も表示されない場合、原因の大半は「I2Cアドレスの指定間違い」と「SDA・SCLの配線ミス」の2つに集約されます。よく使われるSSD1306搭載のOLEDモジュールは、製品によってI2Cアドレスが0x3Cまたは0x3Dのいずれかに設定されており、サンプルコードのアドレスがそのまま自分のモジュールに合うとは限りません。
電子工作を始めたばかりのEさんは、通販で購入した0.96インチのOLEDモジュールをArduino Unoに接続し、公式サンプルのssd1306_128x64_i2cをそのまま書き込んだが、画面には何も表示されなかった。配線を何度確認しても間違いが見当たらず数時間悩んだ末、I2Cスキャナースケッチを実行したところ、コード内で指定していた0x3Dではなく0x3Cが実際のアドレスだったことが判明。アドレスを書き換えた瞬間に画面が表示された、という顛末は初心者が非常によく通る道です。
OLED表示のトラブルシューティングは「配線を疑う前に、まずI2Cアドレスをスキャンして確認する」という順番にするだけで解決時間が大幅に短縮できます。本記事ではこの順番を軸に手順を組み立てています。
この後の章では、OLEDとSSD1306の基本、表示の仕組み、SH1106など類似デバイスとの違い、そして実際に文字を表示するまでの手順を順番に解説していきます。
02OLED(SSD1306)とArduinoの基礎知識
OLED(有機ELディスプレイ)とは、電圧をかけると自ら発光する有機化合物を使ったディスプレイです。バックライトが不要なため消費電力が少なく、黒い部分が完全に発光しないコントラストの高さが特徴で、Arduinoのようなマイコンでの小型情報表示によく使われます。
SSD1306は、こうしたモノクロ有機ELディスプレイを制御するための代表的なドライバICです。Adafruit社が公開しているArduino向けライブラリ「Adafruit_SSD1306」は、128×64および128×32ピクセルのモノクロSSD1306搭載OLEDに対応しており、I2CまたはSPIで通信できると公式リポジトリで説明されています。文字や図形の描画には、このライブラリと組み合わせて使う「Adafruit GFX Library」も必要です。
Arduinoは、イタリア発のオープンソースハードウェアプラットフォームで、趣味の電子工作からプロトタイピングまで幅広く使われるマイコンボードとその開発環境(Arduino IDE)を指します。OLEDのようなI2Cデバイスとの通信には、Arduino標準の「Wire」ライブラリが使われ、多くのArduinoボードではSDA・SCLという2本の信号線でI2C通信を行います。
03表示の仕組みと技術的背景
ArduinoからOLEDに文字を表示する処理は、大きく分けて「①I2CでSSD1306に接続する」「②画面バッファに描画内容を書き込む」「③バッファの内容を一括で画面に転送する」という3段階で成り立っています。Adafruit_SSD1306ライブラリを使った基本的なコードは次のようになります。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLEDの横ピクセル数
#define SCREEN_HEIGHT 64 // OLEDの縦ピクセル数(128x32モデルの場合は32)
#define OLED_RESET -1 // リセットピン未使用の場合は-1
#define SCREEN_ADDRESS 0x3C // I2Cアドレス(0x3Cまたは0x3D。要スキャン確認)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
// ディスプレイを初期化。アドレスが違うと何も表示されない
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("SSD1306の初期化に失敗しました");
while (true); // 停止
}
display.clearDisplay(); // 画面バッファをクリア
display.setTextSize(1); // 文字サイズ(1〜複数倍で指定)
display.setTextColor(SSD1306_WHITE); // モノクロOLEDでは白のみ
display.setCursor(0, 0); // 描画開始座標(x, y)
display.println("Hello, OLED!");
display.display(); // バッファの内容を実際の画面に転送
}
void loop() {
}
ポイントはdisplay.print()やdisplay.drawLine()などの描画関数を呼んだ時点ではまだ画面に反映されず、最後にdisplay.display()を呼び出して初めてバッファの内容が画面に転送されるという点です。この2段階方式により、複数の描画を組み合わせてから一括で画面を更新でき、ちらつきを抑えられます。
もう一つの重要なポイントがI2Cアドレスです。Adafruit SSD1306のサンプルスケッチではデフォルトでI2Cアドレスが0x3Dに指定されているが、実際のハードウェアでは0x3Cで動作するケースが多く、アドレスが合わない場合は表示されないことが複数の技術記事で報告されています。手元のモジュールの実アドレスが分からない場合は、Arduinoコミュニティで広く使われているI2Cスキャナースケッチを実行することで、接続されているI2Cデバイスのアドレスを特定できます。
編集部で確認した複数の実装例を横断すると、0.96インチ・128×64ピクセルのSSD1306搭載OLEDモジュールでは0x3C、0.91インチ・128×32ピクセルのモデルでは0x3Cまたは0x3Dが使われるケースが多い傾向が見られました。ただしこれは購入元・ロットによって差があるため、必ず自分のモジュールでI2Cスキャナーを実行して確認することを推奨します。
04比較:SSD1306/SH1106/有機ELとLCD
| 項目 | A:SSD1306(OLED) | B:SH1106(OLED) | C:16×2キャラクタLCD |
|---|---|---|---|
| 表示方式 | 有機EL(自発光) | 有機EL(自発光) | 液晶(バックライト式が多い) |
| 対応ライブラリ例 | Adafruit_SSD1306 | U8g2など専用ライブラリ | LiquidCrystal(Arduino標準) |
| 表示できる内容 | 文字・図形・グラフィックを自由描画 | 文字・図形・グラフィックを自由描画 | 基本は英数字・カナのみ |
| 初心者への向きやすさ | 情報が多く導入しやすい | SSD1306用コードの流用に一手間必要 | 配線・コードともに最もシンプル |
| 参考 | Adafruit_SSD1306(GitHub) | 編集部見解 | 編集部見解 |
※「初心者への向きやすさ」欄は編集部見解によるものです。購入したモジュールのドライバICは商品ページや基板の刻印で必ず確認してください。
結論として、購入したOLEDモジュールがSSD1306搭載であれば、情報量が多くコミュニティのサポートも厚いAdafruit_SSD1306ライブラリから始めるのが最短ルートです。SH1106搭載モジュールを誤ってSSD1306用コードで動かそうとすると、表示が歪んだり真っ暗のままになったりすることがあるため、購入前に型番を確認しておくと余計なトラブルシューティングを避けられます。
05実践:5ステップで文字を表示する
OLEDとArduinoをI2Cで配線する
OLEDモジュールのVCCを5V(または3.3V、モジュール仕様による)、GNDをGND、SDAをArduino UnoのA4、SCLをA5に接続します。ボードによってSDA/SCLのピン番号は異なるため、使用するArduinoの仕様を確認してください。
配線初挑戦のFさんは、SDAとSCLを逆に接続してしまい画面が反応しないというトラブルに遭遇。テスターでの導通確認と、モジュール側の端子表記(SDA/SCL)を再度見比べることで誤配線に気づき、正しく接続し直したところ無事に表示された、というのはよくあるつまずきパターンです。
Adafruit_SSD1306とAdafruit_GFXライブラリをインストールする
Arduino IDEの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」から「Adafruit SSD1306」を検索してインストールします。依存関係として「Adafruit GFX Library」のインストールを確認するダイアログが出た場合は、あわせてインストールしてください。
I2Cスキャナースケッチで実際のアドレスを確認する
Arduinoコミュニティで広く使われているI2Cスキャナースケッチを書き込み、シリアルモニタ(通信速度9600bpsが一般的)を開いて実行します。検出されたアドレス(多くの場合0x3Cまたは0x3D)を控えておきます。
編集部での確認では、I2Cスキャナーを一度実行してアドレスを確定させるという一手間を最初に挟むだけで、その後の「表示されない」系トラブルの切り分けにかかる時間が大幅に短縮できました。特に初めてOLEDを使う場合は、サンプルコードを直接書き込む前にこのステップを踏むことを強く推奨します。
サンプルコードのアドレスを実機に合わせて書き換える
第3章のサンプルコードのSCREEN_ADDRESSを、ステップ3で確認した実際のアドレスに書き換えます。SCREEN_WIDTH・SCREEN_HEIGHTも、購入したモジュールの解像度(128×64または128×32)に合わせて設定してください。
書き込んで表示を確認し、レイアウトを調整する
コードをArduinoに書き込み、文字が正しく表示されることを確認します。表示位置がずれる場合はsetCursor(x, y)の座標を、文字が小さすぎる/大きすぎる場合はsetTextSize()の値を1〜4程度の範囲で調整して見やすい表示に仕上げます。
06注意点・よくある誤解
誤解1:どのOLEDモジュールでも同じコードで動くはず
見た目が似ていても、搭載されているドライバIC(SSD1306かSH1106かなど)が異なると同じライブラリでは正しく動作しません。購入前に商品ページや基板の刻印でドライバICの型番を確認する習慣をつけましょう。
誤解2:display.print()を呼べば即座に画面へ反映される
実際には描画関数はすべてメモリ上のバッファへの書き込みであり、最後にdisplay.display()を呼ばない限り画面には何も表示されません。「コードは通っているのに表示されない」というトラブルの多くはこの呼び出し忘れが原因です。
誤解3:文字色を自由に変えられるはず
モノクロのSSD1306 OLEDでは、表示できる色は基本的に「点灯(白)」か「消灯(黒)」の2値のみです。カラー表示をしたい場合はSSD1306ではなく、カラー対応の有機ELモジュール(別のドライバICを使用)を選ぶ必要があります。
07よくある質問
参考文献
- Adafruit「Adafruit_SSD1306」GitHubリポジトリ, 2026年, https://github.com/adafruit/Adafruit_SSD1306
- Arduino公式サイト, 2026年, https://www.arduino.cc/
- Qiita「Arduino > OLED > adafruitライブラリ」2018年, https://qiita.com/sugasaki/items/7df0fec82b232c41c2d2
※出典の明記がない数値・シナリオは「編集部見解」または「編集部想定シナリオ」として本文中に明示しています。
コメント