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

I2C EEPROMが仮想環境に統合されているため、回路は非常にシンプルです。必要なコンポーネントはArduino Unoだけです。EEPROMは内部的にシミュレートされ、ArduinoのI2Cピン(SDA用A4、SCL用A5)に接続されています。外部配線は不要で、シミュレーターがI2Cバスを自動的に処理します。
回路をセットアップするには:
- Velxioエディターを開き、コンポーネントピッカーからArduino Unoを追加します。
- I2C EEPROMはすでにシミュレーションの一部であり、手動で追加する必要はありません。
- コードはアドレス0x50のEEPROMと通信します。

コンポーネントピッカーの「マイクロコントローラ」カテゴリで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);
}
コードの仕組み
writeEEPROM(reg, value): この関数はレジスタアドレスとデータバイトをEEPROMに送信します。Wire.beginTransmission()、Wire.write()、Wire.endTransmission()を使用します。5msの遅延はEEPROMの書き込みサイクル時間をシミュレートしています。readEEPROM(reg): 最初にレジスタアドレスをEEPROMに送信し(「ダミーライト」)、次にWire.requestFrom()を使用して1バイトを要求します。データが利用可能な場合は読み取って返し、そうでない場合は0xFFを返します。setup(): Wireライブラリとシリアル通信を初期化します。レジスタ0から7にテストパターン(10、20、30…)を書き込み、それらを読み戻して期待値と比較します。不一致があるとエラーカウンターが増加します。loop(): 空で、ボードを生かしておくための小さな遅延があります。
学生向けの主要な概念
- I2Cプロトコル: I2Cは2本のワイヤ(SDAとSCL)と7ビットアドレスを使用して複数のデバイスと通信します。EEPROMアドレス0x50は多くのAT24Cシリーズチップで一般的です。
- EEPROM書き込みサイクル: EEPROMはデータを内部に書き込むのに数ミリ秒必要です。
writeEEPROM()内のdelay(5)は、次の操作の前に書き込みが完了することを保証します。 - 読み取りのためのダミーライト: 特定のレジスタから読み取るには、最初にレジスタアドレスを送信し(書き込み操作)、次にリピーテッドスタートまたはストップ/スタートを発行してデータを読み取ります。コードではストップ/スタートアプローチを使用しています。
- エラーチェック: スケッチは各読み取り値を期待値と照合して検証します。これは通信テストの良い習慣です。
よくある落とし穴とデバッグのコツ
- アドレスの誤り: EEPROMアドレスがデバイスと一致していることを確認してください。仮想EEPROMは0x50を使用します。0xFFが返ってくる場合、アドレスが間違っている可能性があります。
- プルアップ抵抗の欠落: 実際のハードウェアでは、I2Cラインにプルアップ抵抗が必要です。Velxioでは内部的にシミュレートされるため、追加する必要はありません。
- シリアルモニター: Velxioのシリアルモニターを使用して出力を確認します。ツールバーのシリアルモニターアイコンをクリックしてください。
- タイミング: 読み取りが断続的に失敗する場合は、書き込み後の遅延を増やしてください。仮想EEPROMは高速ですが、実際のデバイスはより多くの時間を必要とする場合があります。

ツールバーを使用してコードをコンパイルおよび実行します。シリアルモニターにテスト結果が表示されます。
推奨される拡張
- より大きなデータの書き込み: 文字列やバイト配列を書き込み・読み取りするようにコードを変更してみましょう。
- ページ書き込み: 多くのEEPROMはページ書き込み(1回のトランザクションで複数バイトを書き込む)をサポートしています。それを実装してみてください。
- 外部EEPROM: (Velxioで利用可能な場合)物理的なEEPROMコンポーネントを追加し、Arduinoに配線してみましょう。
- データロギング: EEPROMを使用してセンサーの読み取り値を保存し、後で取得してみましょう。
まとめ
VelxioでI2C EEPROMの読み書きテストを正常に構築できました!このプロジェクトは、I2C通信と不揮発性メモリの基礎を示しています。仮想環境により、ハードウェアなしで簡単に実験できます。次は、コードを拡張したり、より大きなプロジェクトに統合してみてください。
自分で構築する準備はできましたか?Velxioでライブサンプルを開いてコーディングを始めましょう:I2C EEPROM読み書きサンプル。楽しいシミュレーションを!