Arduinoの基礎 - EEPROM

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2021年11月18日 (木) 06:12時点におけるWiki (トーク | 投稿記録)による版 (文字列「source lang」を「syntaxhighlight lang」に置換)
ナビゲーションに移動 検索に移動

概要

Arduino上のマイコンにはEEPROM(Electrically Erasable Programmable Read-Only Memory)がある。
EEPROMがあれば、ハードディスクのように電源がOFFの場合でもメモリ上の値を保持することができる。

Arduino IDE上で利用可能なEEPROMライブラリもあるので、読み込みや書き込みは非常に簡単である。

EEPROMのサイズはマイコンの種類によって違うので、利用時には注意する。
ATmega88と168では512[Byte]、ATmega328では1[KB]、 ATmega1280とATmega2560では4[KB]である。
また、1[Byte]を書き込むのに掛かる時間は3.3[mS]であり、更にデータを削除して書き込むというサイクルの寿命は10万回とされている。


EEPROM の read/write

EEPROMライブラリでは、書き込み時はwriteメソッド、読み込み時はreadメソッドがあり、1バイト毎に読み書きを行う。
次のサンプルコードでは、MYSTRUCT構造体を定義して、それをEEPROMに書き込み、 s2に読み込む。
また、読み込んだ結果はシリアルモニタで確認することができる。

<syntaxhighlight lang="c++">
#include <EEPROM.h>

typedef struct _MYSTRUCT
{
   int i;
   char c;
} MYSTRUCT, *PMYSTRUCT;

void setup()
{
   Serial.begin(9600);
 
   MYSTRUCT s = {.i = 1234, .c = 'z'};
   byte *p = (byte*)&s;

   for(int i = 0; i < sizeof(MYSTRUCT); i++)
   {
      EEPROM.write(i, *p);
      p++;
   }

   MYSTRUCT s2;
   byte *p2 = (byte*) &s2;

   for(int i = 0; i < sizeof(MYSTRUCT); i++)
   {
      byte b = EEPROM.read(j);
      *p2 = b;
      p2++;
   }

   Serial.println( s2.i );
   Serial.println( s2.c );
}

void loop()
{

}
</source>



EEPROMのgetメソッドとputメソッド

次のサンプルコードでは、getメソッドとputメソッドを利用して、ユーザ定義のMYSTRUCT構造体をEEPROMに読み書きしている。
特定のデータ構造を非構造的な保存領域に記憶する際は、
データ構造の先頭にシグネチャ(例 : 3文字等)を置いたり、データ構造のバージョン番号も同時に書き込むことによって、
複数のプログラムバージョンに対応することができる。

<syntaxhighlight lang="c++">
#include <EEPROM.h>

typedef struct _MYSTRUCT
{
   int i;
   char c;
} MYSTRUCT, *PMYSTRUCT;

void setup()
{
   MYSTRUCT s3 = {.i = 9876, .c = 'a'};
   EEPROM.put(0, s3);

   MYSTRUCT s4;
   EEPROM.get(0, s4);

   Serial.println(s4.i);
   Serial.println(s4.c);
}

void loop()
{

}
</source>