Arduino 入門
Lesson 61
【SD カードスロット モジュール】
その2
こにんちは、管理人のomoroyaです。
センサーの使い方の基本を学習する入門編。
世の中には、まだまだ色々なセンサーがあります。
これからも、色々なセンサーで遊んでいきます。
本LessonはLesson 60から引き続き「SDカードモジュール」を使って遊びます。
Lesson 60では、SDカードモジュールの使いかたを学習しました。
動作させるためのスケッチは、サンプルコードを利用。
読み取り、書き込み等のコマンドについては理解していません。
本Lessonは「SD Module Library」のコマンドを学習していきます。
センサから得られたデータを記憶する観測装置(データロガー)作成のための基礎学習。
本Lessonは2,3回を想定。
2回目のLessonとなります。
Lesson 60同様に、本Lessonで扱うのは通常サイズのSDカード。
これから購入するかたは、新しいタイプ(マイクロSDで3.3V変換回路付きがおすすめ)
※SDカードの入力仕様は3.3V(Arduinoを利用するならレベル変換などが必要)
以下が同等品。
※prime対応品(出荷元:Amazon)
これから始める方は3.3Vのレベル変換回路搭載のこちらがおすすめ。
Arduino入門編の解説にて使用しているArduinoは互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
はじめに
本Lessonで使用する「SDカードスロット モジュール」はSDカードのデータ読み取り、書き込みを行うためのカードスロットになります。
通信方法はSPI通信を使いますので、下記を読んでおくとより理解がすすみやすいかも。。。
また、本LessonはLesson 60と同じ回路構成を利用してスケッチの読み取り、書き込みを理解していきます。
Lesson 60をすでにお読みの方は、「SD Module Library スケッチ例」からお読みください。
Lesson 61 目標
本Lessonの目標は以下です。
2.コマンドをスケッチを描いて理解する
3.楽しんで遊ぶ!
いつものように、遊びながら学習することが重要です。
下記はLesson 60で説明した内容と同じ。
※Lesson 60を学習済みの方は飛ばしてください。
「SDカードスロット モジュール 」ですが、SDカードの入力電圧が3.3Vであるためレギュレータが搭載されています。
そのためArduinoから5V供給したとしても、供給電圧は3.3Vとなるようになっています。
ただし、入力信号は直接SDカードにつながっているため、3.3Vへ降圧してあげる必要があります。
これから購入しようと考えている場合はレベル変換回路がすでに搭載されている下記をおすすめします。
準備
ではLessonの準備に取り掛かりましょう。
下記はLesson 60で説明した内容と同じ。
※Lesson 60を学習済みの方は飛ばしてください。
電子部品は「SDカードスロット モジュール」と「1N4148×3個」。
※1N4148:ダイオード『入力3.3V対応に利用』
あとは「SDカード」をご用意ください。
※SDカードは使用できるようにFAT16/FAT32にフォーマットしておいてください。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - M-M Jumper wire(UNOと部品をつなぐための配線)
- M-F Jumper wire(UNOと部品をつなぐための配線)
- M-F M-M F-F セット Jumper wire(UNOと部品をつなぐための配線)
※SDカードは、マイクロ、通常サイズ、お好みで選択ください。
※ブレッドボードはセンサとUNOを直接つなぐ場合不要です。
※ジャンパワイヤーは「M-M」「M-F」を必要に応じて使い分けてください。
Jumper wire、抵抗は今後も頻繁に利用します。
Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
抵抗も単品で揃えるよりはセットをおすすめします。
抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!
という方は、「電子工作基本部品セット」が使い勝手が良い。
使用部品説明
「SDカードスロット モジュール」について説明していきます。
下記はLesson 60で説明した内容と同じ。
※Lesson 60を学習済みの方は飛ばしてください。
SDカードスロット モジュール 実物写真
下の写真が「SDカードスロット モジュール」の実物写真です。
端子は以下となります。
端子名 | 内容 |
---|---|
5V | Arduinoから5V供給 |
3.3V | 3.3Vを供給することも可能 |
GND | ArduinoのGNDと接続 |
SCK | シリアルクロック |
MISO | スレーブからマスタへのデータ送信ライン |
MOSI | マスタからスレーブへのデータ送信ライン |
CS | デバイスを選択するための信号 SSと呼ばれることも |
詳しく知りたい方は下記を参照ください↓。
SDカードスロット モジュール 回路図
「SDカードスロット モジュール」の回路図。
下記はLesson 60で説明した内容と同じ。
※Lesson 60を学習済みの方は飛ばしてください。
「1117」のレギュレータが搭載されており、5Vを供給することで3.3Vとして扱うことができます。
本Lessonで使用する「SDカードスロット モジュール」の回路図と思われるものを発見。(慈渓博瑞テクノロジー株式会社 SDカードモジュール.pdf)←中国の会社だと思います。
CLK → SCK
SDI → MOSI
SDO → MISO
と読み替えてください。
3.3V入力の対応方法
Lesson 60にて解説しています。
詳細を確認したいかたは以下を参照ください。
使用しているダイオードと同等のものが以下。
50個あっても・・・と思います。
「電子工作基本部品セット」などをおすすめします。
※下記に「1N41481」入っています!
SDカードスロット モジュール 仕様
遊び、学習で使う分には気にする特性はとくにありません。
下記はLesson 60で説明した内容と同じ。
※Lesson 60を学習済みの方は飛ばしてください。
■仕様抜粋(一例)
項目 | 仕様 |
---|---|
動作電圧 | 5.0V/3.3V |
LM1117/AMS117 などのレギュレータ搭載 |
5.0V → 3.3V |
本Lessonは遊び、学習を想定しています。
Arduinoの仕様範囲内で使用していれば問題になることもありません。
遊び、学習以外での使用用途をお考えの場合はデータシートを必ず確認しましょう。
実践 回路作成
下記はLesson 60で説明した内容と同じ。
※Lesson 60を学習済みの方は飛ばしてください。
最初に回路図を確認してください。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、「SDカードスロット モジュール」を動かしながらスケッチを理解していきましょう。
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
下記はLesson 60で説明した内容と同じ。
※Lesson 60を学習済みの方は飛ばしてください。
Arduinoの使用ピンは以下。
- デジタル出力:D10、D11、D12、D13
- 5V、GND
回路図がこちら。
※ダイオードの向きに注意!
こちらがブレッドボード図。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下記はLesson 60で説明した内容と同じ。
※Lesson 60を学習済みの方は飛ばしてください。
下図に示すように、用意した部品を使用して接続しましょう。
部品は「SDカードスロット モジュール」「1N4148×3個」となります。
使用するポートは
- デジタル出力:D10、D11、D12、D13
- 5V、GND
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
SD Module Library スケッチ例
本Lessonのメインとなります。
「SD Module Library」のコマンドを確認しスケッチを描いて確認していきましょう。
コマンド説明(SD Module Libraryについて)
SDカートの読み取り、書き込みはArduino IDEの標準ライブラリでサポートされています。
サポートしているフォーマットはFAT16/FAT32。
※SDHCカードも使用可能
同時に開けるファイルは一つであり、ファイル名はパスを含めて指定が可能です。
※1 パスの区切り文字はスラッシュ”/”
※2 バージョン1.0からは複数ファイルの同時オープンに対応
SDカードとのやり取りは、通信となります。
SDカードを操作するために、下記ライブラリを使用します。
#include <SD.h>
コマンド一覧
「SD Module Library」で使用できるコマンド一覧がこちら。
詳細は公式ページにて確認できます。
https://www.arduino.cc/en/Reference/SD
■SD classコマンド
SD class コマンド | 概要 |
---|---|
SD.begin() SD.begin(cspin) |
SDライブラリとカードの初期化 cspin:SDカードのチップセレクトに接続するピン |
SD.exists(file_name) | ファイルまたはディレクトリが存在するかどうかのテスト filen_ame:ファイル名(ディレクトリを含めてOK) |
SD.mkdir(file_name) | ディレクトリの作成 file_name:ファイル名(ディレクトリを含めてOK) |
SD.open(file_Path) SD.open(file_Path, mode) |
ファイルを開く file_path:ファイル名 mode:ファイルを開くモード FILE_READ:ファイル先頭から開始(読み取り専用) FILE_WRITE:ファイルの最後から(読み取り、書き込み) |
SD.remove(file_name) | ファイルの削除 file_name:ファイル名(ディレクトリを含めてOK) |
SD.rmdir(dir_name) | ディレクトリ削除 dir_name:ディレクトリ名 |
■File classコマンド
xxx部分は、「Fileクラスのインスタンス」になります。
SD.open()の戻り値です。
File myFile;
~
~
myFile = SD.open(“test.txt”, FILE_WRITE);
上記で指定した場合、下記xxxは「myFile」となります。
File class コマンド | 概要 |
---|---|
xxx.name() | ファイル名を返す |
xxx.available() | 指定したファイルの読み取り可能な文字(byte)があるかチェック |
xxx.close() | ファイルを閉じる データが物理的に保存されていることを保証する |
xxx.flush() | ファイルに書き込まれたデータが物理的に保存されいていることを保証する ファイルが閉じられるときに自動的に実行される |
xxx.peek() | ファイルから1byteっ読み込み 読み取り位置は変わらないため、繰り返すと同じデータを読み続ける |
xxx.position() | ファイルの現在位置を取得 |
xxx.print(data) xxx.print(data, BASE) |
書き込みモードで開いたファイルにデータを書き込む アスキー文字の連続として書き込み data:書き込みデータ BASE:基数(BIN、DEC、OCT、HEX) |
xxx.println(data) xxx.println(data, BASE) |
データの末尾に改行コードを付けて書き込み アスキー文字の連続として書き込み data:書き込みデータ BASE:基数(BIN、DEC、OCT、HEX) |
xxx.seek(pos) | ファイル内の位置を移動 pos:新しい位置(0 ≦ pos ≦ ファイルサイズ) |
xxx.size() | ファイルのサイズを取得 |
xxx.read() | ファイルから1バイト読み取り |
xxx.write(data) xxx.write(buf, len) |
ファイルにデータを書き込み data:byte型、char型、string型(char *)のデータ buf:文字列(char または byte型の配列) len:文字数(配列bufの要素数) |
サンプルコード(SD クラスのコマンド)
Arduino のSSピン(chipSelect)はD10となります。
//Lesson 61 MH-SDカードモジュール //SD クラスのコマンド理解のためのスケッチ //https://omoroya.com/ #include <SPI.h> #include <SD.h> File myFile1, myFile2; //クラス指定 const int chipSelect = 10; //チップセレクトピン指定 void setup(){ /* ----- ポート開放 ----- */ Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only // シリアルポートに接続できないときは、このループから抜け出せない! } /* ----- SDカードの初期化 ------ */ Serial.println("Initializing SD card..."); //SDカードが存在すれば、初期化される if (!SD.begin(chipSelect)) { Serial.println("Initialization failed or does not exist"); while (1); } Serial.println("Initialization done."); Serial.println(); /* ----- SDカード Open ------ */ // Writeモードでopen、ファイルは大文字で作成される仕様 myFile1 = SD.open("omoroya1.txt", FILE_WRITE); myFile2 = SD.open("omoroya2.txt", FILE_WRITE); /* ----- SDカードへ書き込み ------ */ if (myFile1) { /* ファイル作成、ファイルへ文字書き込み */ Serial.print("Writing to OMOROYA1.txt..."); myFile1.println("testing x,y,z,1,2,3"); //ファイルへの書き込み Serial.println("done."); } else { Serial.println("error opening OMOROYA1.txt"); } if (myFile2) { Serial.print("Writing to OMOROYA2.txt..."); myFile2.println("testing x,y,z,1,2,3"); //ファイルへの書き込み Serial.println("done."); Serial.println(); } else { Serial.println("error opening OMOROYA2.txt"); } /* ファイルが存在するか確認し、存在すればファイル削除 */ if (SD.exists("OMOROYA2.txt")) { Serial.println("Deleting to OMOROYA2.txt..."); SD.remove("OMOROYA2.txt"); Serial.println("done."); Serial.println(); } else { Serial.println("OMOROYA2.txt does not exist"); } /* ディレクトリ作成 */ Serial.println("Creating a directory. TEST1/OMOROYA"); SD.mkdir("TEST1/OMOROYA"); Serial.println("done."); Serial.println(); Serial.println("Creating a directory. TEST2/OMOROYA"); SD.mkdir("TEST2/OMOROYA"); Serial.println("done."); Serial.println(); /* ディレクトリが存在するか確認し、存在すればディレクトリ削除 */ Serial.println("Delete the directory. TEST1/"); if (SD.exists("TEST1/OMOROYA")) { SD.rmdir("TEST1/OMOROYA"); SD.rmdir("TEST1"); } Serial.println("done."); Serial.println(); /* ----- SDカード Close ------ */ Serial.println("Close the SD card."); myFile1.close(); myFile2.close(); Serial.println("done."); } void loop(){ }
動作確認(SD クラスのコマンド)
では、さっそく動作を確認していきます。
スケッチを書き込んで、シリアルモニタを開いてください。
※SDカードの挿入をお忘れなく。
■シリアルモニタの結果
下記の順番で実行しています。
- OMORYA1.txt 作成とファイルへの書き込み
- OMORYA2.txt 作成とファイルへの書き込み
- OMORYA2.txt 削除
- ディレクトリ TEST1/OMOROYA 作成
- ディレクトリ TEST2/OMOROYA 作成
- ディレクトリ OMOROYA 削除
- ディレクトリ TEST1 削除
- Fileのclose
最終的気に残っているのは・・・
「TEST2」のディレクトリと「OMORYA1.txt」のファイル。
成功です!
※タイムスタンプに対応したスケッチではないため、更新日時が本Lessonではあっていない。
「OMORYA1.txt」の中身は「testing x,y,z,1,2,3」が記載されています。
「SD クラス」のコマンドを一通り動かしてみました。
全て、動いていることが確認できました。
サンプルコード(File クラスのコマンド)
SDクラスのサンプルスケッチにて、すでにいくつか使っています。
ここでは、作成したファイルのファイル名、ファイルサイズを取得してみます。
//Lesson 61 MH-SDカードモジュール //File クラスのコマンド理解のためのスケッチ //https://omoroya.com/ #include <SPI.h> #include <SD.h> File myFile1, myFile2; //クラス指定 const int chipSelect = 10; //チップセレクトピン指定 void setup(){ /* ----- ポート開放 ----- */ Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only // シリアルポートに接続できないときは、このループから抜け出せない! } /* ----- SDカードの初期化 ------ */ Serial.println("Initializing SD card..."); //SDカードが存在すれば、初期化される if (!SD.begin(chipSelect)) { Serial.println("Initialization failed or does not exist"); while (1); } Serial.println("Initialization done."); Serial.println(); /* ----- SDカード Open ------ */ // Writeモードでopen、ファイルは大文字で作成される仕様 myFile1 = SD.open("omoroya1.txt", FILE_WRITE); myFile2 = SD.open("omoroya2.txt", FILE_WRITE); /* ----- SDカードへ書き込み ------ */ if (myFile1) { /* ファイル作成、ファイルへ文字書き込み */ Serial.print("Writing to OMOROYA1.txt..."); myFile1.println("testing x,y,z,1,2,3"); //ファイルへの書き込み myFile1.println("testing 7,8,9,a,b,c"); //ファイルへの書き込み myFile1.println("omoroya!"); //ファイルへの書き込み Serial.println("done."); /* ----- ファイル名、サイズ取得 -----*/ Serial.print("FileName:");Serial.print(myFile1.name()); Serial.print("\tsize:");Serial.print(myFile1.size(), DEC);Serial.println("byte"); Serial.println(); } else { Serial.println("error opening OMOROYA1.txt"); } if (myFile2) { Serial.print("Writing to OMOROYA2.txt..."); myFile2.println("testing x,y,z,1,2,3"); //ファイルへの書き込み Serial.println("done."); /* ----- ファイル名、サイズ取得 -----*/ Serial.print("FileName:");Serial.print(myFile2.name()); Serial.print("\tsize:");Serial.print(myFile2.size(), DEC);Serial.println("byte"); Serial.println(); } else { Serial.println("error opening OMOROYA2.txt"); } /* ----- SDカード Close ------ */ Serial.println("Close the SD card."); myFile1.close(); myFile2.close(); Serial.println("done."); } void loop(){ }
動作確認(File クラスのコマンド)
では、さっそく動作を確認していきます。
スケッチを書き込んで、シリアルモニタを開いてください。
※SDカードの挿入をお忘れなく。
■シリアルモニタの結果
下記の順番で実行しています。
- OMORYA1.txt 作成とファイルへの書き込み
- 作成したファイルのファイル名とファイルサイズの取得
- OMORYA2.txt 作成とファイルへの書き込み
- 作成したファイルのファイル名とファイルサイズの取得
- Fileのclose
「OMOROYA1.txt」の方にテキストを多く書き込んでいます。
ファイルサイズが2に比べて1の方が大きいことがわかります。
フィル名、ファイルサイズを読み出すことができています。
まとめ
本Lessonは、以下を目標としました。
2.コマンドをスケッチを描いて理解する
3.楽しんで遊ぶ!
「SD Module Library」のコマンドを多少なりとも理解できたでしょうか。
全てを紹介していませんが、紹介していないコマンドもスケッチを描いて遊んでみてください。
色々試して遊ぶことが理解への近道です!
「SDカードスロット モジュール」を使ってSDカードを操作する。
本Lessonを理解していけばデータロガーの作成が可能です。
Lesson 61 【SDカードスロット モジュール】 その2はここまで。
疑問点、質問などありましたら気軽にコメントください。
次回、Lesson 62は 【SDカードスロット モジュール】 その3です。
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント