Arduinoと戯れる!

Arduino 入門 Lesson 61 【SDカードスロット モジュール】その2

arduino-lesson60-00Arduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
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はオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

正規品の本体単品がほしい方はこちらとなります。

 

スポンサーリンク

はじめに

本Lessonで使用する「SDカードスロット モジュール」はSDカードのデータ読み取り、書き込みを行うためのカードスロットになります。

通信方法はSPI通信を使いますので、下記を読んでおくとより理解がすすみやすいかも。。。

 

また、本LessonはLesson 60と同じ回路構成を利用してスケッチの読み取り、書き込みを理解していきます。

 

Lesson 60をすでにお読みの方は、「SD Module Library スケッチ例」からお読みください。

 

Lesson 61 目標

本Lessonの目標は以下です。

1.SD Module Libraryのコマンドを理解する
2.コマンドをスケッチを描いて理解する
3.楽しんで遊ぶ!

いつものように、遊びながら学習することが重要です。

 

下記はLesson 60で説明した内容と同じ。
Lesson 60を学習済みの方は飛ばしてください。

SDカードスロット モジュール」ですが、SDカードの入力電圧が3.3Vであるためレギュレータが搭載されています。

そのためArduinoから5V供給したとしても、供給電圧は3.3Vとなるようになっています。

ただし、入力信号は直接SDカードにつながっているため、3.3Vへ降圧してあげる必要があります。

これから購入しようと考えている場合はレベル変換回路がすでに搭載されている下記をおすすめします。

 

補足:本Lessonで使用する「SDカードスロット モジュール 」
入力を3.3Vでプルアップしている回路となっています。
ダイオードを利用することでレベル変換回路不要で学習可能です。

 

準備

ではLessonの準備に取り掛かりましょう。

下記はLesson 60で説明した内容と同じ。
Lesson 60を学習済みの方は飛ばしてください。

電子部品はSDカードスロット モジュール」と「1N4148×3個
※1N4148:ダイオード『入力3.3V対応に利用

あとは「SDカード」をご用意ください。
※SDカードは使用できるようにFAT16/FAT32にフォーマットしておいてください。

 

必要なもの

※SDカードは、マイクロ、通常サイズ、お好みで選択ください。
※ブレッドボードはセンサとUNOを直接つなぐ場合不要です。
※ジャンパワイヤーは「M-M」「M-F」を必要に応じて使い分けてください。

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

短めが使いやすい場合も。

 

抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!

という方は、「電子工作基本部品セット」が使い勝手が良い。

 

使用部品説明

SDカードスロット モジュール」について説明していきます。

下記はLesson 60で説明した内容と同じ。
Lesson 60を学習済みの方は飛ばしてください。

 

SDカードスロット モジュール 実物写真

下の写真が「SDカードスロット モジュール」の実物写真です。

arduino-lesson60-01

 

端子は以下となります。

端子名内容
5VArduinoから5V供給
3.3V3.3Vを供給することも可能
GNDArduinoのGNDと接続
SCKシリアルクロック
MISOスレーブからマスタへのデータ送信ライン
MOSIマスタからスレーブへのデータ送信ライン
CSデバイスを選択するための信号
SSと呼ばれることも

詳しく知りたい方は下記を参照ください↓。

 

SDカードスロット モジュール 回路図

SDカードスロット モジュール」の回路図。

下記はLesson 60で説明した内容と同じ。
Lesson 60を学習済みの方は飛ばしてください。

 

1117」のレギュレータが搭載されており、5Vを供給することで3.3Vとして扱うことができます。

注意
信号線は直接SDカードにつながるためArduinoの出力ピン(5V)を直接つなぐと壊れる可能性があります。

 

本Lessonで使用する「SDカードスロット モジュール」の回路図と思われるものを発見。(慈渓博瑞テクノロジー株式会社 SDカードモジュール.pdf)←中国の会社だと思います。

CLK → SCK
SDI → MOSI
SDO → MISO
と読み替えてください。

arduino-lesson60-02

 

3.3V入力の対応方法

Lesson 60にて解説しています。

詳細を確認したいかたは以下を参照ください。

 

使用しているダイオードと同等のものが以下。

100個あっても・・・と思います。

 

電子工作基本部品セット」などをおすすめします。
※下記に「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

 

回路図がこちら。
※ダイオードの向きに注意!

arduino-lesson60-05

 

 

こちらがブレッドボード図。

