PR

ESP32-WROOM-32EのFLASH(SPIFFS)を使用する方法

組み込みエンジニア
本記事はプロモーションが含まれています。

こんにちは、ENGかぴです。

ESP32シリーズはFLASHを搭載しており基本的にはプログラム用に使用しますが一部をデータ用で使用することができます。SPIFFSライブラリを使用するとSDカードのようにFLASHにアクセスしてデータの読み書きができます。

ESP32のEEPROMライブラリを使用してデータを管理して動作確認した下記記事の内容をSPIFFSを使って実装します。

ESP32-WROOM-32EのEEPROMを使用する方法

ESP32-WROOM-32E開発ボード(秋月電子)を使用しArduino IDEで開発を行います。また、LCDはAQM1602XA-RN-GBW(秋月電子)を使用しています。LCDの使い方については下記記事にまとめています。

Seeeduino XIAOを使ってBME280のデータをLCDに表示する

ESP32-WROOM-32Eで動作確認したことについてリンクをまとめています。

ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方

SPIFFSの使い方

FLASH領域は基本的にプログラム用に使用されますが、すべての領域を使用することはほとんどありません。そのためFLASH領域の一部をデータ用のストレージとして使用することができます。

ESP32シリーズ専用にSPIFFSライブラリが搭載されており、本ライブラリを使用することでArduino環境でSDカードを操作するようなイメージでFLASH領域にデータの読み書きができるようになります。

SPIFFSの初期設定

#include <FS.h>
#include <SPIFFS.h>

String settings = "/flash_dat.txt"; //フラッシュに置くテキストファイル

SPIFFS.begin(); //SPIFFSの初期化

SPIFFSライブラリを使用するためにSPIFFS.hをインクルードします。ファイルを開いて読み書きするためFS.hライブラリもインクルードします。ファイル名はファイルを開く際に文字列として指定してもよいですが、固定のパスとなるため変数で宣言しています。

例では文字列で/flash_dat.txtを宣言し保存するデータのファイルのパスとしています。SPIFFSの初期化を行うためbegin()関数を使用します。

PR: わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジムPython入門講座の申込

FLASHのデータを読み込む

void FfsRead(void){

  File fp = SPIFFS.open(settings,"r"); //データを読み込む

  if(fp){ //ファイルを開いて以下を処理
    for(uint8_t i = 0; i < sizeof(flash_dat); i++){
      flash_dat[i] = fp.read();
    }
  //fp.readBytes((char*)&flash_dat[0], sizeof(flash_dat));
    fp.close(); //ファイルを閉じる
  }
  else{ //ファイルが開けなかった場合
    Serial.println("Flash Read error");
    //データを読み込めない場合の処理
  }
}

SPIFFSを使ってファイルを開くためにopen()関数を使用します。第1引数にはファイルのパスを指定します。第2引数にデータを読み込む場合は”r”を指定します。

ファイルが開けるとフラッシュに保管したデータ分のサイズをread()関数を使用して読み込みます。read()関数の他にも読み込みのための関数が実装されています。読み込んだ後はファイルを閉じるためclose()関数を使用します。

スケッチを書き込んだ初期時はFLASH領域にファイルが存在しないためファイルが開けずデータの読み込みが失敗します。不定値によって動作不良にならないようなデフォルト値をセットするなど工夫が必要な場合もあります。

ファイルをあらかじめESP32 Sketch Data Uploadを使ってアップロードしておくことでスケッチ書き込み後に初めて動作させる場合でもデータを読み込ませることもできます。

PR:(即戦力のスキルを身に着ける:DMM WEBCAMP 学習コース(はじめてのプログラミングコース))

FLASHにデータを書き込む

void FfsWrite(void){
 
  File fp = SPIFFS.open(settings,"w");
  if( fp ){
    fp.write(btncnt);
    fp.write(btncnt);
 //fp.write( &btncnt, 2);
    fp.close();
  }
  else{
    Serial.println("Flash Write Error");
  }
}

SPIFFSを使ってファイルを開くためにopen()関数を使用します。第1引数にはファイルのパスを指定します。第2引数にデータを書き込む場合は”w”を指定します。

ファイルを開きwrite()関数を使用して書き込むデータを指定します。例ではbtncntを2バイト分書き込んでいます。コメントアウトで記述している方法でも同じ処理になります。書き込んだ後はファイルを閉じるためにclose()関数を使用します。

