超小型ボードM5Atom Liteをつかう その2:内部保存領域をつかう

shuzo-kino.hateblo.jp
の続き

www.switch-science.com
には4MBの不揮発フラッシュメモリが搭載されています。

ちょっとしたデータロガーを作ろうとSDカードモジュール引っ張り出したのですが
短い稼働時間なら十分かなと思い、このフラッシュメモリを使ってみることに。

実際のところ

Atom LiteはESP32 Pico系なので同型のサンプルを漁ってみたらESP32のサンプルのなかに”eeprom_write.ino”というのが。
EEPROMライブラリ自体はArduino IDEにもとからあるもので、開始アドレス等々の設定値がボード毎に違う様子。

/*
   EEPROM Write

   Stores random values into the EEPROM.
   These values will stay in the EEPROM when the board is
   turned off and may be retrieved later by another sketch.
*/

#include "EEPROM.h"

// the current address in the EEPROM (i.e. which byte
// we're going to write to next)
int addr = 0;
#define EEPROM_SIZE 64
void setup()
{
  Serial.begin(115200);
  Serial.println("start...");
  if (!EEPROM.begin(EEPROM_SIZE))
  {
    Serial.println("failed to initialise EEPROM"); delay(1000000);
  }
  Serial.println(" bytes read from Flash . Values are:");
  for (int i = 0; i < EEPROM_SIZE; i++)
  {
    Serial.print(byte(EEPROM.read(i))); Serial.print(" ");
  }
  Serial.println();
  Serial.println("writing random n. in memory");
}

void loop()
{
  // need to divide by 4 because analog inputs range from
  // 0 to 1023 and each byte of the EEPROM can only hold a
  // value from 0 to 255.
  // int val = analogRead(10) / 4;
  int val = byte(random(10020));
  // write the value to the appropriate byte of the EEPROM.
  // these values will remain there when the board is
  // turned off.
  EEPROM.write(addr, val);
  Serial.print(val); Serial.print(" ");
  // advance to the next address.  there are 512 bytes in
  // the EEPROM, so go back to 0 when we hit 512.
  // save all changes to the flash.
  addr = addr + 1;
  if (addr == EEPROM_SIZE)
  {
    Serial.println();
    addr = 0;
    EEPROM.commit();
    Serial.print(EEPROM_SIZE);
    Serial.println(" bytes written on Flash . Values are:");
    for (int i = 0; i < EEPROM_SIZE; i++)
    {
      Serial.print(byte(EEPROM.read(i))); Serial.print(" ");
    }
    Serial.println(); Serial.println("----------------------------------");
  }

  delay(100);
}

こいつをもとに、少し改造してみます。

メーカーの発表によると、こいつの石はesp32-pico-d4だそう。

仕様PDFをみると
f:id:shuzo_kino:20210103015452p:plain

ボードの方はリセットボタンをおした時に返ってくる反応が

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
start...

開始アドレスはライブラリの方でよろしくやってくれる様子。

不揮発領域にちゃんと保存するにはcommit()

公式サンプルをそのまんま実行すると、リセットの度にEEPROMにwriteしたはずの値が吹き飛びます。
beginが悪いのか等々調べて回りましたが……なんと公式リファレンスにも書いてない穴が。
不揮発領域に保存するためにはwriteやputをやったあとにcommitを実行しないと不揮発領域に書き込まれません。

試しに
ESP32版の版Githubのコードを見に行くと、
writeは内部メモリに確保され、クラスが閉じるか、明示的にcommitするとEEPROMを読み出しに行くようになっています。
寿命が限られるEEPROMのためを思っての実装なんでしょうが、せめて公式ドキュメントに残すくらいの気心はあってもよかった気が……。