ArduinoとI2Cプロトコル(Wire)ガイド

デバイスとセンサー間を、2線シリアルインターフェイスバスで通信します。


Author:Nicholas Zambetti, Karl Söderby, Jacob HylénLast revision:2025/09/30

はじめに

配線を複雑にしないで、プロジェクトに複雑な機能を追加するいい方法は、I2C(Inter-Integrated Circuit)を利用することです。全てのArduinoボードでI2Cプロトコルはサポートされています。数本の配線だけで、センサーやディスプレイ、モータードライバ―など、複数の周辺デバイスを接続することができます。大量に配線せずに、柔軟性が増し、プロトタイピングの速度が向上します。どのように動作するかや、異なる標準にどのように実装されたか、自分自身のI2Cデバイスを構築するためのWireライブラリの使い方を紹介します。

I2Cとは何か?

I2Cプロトコルは、2本の信号線を使いデータを送受信します。一つはシリアルクロックピン(Serial Clock Pin: SCL)で、Arduinoコントローラーボードが定期的にパルスを送信します。もう一つは、シリアルデータピン(Serial Data Pin: SDA)で、2つのデバイス間でデータを送信します。

I2Cでは、コントローラーデバイスが一つあり、一つ以上のペリフェラルデバイスが、コントローラーのSCLとSDAに接続されます。

クロックラインがLOWからHIGHに変わると(クロックパルスの立ち上がり)、1ビットの情報が、SDA線を通じ、ボードからI2Cデバイスに送信されます。クロックラインがパルスを送信し続けると、7ビットか8ビットのアドレスとコマンドやデータが形成されるまで、データが送信されます。この情報がビットごとに送信されると、呼び出されたデバイスは要求を実行し、必要に応じ、コントローラによってSCL上に継続して生成されているクロックを使い、同じデータ線を通じて、データをボードに返します。

I2Cバスに接続されている各デバイスは、コントローラーから独立していますが、コントローラーから要求されると、情報を返信します。

I2Cプロトコルでは、有効なデバイスが個別のアドレスを持ち、コントローラーとペリフェラルデバイスの双方が、一本の信号線で順に通信するので、マイクロコントローラーのたった2本のピンを使うだけで、Arduinoボードは、多くのデバイスや他のボードと(順に)通信することができます。

低位のビットレベルのI2Cメッセージは以下のようになっています。

  • コントローラーは、データピン(SDA)上のI2Cバスを通じて命令を送信します。命令にはアドレスが付与されているので、正しいデバイスだけが受信します。
  • コントローラーが受信したいのか、送信したいのかを区別するビットが付与されています。
  • 想定外の結果を引き起こさないように、各メッセージは応答が必要です。受信側が前の情報を確認すると、コントローラーに知らせ、次のビットの組に進むことができます。
  • 8ビットのデータ
  • 別の確認ビット
  • 8ビットのデータ
  • 別の確認ビット

ところで、コントローラーとペリフェラルはどのようにして、アドレスやメッセージなどがどこから始まり、どこで終わるかを知るのでしょうか? そのために、SCL線があります。これはコントローラーのクロックをデバイスに同期させ、同時に次の命令に進むことを保証します。

しかし、実際には上記のことを考える必要はほとんどありません。Arduinoエコシステムには、全てを取り扱うWireライブラリがあるからです。

ArduinoのI2cピン

以下の表では、異なるボードフォームファクタとI2C用のピンを示します。

Form factor SDA SCL SDA1 SCL1 SDA2 SCL2
UNO SDA/A4 SCL/A5
Nano A4 A5
MKR D11 D12
GIGA D20 D21 D102 D101 D9 D8
Mega & Due D20 D21

I2Cの配線

以下にI2Cブレイクアウトモジュールを配線するいくつかの方法を示します。どれが最適なのかは、モジュールや要件に依存します。

ブレイクアウトボード

ブレッドボード上で電線を直接配線するブレイクアウトモジュールがあります。このようなモジュールをArduinoボードに接続するには、以下のように配線します。

  • VCC* - 5V/3V3ピン(ブレイクアウトモジュールに依存)
  • GND* - GND
  • SDA - SDA
  • SCL - SCL

*ピンの名前はモジュールに依存します。VCCは"VIN"や"+“などです。GNDは、”-“の場合もあります。

センサーをUNO R4 WiFiに接続する例です。

QwiicとSTEMMA QT

