できること

第21回 Arduinoでパーツやセンサを使ってみよう~SDカード編(その1)

2015年2月にArduino開発環境の最新版IDE(version1.6.0)がリリースされて、ますます使いやすくなったArduino。特に、これまでのIDEでは、プログラムを記述する際に、エラーが示す行を探しにくいなど、ちょっとしたわずらわしさがありました。今回、細かい点も改良されてとても使いやすくなりました。今回は、冒頭にArduinoの最新IDEを少しご紹介と、パーツやセンサを使ってみようシリーズということで、ArduinoでSDカードを利用してみたいと思います。

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

最新版のArduino IDEをインストールする

最新版のArduino IDEをインストールして快適な環境を手に入れましょう!さっそくArduinoの公式ウェブサイトからダウンロードを行います。

みなさんもご存知かと思いますが、Arduinoの開発提供元がグループ内の分裂により、ややこしい状況となっています(編集部注:2015年4月9日現在)。ウェブサイトもarduino.ccおよびarduino.orgの2つが存在してますが、本記事ではこれまで利用しているarduino.ccでの開発環境にて進めていきます。

図1 arduino.ccのダウンロード画面

図1 arduino.ccのダウンロード画面

下記のURLから最新版のIDEを利用中のOSに合わせてダウンロードしてください。本記事執筆時(2015年3月)では最新版で1.6.2がリリースされています。

http://arduino.cc/en/Main/Software

図2 ダウンロード画面

図2 ダウンロード画面

ダウンロード画面では、直接ダウンロードする方は「JUST DOWNLOAD」をクリック、Arduinoのプロジェクト支援に少しでも協力したい!という方は「CONTRIBUTE & DOWNLOAD」でプロジェクトの支援もすることができます。

既存のライブラリディレクトリをバックアップ

最新版のインストーラーがダウンロードできたら、インストールへと移りたいと思いますが、その前に既存のライブラリディレクトリをバックアップしておきます。最新版のインストーラーでは過去のバージョンが削除されてしまい、それと同時に追加したライブラリが消えてしまうので、バックアップしましょう。

ライブラリディレクトリの場所は、

MacOSの方は通常「書籍」–「Arduino」-「libraries」

Windowsの方は通常「MyDocument」-「Arduino」-「libraries」

ができていると思いますので、「libraries」ディレクトリをどこかにコピーなどをしてバックアップを取っておいてください。

いざインストール!

準備ができたらインストーラーファイルを実行してインストールを開始してください。インストールといっても難しいことはなく、画面の指示に従って流れに身をまかせるだけです。MacOSのインストール手順は、他のアプリケーションと同様の手順で、インストーラーのzipを解凍して、アプリケーションディレクトリに移してください(解凍した場所でファイルをクリックしてそのまま起動しても問題ありません。新旧IDEを使い分けたい、という方におすすめです)。Windowsはインストーラーの指示に従って、インストールを完了してください。

インストール完了後、バックアップしたライブラリディレクトリで、追加して引き続き利用したいライブラリは、また新たにできたlibrariesディレクトリに移してください。

新しいIDEのどこが変わったの?

これで新しいArduino開発環境が手に入りましたね。では、実際に以前のバージョンと比較し特に便利になった!というところに注目して確認していきましょう。詳細な変更点などにつきましては、スイッチサイエンスさんなどのブログで翻訳されてわかりやすく紹介されていますので気になる方はそちらをご覧ください。

図3 Arduino Software Release Notes

図3 Arduino Software Release Notes

Arduino Software Release Notes
http://arduino.cc/en/Main/ReleaseNotes

行番号の表示

行番号が左側に表示されるようになりました。普段あまりプログラミングに馴染みのない方は地味な変更だと思ってしまうかもしれませんが、かなり嬉しい方が多いと思われる改良ですね。
Arduinoの場合特に1つのファイルにずらっとプログラムが長くなってしまうことも多いですね。エラーで何行目がうんぬんと表示されても、該当の行を探すのが、ちょっと手間なので、そんな時にとても便利です。行番号を表示させるには「環境設定」から行番号の表示にチェックを入れることで利用が可能です。図4「行番号の」になっていて日本語の翻訳ちょっとおかしいですね。

図4 「行番号の」にチェック

図4 「行番号の」にチェック

図5 プログラムの左側に行番号が表示

図5 プログラムの左側に行番号が表示

メモリの消費量が確認できるようになった

図6 メッセージ画面にメモリ消費量が表示

図6 メッセージ画面にメモリ消費量が表示

プログラムのメモリ(SRAM)の消費量を確認できるようになりました。これまでも確認する方法はありましたが、標準で搭載されたおかげで便利になりました。このメモリの消費量というのは、Arduinoで記述したプログラムのファイルサイズなのです。このファイルサイズがArduinoボードそれぞれの仕様に記載されているサイズを超えてしまうと、プログラムがうまく動かないなどのエラーになってしまいます。毎回よく利用するArduino UNOではSRAMのサイズは256バイト(レジスタ)+2キロバイト(ユーザデータ)と書かれていますね。普段紹介している比較的短いプログラムなどを動かす場合などはあまり意識しなくても良いのですが、プログラムが長い場合などはこのメモリサイズの壁が出てきたりもしますので、なぜかうまく動かない、というときはメモリサイズも気にしてみてください。

他にもたくさん変更箇所がありますが、そろそろ本題に移りましょう(笑)。

