ESP32-WROOM-32EにSDカードのファイルをアップロードする

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

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

ESP32シリーズのFLASHにファイルをアップロードする方法として、SDカードライブラリとSPIFFSライブラリを使用する方法をまとめました。ESP32 Sketch Data Uploadプラグインの代替の方法として使用できます。

Arduino IDEのバージョンアップで2.0.0以降でESP32 Sketch Data Uploadプラグイン(2023年11月上旬では本プラグインは対応していない)が使用できなくなったため、代替の方法でFLASHにファイルをアップロード(書き込み)します。

ESP32-WROOM-32E開発ボード(秋月電子)を使用し、Arduino IDEで開発を行います。また、SDカードモジュール(秋月電子)を使用しています。

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

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

ファイルをアップロードする方法

ファイルを開く方法として標準関数を使う方法がありますが、Arduino環境ではfopen()などの標準関数は非対応となっています。SDカードライブラリはfopen()関数などに準拠したファイルの操作ができます。

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

SDカードライブラリとSPIFFSライブラリの関係

SDカードとFLASHの関係
SDカードとFLASHの関係

SDカードライブラリでSDカードのファイルを読み出し、SPIFFSライブラリでSDカードから読み出したファイルをFLASHに書き込みます。

本記事では下記記事のグラフ表示に必要なファイルをFLASHに書き込みします。

ESP32-WROOM-32Eで温湿度データをグラフで表示する

ESP32 Sketch Data Uploadプラグインを使用する方法と同様にdataフォルダ内に書き込むデータを準備します。

SDカードに準備したファイル
SDカードに準備したファイル

SDカードに保存したdataフォルダの「myfavicon.ico」「chart.umd.js」を読み出してSPIFFSを使ってFLASHに書き込みます。

ESP32のFLASHにSDカードのファイルを保存する方法
  • 手順1
    SDカードのファイルをリードモードで開く
  • 手順2
    SPIFFSのファイルをライトモードで開く
  • 手順3
    SDカードから読み出したデータをFLASHに書き込む
  • 手順4
    ファイルを閉じる

広告
漠然としたキャリア形成の不安を打ち破る!

ライブラリの初期化

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

SPIFFS.begin(); //SPIFFSの初期化
SPIFFS.format(); //FLASHのデータをフォーマットする場合

if(!SD.begin()){
  Serial.println("initialization failed!");
  while (1);
}

SPIFFSライブラリ及びSDカードライブラリを使用するためSPIFFS.h、SD.hをインクルードします。またファイルを操作するためFS.hをインクルードします。

SPIFFSの初期化を行うためbegin()関数を使用します。FLASHに不要なファイルが残ることを防ぐ場合はformat()関数でFLASHをフォーマットします。

SDライブラリの初期化を行うためbegin()関数を使用します。初期化に失敗した場合は以降の処理を行えないためwhile()で無限ループするようにしています。

SDカードのファイルを読み込む

//ディレクトリのファイル名を表示
File root = SD.open("/data"); //dataフォルダを開く
File file = root.openNextFile();//ファイルを順次開く

while(file){
  Serial.println(file.name());
  while(file.available()){
    Serial.write(file.read());//シリアルモニターにファイルの内容を表示
    //FLASHに読み込んだデータを書き込む処理を追加
  }
  file.close();
  file = root.openNextFile();
}
root.close(); //ファイルを閉じる

SDカードのdataフォルダを開くため、open()関数に”/data”を指定します。次にdataフォルダーのファイルを開くためopenNextFile()関数で順次ファイルを開きます。

ファイルが存在する場合はFileクラスをインスタンス化した変数(file)にファイルの情報が格納されます。

Fileクラスのname()関数を使用するとファイル名が取得できます。例ではwhile()で繰り返すことで存在するファイル名をすべて表示するようにしています。

openNextFile()関数でファイルを開いた状態になっているためavailable()関数で読み込めるファイルのデータ数が確認できます。

read()関数でデータを読み込むとavailable()の値が更新されるため、while()の繰り返しの条件にavailable()を指定することでファイルのデータをすべて取得することができます。例ではread()関数で読み込んだデータをシリアルモニターに表示します。

ファイルのデータを読み終えたらclose()関数でファイルを閉じます。

