Arduinoと戯れる!

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

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

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

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

 

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

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

といっても、今回はセンサではなくて、SDカードの読み取り、書き込みについて。

センサで遊んでいると、センサから得られたデータを記憶する観測装置(データロガー)の作成がしたい・・・となるかもしれません。

手っ取り早くデータを保存するには、SDカードをArduinoで扱う必要がでてきます。

ということで、応用編に向けてArduinoを使ってSDカードを操作していきましょう。

本Lessonは2,3回を想定しています。

 

本記事はLesson 60 【SDカード モジュール】その1です。

SDカードといっても、通常のSDカード、マイクロSDカードなどがあります。

本Lessonで扱うのは通常サイズのSDカード。

手持ちにある、SDカードの読み取りモジュールがちょっと古いタイプ。

扱いづらい・・・。

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

 

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

 

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

 

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

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

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

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

 

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

 

スポンサーリンク

はじめに

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

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

 

Lesson 60 目標

本Lessonの目標は以下です。

1.SDカードスロット モジュール の使い方を学習する
2.SDカードスロット モジュール の仕組みを理解する(理解しなくてもOKです)
3.SDカードスロット モジュール を動かすスケッチを描く
4.SDカードスロット モジュール でデータの読み書きをする
5.楽しんで遊ぶ!

いつものように、遊ぶことが重要です。

 

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

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

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

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

 

ちなみに、本Lessonで使用するSDカードスロット モジュール」は、入力を3.3Vでプルアップしている回路となっているため、工夫次第でレベル変換回路不要でもOK。

 

準備

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

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

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

 

必要なもの

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

 

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

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

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

 

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

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

 

使用部品説明

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

 

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

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

arduino-lesson60-01

 

端子は以下となります。

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

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

 

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

SDカードスロット モジュール」の回路図を示します。

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

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

 

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

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

arduino-lesson60-02

 

3.3V入力の対応方法

普通であれば、レベル変換回路を利用します。
※抵抗の分圧を利用しているものも見かけました。(検索してみてください!)

本Lessonでは、3.3V入力に対応するためにダイオードを使います。

これが一番簡単かなと思います。

考え方のツボは「回路図にて入力が3.3Vにプルアップ」されているということ。

ということは、「Lowレベルを与えてあげればHighレベルはプルアップで対応できる」。

Arduinoの出力ピンから「Lowレベルだけを伝える」ことができればOKなわけです。

そこでダイオードの登場。

ダイオードは一方向のみに電流を流す性質を持っています。

その性質を利用して、SDカードの入力(Arduinoの出力ピン)にダイオードを挟むことでLowレベルのみ伝えることができます。

 

先ほどの回路図に、ダイオード(1N4148を使用)を入れた回路図がこちら。

ArudinoのHighレベル(5V)は伝わらないですが、Lowレベル(0V)は伝えることができます。

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

arduino-lesson60-03

補足情報
この方法は実装されているプルアップを使用しています。
抵抗値が10kΩで大きいため動作が不安定な場合は、外付けで抵抗を並列につけてプルアップ抵抗を下げてください。
理由:パルス波形の立ち上がりを急峻にすることで安定化をはかる

 

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

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

 

電子工作基本部品セット」などをおすすめします。
※下記に「1N41481」入っています!

 

SDカードスロット モジュール 仕様

遊び、学習で使う分には気にする特性はとくにありません。

 

■仕様抜粋(一例)

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

 

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

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

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

 

実践 回路作成とコード作成

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

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

最後にコードを書いて、「SDカードスロット モジュール」を動かしていきましょう。

 

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

 

回路図

Arduinoの使用ピンは以下。

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

 

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

arduino-lesson60-05

 

 

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

arduino-lesson60-06

 

 

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

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

 

接続

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

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

 

使用するポートは

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

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

arduino-lesson60-04

 

 

コードの書き込み

SDカードの操作に関しては、Arudino IDEに標準でサンプルプログラムが入っています。

本Lessonでは、下記2点について動作のみ確認します。

