#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本のコードを同じフォルダに入れて作業を行って下さい
#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);
}
#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);
}
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);
}
}
#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" とし名前を付けてくれます
file
://WebSDav\DavWWWRoot としてやるとあら不思議 SDカードの中身が見えます
そのショートカットを右クリックでネットワークフォルダとして S:
に割付
デスクトップに Sample.txt を作って中身に Hoge?
と書込み
その Sample.txt をドラッグして S: ドライブにドロップすると
#6. iPhone からのアクセス
WevDav のクライアントとして今回は ES File Explorer を使いました
URL に http://WebSDav.local/
先ほどPC上でドラッグドロップした Sample.txt が見えます
#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 さんに感謝です
よろしくお願い申し上げます