Arduino で比較的大きなデータを扱う

Arduino で使用されている ATmega168, ATmega328 等のマイクロコントローラーには 1KB ないしは 2KB 程度の容量の SRAM しか搭載されていない。そこでちょっとした量のデータを扱おうとすると,すぐにメモリが足りなくなってしまう。

これに対して,プログラム格納用のフラッシュメモリの方は 16KB ないしは 32KB と比較的余裕がある。メモリを節約するには,なるべくこちらの方へデータを格納するようにしなくてはいけない。

ただ,例えば配列に const 修飾子を付けたりしただけでは,データをフラッシュメモリ側に置くことはできない。これを実現するには [http://www.arduino.cc/en/Reference/PROGMEM:title=PROGMEM] と呼ばれる仕組みを利用する必要がある。

PROGMEM を利用したプログラムは以下のような感じになる。

// 配列をフラッシュメモリ側に持つ
PROGMEM prog_uint16_t wordArray[]  = {0x1111, 0x2222, 0x3333, 0x4444};

// wordArray[2] を読み出す
uint16_t word = pgm_read_word_near(wordArray + 2);

単純データ型しか扱うことができないため,複雑な情報を持たせるには少し面倒になるのだけれど,これで一応それなりの容量のデータを持つことが可能になる。