(ESP32を無線APにしてファイルサーバーとして使えるようにする)

 今回はESP32を無線アクセスポイントとして動作させ、スマートフォンやPCから接続できるファイルサーバーを構築しました。

2台のパソコン間でファイルをやり取りする用途で使えるかの検証です。普段利用しているGoogleドライブなどのクラウドストレージはWi-Fiの速度に大きく左右され、自分の数KB/s程度しか出ないときもある、wifiではストレスを感じていました。そのため、ローカル環境でより高速かつ安定してファイルを共有できるシステムが欲しいと思い、作り始めました。ただし今回は特にエクセルファイルを共有したかったのでESP32エクセルサーバーとして作っています。

 

使用したマイコンボードは秋月で売っている、ESP32-DevKitC-VE ESP32-WROVER-E開発ボード 8MBです。

 

■ソースコード

#include <WiFi.h>
#include <WebServer.h>
#include <LittleFS.h>

const char* ssid = "ESP32_Excel_Server";
const char* password = "password123";

WebServer server(80);
File uploadFile;

// --- ホーム画面(ファイル一覧&アップロード) ---
void handleRoot() {
  String html = "<!DOCTYPE html><html><head><meta charset='UTF-8'><title>ESP32 Server</title></head><body>";
  html += "<h2>ESP32 File Server</h2>";
  
  // ファイル一覧
  html += "<h3>Files:</h3><ul>";
  File root = LittleFS.open("/");
  File file = root.openNextFile();
  while (file) {
    if (!file.isDirectory()) {
      String name = file.name();
      html += "<li><a href=\"/download?file=" + name + "\">" + name + "</a> (" + file.size() + " bytes) ";
      html += "<a href=\"/delete?file=" + name + "\" onclick=\"return confirm('Delete " + name + "?')\" style='color:red;'>[Delete]</a></li>";
    }
    file = root.openNextFile();
  }
  html += "</ul>";
  
  // アップロードフォーム
  html += "<h3>Upload:</h3>";
  html += "<form method='POST' action='/upload' enctype='multipart/form-data'>";
  html += "<input type='file' name='upload'><input type='submit' value='Upload'>";
  html += "</form></body></html>";

  server.send(200, "text/html", html);
}

// --- ダウンロード処理 ---
void handleDownload() {
  if (!server.hasArg("file")) {
    return server.send(400, "text/plain", "Bad Request");
  }
  
  String filename = server.arg("file");
  if (!filename.startsWith("/")) filename = "/" + filename;

  if (LittleFS.exists(filename)) {
    File file = LittleFS.open(filename, "r");
    server.streamFile(file, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    file.close();
  } else {
    server.send(404, "text/plain", "Not Found");
  }
}

// --- 削除処理 ---
void handleDelete() {
  if (!server.hasArg("file")) {
    return server.send(400, "text/plain", "Bad Request");
  }

  String filename = server.arg("file");
  if (!filename.startsWith("/")) filename = "/" + filename;

  if (LittleFS.exists(filename)) {
    LittleFS.remove(filename);
    server.sendHeader("Location", "/", true);
    server.send(303);
  } else {
    server.send(404, "text/plain", "Not Found");
  }
}

// --- アップロード処理(ストリーミング) ---
void handleFileUpload() {
  HTTPUpload& upload = server.upload();
  
  if (upload.status == UPLOAD_FILE_START) {
    String filename = upload.filename;
    if (!filename.startsWith("/")) filename = "/" + filename;
    uploadFile = LittleFS.open(filename, "w");
  } 
  else if (upload.status == UPLOAD_FILE_WRITE) {
    if (uploadFile) uploadFile.write(upload.buf, upload.currentSize);
  } 
  else if (upload.status == UPLOAD_FILE_END) {
    if (uploadFile) uploadFile.close();
  }
}

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

  if (!LittleFS.begin(true)) {
    Serial.println("LittleFS Mount Failed");
    return;
  }

  WiFi.softAP(ssid, password);
  Serial.printf("AP IP: %s\n", WiFi.softAPIP().toString().c_str());

  // ルーティング設定
  server.on("/", HTTP_GET, handleRoot);
  server.on("/download", HTTP_GET, handleDownload);
  server.on("/delete", HTTP_GET, handleDelete);
  server.on("/upload", HTTP_POST, []() {
    server.sendHeader("Location", "/", true);
    server.send(303);
  }, handleFileUpload);

  server.begin();
  Serial.println("Server started.");
}

void loop() {
  server.handleClient();
}

■まとめ

今回は、ESP32を使ってファイルサーバーを作成してみました。

実際に使ってみると、PCと頻繁に同期する用途では、容量の面や、その都度Wi-Fiの接続先を変更しないといけないので使えないという判断です。

しかし今回の技術は、これから制作する予定のドローンなどにも応用できそうです。

           (ESP32でMPR121を使ってみた)

  今回はmpr121という静電容量を読み取るセンサーを使ってみたいと思います。

