Arduinoと戯れる!

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

arduino-lesson62-00Arduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 62
【SD カードスロット モジュール】
その3

こにんちは、管理人のomoroyaです。

センサーの使い方の基本を学習する入門編。

 

世の中には、まだまだ色々なセンサーがあります。

これからも、色々なセンサーで遊んでいきます。

本LessonはLesson 60Lesson 61から引き続き「SDカードモジュール」を使って遊びます。

Lesson 60Lesson 61では、「SDカードモジュールの使いかた」「SDカードを操作するスケッチ」を学習しました。

本Lessonでは、簡易的なデータロガーのスケッチを学習します。

本来は、時間も取得したいところです。

RTCモジュールなどと組み合わせる必要があるた本Lessonでは時間取得までは行いません。

センサから得られたデータを記憶する観測装置(データロガー)作成のための基礎学習。

本Lessonは2,3回を想定。

3回目のLessonとなります。

 

Lesson 60Lesson 61同様に、本Lessonで扱うのは通常サイズのSDカード。

これから購入するかたは、新しいタイプ(マイクロSDで3.3V変換回路付きがおすすめ)
※SDカードの入力仕様は3.3V(Arduinoを利用するならレベル変換などが必要)

 

以下が同等品。
※prime対応品(出荷元:Amazon)

 

これから始める方は3.3Vのレベル変換回路搭載のこちらがおすすめ。

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

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

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

 

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

 

スポンサーリンク

はじめに

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

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

 

また本Lessonは、簡易的な「データロガー」作成のためLesson 60Lesson 61の回路構成に「温湿度センサ:DHT11」を追加し「湿度」「温度」を取得して「SDカード」に保存します。

サーミスタとどちらを利用するか迷いましたが、「DHT11」の方が「Library」を使うことでより簡単なので「DHT11」しました。

 

Lesson 60Lesson 61をすでにお読みの方は、「実践 回路作成」からお読みください。

 

Lesson 62 目標

本Lessonの目標は以下です。

1.簡易的な「データロガー」を作成する
2.スケッチを描いて理解する
3.楽しんで遊ぶ!

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

 

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

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

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

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

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

 

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

 

準備

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

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

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

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

 

必要なもの

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

 

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

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

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

 

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

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

 

使用部品説明

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

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

 

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

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

arduino-lesson60-01

 

端子は以下となります。

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

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

 

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

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

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

 

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 60Lesson 61で説明した内容と同じ。
Lesson 60Lesson 61を学習済みの方は飛ばしてください。

 

■仕様抜粋(一例)

項目仕様
動作電圧5.0V/3.3V
LM1117/AMS117
などのレギュレータ搭載
5.0V → 3.3V

 

本Lessonは遊び、学習を想定しています。

Arduinoの仕様範囲内で使用していれば問題になることもありません。

遊び、学習以外での使用用途をお考えの場合はデータシートを必ず確認しましょう。

 

温湿度センサモジュール 実物写真

下の写真が、温湿度センサモジュール(DHT11)です。

本Lessonでは、「DHT11」にて取得した「湿度」「温度」をSDカードに保存します。

詳細は下記Lessonにて解説しています。

Arduino-lesson11-01

 

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

 

実践 回路作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、「SDカードスロット モジュール」「温湿度センサ(DHT11)」を動かしながらスケッチを理解していきましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

Arduinoの使用ピンは以下。

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

 

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

arduino-lesson62-01

 

 

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

arduino-lesson62-02

 

 

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

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

 

接続

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

部品は「SDカードスロット モジュール」「1N4148×3個」「温湿度センサ(DHT11)」となります。

 

使用するポートは

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

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

arduino-lesson62-03

 

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。

 

コマンド説明

本Lessonでは、特に新しいコマンドはありません。

 

Lesson 61にて解説したSDカードを操作するためのコマンドの一覧は再掲しておきます

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の要素数)

 

サンプルコード

Arduino のSSピン(chipSelect)はD10となります。

//Lesson 62 MH-SDカードモジュール
//温湿度センサモジュール(DHT11)を使って簡易的なデータロガーを作成
//時間取得、低電力化の対応は未
//https://omoroya.com/

/* ----- ライブラリインクルード ----- */
#include "SPI.h" 
#include "SD.h"
#include "DHT.h"