一度でもFLASHに書き込むことでファイルが生成されるため ハード故障など別の要因で読み込めない場合を除いて読み込み時のファイル読み込みの失敗が発生しなくなります。

ESP32 Sketch Data Uploadでファイルをアップロードする

ESP32-WROOM-32EではESP32 Sketch Data Uploadを使用することでファイルをFLASH領域にアップロードすることができます。ESP32 Sketch Data Uploadを追加する手順についてまとめています。

小規模のデータの格納であれば特にアップロードする必要はありませんが外部のAPIなど規模が大きなライブラリをFLASHに格納したい場合に有効です。

ESP32 Sketch Data Uploadを追加する手順
  • 手順1
    SPIFFSのプラグインをダウンロード
  • 手順2
    Arudinoスケッチ保存場所にtoolsフォルダを作成
  • 手順3
    toolsフォルダにダウンロードしたファイルを解凍して移動(コピー)

SPIFFSプラグインをダウンロードしてArduino IDEのツールに「ESP32 Sketch Data Upload」を追加します。

GitHub-arduino-esp32fs-プラグインのダウンロード

ダウンロードしたファイルをArduinoフォルダに追加します。ダウンロードしたファイルを解凍すると「ESP32FS」フォルダが生成されます。Arduinoのスケッチブックの保存場所に指定しているフォルダ内で「tools」フォルダを作成してtoolsファルダー内にESP32FSをコピー(移動)します。

Arduinoフォルダを保存場所
Arduinoフォルダを保存場所

環境設定でスケッチブックの保存場所を確認することができます。初期のままであればドキュメント内のArduinoフォルダが指定されています。例ではC:\WorkSpace\Arduinoを指定しています。

解凍したファイルを作成したtoolsフォルダに移動
解凍したファイルを作成したtoolsフォルダに移動

toolsフォルダにESP32FSを追加した後でArduino IDEを起動するとツール欄にESP32 Sketch Data Upload」が追加されます。

ESP32 Sketch Data Upload追加後
ESP32 Sketch Data Upload追加後

ESP32 Sketch Data UploadをクリックするとFlashにデータを書き込むことができますがFlashにデータを書き込む前に書き込むファイルを準備する必要があります。Arduinoファイルが保管されているフォルダに「data」フォルダを作成します。

アップロードするファイルをdataフォルダに置く
アップロードするファイルをdataフォルダに置く

例ではArduinoファイルが「spiffs」フォルダにあります。このフォルダ内に「data」フォルダを作成しflash_dat.txtファイルを追加しています。

「data」フォルダにファイルを追加しツール内のESP32 Sketch Data Uploadをクリックすると書き込みが開始します。

PR:わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!

動作確認

動作確認用の回路図
動作確認用の回路図

ESP32-WROOM-32EのWire(I2C)をLCDに接続しSW1をDIに接続します。SW1を押した回数をLCD上に表示します。SW1を2秒間長押しすると現在のボタンを押した回数をFLASHに書き込みます。長押しする際もSW1を押した回数がカウントされるためFLASHに書き込む前にカウント値を-1するようにしています。

FLASHへの書き込みが終わる(カウントが-1された後)と電源をOFF(モジュール上のリセットボタンでもよい)します。FLASHに保存されているデータは電源をOFFしても保持されるため次に電源をONしたときにFLASHのデータの確認を行いデータが消えていないことを確認します。

FLASHのデータを読み込んでLCDに表示
FLASHのデータを読み込んでLCDに表示

電源をONすると初期画面が2秒表示されます。メイン処理に遷移すると初期化時に読み込んだFLASHのデータを表示します。LCDの1段目に「FLASH DATA READ:10」と表示されているためFLASHのデータが読み出せていることが分かります。

スポンサーリンク

ソースコード全体

ソースコードは記事作成時点において動作確認できていますが、使用しているライブラリの更新により動作が保証できなくなる可能性があります。また、ソースコードを使用したことによって生じた不利益などの一切の責任を負いかねます。参考資料としてお使いください。

リンクからZIPファイル形式のファイルをダウンロードし、任意の場所に展開していただくとテキストファイルが生成されます。

ソースコードをダウンロード

関連リンク

Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。

Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方

Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方

ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方

PR:わからないを放置せず、あなたにあった最低限のスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!

最後まで、読んでいただきありがとうございました。

タイトルとURLをコピーしました