ブレイクアウトモジュールやセンサーの市場を調査すると、I2Cプロトコルに関刷る標準が確立された、完全なエコシステムが存在することがわかります。このような標準の例には、Sparkfunが開発したQwiicや、Adafruitが開発したSTEMMA QTがあります。QwiicとSTEMMAは双方とも、I2Cデバイス用に、4ピンのJST SHコネクターを使い、サードパーティが互換性を持ったハードウェアを設計するのを容易にしています。標準コネクターがあることで、デバイスにQwiicやSTEMMA QTの文言があるとUNO R4 WiFiのようにQwiicやSTEMMA QTコネクタを持つArduinoボードで動作することがわかります。

QwiicとSTEMMAは双方とも、SDAとSDLに加え、電源とアース用の電線も一つにまとめた完全なキットです。

両者の違いは?

QwiicとSTEMMAは双方ともI2Cを使っていますが、両方の標準を使うモジュールを詳しく調べても、両者の違いを示すのは難しいかもしれません。しかし違いはあります。この違いは、それらをどのように使うのか、何のために使うのかに関して影響があります。

Qwiicは、コントローラー(ペリフェラルにはありません)に、レベルシフトと電圧調整機能があります。Qwiicは3.3Vロジックのみです。これにより使い方が簡単になり、利用者にとっては、設計や回路を組み立てるときの間違いが一つ減ります。

一方、STEMMA QTにはこれがありません。3.3Vと5Vの両方のロジックをモジュールは使います。これは、回路を組み立てるときに考えることが一つ増えますが、電源やロジックに対する要件に柔軟性をもたらします。

STEMMA QTのピンの順序は、Qwiicのピンの順序と同じです。これにより、2つの標準間で互換性が生じます。

Grove

Groveはもう一つのコネクタの標準で、seeed studioが開発しました。Groveコネクタを持つモジュールは多くありますが、その一部だけがI2Cに対応しています。Groveコネクタを内蔵するArduinoボードはありませんが、ArduinoボードとGroveセンサーを接続するのに、MKR connector carrierNano Grove ShieldArduino Sensor Kitのベースシールドといった製品を使うことができます。

Wireライブラリ

I2Cデバイスとの通信にArduinoが使うのがWireライブラリです。全てのボードパッケージに含まれているので、利用するのに手動インストールは不要です。

Wireライブラリの全てのAPIは、ドキュメントページを参照してください。

  • begin(): I2Cバスを初期化する
  • end(): I2Cバスを閉じる
  • requestFrom(): ペリフェラルデバイスにバイトを要求する
  • beginTransmission(): 送信のキューイングを開始する
  • endTransmission(): キューイングされたバイトを送信し、送信を終了する
  • write(): ペリフェラルからコントローラー、あるいはその逆に、データを書き込む
  • available(): 取得可能なバイト数を返却する
  • read(): ペリフェラルからコントローラーに送信されたバイトを読む
  • setClock(): クロック周波数を変更する
  • onReceive(): ペリフェラルが送信データを受信したときに呼び出す関数を登録する
  • onRequest(): コントローラーがデータを要求したときに呼び出す関数を登録する
  • setTimeout(): コントローラーモードでの送信タイムアウトを設定する
  • clearWireTimeoutFlag(): タイムアウトフラグをクリアする
  • getWireTimeoutFlag(): 最後にフラグがクリアされてから、タイムアウトが発生したか確認する

派生ライブラリ

I2Cプロトコルを利用する、基本的にはすべてのブレイクアウトモジュールを購入したとき、そのセンサーを利用するのを助けるライブラリが付属します。これらのライブラリはWireライブラリ上に構築されていて、内部で利用しています。例えば、温度を容易に取得するために、機能を追加しています。

Adafruit MCP9808モジュールを使うとき、Adafruit_MCP9808ライブラリを、IDEのライブラリマネージャからダウンロードします。これにより、Wireコードを自分で書く代わりに、正しいアドレスに温度データを要求し、センサーの温度データを読み、1行で情報を読むことができるtempsensor.readTempC()のような関数を利用できるようになります。

ライブラリのインストール方法を学ぶには、ライブラリのインストールを参照してください。

スケッチ例

この記事の残りは、I2Cを使い始めるためのスケッチ例を集めたものです。

コントローラリーダー

状況によっては、2つ(以上)のArduinoボードが、互いに情報を共有するように設定することが有効なことがあります。この例では、I2Cシリアル同期プロトコルを通じ、コントローラリーダー/ペリフェラルセンダー構成で、互いに通信するようにプログラムしています。これを実現するため、ArduinoのWireライブラリのいくつかの関数を使います。Arduino1(コントローラ)は、要求を出した後、固有のアドレス持つペリフェラルArduinoから、6バイトのデータを受信するようにプログラムされています。そのメッセージを受信すると、Arduinoソフトウェア(IDE)のシリアルモニタウインドウで、見ることができます。

