【Raspberry Pi Pico入門 – 応用編】内蔵フラッシュにデータを保存

応用編Arduino,Raspberry Pi Pico

概要

プログラムの変数に入っている値はマイコンの電源を切ると基本的には全て消えてしまいます。ただ、中には設定値などを保存しておいて起動時に前のデータを引き継ぎたいこともあるかと思います。そういう時はEEPROMというICを使ったり、SDカードにテキストファイルに保存したりすることが多いのですが、変数何個かのためにそこまでするのはかなり面倒です。

Raspberry Pi Picoではプログラムを書き込むための内蔵フラッシュメモリの一部を、EEPROMのように自由に読み書き出来るように設定することができます(疑似EEPROMと呼ぶ人もいます)。これならEEPROM等を増設しなくても変数のデータを保存することが出来ます。

注意点として、フラッシュメモリは書き込み回数が10万回程度が限界となっています。プログラムを書き込む分には全く問題ないですが、1秒間に何回も書き込むような使い方をすると一気に寿命が来てしまいます。
例えば1秒間に10回フラッシュメモリに書き込むと、10000秒、つまり3時間弱でフラッシュメモリの寿命が来て故障してしまう計算になります。
必要以上にデータを書き込まないよう、後述のEEPROM.commit()の実行タイミングには注意してください。

実行環境

IDE:Arduino IDE 2.3.6
MCU:Raspberry Pi Pico

回路

今回はRaspberry Pi Pico単体で動作させます。

Arduino IDEの設定

疑似EEPROMを使用する際はボード情報を変更する必要があります。
「ツール」→「Flash Size」でデータを書き込む領域の大きさを設定してください。
変数は1個辺り4バイトのものが多いので、何個か保存するだけなら64KB(65536バイト)で十分です。

コーディング

新しくスケッチを作成し、以下の内容をコピペしてください。
Raspberry Pi Picoの起動回数をカウントするプログラムとなります。

#include <EEPROM.h>

int count = 0;

// EEPROM書き込み用構造体(データの塊)
typedef struct data {
  int count1;
  int count2;
} DataType;

DataType dataStruct;

void setup() {
  Serial.begin(115200);
  delay(2000);

  // EEPROMの初期化
  // 使用する領域サイズをbyteで指定
  EEPROM.begin(sizeof(DataType));

  // EEPROMのデータを読み込み
  EEPROM.get(0, dataStruct);
  count = dataStruct.count2;

  // 起動回数をカウントアップ
  count++;
  Serial.println(count);

  // 構造体の更新
  dataStruct.count1 = count;
  dataStruct.count2 = count;

  // EEPROMに保存
  EEPROM.put(0, dataStruct);
  EEPROM.commit();
}

void loop() {
}

動作確認

起動する度にシリアルモニタに表示される数字が大きくなっていれば成功です。

解説

コードの解説

EEPROMは変数毎にサイズを把握したうえでメモリアドレスを指定して読み書きをすることが多いのですが、メモリの構造を理解する必要があって初心者向きではありません。
サンプルコードではDataTypeという構造体(データの塊)を作って、構造体を丸ごと読み書きすることによりメモリの構造がわからなくても使えるようにしています。保存したいデータを増やしたい時はDataTypeの中の変数定義を編集してください。

関数の解説

begin()疑似EEPROMを初期化します。
引数には使用したい領域サイズを指定します。サンプルプログラムではDataTypeのデータサイズを自動で計算しています。
get()疑似EEPROMからデータを読み込みます。
実行すると読み込んだ値がdataStructに保存されます。
put()このライブラリには疑似EEPROMに書き込みたい値を仮置きする場所が用意されています。put()を実行するとdataStructの中身が仮置きする場所に保存されます。
commit()仮置きする場所に保存されているデータを疑似EEPROMに保存します。なるべくこの関数を実行する回数を減らすよう工夫してください。