はじめに (対象読者・この記事でわかること)
この記事は、SpresenseやArduinoに興味があり、USBメモリとしてSpresenseを利用したい方を対象としています。特に、Spresense SDKのUSB MSC機能の実装方法について知りたい開発者向けの内容です。 この記事を読むことで、Spresense SDKを使ってUSB Mass Storage Class機能を実装し、SpresenseをPCからUSBメモリとして認識させる方法がわかります。また、ファイルシステムの設定方法や実装上の注意点についても学べます。 Spresenseは高機能なマイコントローラーボードですが、USBストレージとして利用できると、データロガーや簡易的なUSBメモリとしての活用が可能になります。本記事では、その実装方法を具体的に解説します。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。 - Arduino IDEの基本的な使い方 - C/C++の基本的なプログラミング知識 - USBの基本的な概念 - ファイルシステムの基本的な知識
Spresense SDKとUSB MSC機能の概要
Spresenseは、Sonyが開発した高性能マイコントローラーボードで、Arduino IDEで開発が可能です。Spresense SDKには、USBデバイスとして動作させるための様々なクラスが実装されており、その一つにMass Storage Class (MSC)があります。 USB MSC機能を利用することで、SpresenseをPCからUSBメモリとして認識させることができます。これにより、Spresense内のフラッシュメモリにアクセスしたり、データを保存・読み出したりすることが可能になります。 この機能は、データロガーとしての利用や、簡単なファイル転送ツールとして活用できます。例えば、センサーデータを記録しておき、後でPCに取り出すといった用途に適しています。 USB MSCを実装するには、Spresense SDKのサンプルコードをベースに、必要な設定を行い、ファイルシステムを構築する必要があります。次のセクションでは、具体的な実装手順を解説します。
USB MSC機能の実装方法
ステップ1:開発環境の準備
まずは、Spresense SDKの開発環境を整えます。Arduino IDEでSpresenseボードをサポートするように設定する必要があります。
- Arduino IDEを開き、「ファイル」→「環境設定」を選択します。
- 「追加のボードマネージャーのURL」に以下のURLを入力します。
https://raw.githubusercontent.com/sonydevworld/spresense/master/arduino/package_spresense_index.json - 「ツール」→「ボード」→「ボードマネージャー」を選択し、「Spresense」を検索してインストールします。
- 「ツール」→「ボード」から「Spresense」を選択します。
これでSpresenseの開発環境が整いました。
ステップ2:USB MSCサンプルスケッチの取得
Spresense SDKにはUSB MSCのサンプルスケッチが用意されています。これをベースにカスタマイズしていきます。
- Arduino IDEで「ファイル」→「スケッチ例」→「Spresense」→「USB」→「MSC」を選択します。
- サンプルスケッチ「MSC.ino」が開かれるので、これを保存します。
このサンプルスケッチは、SpresenseをUSBメモリとしてPCに認識させる基本的な実装が含まれています。
ステップ3:スケッチのカスタマイズ
サンプルスケッチをカスタマイズして、目的に合わせたUSBメモリとして動作させます。
Cpp#include <Flash.h> #include <MSC.h> // ファイルシステムの設定 FlashIAPBlockDevice block_device(0, 0x80000); MBRPartitionTable partition(&block_device); FATFileSystem fs("msc"); void setup() { // シリアル通信の初期化 Serial.begin(115200); while (!Serial) { ; // シリアルポートの接続を待機 } // ファイルシステムのマウント int err = fs.mount(&block_device); if (err) { // パーティションが存在しない場合は作成 Serial.println("No filesystem found, formatting..."); err = partition.reformat(&fs); if (err) { Serial.printf("Error reformatting: %d\n", err); return; } } // USB MSCの初期化 MSC msc(&fs, "MSC"); msc.begin(); } void loop() { // USBが接続されているかチェック if (MSC::isConnected()) { Serial.println("USB MSC is connected"); } else { Serial.println("USB MSC is not connected"); } delay(1000); }
このスケッチでは、Spresenseのフラッシュメモリをファイルシステムとして使用し、USB MSCとして公開しています。
ステップ4:ビルドと書き込み
スケッチをSpresenseに書き込みます。
- Arduino IDEで「スケッチ」→「アップロード」を選択します。
- SpresenseボードをPCに接続し、書き込みが完了するまで待ちます。
書き込みが完了したら、SpresenseをPCに接続してみてください。PCからはUSBメモリとして認識されるはずです。
ステップ5:動作確認
PCからSpresenseにアクセスできることを確認します。
- SpresenseをPCに接続します。
- PCのファイルエクスプローラーで、SpresenseがUSBメモリとして認識されることを確認します。
- ファイルを作成・編集・削除できることを確認します。
ハマった点やエラー解決
実装中にいくつかの問題に遭遇しました。以下にその解決策を記載します。
問題1:ファイルシステムがマウントできない
現象:スケッチを実行すると、ファイルシステムのマウントに失敗し、フォーマットが実行される。
原因:フラッシュメモリのパーティションが正しく設定されていない。
解決策:MBRPartitionTableを使用してパーティションを再作成しました。スケッチの以下の部分を修正しました。
Cpp// パーティションの再作成 err = partition.reformat(&fs); if (err) { Serial.printf("Error reformatting: %d\n", err); return; }
問題2:USB接続時にPCが認識しない
現象:SpresenseをPCに接続しても、USBメモリとして認識されない。
原因:USB MSCの初期化に失している。
解決策:USB MSCの初期化コードを修正しました。特に、MSCクラスのインスタンス化方法を見直しました。
Cpp// USB MSCの初期化 MSC msc("msc", &fs); msc.begin();
問題3:ファイルアクセスが遅い
現象:Spresenseに保存したファイルへのアクセスが非常に遅い。
原因:フラッシュメモリの特性による書き込み遅延。
解決策:ファイルシステムのキャッシュサイズを増やすことで、アクセス速度を改善しました。スケッチの冒頭で以下の設定を追加しました。
Cpp// ファイルシステムのキャッシュサイズを設定 fs.setCacheSize(4096);
まとめ
本記事では、Spresense SDKを使ってUSB MSC機能を実装する方法について解説しました。
- Spresense SDKの開発環境を整える
- USB MSCサンプルスケッチを取得・カスタマイズする
- ファイルシステムを設定し、USBメモリとして動作させる
- 実装中の問題点とその解決策を理解する
この記事を通して、SpresenseをUSBメモリとして利用する方法がわかり、データロガーや簡易的なファイル転送ツールとして活用できるようになったことを改めて伝えます。 今後は、複数のファイルシステムの併用や、より高度なファイル操作方法についても記事にする予定です。
参考資料
