Arduino(アルディーノ)を使って電子工作をしていると、センサーやディスプレイなど、さまざまな部品を扱います。特に、小型で高精細な「OLED(有機EL)ディスプレイ」は、プロジェクトの結果を表示させるのに非常に人気があります。
しかし、いざOLEDディスプレイ(今回は「NFP1315-61AY 1.3インチ 128×64」を想定)を接続してスケッチ(プログラム)を書き込んでも、「うんともすんとも言わない」「エラーが出る」という壁にぶつかることがあります。
本記事では、ArduinoでOLEDディスプレイを使おうとして陥りがちな「ライブラリの選定ミス」と、その正しい解決策について、順を追って詳しく解説します。
遭遇したエラー:fatal error: LiquidCrystal_I2C.h: No such file or directory
まず、以下のようなコードを書き込みました。これは、一般的なI2C接続の「LCD」を動かす際によく使われるものです。
// 失敗したコード例
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // ← このライブラリを使おうとした
// I2Cアドレス0x27、16x2のLCDを使用
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.begin(16, 2);
lcd.backlight();
lcd.print("Hello, World!");
}
void loop() {
// 何もしない
}
このコードをコンパイル(検証)すると、以下のようなエラーメッセージが表示されました。
fatal error: LiquidCrystal_I2C.h: No such file or directory
compilation terminated.
このエラーメッセージだけを見ると、「LiquidCrystal_I2C.h
というライブラリがインストールされていないからだ」と考えてしまいがちです。
しかし、根本的な問題はそこではありませんでした。
最大の原因:使用するデバイスとライブラリのミスマッチ
今回使用しようとしているのは「NFP1315-61AY 1.3インチ OLED ディスプレイ」です。
一方で、エラーが出たコードで使おうとしていたライブラリ LiquidCrystal_I2C.h は、**「キャラクタLCD」**を動かすためのものです。
この2つは、見た目や接続方法(I2C)が似ているかもしれませんが、制御方法が全く異なるデバイスです。
- キャラクタLCD (Liquid Crystal Display)
LiquidCrystal_I2C.h
が対応する製品。- 主に「16文字×2行」や「20文字×4行」といった、決まった文字数を表示するためのディスプレイです。
- 例:温度計の数値や、簡単なメッセージ表示に使われます。
- ピクセル単位での自由な描画はできません。
- OLED (Organic Light Emitting Diode)
- 今回使用する「NFP1315-61AY」はこちら。
- 「128×64」のように、ピクセル(点の集まり)で構成されています。
- 文字だけでなく、図形や画像も自由に描画できるディスプレイです。
- 制御するためには、ピクセル単位で描画をサポートする別のライブラリが必要です。
つまり、「OLEDディスプレイ」を動かそうとしているのに、「キャラクタLCD」用のライブラリを使おうとしていたことが、今回の失敗の根本的な原因でした。
OLED(NFP1315-61AY)を動かす正しい手順
OLEDディスプレイ(多くの場合、SSD1306というコントローラチップが内蔵されています)をArduinoで動かすには、専用のライブラリが必要です。最も一般的に使われるのが、Adafruit社が提供するライブラリです。
1. 必要なライブラリを準備する
以下の2つのライブラリが必要になります。
- Adafruit SSD1306
- SSD1306コントローラ(OLED)とI2CやSPIで通信し、ディスプレイを制御するためのライブラリです。
- Adafruit GFX Library
- 文字、図形(線、円、四角形など)を描画するための基本的なグラフィックス機能を提供するライブラリです。
Adafruit SSD1306
は、このGFX
ライブラリの機能を使って画面に描画します。
- 文字、図形(線、円、四角形など)を描画するための基本的なグラフィックス機能を提供するライブラリです。
2. ライブラリのインストール方法
Arduino IDE(開発環境)を開き、以下の手順でライブラリをインストールします。
- 上部メニューの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理…」を選択します。
- ライブラリマネージャの検索ボックスに「Adafruit SSD1306」と入力します。
- 表示された「Adafruit SSD1306」を選択し、「インストール」をクリックします。(依存ライブラリとして
Adafruit GFX
も一緒にインストールするか尋ねられたら、「Install all」を選択してください) - もし
Adafruit GFX
が自動でインストールされない場合は、同様に検索ボックスで「Adafruit GFX Library」を検索し、インストールします。
3. OLED用のサンプルコード
ライブラリの準備ができたら、以下のスケッチ(コード)をArduinoに書き込みます。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLEDの画面サイズを定義 (1.3インチは 128x64 が一般的)
#define SCREEN_WIDTH 128 // 画面の幅
#define SCREEN_HEIGHT 64 // 画面の高さ
// I2C通信のリセットピン (-1 はリセットピンを使用しない設定)
#define OLED_RESET -1
// I2Cアドレスの定義 (0x3C が非常に多いですが、0x3Dの場合もあります)
#define SCREEN_ADDRESS 0x3C
// Adafruit_SSD1306ライブラリの初期化
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
// シリアルモニタを開始 (デバッグ用)
Serial.begin(115200);
// I2C通信を開始
Wire.begin();
// OLEDディスプレイの初期化
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // 初期化失敗時はここで停止
}
// --- ここから描画処理 ---
display.clearDisplay(); // 画面全体をクリア
display.setTextSize(1); // 文字サイズを1に設定
display.setTextColor(SSD1306_WHITE); // 文字色を白に設定
display.setCursor(0,0); // 表示位置を左上(0, 0)に設定
display.println(F("Hello, OLED!")); // 文字列を表示
display.display(); // 画面に描画内容を反映
}
void loop() {
// loop内では何もしない
}
4. 配線の確認
配線はI2C通信の基本通りです。Arduino UnoやNanoの場合、以下のようになります。
Arduinoピン | OLEDピン | 役割 |
5V | VCC (またはVDD) | 電源 |
GND | GND | 接地 |
A4 | SDA | データ線 |
A5 | SCL | クロック線 |
※OLEDによっては3.3V駆動が推奨される場合もありますが、多くのモジュールは5Vで動作します。
それでも動かない時は?(I2Cアドレスの確認)
上記のコードを試してもOLEDに何も表示されない場合、I2Cアドレスが間違っている可能性があります。
OLEDのI2Cアドレスは 0x3C であることが多いですが、製品によっては 0x3D など異なる場合があります。
このような時は、「I2Cスキャナ」というスケッチを使って、Arduinoに接続されているI2Cデバイスのアドレスを特定します。
I2Cスキャナのコード
以下のスケッチをArduinoに書き込み、シリアルモニタを開いてください。(通信速度は 115200 bps に設定してください)
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("\nI2C Scanner");
}
void loop() {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16)
Serial.print("0");
Serial.print(address, HEX);
Serial.println(" !");
nDevices++;
} else if (error == 4) {
Serial.print("Unknown error at address 0x");
if (address < 16)
Serial.print("0");
Serial.println(address, HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // 5秒待機して再スキャン
}
シリアルモニタに I2C device found at address 0x3C のように表示されたら、それがOLEDのアドレスです。
もし 0x3D など別のアドレスが表示された場合は、OLED用のサンプルコード(Adafruit_SSD1306を使ったコード)の以下の部分を修正してください。
// 修正前
// #define SCREEN_ADDRESS 0x3C
// 修正後 (例: 0x3Dだった場合)
#define SCREEN_ADDRESS 0x3D
まとめ:正しいライブラリ選びが成功の鍵
今回のトラブルを振り返ります。
- 失敗の原因: 「OLEDディスプレイ」に対して、文字表示専用の「キャラクタLCD」用ライブラリ(
LiquidCrystal_I2C.h
)を使おうとしたこと。 - OLEDの正しいライブラリ:
Adafruit_SSD1306
とAdafruit_GFX
を使う。 - キャラクタLCD用のライブラリ:
LiquidCrystal_I2C.h
は、16×2や20×4の文字専用LCDを使うときに使用する。 - トラブルシューティング: I2C接続がうまくいかない時は、「I2Cスキャナ」でデバイスのアドレスを確認する。
Arduinoで新しい部品を使う際は、「その部品が何なのか(OLEDなのか、LCDなのか)」を正確に把握し、それに適したライブラリを選ぶことが非常に重要です。エラーメッセージに惑わされず、根本的な原因を探ることで、スムーズにプロジェクトを進めることができます。