\r\n\r\n
Arduinoは、電源を切ってもデータを保存できることをご存知ですか?フラッシュメモリに保存されたスケッチではなくEEPROMの可変データについてです。その読み方、書き方、そしてプロジェクトで何ができるのか、一緒に考えてみましょう。
Arduinoが初めての方は、ビギナーズガイドをぜひご覧ください。
EEPROMは、Electrically Erasable Programmable Read Only Memoryの略です。不揮発性メモリである。この意味がわからなくても、心配はいりません。電源障害が発生しても、データを保存するだけである(RAMと異なり、データを保持するためには電源が必要である)。
EEPROMは、行列生成装置Pi HATに使われているFPGA(Field Programmable Gate Array)など、無数のプロセッサに内蔵されています。EEPROMはすべてのArduinoに搭載されていますが、モデルによって容量が異なります。各ボードの詳細については、バイイングガイドをぜひご覧ください。
EEPROMの電気的な消去とプログラミングは、ノルトハイム総統府のトンネルを使用しています。技術的なことはわからなくても使えます。大前提として、電気を使ってバイナリーデータを変化させる(バイナリーとは何か)。電子的に読み、消し、書き換えることができる。
幸いなことに、Arduinoの言語を使えば、コンピュータサイエンスの学位を持っていなくても、簡単にデータを変更することができます。
ArduinoでEEPROMを使うのは簡単ですが、EEPROMの寿命は限られています。これは、EEPROMが不安定になる前に、10万回のデータ書き込み、そして消去/書き換えができることを意味します。実際、Atmel(Arduinoの「チップ」の**販売元)セミコンダクターは、各プロセッサの許容範囲に応じて、より高いサイクルカウントや低いサイクルカウントを扱うことができます。
一度書き込みと消去を繰り返した場所は、正しいデータを返さなかったり、隣接するビットの値を返したりして、信頼性が低下する。
これは書き込みが多いように聞こえますが、読み書きがプログラム的に(例えばループの中で)行われる場合、この制限に簡単に達してしまうのです。データを読み込んでもシリコンの品質は落ちず、書き込みだけが劣化する。EEPROMのデータも安心して好きなだけ読める!
この制限は、各メモリーロケーションに適用されることに留意することが重要です。ArduinoのEEPROMには1000以上の空きメモリがあるので、1つの場所に何度も書き込むと、その場所だけに影響し、他の場所には影響しなくなります。後ほど、データを均等に分散させることでEEPROMの消耗を抑えるウェアイコライゼーションについて説明しますが、SSDはこれを利用することができます。
EEPROMはArduinoのプロジェクトに非常に有効です。電源を切ってもデータを記憶しているため、Arduinoの状態を保存することができます。レーザー砲台を作れば、自分の位置や「**」の残り数を記憶できるかもしれませんね。デバイスを制御したり、何回起動したかを記録したりするのに使えるでしょう。
EEPROMは、セットアップやハイスコアに最適です。複雑なデータを定期的に書き込む場合は、Ethernetシールド(SDスロット内蔵)やRaspberry Piの利用をご検討ください。
さて、理屈はともかく、データの読み書きを見てみましょう!まず、ライブラリ(Arduino IDEに付属しています)をインクルードします。
#include <EEPROM.h>では、データを書いてみましょう。
EEPROM.write(0, 12);1回の書き込みに3.3ミリ秒(ms、1000ms=1秒)かかります。なお、文字(char)は書けず、0〜255の数字のみです。そのため、EEPROMは設定やハイスコアには向いていますが、プレイヤー名やテキストにはあまり向いていません。この方法でテキストを保存することは可能だが(アルファベットの各文字を数字に対応させることができる)、文字ごとに1カ所ずつ、複数のメモリロケーションが必要となる。
このデータの読み方を紹介します。
EEPROM.read(0);ゼロは以前に書き込んだことのあるアドレスです。以前に書き込んでいない場合は、最大値(255)が返されます。
もう少し便利なメソッドも用意されている。
EEPROM.put(2,"12.67");これで複数の場所にデータを書き込むことができます。自分で書くのは簡単ですが、便利ですね。間違ってデータを上書きしてしまわないように、書き込み先の数を記録しておく必要があるのですこのデータは、getメソッドで再度取得する必要があります。
float f = 0.00f;EEPROM.get(2, f);get の値は float f 変数に格納される。fはコンパイラに、この変数に大量のデータを格納する必要があることを知らせ、コンパイル時に特別な設定を行う。
ArduinoのホームページのEEPROMのドキュメントに、より多くの例が掲載されています。
ウェアイコライゼーションは、EEPROMの磨耗を低減し、EEPROMの寿命を延ばすための技術です。小さなプロジェクトにしか取り組んでいないのであれば、おそらく心配する必要はないでしょう。
EEPROMの寿命を保つ最も簡単な方法は、書き込み操作を特定の場所に限定することです。まずアドレスを読み、書き込むべき値がすでに存在していれば、再度書き込む必要はありません(データを読んでもダメージがないことを覚えておいてください)。その方法は以下の通りです。
int safeWrite(int data, address) { if(EEPROM.read(address) != data) { EEPROM.write(address, data); }}かなり単純なコードですが、整数でしか動作しません!車輪の再発明ではなく、ArduinoのEEPROMライブラリに組み込まれた関数を以下のように使用します。
EEPROM.update(address, val);このメソッドはwriteメソッドと全く同じシグネチャを持ちますが、必要な書き込み回数を大幅に減らすことができるかもしれません
多くのデータを書き込む必要があり、シリコンの摩耗が気になる場合は、データ使用量は増えますが、書き込み回数を記録しておくとよいでしょう。以下は、その疑似コードの大まかな実装である。
var address = 0var writeCount = 0if(writeCount > 75,000) writeCount = 0 address += 1EEPROM.write(address, data)EEPROMにアドレスとwriteCountを格納する必要があります(writeCountはアドレスの位置で分割する必要があります)。ほとんどの場合、このレベルの保護は必要ありません。arduinoは価格も安いので、バックアップを購入するほうが簡単かもしれませんね
これで、いくつかの素晴らしいプロジェクトを作るのに十分な知識を得ることができたはずです。もし、あなたが何かクールなことをしたら、私たちに教えてください。写真に写っている機材に見覚えはありますか?コメントをお寄せください。