コントローラリーダーのスケッチ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Wire Controller Reader
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Reads data from an I2C/TWI peripheral device
// Refer to the "Wire Peripheral Sender" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup() {
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
}

void loop() {
  Wire.requestFrom(8, 6);    // request 6 bytes from peripheral device #8

  while (Wire.available()) { // peripheral may send less than requested
    char c = Wire.read(); // receive a byte as character
    Serial.print(c);         // print the character
  }

  delay(500);
}

ペリフェラルセンダーのスケッチ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Wire Peripheral Sender
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Sends data as an I2C/TWI peripheral device
// Refer to the "Wire Master Reader" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup() {
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onRequest(requestEvent); // register event
}

void loop() {
  delay(100);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  Wire.write("hello "); // respond with message of 6 bytes
  // as expected by master
}

コントローラライター

状況によっては、2つ(以上)のArduinoボードが、互いに情報を共有するように設定することが有効なことがあります。この例では、I2Cシリアル同期プロトコルを通じ、コントローラライター/ペリフェラルレシーバー構成で、互いに通信するようにプログラムしています。これを実現するため、ArduinoのWireライブラリのいくつかの関数を使います。Arduino1(コントローラ)は、0.5秒ごとに、固有のアドレス持つペリフェラルArduinoに、6バイトのデータを送信するようにプログラムされています。そのメッセージを受信すると、Arduinoソフトウェア(IDE)を実行しているUSB接続したPCで開いた、ペリフェラルボードのシリアルモニタウインドウで見ることができます。

コントローラーライターのスケッチ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Wire Master Writer
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Writes data to an I2C/TWI Peripheral device
// Refer to the "Wire Peripheral Receiver" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
}

byte x = 0;

void loop()
{
  Wire.beginTransmission(4); // transmit to device #4
  Wire.write("x is ");        // sends five bytes
  Wire.write(x);              // sends one byte  
  Wire.endTransmission();    // stop transmitting

  x++;
  delay(500);
}

ペリフェラルレシーバーのスケッチ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Wire Peripheral Receiver
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Receives data as an I2C/TWI Peripheral device
// Refer to the "Wire Master Writer" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup()
{
  Wire.begin(4);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  while(1 < Wire.available()) // loop through all but the last
  {
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

加速度センサー

このコードは、seeed arduino LSM6DS3 libraryを使い、Grove 6-Axis Accelerometer moduleから加速度データを読みます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "LSM6DS3.h"
#include "Wire.h"

//Create instance of Accelerometer class
LSM6DS3 accelerometer(I2C_MODE, 0x6A);

void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    while (!Serial);

    if (accelerometer.begin() != 0) {
        Serial.println("LSM6DS3 not found, check your wiring.");
    } else {
        Serial.println("LSM6DS3 found!");
    }
}

void loop() {
    //Gyroscope
    Serial.print("\nGyroscope:\n");
    Serial.print(" X1 = ");
    Serial.println(accelerometer.readFloatGyroX(), 4);
    Serial.print(" Y1 = ");
    Serial.println(accelerometer.readFloatGyroY(), 4);
    Serial.print(" Z1 = ");
    Serial.println(accelerometer.readFloatGyroZ(), 4);

    //Accelerometer
    Serial.print("\nAccelerometer:\n");
    Serial.print(" X1 = ");
    Serial.println(accelerometer.readFloatAccelX(), 4);
    Serial.print(" Y1 = ");
    Serial.println(accelerometer.readFloatAccelY(), 4);
    Serial.print(" Z1 = ");
    Serial.println(accelerometer.readFloatAccelZ(), 4);

    delay(1000);
}

I2C BMP280

このコードは、AdafruitのBMP280ブレイクアウトモジュールからI2C経由で、温度を読み取ります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <Wire.h>
#include <Adafruit_BMP280.h>

//Create an instance of the BMP280 sensor
Adafruit_BMP280 bmp;

void setup() {
  Serial.begin(9600);

  // Start the sensor, and verify that it was found
  if (!bmp.begin()) {
    Serial.println("Sensor not found");
    while (1){}
  }

}

void loop() {
  // Read the values
  float temperature = bmp.readTemperature();

  // Print to the Serial Monitor
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" C");

  Serial.println();
  delay(2000);
}

I2C OLED

このコードは、128x64 I2C Grove OLEDにArduinoロゴの一つのバージョンを表示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(128, 64, &Wire, -1);

