M376S-8X2P-USBメモリ読み書きモジュール
arduinoとかESP32からUSBメモリへ書き込みを行おうとすると、
急に敷居が高くなって、その手段が見当たらなくなってしまう。
SDカードなら直接接続して書き込めるんですが、
USBが間に入るせいでUSBの制御をしなければならなくなる様です。
M376S-8X2P
で、知り合いがこのaitendoとかamazonで売っているモジュールに目を付けたんですが、
うまく動かなかったみたいなところがあり、
自分の方で挑戦することになりました。
■知り合いが送ってきた情報
□チップの説明書
https://www.mpja.com/download/ch376ds1.pdf
□この基板(モジュール)の説明書
https://www.javanelec.com/CustomAjax/GetAppDocument/660b1a06-34f0-4ad5-8374-c8b8a3673536
□Arduino用のライブラリ
https://github.com/djuseeq/Ch376msc
■説明とか見てわかること。
arduino等から接続して、USBメモリへの読み書き制御が出来る。
信号は3.3V系で電源は5V
USBのホストとかの制御はチップにお任せで、SPIまたはuartでコマンドを送ればいい。
FAT32に対応しているがNTFSには対応していない
■実装
上記Arduino用のライブラリと、3VのArduinoを組み合わせて、
ライブラリの情報にある通り接続するとあっさり動作。
USBメモリはBuffaloの古いもので、スケルトンの中の刻印を見ると
RUF-C/U2 2GBと書いていました。 2004年ぐらいの品らしいです。
フォーマットはWindows10の標準機能でFAT32のアロケーションユニットサイズを1024バイトにして
うまく行きました。
■回路図
上のライブラリの説明に書いてある通りに接続すると動くぞ
この図のM376Sって書いている所は、モジュールのコネクタH2になります。
コネクタH1はその上のSPIって書いている部分の図の赤の様にジャンパーしてください。
今回のプログラムではARDUINOとの接続はSPIにしています。
■ファームウェアバージョン
ライブラリの説明にファームウェアバージョンによってWindowsで対応できないパターンとか
載っておりましたけど、うちに届いたのは44だったようです。
Libのドキュメントでは記述が42と43だったので1上がっていました。
int v = flashDrive.getChipVer();
Serial.print("getChipVer()=");
Serial.println(v);
■注意事項
試行錯誤しましたが、ファイル名に使える文字に制限があります。
半角大文字は大丈夫ですが、小文字はダメです。半角数字は大丈夫です。
例えばlog1.logはダメでLOG1.LOGは大丈夫。
少し癖ありますが癖の範囲という事で直さず使うことにしています。
■性能試験
100バイトのデータを1000回連続で書き込みすると、
14.44秒でしたので、1回に付き14.5ミリ秒
USBメモリの性能にもよると思いますが。
まあまあの速度と思います。
■考察 ロガーとして使用する場合
もし、IoT機器のロガーとして使用する場合、
ログローテーションが必要になると思うが、
このライブラリーにリネーム系のコマンドが用意されていないことから、
LOGyyyymmdd.log等の日付付きのファイル名で記録を残しつつ、古いものを削除するなどの
対処が必要になると思われます。
日付の変更のタイミングでlistDir()で取得して、一定期間以上前の日付のものを削除とかですね。
■プログラム
https://drive.google.com/file/d/1OCwTFyEf2kN0SHPBWbygy7jcAbwULpj_/view?usp=sharing