はじめに (対象読者・この記事でわかること)
この記事は、SPRESENSEボードを使ってプロトタイピングを楽しみたいメイカー層や、Arduino IDEでカスタムボードを扱いたい中級者を対象にしています。
SPRESENSEにmicroSDカードを刺しても「SD.begin()がfalseを返す」「ファイルが開けない」といった壁にぶつかり、Webの情報だけでは原因が特定できずに困っている方が多いはずです。本記事では、配線不要でSDカードを認識させるための「ボードマネージャー」「ボード設定」「ライブラリバージョン」の3つのポイントを絞って解説します。読み終えると、5分以内でSDカードが使える状態になり、ログや録音データの書き出しがスムーズに行えるようになります。
前提知識
- Arduino IDEでスケッチを書いてボードに書き込める
- microSDカードをPCでフォーマット(FAT32)できる
- シリアルモニタでデバッグ出力を読み取れる
SPRESENSE+SDカードの概要となぜ認識されがちなのか
SPRESENSEは、Sony製の6コアARM Cortex-M4Fマイコン搭載ボードで、GPS・高解像度オーディオ・カメラインターフェースを標準で持ちながら、消費電力が低いのが特徴です。SDカードは、録音データやセンサーログ、ファームウェアアップデートファイルを保存するための必須デバイスです。
しかし「SDカード挿しただけじゃ認識されない」というのが初期の落とし穴です。理由の大半は、以下3つに集約されます。
- ボードマネージャーのバージョンが古く、SDホストライブラリの互換性がない
- ボード設定で「CSピン=4」が選択されている(SPRESENSEでは10が正)
- SDライブラリがArduino標準(
)のままで、SPRESENSE専用( )を使っていない
この記事では、上記を順番にチェックしながら、認識されない原因を切り分けていきます。
Arduino IDEでSPRESENSEのSDカードを認識させる実装手順
ステップ1:ボードマネージャーを最新に更新する
- Arduino IDEを起動 → ツール→ボード→ボードマネージャー
- 検索欄に「spresense」と入力
- 「Spresense by Sony」が出たら、バージョンを2.6.0以降にアップデート
- インストール後、IDEを再起動
ポイント:2.4.x以前にはSDMMCホストのバグが残っており、begin()がfalseを返す確率が高くなります。
ステップ2:正しいボード設定を選択する
- ツール→ボード→Spresense Boards → 「Spresense」
- 下記のように設定する
- Flash:「Enable 8MB」
- Clock:「156 MHz」
- CS Pin for SD:「10」 ← これがミソ - シリアルポートを選択してスケッチを書き込む
CSピンを4のままにすると、SD.begin(4)が呼ばれてしまい、SPRESENSEのSPIバスと競合して認識しません。
ステップ3:専用ライブラリをインクルードして最小スケッチを書く
Arduino標準の
Cpp#include <SDSPRESENSE.h> const int chipSelect = 10; // ボード設定と合わせる void setup() { Serial.begin(115200); while (!Serial); // シリアル接続待ち if (!SD.begin(chipSelect)) { Serial.println("SD init failed!"); return; } Serial.println("SD OK"); // 書き込みテスト File f = SD.open("/test.txt", FILE_WRITE); if (f) { f.println("Hello SPRESENSE SD"); f.close(); Serial.println("Write OK"); } else { Serial.println("Write NG"); } } void loop() {}
書き込み後、シリアルモニタで「SD OK」「Write OK」が出れば成功です。
ステップ4:フォーマットとアクセス速度をチューニングする
- 32 GB以上のカードは、Windows「FAT32」で再フォーマット(guiformatなど)
- 512 MB以下の小容量カードは、クラスタサイズ4096 byteに設定
- 録音用途なら、SD.open()は起動時に1回だけにし、close()せずにフラッシュを減らす
ハマった点やエラー解決
| エラーメッセージ | 原因の一例 | 解決策 |
|---|---|---|
| SD init failed! | ①ボードマネージャが古い ②CSピン不一致 | ステップ1・2を再実行 |
| ファイル名が"8.3"以外で開けない | 長ファイル名無効 | SFNで8文字+.TXTに限定 |
| 録音で偶々停止 | クラスタ枯渇 | 定期的にclose()/open()でフラッシュ |
解決策
上記の通り、ボードマネージャの更新→CSピン10→SDSPRESENSE.hの3点を守れば、9割以上のケースで解決します。それでもダメな場合、以下を試して下さい。
- 別のmicroSDカード(Class 10以上、最大32 GB)を試す
- カードスロットの爪をエアダスターで清掃
- スケッチ冒頭で
SPI.end()を呼んでからSD.begin()(SPIバスリセット)
まとめ
本記事では、SPRESENSEでSDカードが認識されない原因を「ボードマネージャのバージョン」「CSピン設定」「ライブラリの違い」に絞って、Arduino IDE上で解決する手順を解説しました。
- ボードマネージャを2.6.0以降に更新する
- ボード設定でCSピンを10に固定する
- Arduino標準SD.hの代わりにSDSPRESENSE.hを使う
- 32 GB以下のFAT32フォーマットカードを選ぶ
この記事を通して、SPRESENSEでSDカードログや高音質録音データを即座に保存できるようになり、野外での長時間IoT実験がスムーズになります。
次回は、SPRESENSEの6コアを使ったマルチタスク録音とSDカードへの並列書き出しを高速化する方法を紹介します。
参考資料
- SPRESENSE公式:SDカード取扱いガイド
- Arduino Forum:SPRESENSE SD not mounting
- 『SPRESENSEプログラミングブック』(技術評論社、2024年)