// The Arduino Logo in a bitmap format
const uint8_t arduinoLogo[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x30, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x70, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0x80, 0x50, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x40, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf0, 0x20, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x01, 0xff, 0xfc, 0x0f, 0xff, 0xe0, 0x07, 0xff, 0xf0, 0x3f, 0xff, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x01, 0xff, 0xc0, 0x00, 0xff, 0xf0, 0x0f, 0xff, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x7f, 0xf8, 0x1f, 0xfc, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00,
  0x00, 0x00, 0x07, 0xfe, 0x00, 0x00, 0x1f, 0xfc, 0x3f, 0xf8, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x0f, 0xfe, 0x7f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x07, 0xff, 0x7f, 0xe0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00,
  0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00,
  0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x01, 0xff, 0xff, 0x80, 0x0f, 0x00, 0x0f, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0x80, 0x07, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x0f, 0x80, 0x07, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x0f, 0x80, 0x07, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x0f, 0x80, 0x03, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xc0, 0x1f, 0xff, 0x00, 0x1f, 0xf8, 0x00, 0xff, 0xf8, 0x03, 0xfc, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xc0, 0x3f, 0xff, 0x00, 0x1f, 0xf8, 0x00, 0xff, 0xf8, 0x03, 0xfc, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xc0, 0x3f, 0xff, 0x00, 0x1f, 0xf0, 0x00, 0xff, 0xf8, 0x03, 0xfc, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xc0, 0x1f, 0xff, 0x00, 0x1f, 0xf8, 0x00, 0xff, 0xf8, 0x03, 0xfc, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x0f, 0x80, 0x03, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x0f, 0x80, 0x07, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x0f, 0x80, 0x07, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0x80, 0x07, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 0x01, 0xff, 0xff, 0x80, 0x0f, 0x00, 0x0f, 0xf8, 0x00, 0x00,
  0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x03, 0xff, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00,
  0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00,
  0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x0f, 0xfe, 0x7f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x07, 0xfe, 0x00, 0x00, 0x1f, 0xfc, 0x3f, 0xf8, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x7f, 0xf8, 0x1f, 0xfc, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00,
  0x00, 0x00, 0x01, 0xff, 0xc0, 0x01, 0xff, 0xf0, 0x0f, 0xff, 0x00, 0x03, 0xff, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x01, 0xff, 0xf8, 0x07, 0xff, 0xf0, 0x07, 0xff, 0xe0, 0x1f, 0xff, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x0c, 0x07, 0x80, 0xf0, 0x04, 0x18, 0xff, 0x88, 0x18, 0x1c, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x1e, 0x0f, 0xf8, 0xff, 0x1e, 0x1c, 0xff, 0x9e, 0x1c, 0x7f, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x1f, 0x0f, 0xfc, 0xff, 0x9e, 0x1c, 0xff, 0x9f, 0x1c, 0xff, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x3f, 0x0e, 0x3c, 0xe3, 0xce, 0x1c, 0x1c, 0x1f, 0x1d, 0xe3, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x3f, 0x0e, 0x1c, 0xe1, 0xce, 0x1c, 0x1c, 0x1f, 0x99, 0xc3, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x33, 0x8e, 0x1c, 0xe1, 0xce, 0x1c, 0x1c, 0x1f, 0x99, 0xc3, 0xc0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x73, 0x8f, 0x3c, 0xe1, 0xce, 0x1c, 0x1c, 0x1d, 0xd9, 0xc3, 0xc0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x73, 0x8f, 0xf8, 0xe1, 0xce, 0x1c, 0x1c, 0x1d, 0xf9, 0xc3, 0xc0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x7f, 0x8f, 0xf0, 0xe1, 0xce, 0x1c, 0x1c, 0x1c, 0xf9, 0xc3, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xff, 0xce, 0x70, 0xe3, 0xce, 0x1c, 0x1c, 0x1c, 0xf9, 0xc3, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xff, 0xce, 0x78, 0xe7, 0x8e, 0x3c, 0x3c, 0x1c, 0x7d, 0xe7, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xe1, 0xce, 0x3c, 0xff, 0x8f, 0xf8, 0xff, 0x9c, 0x7c, 0xff, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x01, 0xe1, 0xee, 0x3c, 0xff, 0x07, 0xf0, 0xff, 0x9c, 0x3c, 0x7e, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

void setup() {
  Serial.begin(9600);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 not found"));
    while(1){}
  }

  display.clearDisplay();

  display.drawBitmap(0, 0, arduinoLogo, 128, 64, SSD1306_WHITE);
  display.display();

}

void loop() {
}

オリジナルのページ

https://docs.arduino.cc/learn/communication/wire/

最終更新日

August 2, 2026

inserted by FC2 system