EEPROM への書出しと読込み方法
Arduino 上のマイクロコントローラには EEPROM (Electrically Erasable Programmable Read-Only Memory) があります。
EEPROM があればハードディスクのように、電源が OFF の場合でもメモリ上の値を保持できます。
また Arduino IDE 上で利用可能な EEPROM ライブラリもあるので、 そこからの読み出し、書き出しは非常に簡単です。
EEPROM のサイズはマイコンの種類によって違いますので、利用時に注意しましょう。
ATmega328 で 1k (1024) バイト、 ATmega168 と ATmega8 で 512 バイト、 ATmega1280 と ATmega2560 では 4k バイトです。
2016年6月現在で Arduino Uno は ATmega328P なので 1k です。
1 バイト書込むのに 3.3ms かかり、さらにデータを消して書くというサイクルの寿命は 10 万回とされています。
パフォーマンス的にも寿命的にも無駄な書き込みはさけるようにしましょう。
EEPROM の read/write
EEPROM ライブラリでは書込みに write メソッドが、読込みに read メソッドがあります。 バイト毎に読書きします。
次の例では MYSTRUCT という名前の構造体を型定義して、それを EEPROM に書き込み、 s2 に読み込んでいます。
#include <EEPROM.h>
typedef struct _MYSTRUCT {
int i;
char c;
} MYSTRUCT, *PMYSTRUCT;
void setup() {
Serial.begin(9600);
MYSTRUCT s;
s.i = 1234;
s.c = 'z';
byte* p = (byte*) &s;
for(int j=0; j<sizeof(MYSTRUCT); j++){
EEPROM.write(j, *p);
p++;
}
MYSTRUCT s2;
byte* p2 = (byte*) &s2;
for(int j=0; j<sizeof(MYSTRUCT); j++){
byte b = EEPROM.read(j);
*p2 = b;
p2++;
}
Serial.println( s2.i );
Serial.println( s2.c );
}
void loop() {
}
読み込んだ結果はシリアルモニターで確認できます。
EEPROM の get と put
次の例では get メソッドと put メソッドを利用して、ユーザー定義型の MYSTRUCT を EEPROM に読み書きしています。
#include <EEPROM.h>
typedef struct _MYSTRUCT {
int i;
char c;
} MYSTRUCT, *PMYSTRUCT;
void setup() {
MYSTRUCT s3;
s3.i = 9876;
s3.c = 'a';
EEPROM.put( 0, s3 );
MYSTRUCT s4;
EEPROM.get( 0, s4 );
Serial.println( s4.i );
Serial.println( s4.c );
}
void loop() {
}
ちなみに、今回のように特定のデータ構造を非構造的な保存領域に記録する際には、 データ構造の先頭にシグネチャ (例えば文字三つとか) を置いたり、データ構造のバージョン番号も同時に書き込むことによって、 複数のプログラムバージョンに対応できたりして、良いことがあります。