はじめに (対象読者・この記事でわかること)

この記事は、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つに集約されます。

  1. ボードマネージャーのバージョンが古く、SDホストライブラリの互換性がない
  2. ボード設定で「CSピン=4」が選択されている(SPRESENSEでは10が正)
  3. SDライブラリがArduino標準()のままで、SPRESENSE専用()を使っていない

この記事では、上記を順番にチェックしながら、認識されない原因を切り分けていきます。

Arduino IDEでSPRESENSEのSDカードを認識させる実装手順

ステップ1:ボードマネージャーを最新に更新する

  1. Arduino IDEを起動 → ツール→ボード→ボードマネージャー
  2. 検索欄に「spresense」と入力
  3. 「Spresense by Sony」が出たら、バージョンを2.6.0以降にアップデート
  4. インストール後、IDEを再起動

ポイント:2.4.x以前にはSDMMCホストのバグが残っており、begin()がfalseを返す確率が高くなります。

ステップ2:正しいボード設定を選択する

  1. ツール→ボード→Spresense Boards → 「Spresense」
  2. 下記のように設定する
    - Flash:「Enable 8MB」
    - Clock:「156 MHz」
    - CS Pin for SD:「10」 ← これがミソ
  3. シリアルポートを選択してスケッチを書き込む

CSピンを4のままにすると、SD.begin(4)が呼ばれてしまい、SPRESENSEのSPIバスと競合して認識しません。

ステップ3:専用ライブラリをインクルードして最小スケッチを書く

Arduino標準のは、SPRESENSE専用のSDMMCドライバを使っていないため、認識率が低いです。必ずSpresenseサンプルから拝借したを使います。

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カードへの並列書き出しを高速化する方法を紹介します。

参考資料