目的
EEPROMへのデータの書き込みおよび読み込みを行います。
特徴
EEPROMに書かれたデータは電源を切っても消えず、データシートによれば以下の通りに設計されているようです。
- データは10万回書き換え可能
- 85℃で20年、あるいは25℃で100年経っても、書いたデータが壊れる確率は100万分の1(1ppm)以下
- 容量は1KB(Arduino Nanoに実装されたATmega328P-AUの場合)
10万回書き換え可能という数字は、一見すると多いように思えます。しかし、1秒ごとに1回書き換えていくと、1日と3時間ちょっとで上限に達してしまいます。実際に使う場合は、頻繁に書き換えないように注意する必要がありそうです。
温度については、85℃で20年もつとのことです。例えば、車のダッシュボード上で動作する回路を組んだとしても、80℃近くになるのは真夏の昼間ぐらいでしょうから、最低でも20年以上は持ちそうだということが分かります。ただし、周辺の回路素子の寿命は別に考える必要があります。ところで、20年後というと、むしろこのArduino Nanoに実装されているマイコンがまだ生産しているかどうかの方が心配です。
データが壊れる確率をできるだけ下げたい場合、1ppmでも十分ではないかもしれません。例えば、1KBすべてにデータを書いた場合、どこかのデータが壊れる確率は、およそ1000分の1となってしまいます。データ破壊確率を下げる対策としては、同じデータを複数個所に書いておき、読み込むときにビットの多数決をとる、などがあると思います。
プログラムを書く
前回の環境構築で書いたLED点滅プログラムを変更してみます。赤字が変更箇所です。動作としては、前回のプログラムと変わりなく、1秒間隔で点滅を繰り返します。ここで、6行目の1番地のデータを1にしてみると、EEPROMへのデータの書き込みと読み込みがうまくいっていれば、点滅ではなく、点灯し続けるようになります。
#include <EEPROM.h> /* EEPROM読み書きに必要 */ void setup() { EEPROM.write( 0, 1 ); /* EEPROMの0番地の値を1に設定 */ EEPROM.write( 1, 0 ); /* EEPROMの1番地の値を0に設定 */ pinMode( 13, OUTPUT ); /* 13番ピンをデジタル出力に設定 */ } void loop() { digitalWrite( 13, EEPROM.read( 0 ) ); /* 13番ピンをEEPROMの0番地の値に設定 */ delay( 500 ); /* 500ミリ秒待つ */ digitalWrite( 13, EEPROM.read( 1 ) ); /* 13番ピンをEEPROMの1番地の値に設定 */ delay( 500 ); /* 500ミリ秒待つ */ }
最終更新日: 2019/06/12