EEPROM(I2C版)の使い方 [Arduino]
EEPROMは電源をオフにしてもデータが消えない半導体メモリです。
Arduino UNOでは標準で1024byteのEEPROMがありますが、今回は外部のEEPROM(I2C接続)を使用します。
使用部品・材料
総額で約315円です。(Arduino本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
ブレッドボード | ¥270 | 秋月電子の通販コード(P-00315) |
シリアルIスケアC EEPROM 24LC64-I/P | ¥45 | 秋月電子の通販コード(I-00194) |
カーボン抵抗器 | 数円 | 2kΩ(2個)を使用。 |
※仕様書では2kΩですが、手元にない場合は10kΩでも動作します。
配線図
I2CのSCL/SDAのプルアップ抵抗には2kΩを使用します。
次は公式データシートより引用(24aa64_24lc64.pdf)
※R/W = 1 読み込み。R/W =0 読み込み、書き込み。
今回の配線によるデバイスアドレスは「A0=H(1)、A1=H(1)、A2=H(1)」にしていますので「10101110」になります。Arduinoの場合は7bitのみを使用しますので右に1bitシフトした「1010111」(0x57)がデバイスアドレスとなります。
A0,A1,A2の3bitありますので、最大8個のEEPROMを接続可能です。
アドレス
今回の24LC64-I/Pは64kビットですので
アドレスは0番地から8191番地まで使用可能です。
姉妹品の24LC256は256kビットで32767番地まで、24LC512は512kビットなので65535番地までとなります。
スケッチ(プログラム)
アドレス0番地から5番地までに「数値」を書き込みます。次にその番地から値を取得してシリアルモニターへ表示します。
#include <Wire.h> // デバイスアドレス(スレーブ) uint8_t DEVICE_ADDRESS = 0x57; // 1010111 void setup() { Serial.begin(9600); // マスタとしてI2Cバスに接続する Wire.begin(); // アドレス0番地から5番地までデータを書き込む for (int i=0; i< 6; i++){ Wire.beginTransmission(DEVICE_ADDRESS); // 対象アドレスに移動 Wire.write(i >> 8); // Address(High Byte) Wire.write(i & 0x00FF); // Address(Low Byte) // データの書き込み Wire.write(i+1); Wire.endTransmission(); delay(5); } // アドレス0番地から5番地までデータを読み込む for (int i=0; i< 6; i++){ Wire.beginTransmission(DEVICE_ADDRESS); // 対象アドレスに移動 Wire.write(i >> 8); // Address(High Byte) Wire.write(i & 0x00FF); // Address(Low Byte) Wire.endTransmission(); // デバイスへ1byteのレジスタデータを要求する Wire.requestFrom(DEVICE_ADDRESS, 1); while (Wire.available() == 0 ){} Serial.println(Wire.read()); } } void loop() { }
実行結果
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。