ファイルを閉じなくても問題ないことが多いですが、メモリの破棄が遅くなったりするため不要なメモリを削減して負担を減らすことが推奨されます。

スポンサーリンク

FLASHにデータを書き込む

File fp = SPIFFS.open("/myfavicon.ico",FILE_WRITE);

if( fp ){
  while(file.available()){ 
    fp.write(file.read()); //fileはSDカードを開いたファイル
  }
  fp.close();
}

SPIFFSを使ってファイルを開くためにopen()関数を使用します。第1引数にはファイルのパスを指定します。第2引数にFILE_WRITE(“w”)を指定します。

対象のファイルが開くと、SPIFFSライブラリのwrite()関数でデータを書き込みます。例は、SDカードのファイルのデータを読み込んだ結果をSPIFFSライブラリのwrite()関数で書き込んでいます。

SDカードのファイルのデータをすべて書き込んだあとはファイルを閉じるためにclose()関数を使用します。

SDカードから読み込んだデータを1バイトずつSPIFFSライブラリのwrite()で書き込むためESP32 Sketch Data Uploadを使ってファイルをアップロードするよりもかなり時間が必要になってしまいます。

PR:技術系の通信教育講座ならJTEX

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

Arduino IDEの旧バージョンのVer1.8.19であれば、下記の方法でESP32 Sketch Data Uploadプラグインが使用できるため手早くファイルをアップロードしたい場合は旧バージョンでアップロードしても良いと思います。

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をクリックすると書き込みが開始します。

スポンサーリンク

動作確認

動作確認用の回路図

ESP32-WROOM-32EとSDカードモジュールの配線例を示しています。SPIライブラリは初期化時に指定しなければVSPIになります。またスレーブセレクト(SS)はデフォルトで5ピンです。

回路図の番号はESP32-WROOM-32Eの左上を1ピンとした時反時計回りにピンを数えた場合の番号としています。ピン番号横の()内の番号はシルク印刷されているピンの名称です。

ソースコード全体のソフトを書き込む前にESP32-WROOM-32Eで温湿度データをグラフで表示するのソフトを書き込んでWiFiでアクセスすると ファビコン及びchart.jpのライブラリが無いため表示されていません。

FLASHにSDカードのデータをアップロードする前の結果
FLASHにSDカードのデータをアップロードする前の結果

ソースコード全体のソフトを書き込んでSDカードに保存したdataフォルダの「myfavicon.ico」「chart.umd.js」をFLASHに書き込みます。

書き込み後はESP32-WROOM-32Eで温湿度データをグラフで表示するのソフトを書き込みます。

FLASHにSDカードのデータをアップロードした後の結果
FLASHにSDカードのデータをアップロードした後の結果

WiFiでアクセスすると「myfavicon.ico」「chart.umd.js」がFLASHに書き込まれているためファビコンとグラフの表示がされていることが確認できました。

広告

ソースコード全体

以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。

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

//#define FLASH_FORMAT

File myfile;
uint32_t datacnt;

void setup() {
 
  Serial.begin(9600);
  SPIFFS.begin();
  delay(1000);

  #ifdef FLASH_FORMAT
    Serial.println( "Format start!" );
    SPIFFS.format();
    Serial.println( "Format Complete!" );
  #endif

  delay(1000);

    if(!SD.begin()){
      Serial.println("initialization failed!");
      while (1);
    }
    else{
      File root = SD.open("/data");
      File file = root.openNextFile();
      String flash_path;

      while(file){
        flash_path="/";
        flash_path.concat(file.name());
        Serial.println(flash_path);
        File fp = SPIFFS.open(flash_path,FILE_WRITE);
        if( fp ){
          datacnt = 0;
          while(file.available()){
            fp.write(file.read());
            ++datacnt;
            Serial.println(datacnt);
          }
          fp.close();
        }
        file.close();
        file = root.openNextFile();
      }
      
      root.close();
    }
  delay(1000);
  Serial.println("--end--");
}

void loop() {
  // put your main code here, to run repeatedly:
}

FLASHにファイルを書き込む前にフォーマットする場合は、#define FLASH_FORMATのコメントアウトは外して使用してください。

関連リンク

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

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

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

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

PR:あなたのキャリアのお供に「生涯学習のユーキャン」

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

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