2015年2月にArduino開発環境の最新版IDE(version1.6.0)がリリースされて、ますます使いやすくなったArduino。特に、これまでのIDEでは、プログラムを記述する際に、エラーが示す行を探しにくいなど、ちょっとしたわずらわしさがありました。今回、細かい点も改良されてとても使いやすくなりました。今回は、冒頭にArduinoの最新IDEを少しご紹介と、パーツやセンサを使ってみようシリーズということで、ArduinoでSDカードを利用してみたいと思います。
今回の電子工作レシピ
完成までの時間目安:60分
必要なパーツ
- Arduino本体(Arduino Pro Mini)http://www.switch-science.com/catalog/946/
- ブレッドボード http://www.switch-science.com/catalog/313/
- microSDカードスロットDIP化キット http://akizukidenshi.com/catalog/g/gK-05488/
- microSDカード
- 抵抗器(1.8KΩ × 3 / 3.3KΩ × 3)
- コンデンサ(100μF)
最新版のArduino IDEをインストールする
最新版のArduino IDEをインストールして快適な環境を手に入れましょう!さっそくArduinoの公式ウェブサイトからダウンロードを行います。
みなさんもご存知かと思いますが、Arduinoの開発提供元がグループ内の分裂により、ややこしい状況となっています(編集部注:2015年4月9日現在)。ウェブサイトもarduino.ccおよびarduino.orgの2つが存在してますが、本記事ではこれまで利用しているarduino.ccでの開発環境にて進めていきます。
下記のURLから最新版のIDEを利用中のOSに合わせてダウンロードしてください。本記事執筆時(2015年3月)では最新版で1.6.2がリリースされています。
http://arduino.cc/en/Main/Software
ダウンロード画面では、直接ダウンロードする方は「JUST DOWNLOAD」をクリック、Arduinoのプロジェクト支援に少しでも協力したい!という方は「CONTRIBUTE & DOWNLOAD」でプロジェクトの支援もすることができます。
既存のライブラリディレクトリをバックアップ
最新版のインストーラーがダウンロードできたら、インストールへと移りたいと思いますが、その前に既存のライブラリディレクトリをバックアップしておきます。最新版のインストーラーでは過去のバージョンが削除されてしまい、それと同時に追加したライブラリが消えてしまうので、バックアップしましょう。
ライブラリディレクトリの場所は、
MacOSの方は通常「書籍」–「Arduino」-「libraries」
Windowsの方は通常「MyDocument」-「Arduino」-「libraries」
ができていると思いますので、「libraries」ディレクトリをどこかにコピーなどをしてバックアップを取っておいてください。
いざインストール!
準備ができたらインストーラーファイルを実行してインストールを開始してください。インストールといっても難しいことはなく、画面の指示に従って流れに身をまかせるだけです。MacOSのインストール手順は、他のアプリケーションと同様の手順で、インストーラーのzipを解凍して、アプリケーションディレクトリに移してください(解凍した場所でファイルをクリックしてそのまま起動しても問題ありません。新旧IDEを使い分けたい、という方におすすめです)。Windowsはインストーラーの指示に従って、インストールを完了してください。
インストール完了後、バックアップしたライブラリディレクトリで、追加して引き続き利用したいライブラリは、また新たにできたlibrariesディレクトリに移してください。
新しいIDEのどこが変わったの?
これで新しいArduino開発環境が手に入りましたね。では、実際に以前のバージョンと比較し特に便利になった!というところに注目して確認していきましょう。詳細な変更点などにつきましては、スイッチサイエンスさんなどのブログで翻訳されてわかりやすく紹介されていますので気になる方はそちらをご覧ください。
Arduino Software Release Notes
http://arduino.cc/en/Main/ReleaseNotes
行番号の表示
行番号が左側に表示されるようになりました。普段あまりプログラミングに馴染みのない方は地味な変更だと思ってしまうかもしれませんが、かなり嬉しい方が多いと思われる改良ですね。
Arduinoの場合特に1つのファイルにずらっとプログラムが長くなってしまうことも多いですね。エラーで何行目がうんぬんと表示されても、該当の行を探すのが、ちょっと手間なので、そんな時にとても便利です。行番号を表示させるには「環境設定」から行番号の表示にチェックを入れることで利用が可能です。図4「行番号の」になっていて日本語の翻訳ちょっとおかしいですね。
メモリの消費量が確認できるようになった
プログラムのメモリ(SRAM)の消費量を確認できるようになりました。これまでも確認する方法はありましたが、標準で搭載されたおかげで便利になりました。このメモリの消費量というのは、Arduinoで記述したプログラムのファイルサイズなのです。このファイルサイズがArduinoボードそれぞれの仕様に記載されているサイズを超えてしまうと、プログラムがうまく動かないなどのエラーになってしまいます。毎回よく利用するArduino UNOではSRAMのサイズは256バイト(レジスタ)+2キロバイト(ユーザデータ)と書かれていますね。普段紹介している比較的短いプログラムなどを動かす場合などはあまり意識しなくても良いのですが、プログラムが長い場合などはこのメモリサイズの壁が出てきたりもしますので、なぜかうまく動かない、というときはメモリサイズも気にしてみてください。
他にもたくさん変更箇所がありますが、そろそろ本題に移りましょう(笑)。
ArduinoでSDカードを利用する
ArduinoでSDカードを使うまでの準備
普段WindowsやMacであまり意識することなく利用しているSDカード。Arduinoでもプログラム上で利用するためのSDカードライブラリがあって手軽に利用することができます。
Arduinoのスケッチ上にサンプルがあるので、それを試してみましょう。
「ファイル」-「スケッチ」-「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端子番号 |
機能 |
説明 |
---|---|---|
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カードとなります。
microSDカードスロットは1〜10まで接続端子がありますが、9、10については、microSDカードがスロットに接続されているかどうかを判別するためのスイッチとして利用することができるようになっています。(今回は利用しません)
上記の仕様を踏まえて、回路組んでいきます。SDカードは動作に3.3V必要です。今回利用するArduino Pro Mini(5V)やArduino UNOでは、Arduinoの電源出力のVCCでは5Vが出力されていますので、そのままSDカードにつなぐとSDカードが壊れて使えなくなってしまいます。なので、電圧を3.3Vまで降下してSDカードと通信をできるように回路を組みます。
今回は、手元に3.3KΩと1.8KΩの抵抗がありましたのでそれを利用します。1.7KΩがあれば、3.3Vと1.7Vをきれいに分圧できますが、0.1KΩであればおおよそ動作するので、今回は1.8KΩを利用します。
回路は図9のとおりになります。
回路ができたら早速プログラムを実行してみましょう。
プログラムを実行したらシリアルモニターを表示してください。そうすると、SDカードの情報が表示されます。このプログラムでは、カードの種類や、フォーマットの形式などを表示することができます。シリアルモニターに表示されているメッセージを読むと、今回利用したSDカードは「FAT16/FAT32のパーティションが見つからないよ」、と表示されていることがわかります。ArduinoのSDライブラリでSDカードを利用する場合、SDカードのフォーマットはFAT16もしくはFAT32にする必要がありますので、WindowsやMacのソフトでフォーマットを変更して再度試してください。
今回、Windowsでフォーマットしてもうまくいかなかったので、SDメモリカードフォーマッターを利用しました。
無事SDカードを読み込むことができました。
まとめ
SDカードを利用する準備ができたので、次回はSDカードを使ったデータの読み書きを行っていきます。「第6回Arduinoを使ってWebサーバーをつくろう!」で解説したArduinoをサーバーに、受けたデータを保存し、光センサーや温度センサーなどの数値をSDカードへ蓄積した応用例を紹介していきます。