arduino-lesson60-06

 

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下記はLesson 60で説明した内容と同じ。
Lesson 60を学習済みの方は飛ばしてください。

下図に示すように、用意した部品を使用して接続しましょう。

部品は「SDカードスロット モジュール」「1N4148×3個」となります。

 

使用するポートは

  • デジタル出力:D10、D11、D12、D13
  • 5V、GND

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

arduino-lesson60-04

 

 

事項からが本Lessonの本題です。

 

SD Module Library スケッチ例

本Lessonのメインとなります。

SD Module Library」のコマンドを確認しスケッチを描いて確認していきましょう。

 

コマンド説明(SD Module Libraryについて)

SDカートの読み取り、書き込みはArduino IDEの標準ライブラリでサポートされています。

サポートしているフォーマットはFAT16/FAT32。
※SDHCカードも使用可能

同時に開けるファイルは一つであり、ファイル名はパスを含めて指定が可能です。
※1 パスの区切り文字はスラッシュ”/”
※2 バージョン1.0からは複数ファイルの同時オープンに対応

SDカードとのやり取りは、通信となります。

 

SDカードを操作するために、下記ライブラリを使用します。

#include <SPI.h>
#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カードの挿入をお忘れなく。

補足情報
SDカードを認識するためには、フォーマットをFAT16/FAT32のいずれかにしておく必要があります。

 

■シリアルモニタの結果

下記の順番で実行しています。

  1. OMORYA1.txt 作成とファイルへの書き込み
  2. OMORYA2.txt 作成とファイルへの書き込み
  3. OMORYA2.txt 削除
  4. ディレクトリ TEST1/OMOROYA 作成
  5. ディレクトリ TEST2/OMOROYA 作成
  6. ディレクトリ OMOROYA 削除
  7. ディレクトリ TEST1 削除
  8. Fileのclose

arduino-lesson61-01

 

最終的気に残っているのは・・・

TEST2」のディレクトリと「OMORYA1.txt」のファイル。

成功です!
※タイムスタンプに対応したスケッチではないため、更新日時が本Lessonではあっていない。

arduino-lesson61-02

 

OMORYA1.txt」の中身は「testing x,y,z,1,2,3」が記載されています。

arduino-lesson61-03

 

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カードの挿入をお忘れなく。

補足情報
SDカードを認識するためには、フォーマットをFAT16/FAT32のいずれかにしておく必要があります。

 

■シリアルモニタの結果

下記の順番で実行しています。

  1. OMORYA1.txt 作成とファイルへの書き込み
  2. 作成したファイルのファイル名とファイルサイズの取得
  3. OMORYA2.txt 作成とファイルへの書き込み
  4. 作成したファイルのファイル名とファイルサイズの取得
  5. Fileのclose

arduino-lesson61-04

OMOROYA1.txt」の方にテキストを多く書き込んでいます。

ファイルサイズが2に比べて1の方が大きいことがわかります。

フィル名、ファイルサイズを読み出すことができています。

 

まとめ

本Lessonは、以下を目標としました。

1.SD Module Libraryのコマンドを理解する
2.コマンドをスケッチを描いて理解する
3.楽しんで遊ぶ!

 

「SD Module Library」のコマンドを多少なりとも理解できたでしょうか。

全てを紹介していませんが、紹介していないコマンドもスケッチを描いて遊んでみてください。

色々試して遊ぶことが理解への近道です!

 

SDカードスロット モジュール」を使ってSDカードを操作する。

本Lessonを理解していけばデータロガーの作成が可能です。

 

Lesson 61 【SDカードスロット モジュール】 その2はここまで。

疑問点、質問などありましたら気軽にコメントください。

 

次回、Lesson 62は 【SDカードスロット モジュール】 その3です。

Arduino 入門 Lesson 62 【SDカードスロット モジュール】その3
本Lessonでは、簡易的なデータロガーのスケッチを学習します。時間も取得したいところですがRTCモジュールなどと組み合わせる必要があるた本Lessonでは時間取得までは行いません。センサから得られたデータを記憶する観測装置(データロガー)…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分)一般プライム会員
5,000円~19,999円0.5%1.0%
2,0000円~39,999円1.0%1.5%
40,000円~89,999円1.5%2.0%
90,000円~2.0%2.5%

さらに、初回チャージで2000ポイントもらえるキャンペーンも実施中!
※いつもは1000ポイント、今なら2000ポイントです!

\Amazonギフト券 2000ポイントキャンペーン/
Amazonチャージ 初回購入で2000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

タイトルとURLをコピーしました