電極にはITOフィルムを用います。

 

■配線

■コード

#include <Wire.h>
#include <Adafruit_MPR121.h>

Adafruit_MPR121 cap = Adafruit_MPR121();

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

  Wire.begin(23, 22);

  if (!cap.begin(0x5A)) {
    Serial.println("MPR121 NG");
    while (1);
  }

  cap.setAutoconfig(true);   // ←追加

  Serial.println("MPR121 OK");
}

void loop() {
  uint16_t touched = cap.touched();

  for (int i = 0; i < 12; i++) {
    if (touched & (1 << i)) {
      Serial.print("Touch ");
      Serial.println(i);
    }
  }

  delay(100);
}

       (arduinoで美咲フォント使えるようにしてみた。)

  今回はarduinoで美咲フォントを使えるようにします。

美咲フォントは 8×8 ドットの日本語ビットマップフォントで、8*8のLEDマトリクスに文字を表示したいときに使うのに適しています。

 

■ArduinoIDEにインストールする。

1、ギットハブのこのリンクzipファイルをダウンロードする。

2、ダウンロードしたzipをarduinoIDEのメニューから

  スケッチ>ライブラリをインクルード>.zip形式のライブラリをインストールを

  選択しダウンロードしたzipを選択。

3、ファイル>スケッチ例>misakiUTF16があったらインストール成功。

 

■まとめ

今回は美咲フォントを使えるようにしてみました。

時間があるときに8*8LEDマトリクスに表示してみます。

         (USBメモリをパソコンに同期する。)

  最近USBメモリ内のデーターが壊れて危うく、大切なデーターを失いかけたので、USBメモリ内のデーターをパソコンに自動でバックアップできるようしたいと思います。

 

同期にはwindowsにもともとある機能のみを用います。

 

■バックアップできるようにする。

1、cドライブに「Backup」>  「USB」という名前のフォルダーを作成

2、バッチファイルの作成

  メモ帳を立ち上げ下記の内容をコピペしUSBメモリのラベル名.bat形式で

  保存。

@echo off

robocopy E:\ C:\Backup\USB /E /FFT /R:1 /W:1

pause

3、バッチファイルを実行。

・ダブルクリックで実行すると、自動で全ファイルがUSBメモリからPCに作ったバックアップフォルダーに保存されます。

 

■バックアップを自動化する。

1、windowsのスタートメニューから「タスクスケジューラー」を実行。

2、右側の「タスクの作成」をクリック。

  すると下図のようになります。

3、名前を適当に決めて最上位の権限で実行するにチェックを入れます。

4、次にトリガーを下図の設定にします。

  イベントIDやソースはこのURLを参考に確認してください。

URL:USBを抜き差しした時のログ(接続履歴)を確認する方法 – Windows11 | 情シスの自由帳

5、続いて新しい操作を下図の設定にします。プログラム/スクリプトの欄は

  作ったバッチファイルの全パスを入力します。

6、条件と設定に関しては、変更する必要はありません。

7、動作確認

  USBメモリに何かファイルを入れてドラックアンドドロップすると、

  次回差し込んだ時にコマンドが立ち上がりコピーが実行されます。

  重複してあるコピーはしないため時間もリソースも食いません。

 

■まとめ

今回はUSBメモリを自動でバックアップするシステムを作ってみました。

またwindowsの機能について体系的に学ぶことができました。そしていろいろな作業を効率化できるノウハウも身についたと思います。便利なので、USBメモリに重要なデーターを入れている人はぜひ試してみてください。そもそも重要なデーターはUSBメモリに保存するものではないと思いますが。

 

参考サイト↓

 

            (6軸IMUセンサーを使ってみた。)

  今回は秋月で購入した。AE-LSM6DSV16X搭載の6軸IMUセンサーモジュールを使っていきます。簡単な動作確認をした後8*8LEDマトリクスのドットをIMUの傾けた方向へ移動させることが目標に進めていきます。

 

まず、6軸IMUセンサーは、3軸加速度センサーと3軸ジャイロセンサーを一つにまとめたセンサーです。センサーの中には小さなおもりが入っており重力によってわずかに動くことで、どの方向に重力がかかっているかを知ることができます。

 

■動作確認

まずは、秋月電子の公式サンプルプログラムを使用して動作確認を行います。

注意点として、このセンサーモジュールは3.3V系のマイコン向けです。
5Vでの使用はできません。

ただし、手元のArduinoでも動作確認を行ったところ、問題なく使用することができました。

 

公式ページからコードをダウンロードして書き込みます。

 

ピンアサイン

黒 : GND

赤 : 3.3V (5V不可)

青 : SDA

黄 : SCL

■まとめ

今回は、8×8 LEDマトリクスまで完成させる予定でしたが、時間の都合でそこまでは進めることができませんでした。

毎日投稿を目標にしているため、今回はここまでで投稿します