Raspberry Pi Pico WでOLED表示(Arduino)|I2Cが認識しない原因と解決

Raspberry Pi Pico W と 0.96インチOLED(SSD1306)を使って、表示+アニメーションまで動かしました。


環境

  • Raspberry Pi Pico W
  • OLED(SSD1306 / 128×64 / I2C)
  • Arduino IDE

1. Pico Wはそのままでは使えない

最初にハマるのがここ。

Arduino IDEには、最初Pico Wが出てきません

追加するURL

https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json

手順

  • ファイル → 環境設定
  • 「追加のボードマネージャのURL」に貼る
  • ボードマネージャで「pico」を検索
  • Raspberry Pi Pico / RP2040 をインストール

👉 これで Pico W が選べるようになる


2. OLED用ライブラリ

これもハマりポイント。

必要なライブラリ

  • Adafruit GFX Library
  • Adafruit SSD1306

👉 セットで必要


3. 配線(最大の落とし穴)

I2C接続

  • VCC → 3.3V
  • GND → GND
  • SDA → GP4(Pin6)
  • SCL → GP5(Pin7)

Picoのピン対応(重要)

Pin1  GP0
Pin2 GP1
Pin3 GND
Pin4 GP2
Pin5 GP3
Pin6 GP4 ← SDA
Pin7 GP5 ← SCL

👉 GPIO番号とPin番号を混同すると終わる


4. I2Cが認識しない問題

スキャナを回しても何も出ない。

I2C scan start
Scan done

👉 完全に詰む


5. 原因特定(ここが一番重要)

配線は合っているように見える。

そこで発想を変えた。

👉 「そのピン、本当にそこか?」


LEDでピン確認

GPIOを順番に光らせるプログラムを作成。

さらに

👉 シリアルモニタに出しながら確認

void testPin(int pin) {
Serial.print("Testing GP");
Serial.println(pin); pinMode(pin, OUTPUT); digitalWrite(pin, HIGH);
delay(300);
digitalWrite(pin, LOW);
delay(300);
}void setup() {
Serial.begin(115200);
delay(2000);
}void loop() {
for (int i = 0; i < 10; i++) {
testPin(i);
}
}

何が起きたか

Testing GP3 → 光る
Testing GP4 → 光る

👉 つまり接続はここ

Pin5(GP3)
Pin6(GP4)

本来の位置

SDA → GP4(Pin6)
SCL → GP5(Pin7)

👉 SCLが1本ズレていた


6. 修正後

配線を1つ下にずらす


結果

I2C scan start
Found device at 0x3C
Scan done

👉 一発で認識


7. 表示コード

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SCREEN_ADDRESS 0x3CAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);void setup() {
Wire.setSDA(4);
Wire.setSCL(5);
Wire.begin(); display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.println("Hello");
display.display(); // ←重要
}void loop() {}

👉 display.display() を忘れると何も出ない


8. アニメーション

unsigned long lastTime = 0;
int x = 10;
int vx = 1;void loop() {
if (millis() - lastTime >= 50) {
lastTime = millis(); display.clearDisplay(); x += vx;
display.drawCircle(x, 20, 3, SSD1306_WHITE); display.display(); if (x > 124) vx = -1;
if (x < 3) vx = 1;
}
}

👉 端で跳ね返る


9. できること

ここまで来ると、

  • ドット絵キャラ
  • UIメニュー
  • ミニゲーム

👉 たまごっち的なものが作れる


10. 教訓

今回一番重要だったのはこれ👇

👉 「見た目で合っている」は信用しない


最強の切り分け方法

👉 GPIO単体で確認する
👉 シリアルで可視化する

これで一気に解決した。


まとめ

  • Pico Wは最初にボード設定が必要
  • OLEDはライブラリが必要
  • I2Cは配線がすべて
  • 詰まったらGPIOで検証