戻る

Arduinoを使ったI2C EEPROMの読み書き:完全ガイド

はじめに

Arduinoプロジェクトで設定データや少量の不揮発性情報を保存する必要があったことはありませんか?I2C EEPROMは完璧なソリューションです。安価で使いやすく、通信に必要な配線はたった2本だけです。このチュートリアルでは、Velxioブラウザ内シミュレーターを使って、完全なI2C EEPROM読み書きテストを構築します。アドレス0x50の仮想EEPROMにデータを書き込み、それを読み戻して、すべてが正しく動作することを確認する方法を学びます。

VelxioはSPICE精度のアナログシミュレーション環境を提供するため、物理的なハードウェアなしでコードをテストできます。さっそく始めましょう!

回路の解説

Velxioシミュレーターキャンバス上のi2c-eeprom-rwの回路図

I2C EEPROMが仮想環境に統合されているため、回路は非常にシンプルです。必要なコンポーネントはArduino Unoだけです。EEPROMは内部的にシミュレートされ、ArduinoのI2Cピン(SDA用A4、SCL用A5)に接続されています。外部配線は不要で、シミュレーターがI2Cバスを自動的に処理します。

回路をセットアップするには:

  1. Velxioエディターを開き、コンポーネントピッカーからArduino Unoを追加します。
  2. I2C EEPROMはすでにシミュレーションの一部であり、手動で追加する必要はありません。
  3. コードはアドレス0x50のEEPROMと通信します。

カテゴリ別に部品をブラウズするVelxioコンポーネントピッカーモーダル

コンポーネントピッカーの「マイクロコントローラ」カテゴリでArduino Unoを見つけることができます。配置すると、キャンバスにプログラミング可能なボードが表示されます。

コードの解説

読み書き操作を実行するArduinoスケッチを見てみましょう。コードはC++で書かれており、I2C通信用の標準Wireライブラリを使用しています。

// I2C EEPROM Read/Write Test
// Virtual EEPROM at address 0x50
// Writes values to registers, then reads them back.

#include <Wire.h>

#define EEPROM_ADDR 0x50

void writeEEPROM(byte reg, byte value) {
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write(reg);    // register address
  Wire.write(value);  // data
  Wire.endTransmission();
  delay(5); // EEPROM write cycle time
}

byte readEEPROM(byte reg) {
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write(reg);
  Wire.endTransmission();

  Wire.requestFrom(EEPROM_ADDR, 1);
  if (Wire.available()) {
    return Wire.read();
  }
  return 0xFF;
}

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

  Serial.println("============================");
  Serial.println(" I2C EEPROM R/W Test (0x50)");
  Serial.println("============================");
  Serial.println();

  // Write test pattern
  Serial.println("Writing test data...");
  for (byte i = 0; i < 8; i++) {
    byte value = (i + 1) * 10;  // 10, 20, 30, ...
    writeEEPROM(i, value);
    Serial.print("  Write reg[");
    Serial.print(i);
    Serial.print("] = ");
    Serial.println(value);
  }

  Serial.println();
  Serial.println("Reading back...");

  // Read back and verify
  byte errors = 0;
  for (byte i = 0; i < 8; i++) {
    byte expected = (i + 1) * 10;
    byte actual = readEEPROM(i);
    Serial.print("  Read  reg[");
    Serial.print(i);
    Serial.print("] = ");
    Serial.print(actual);

    if (actual == expected) {
      Serial.println("  [OK]");
    } else {
      Serial.print("  [FAIL] expected ");
      Serial.println(expected);
      errors++;
    }
  }

  Serial.println();
  if (errors == 0) {
    Serial.println("All tests PASSED!");
  } else {
    Serial.print(errors);
    Serial.println(" test(s) FAILED.");
  }
}

void loop() {
  // Nothing to do
  delay(1000);
}

コードの仕組み

学生向けの主要な概念

  1. I2Cプロトコル: I2Cは2本のワイヤ(SDAとSCL)と7ビットアドレスを使用して複数のデバイスと通信します。EEPROMアドレス0x50は多くのAT24Cシリーズチップで一般的です。
  2. EEPROM書き込みサイクル: EEPROMはデータを内部に書き込むのに数ミリ秒必要です。writeEEPROM()内のdelay(5)は、次の操作の前に書き込みが完了することを保証します。
  3. 読み取りのためのダミーライト: 特定のレジスタから読み取るには、最初にレジスタアドレスを送信し(書き込み操作)、次にリピーテッドスタートまたはストップ/スタートを発行してデータを読み取ります。コードではストップ/スタートアプローチを使用しています。
  4. エラーチェック: スケッチは各読み取り値を期待値と照合して検証します。これは通信テストの良い習慣です。

よくある落とし穴とデバッグのコツ

コンパイルと実行のコントロールがあるVelxioエディターツールバー

ツールバーを使用してコードをコンパイルおよび実行します。シリアルモニターにテスト結果が表示されます。

推奨される拡張

  1. より大きなデータの書き込み: 文字列やバイト配列を書き込み・読み取りするようにコードを変更してみましょう。
  2. ページ書き込み: 多くのEEPROMはページ書き込み(1回のトランザクションで複数バイトを書き込む)をサポートしています。それを実装してみてください。
  3. 外部EEPROM: (Velxioで利用可能な場合)物理的なEEPROMコンポーネントを追加し、Arduinoに配線してみましょう。
  4. データロギング: EEPROMを使用してセンサーの読み取り値を保存し、後で取得してみましょう。

まとめ

VelxioでI2C EEPROMの読み書きテストを正常に構築できました!このプロジェクトは、I2C通信と不揮発性メモリの基礎を示しています。仮想環境により、ハードウェアなしで簡単に実験できます。次は、コードを拡張したり、より大きなプロジェクトに統合してみてください。

自分で構築する準備はできましたか?Velxioでライブサンプルを開いてコーディングを始めましょう:I2C EEPROM読み書きサンプル。楽しいシミュレーションを!


共有:
David Montero

執筆者

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

関連記事


前の記事
SPIループバックテスト:Velxioでプロトコルをマスターする
次の記事
VelxioでDS1307を使ったI2C RTC時計