詳細なスケッチ(コード)の内容は「その2」以降で解説します。

  • SDカードを認識すること
  • SDカードへの書き込み

 

コマンド説明(動作理解編)

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

#include <SPI.h>
#include <SD.h>

ライブラリで使用できるコマンドの内容は下記で確認できます。

 

コマンドの解説に関しても、「その2」以降で解説していきます。

まずは、本Lessonでは、SDカードで遊べることを確認!

 

サンプルコード(その1)

ファイル」→「スケッチ例」→「SD」→「CardInfo」を開いていください。

今回は紹介のみ。

このサンプルプログラムは・・・

SDカードに関する情報を取得するためにライブラリをどのように使用するかを確認できるサンプルスケッチ。

カードが機能しているかどうかわからない場合に、カードをテストするのに便利です。

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

/*
  SD card test

  This example shows how use the utility libraries on which the'
  SD library is based in order to get info about your SD card.
  Very useful for testing a card when you're not sure whether its working or not.

  The circuit:
    SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module.
 		Pin 4 used here for consistency with other Arduino examples


  created  28 Mar 2011
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
*/
// include the SD library:
#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 10;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();

  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {
}

 

動作確認

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

スケッチを書き込んで、シリアルモニタを開いてください。
※SDカードの挿入をお忘れなく。

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

 

■シリアルモニタの結果

SDカードの各種情報を取得できていることがわかります。

arduino-lesson60-07

サンプルコード(その2)

ファイル」→「スケッチ例」→「SD」→「ReadWrite」を開いていください。

こちらも今回は紹介のみ。

このサンプルプログラムは・・・

SDカードファイルとの間でデータを読み書きするサンプルスケッチです。

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

/*
  SD card test

  This example shows how use the utility libraries on which the'
  SD library is based in order to get info about your SD card.
  Very useful for testing a card when you're not sure whether its working or not.

  The circuit:
    SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module.
 		Pin 4 used here for consistency with other Arduino examples


  created  28 Mar 2011
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
*/
// include the SD library:
#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 10;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();

  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {
}

 

動作確認(その2)

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

 

■SDカードの中身(書き込み前)

最初にSDカードの中身を確認。

最初は空っぽです。

arduino-lesson60-08

 

次にスケッチを書き込んで、シリアルモニタを開いてください。
※SDカードの挿入をお忘れなく。

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

 

■シリアルモニタの結果

  • SDカードへtest.txtという名前のファイルを作る
  • 作成したファイルの中へ1,2,3を書き込んで保存

arduino-lesson60-09

 

■SDカードの中身(書き込み後)

SDカードの中身を確認。

TEXT.TXT」というファイルができています。

arduino-lesson60-10

 

■ファイルの中身を確認

testing 1,2,3」と書き込まれていることがわかります。

arduino-lesson60-11

 

エクセルで扱えるCSVファイルとしても保存可能です。

本Lessonの内容を理解できれば、センサで取得した値をSDカードに保存することが可能となります。

その2以降で詳細を解説、データの取得保存をして遊んでいきます。

 

まとめ

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

1.SDカードスロット モジュール の使い方を学習する
2.SDカードスロット モジュール の仕組みを理解する(理解しなくてもOKです)
3.SDカードスロット モジュール を動かすスケッチを描く
4.SDカードスロット モジュール でデータの読み書きをする
5.楽しんで遊ぶ!

 

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

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

 

これまで遊んだセンサのデータをSDカードに保存する。

これで、また一歩応用できることが増えました!

 

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

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

 

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

Arduino 入門 Lesson 61 【SDカードスロット モジュール】その2
本Lessonは「SD Module Library」のコマンドについて学習。Lesson 60では、SDカードモジュールの使いかたを学習。スケッチは、サンプルコードを利用。各種コマンドについては理解していません。本Lesson 61はセン…

 

最後に

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

この電子部品の解説をしてほしい!などなどなんでも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円単位で可能

コメント

  1. omoroyaomoroya より:

    SDカードモジュールを使って、簡易的なデータロガーを作ってみます。
    記事は3回ぶんを予定!

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