/* --- 各種設定 --- */
File myFile;                //クラス指定
const int chipSelect = 10;  //チップセレクトピン指定
const int DHT_Pin = 8;      //DHT11のDATAピンを定義

/* --- センサ初期化 --- */
#define DHT_Type DHT11      //センサの型番定義 DHT11,DHT22など
DHT dht(DHT_Pin, DHT_Type); //センサ初期化

/* --- 計測値、変数設定 --- */
float humidity = 0.0f;      //湿度
float tempC    = 0.0f;      //摂氏温度
unsigned long pos;
int i = 0;

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...");
  if (!SD.begin(chipSelect)) {
    Serial.println("Initialization failed or does not exist");
    while (1);
  }
  Serial.println("Initialization done.");
  Serial.println();
  
  /* --- 温湿度センサー開始 --- */
  Serial.println("Temperature and humidity, measurement start.");
  dht.begin();
}

void loop(){
  /* --- シリアルモニタ表示は確認用 コメントアウトOK!--- */
  /* --- 湿度、温度の読み出し ---*/
  delay(2000);                   //2秒待つ データの読み出し周期1秒以上必要。
  humidity = dht.readHumidity(); //湿度の読み出し
  tempC = dht.readTemperature(); //温度の読み出し 摂氏

  /* --- SDカード Open ---- */
  myFile = SD.open("DATA_LOG.csv", FILE_WRITE); 
  if(i == 0){
    Serial.print("No.,");Serial.print("Rh,");Serial.println("Temp.");
    /* --- SDカードに書き込み --- */
    myFile.print("No.,");myFile.print("Rh,");myFile.println("Temp.");
  }
  
  i++;
  /* --- 読み取れたかどうかのチェック--- */
  if (myFile){
    if (isnan(humidity) || isnan(tempC)) {
      Serial.println("Read failure!");
      myFile.println("Read failure!");
      return;
    }
    Serial.print(i);Serial.print(",");Serial.print(humidity);
    Serial.print(",");Serial.println(tempC);
    /* --- SDカードに書き込み --- */
    myFile.print(i);myFile.print(",");myFile.print(humidity);
    myFile.print(",");myFile.println(tempC);
  }
  myFile.close();

  /* --- 測定時間の設定 --- */
  delay(1000); //テスト用なので1秒
}

 

動作確認

では、さっそく動作を確認していきます。

スケッチを書き込んで、シリアルモニタを開いてください。

シリアルモニタは、あくまでも動作確認用です。

SDカードの挿入をお忘れなく。

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

 

■シリアルモニタの結果

DATA_LOG.csv」というファイルを作成し、「温湿度センサ(DHT11)」にて取得した「Rh.:湿度」「Temp:温度」を書き込んでいます。
※データ取得周期はサンプルスケッチのため短くしています。

Excelでデータ処理をすることを考えてカンマ区切りにしています。
※途中で湿度が70以上に変化しているのは息を吹きかけたからです。

arduino-lesson62-04

 

 

 

■SDカードに保存したファイルの中身

DATA_LOG.csv」の中身がこちら。

湿度、温度がカンマ区切りで取得できていることがわかります。

arduino-lesson62-05

 

 

簡易的な「データロガー」のサンプルスケッチですが動作理解の入門編としては十分でしょう!

 

まとめ

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

1.簡易的な「データロガー」を作成する
2.スケッチを描いて理解する
3.楽しんで遊ぶ!

 

簡易的な「データロガー」のサンプルスケッチですが理解できたでしょうか。

余力があれば「時間取得」「低電力化」を考えたサンプルスケッチに挑戦してみてください。

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

 

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

本Lessonにて簡易的なデータロガー」のサンプルスケッチを理解しました。

電池を使って、パソコンなしで動かしてみてください!

 

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

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

 

次回、Lesson 63は 「RFIDモジュール」です。

解説要望があったセンサです。

だいぶたってしまいましたが、遊んでみようと思います。

Arduino 入門 Lesson 63 【RFIDモジュール】
本記事はLesson 63 【RFIDモジュール】です。一言でいうと、電波(電磁波)を用いて、RFタグのデータを非接触で読み書きするもの。RFタグは、内蔵したメモリのデータを非接触で読み書きする情報媒体で、身近なところではSuicaなどでし…

 

最後に

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

この電子部品の解説をしてほしい!などなどなんでも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をコピーしました