LoginSignup
3
1

More than 1 year has passed since last update.

M5シリーズ全機種でWifiをSTAかAP接続しWebDAVを実装してSDカードをPCのネットワークドライブに割り付ける話

Last updated at Posted at 2021-11-19

1. はじめに

お仕事でSDカード(TFカード)を扱う案件があり
ちょっとWEBを検索するともちろん lang-ship さんのところにたどり着く

1個のソースで全機種対応とか素晴らしすぎるので
ちょっとお借りして色々実装してみた

  • FTPや普通のServerも試したのですがやはりWebDav最強です
  • 最終的にはBLEで作りたいのですが それはその時のお話をまた(謎

2. 扱えるマイクロSDカードの種類

手元に多量にあった(支給された)SDカードシールドは至って普通のもの
但し書きには 32GByte までOK FORMAT は FAT or FAT32 との事
手元には 1Gbyte/2Gbyte/8Gbyte/16Gbyte/32Gbyte/128Gbyte のマイクロSDがあり
色々やってみた結果 128Gbyteまでは FAT32フォーマットで読み書き出来る事が分かりました
コマンドラインで FAT32 でフォーマット出来るのですが 今回は

を使って簡単にフォーマットしてみます

3. WebDavのライブラリ

まんまのライブラリがありましたので
これを使わさせて頂きます
また デバイス取得ライブラリは lang-ship さんの

こちらを使わせて頂きます

4. ソースコード

以下の4本のコードを同じフォルダに入れて作業を行って下さい

SDCardServer.ino
#include <M5Lite.h>

#include "Device.h"
#include "Ap.h"
#include "Server.h"

void setup() {
  M5Lite.begin();
  setupDevice();
  setupServer(!M5Lite.BtnA.isPressed());
}

void loop()
{
  loopServer();
  M5Lite.Ex.delay(1);
}
Ap.h
#include <WiFi.h>

#define APSSID      "WebSDav"
#define APPSK       "#WebSDav#"
#define STASSID     "********" // ご自分のルータSSID
#define STAPSK      "********" // ご自分のルータPassword
#define HOSTNAME    "WebSDav"

void setupSTA() {
  WiFi.persistent(true);
  WiFi.setHostname(HOSTNAME);
  WiFi.mode(WIFI_STA);
  Serial.begin(115200);
  WiFi.begin(STASSID, STAPSK);
  Serial.println("Connecting to " STASSID " ...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to "); Serial.println(STASSID);
  Serial.print("IP address: "); Serial.println(WiFi.localIP());
  Serial.print("RSSI: "); Serial.println(WiFi.RSSI());
}

void setupAP() {
  IPAddress ip(192, 168, 4,  1);
  IPAddress subnet(255, 255, 255, 0);
  WiFi.softAPConfig(ip, ip, subnet);
  WiFi.softAP(APSSID, APPSK);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("Connected to "); Serial.println(APSSID);
  Serial.print("IP address: "); Serial.println(myIP);
}

Device.h
SPIClass SPI_EXT;

void setupDevice() {
  if (M5.Ex.board == lgfx::board_M5Stack) {
    // AutoStart
  } else if (M5.Ex.board == lgfx::board_M5StackCore2) {
    // AutoStart
  } else if (M5.Ex.board == lgfx::board_M5StickC) {
    // SD   M5StickC
    // 3V3  3V3
    // GND  GND
    // CLK  GPIO0
    // MISO GPIO36
    // MOSI GPIO26
    // CS   GND
    SPI_EXT.begin(0, 36, 26, -1);
    SD.begin(-1, SPI_EXT);
  } else if (M5.Ex.board == lgfx::board_M5StickCPlus) {
    // SD   M5StickC
    // 3V3  3V3
    // GND  GND
    // CLK  GPIO0
    // MISO GPIO36
    // MOSI GPIO26
    // CS   GND
    SPI_EXT.begin(0, 36, 26, -1);
    SD.begin(-1, SPI_EXT);
  } else if (M5.Ex.board == lgfx::board_unknown) {
    // SD   ATOM(Lite, Matrix) Doesn't work with Echo!
    // 3V3  3V3
    // GND  GND
    // CLK  GPIO23
    // MISO GPIO33
    // MOSI GPIO19
    // CS   GND
    SPI_EXT.begin(23, 33, 19, -1);
    SD.begin(-1, SPI_EXT);
  }
}

Server.h
#include <WiFi.h>
#include <ESPmDNS.h>
#include <ESPWebDAV.h>

#define SERVER_STA  0
#define SERVER_AP   1

FS& gfs = SD;

// WiFiServerSecure tcp(443);
WiFiServer tcp(80);

ESPWebDAV dav;

void setupServer(uint16_t kind) {
  if (kind) setupSTA();
  else      setupAP();
  MDNS.begin(HOSTNAME);
  tcp.begin();
  dav.begin(&tcp, &gfs);
  dav.setTransferStatusCallback([](const char* name, int percent, bool receive) {
    Serial.printf("%s: '%s': %d%%\n", receive ? "recv" : "send", name, percent);
  });
  Serial.print(HOSTNAME);
  Serial.println(" Server Started");
}

void loopServer()
{
  dav.handleClient();
}

5. ネットワークドライブとして認識させる(STAモード)

まずは何もしないでM5を立ち上げるとDHCPにネットワークIPが割り振られます
今回は 192.168.1.11 に割り振られました
これを.... mDNS がいい感じで "WebSDav.local" とし名前を付けてくれます

エクスプローラで 何もない場所に
NetWorkScrn.jpg

file://WebSDav\DavWWWRoot としてやるとあら不思議 SDカードの中身が見えます
NetWorkScrn2.jpg

そのままリンクをショートカットしデスクトップへ
NetWorkScrn3.jpg

そのショートカットを右クリックでネットワークフォルダとして S: に割付
NetWorkScrn5.jpg

をを S: ドライブが出来ました
NetWorkScrn6.jpg

コマンドプロンプトでも S: ドライブが見えてます
NetWorkScrn7.jpg

デスクトップに Sample.txt を作って中身に Hoge? と書込み
NetWorkScrn8.jpg

その Sample.txt をドラッグして S: ドライブにドロップすると
NetWorkScrn9.jpg

これもいい感じでファイルを書込む事が出来ます
NetWorkScrn10.jpg

6. iPhone からのアクセス

WevDav のクライアントとして今回は ES File Explorer を使いました
ip01.PNG

サービスから一番下のWebDavを選択し
ip02.PNG

URL に http://WebSDav.local/

ip04.PNG

ip05.PNG

先ほどPC上でドラッグドロップした Sample.txt が見えます
ip06.PNG

もちろん中身も見ることが出来ます
ip07.PNG

6. ポータブルドライブとして認識させる(APモード)

M5のボタンを押しながらRESET掛けると
APモードで起動されます

  #define APSSID      "WebSDav"
  #define APPSK       "#WebSDav#"
  IPAddress ip(192, 168, 4,  1);
  setupServer(!M5Lite.BtnA.isPressed());

アクセスポイントとして上記が設定されていますので
お出かけ先でSDカードを読み書きしなければ成らない場合でも安心です...

7. アクセスの速度は?

遅い..遅すぎる..
なんとか高速化できないか対応中です

8. さいごに

いつも素敵なヒントを下さる lang-ship さんに感謝です
よろしくお願い申し上げます

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1