SDカード(microSDカード)の使い方 [Arduino]
Arduinoの標準SDライブラリを使用してSPI接続(Serial Peripheral Interface/シリアル周辺インターフェース)で「マイクロSDカード」にアクセスします。SDカード内のファイルの読み書きは「SDクラス」「Fileクラス」を使用します。
Arduinoの電源は5VでSDカードの動作電圧は2.7-3.6Vです。5Vのまま実行するとSDカードが壊れてしまいますので「ロジックレベル変換」で5Vの電圧を3.3Vに変換してからSDカードにアクセスします。
※電圧は抵抗分圧回路でも降圧できますが、回路が複雑になります。
[マイクロSDカードスロット]
※はんだ付けは慣れていないので雑です^^;
[ロジックレベル変換モジュール]
[配線例]
※詳細な配線図は2章で紹介しています。
1. 使用部品・材料
総額で約820円です。(Arduino本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
ブレッドボード | ¥270 | 秋月電子の通販コード(P-00315) |
マイクロSDカードスロットDIP化キット | ¥300 | 秋月電子の通販コード(K-05488) |
8ビット双方向ロジックレベル変換モジュール | ¥250 | 秋月電子の通販コード(M-04522) |
microSDカード 2GB MMAGR02GUFCA-MN(SAMSUNG) | 不明 | 2010年12月17日発売のREGZA Phone T-01C(android 2.3)の付属品 |
2. 配線図
SPI接続用のピン
マスターはArduino。スレーブはSDカードスロットです。
番号 | 名称 | 内容 |
---|---|---|
13 | SCK | シルアルクロック(Serial ClocK)。データ転送の同期の為のマスターからのクロ ック信号。 |
12 | MISO | Master In Slave Out。スレーブからマスターへデータを送る。 |
11 | MOSI | Master Out Slave In。マスターからスレーブへデータを送る。 |
(10) | SS | スレーブ選択ピン(Slave Select pin)。 SPI接続の公式リファレンスには10ピンと記載されていますが、SDライブラリが内部でSPI接続をする場合は「7,8,9,10ピン」では動作しません。実験結果から「2,3,4,5,6,7ピン」ならば動作するようです。 |
SDカードのピン配置
番号 | 名称 | 内容 | Arduino |
---|---|---|---|
1 | DAT2 | 未接続 | 未接続 |
2 | CD/DAT3 | チップセレクト | 4ピン(SS) |
3 | CMD | データ入力 | 11ピン(MOSI) |
4 | VDD | 電源(2.7-3.6V) | 3.3V |
5 | CLK | シリアルクロック | 13ピン(SCK) |
6 | VSS | GND(グラウンド) | GND |
7 | DAT0 | データ出力 | 12ピン(MISO) |
8 | DAT1 | 未接続 | 未接続 |
9 | カード検出スイッチB | 未接続 | 未接続 |
10 | カード検出スイッチA | 未接続 | 未接続 |
3. スケッチ(プログラム)
SDカードに「test.txt」のファイルが存在しない場合は新規に作成して文字列を書き込みます。存在すれば文字列を追記します。
上記の処理が終わった後に、そのファイルを読み込んでシリアルモニターに表示します。
#include <SPI.h> #include <SD.h> File myFile; void setup() { Serial.begin(9600); while (!Serial) { ; } // SDカードにアクセスする準備をします。 if (!SD.begin(4)) { Serial.println("SDカードにアクセスできません。"); return; } // SDカード内のファイルを「書き込みモード」で開きます。 // ・ファイルが存在しない場合は新規に作成して文字列を追加します。 // ・ファイルが存在する場合はファイルの末尾から文字列を追加します。 // ※成功した場合は「Fileオブジェクト」が返る myFile = SD.open("test.txt", FILE_WRITE); if (myFile) { // 文字列を書き込む myFile.println("プチモンテ : http://www.petitmonte.com/"); myFile.close(); } else { Serial.println("ファイルを開けませんでした。"); } // ファイルを「読み込みモード」で開きます。 myFile = SD.open("test.txt"); if (myFile) { // ファイルの読み込み Serial.println("-----------------------"); while (myFile.available()) { Serial.println(myFile.read()); } myFile.close(); } else { Serial.println("ファイルを開けませんでした。"); } } void loop() { }
[実行例]
文字化けの部分はパソコンでファイルを確認すると「Shift-JIS」の日本語が含まれている事がわかります。
...
次はArduino IDEのメニューの[ファイル][スケッチ例][SD][CardInfo]のスケッチを実行したものです。
その他にもSDカード系のサンプルがありますので、試してみてください。
4. SD/SDHC/SDCXの仕様
ファイルシステム | 容量 | 備考 | |
---|---|---|---|
SDカード | FAT(FAT16) | 128MB-2GB | |
SDHCカード | FAT32 | 4GB-32GB | SDカードと互換性がない |
SDXCカード | exFAT | 64GB-2TB | SDカードと互換性がない |
※その他にSDHC/SDXCで利用できる「UHS-I」「UHS-II」があります。
スピードクラス
データ転送速度(最低) | |
---|---|
Class2 | 2MB/秒 |
Class4 | 4MB/秒 |
Class6 | 6MB/秒 |
Class10 | 10MB/秒 |
UHS Speed Class1 | 10MB/秒 |
UHS Speed Class3 | 30MB/秒 |
5. Arduinoの対応フォーマット
種類 | SDカード/SDHCカードに対応。(SDXCは非対応) |
---|---|
ファイルシステム | FAT(FAT16)とFAT32 |
ファイル名 | 8.3フォーマット(拡張子以外は最大8byte、拡張子は最大3byte) |
SDカードは全ての種類でアクセスできると思います。
一方、SDHCカードは読み込めない形式があるようです。Raspberry Pi用に購入したI-O DATAの「microSDHCカード 16GB Class10 EX-MSDC10」はアクセスできませんでした。
ネットで検索してみると「Fujifilm Class 4 SDHC 8GB」「SanDisk Class 4 Micro SDHC 4GB」は読み込めたようです。もしかすると、SDHCカードは4GB、8GBでスピードクラスは低い方がArduinoで動作する可能性が高いかも知れません。
...
京セラのこのページには一昔前のSDカードの一覧がありますので、購入する際の参考になるかも知れません。
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。