ArduinoでSDカードを利用する

ArduinoでSDカードを使うまでの準備

普段WindowsやMacであまり意識することなく利用しているSDカード。Arduinoでもプログラム上で利用するためのSDカードライブラリがあって手軽に利用することができます。

Arduinoのスケッチ上にサンプルがあるので、それを試してみましょう。

「ファイル」-「スケッチ」-「SD」を開くといくつかサンプルがありますね。

図7 SDのサンプル

図7 SDのサンプル

「CardInfo」を選択してください。CardInfoではSDカードの情報のフォーマットなどの情報を確認することができます。はじめにCardInfoプログラムを読みます。

#include <SPI.h>
#include <SD.h>
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 10;
void setup()
{
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("\nInitializing SD card...");
pinMode(10, OUTPUT); // change this to 53 on a mega
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card is inserted?");
Serial.println("* Is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
return;
} else {
Serial.println("Wiring is correct and a card is present.");
}
Serial.print("\nCard 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");
}
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
return;
}
uint32_t volumesize;
Serial.print("\nVolume type is FAT");
Serial.println(volume.fatType(), DEC);
Serial.println();
volumesize = volume.blocksPerCluster(); // clusters are collections of blocks
volumesize *= volume.clusterCount(); // we'll have a lot of clusters
volumesize *= 512; // SD card blocks are always 512 bytes
Serial.print("Volume size (bytes): ");
Serial.println(volumesize);
Serial.print("Volume size (Kbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Mbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop(void) {}

 

次にArduinoの回路を準備するために、SDカードについてちょっと勉強します。

SDカードの仕様

SDカードの裏側をみると、接続端子が複数あるのがわかりますね。それぞれデータを読み書きするためなどに利用します。SDカードとmicroSDカードでは接続端子の数や順番が違います。下記が仕様表になります。

写真1 SDカードの仕様

写真1 SDカードの仕様

 

表1

SD端子番号

機能

説明

9

DAT2

使いません

1

DAT3/CS

チップセレクト

2

CMD/DI

データ入力

3

VSS

グランド

4

VDD

電源

5

CLK

シリアルクロック

6

VSS

グランド

7

DAT0/D0

データ出力

8

DAT1

使いません

microSDカードの仕様
表2

microSD端子番号

機能

説明

1

DAT2

使いません

2

DAT3/CS

チップセレクト

3

CMD/DI

データ入力

4

VDD

電源

5

CLK

シリアルクロック

6

VSS

グランド

7

DAT0/D0

データ出力

8

DAT1

使いません

今回はSDカードとArduinoの接続にmicroSDカードスロットDIP化キットを利用するので、利用するSDカードはmicroSDカードとなります。

写真2 microSDカードスロットDIP化キット

写真2 microSDカードスロットDIP化キット

microSDカードスロットは1〜10まで接続端子がありますが、9、10については、microSDカードがスロットに接続されているかどうかを判別するためのスイッチとして利用することができるようになっています。(今回は利用しません)

写真3 9,10番端子

写真3 9,10番端子

 

上記の仕様を踏まえて、回路組んでいきます。SDカードは動作に3.3V必要です。今回利用するArduino Pro Mini(5V)やArduino UNOでは、Arduinoの電源出力のVCCでは5Vが出力されていますので、そのままSDカードにつなぐとSDカードが壊れて使えなくなってしまいます。なので、電圧を3.3Vまで降下してSDカードと通信をできるように回路を組みます。

teikou

図8 抵抗分圧の法則

 

今回は、手元に3.3KΩと1.8KΩの抵抗がありましたのでそれを利用します。1.7KΩがあれば、3.3Vと1.7Vをきれいに分圧できますが、0.1KΩであればおおよそ動作するので、今回は1.8KΩを利用します。

回路は図9のとおりになります。

図9 SDカードの回路

図9 SDカードの回路

写真4 SD回路

写真4 SD回路

回路ができたら早速プログラムを実行してみましょう。

図10 シリアルモニターで確認

図10 シリアルモニターで確認

プログラムを実行したらシリアルモニターを表示してください。そうすると、SDカードの情報が表示されます。このプログラムでは、カードの種類や、フォーマットの形式などを表示することができます。シリアルモニターに表示されているメッセージを読むと、今回利用したSDカードは「FAT16/FAT32のパーティションが見つからないよ」、と表示されていることがわかります。ArduinoのSDライブラリでSDカードを利用する場合、SDカードのフォーマットはFAT16もしくはFAT32にする必要がありますので、WindowsやMacのソフトでフォーマットを変更して再度試してください。
今回、Windowsでフォーマットしてもうまくいかなかったので、SDメモリカードフォーマッターを利用しました。

図11 SDカードの読み込み完了

図11 SDカードの読み込み完了

無事SDカードを読み込むことができました。

まとめ

SDカードを利用する準備ができたので、次回はSDカードを使ったデータの読み書きを行っていきます。「第6回Arduinoを使ってWebサーバーをつくろう!」で解説したArduinoをサーバーに、受けたデータを保存し、光センサーや温度センサーなどの数値をSDカードへ蓄積した応用例を紹介していきます。

アバター画像

電子工作や新しいデバイスをこよなく愛するエンジニア。日常生活のちょっとしたことを電子工作で作って試して、おもしろく過ごしたいと日々考えています。

NHK学生ロボコン2016 出場ロボット解剖計画