Arduinoを使ったSDカードへのデータ保存(温度データロガー、温度記録計)

Arduinoを使って様々なセンシングを容易に行うことが可能です。しかし、ATmega328(168)のROMへ保存できるデータは1 k(0.5k)バイトに限られます。今回はSparkfunのSDカードシールドを使って、市販のmicro SDへデータを保存することにチャレンジしました。データとしてはIC温度センサ(LM35D)を用いて0.1℃単位の温度を測定することにいたしました。これにより非常に長時間(電池が持てば1年でも2年でも)の計測データを保存することが可能となります。


SDカードへはテキストファイルで保存されますのでメモ帳やExcel,Word等で簡単に読めます。
クリックするとサンプルが開きます。

家庭の消費電力計測器と遠隔監視、ネットワーク保存に発展させました。

ICを使った温度計測の方法

温度計測には測温抵抗体(サーミスタ)、熱電対などの方法がありますが、今回は精度が高く、扱いやすいIC温度センサLM35DZを採用いたしました。このセンサーはデータにあるように0℃を基準に+10 mV/℃の電圧を出します。例えば、24.5℃⇔245 mV, 70.2℃⇔702 mVのように電圧から温度を換算するのが極めて容易です。マルチメーターを温度計として使用するような用途も考えられますね。また、ICの端子は3つだけで、外付けの部品が必要無いところも非常に扱いやすいです。ノイズを減らすために、出力ラインにコンデンサを1個つけましたが、IC単体でも使用できると思います。以下に回路図を示します。入力にArduinoの5 V端子を、GNDはグランドに接続します。温度ICの出力はArduinoのanalog in の0番端子への接続としました。


LM35DZを使った温度計測回路。


温度計測回路のチェック。プレッドボード右の抵抗は未使用です。部品はたったの2つ。

アナログ電圧の読み取りでは、Voltage=AnalogRead(0);で0番端子のデータが読み取れます。ArduinoのADコンバーターは10bitですので5 Vを1024分割して計測します。今回の温度計測では0-100 ℃=0-1000 mVを計測するため、この状態では計測の分解能が約0.5 ℃となってしまいます。そこで、analogReference(INTERNAL);として内部の基準電圧(1100 mV)を最大値としました。そのため、読み取り値(AveAin)から温度(Temp10)への換算にはTemp10=(long) (aveAin*1100/1024); を用いています。桁数を増やしたいときにはAD変換ICを追加する必要があります。また、analogReference(EXTERNAL);として5 Vから分圧した電圧を基準とすることも可能です。

Arduinoを用いたSDカードへの記録

続いてはArduinoで読んだデータをSDカードへ保存するための準備です。今回はSparkfun社のmicro SD card shield(マイクロSDカードシールド)をスイッチサイエンスから購入いたしました。スイッチサイエンスは送料も安いですし、すぐに届いて本当に便利ですね。5 Vを3.3 Vに落とす回路を入れて自作されている方もたくさんいらっしゃいますね。回路は簡単ですが、カード差し込み口のはんだ付けが難しそうですね。このシールドのフリーのボード領域に温度センサーをはんだ付けしたのが以下の写真になります。


Sparkfun社のマイクロSDカードシールドに温度センサを取り付けた図。

追記: ATmega328をArduinoから取り外して動作させるにて、SDカードシールドを使わない、安上がりの方法でSDカードにデータを保存する方法を公開しています。

温度計測(アナログ入力)とSDカードへの保存のためのスケッチ(プログラム)

スケッチはこちらからダウンロードできます。 注意点は以下の5つです。

void setup(){}は以下のようにしました。不必要な部分は削ってお使いいただければ幸いです。

void setup(){
  analogReference(INTERNAL);                         //use internal voltage(1.1 V) as the analog input reference, アナログ入力の最大電力を1.1 Vとする。
  Serial.begin(9600);                               // serial communication rate, シリアル通信のレート
  Serial.print("Initializing SD card...");          //check the Serial communication 
  pinMode(chipSelect, OUTPUT);                       //Define chipselect terminal 8 as output, チップセレクトに使う8番端子はoutputとする。 
  if (!SD.begin(chipSelect)) {                       // check the SD card is available or not, SDカードが利用可能などうか確認
    Serial.println("Card failed, or not present");  // in the case of SD card error, SDカード読み取りエラーの時のメッセージ
  }else{
  Serial.println("Card initialized.");              //in the case of SD card is available, SDカードが読み取れた時のメッセージ
  }
}

SDカードへの書き込みを容易にするため、 以下のようなサブルーチン(関数と言った方が適切でしょうか?)を作成して使いました。

// Subroutine for writing data in SD card, SDカードへのデータ書き込みのためのサブルーチン
void PrintToFile(String dataIn){
  File dataFile = SD.open("datalog.txt", FILE_WRITE);  // define the filename, ファイル名を定義。
  if (dataFile) {                                      //if the file in the SD card was open to wrihte, SDカードの対象ファイルを開くことができれば
    dataFile.println(dataIn);                          // write data into the file, データの記入 
    dataFile.close();                                  // close the file, ファイルを閉じる
    Serial.println(dataIn);                           // print to the serial port too,シリアルポートにも出力して確認。
  }else {                                              // if the file isn't open, pop up an error message, ファイルが開けないときのエラーメッセージ
    Serial.println("error opening file");
  } 
}

これをvoid loop(){}の後ろに書き加えておけばメインのプログラム中で

PrintToFile(dataString);

と書くだけで"dataString"に入っている文字列がファイルに記入されます。ファイル名は"datalog.txt"です。PCなどであらかじめSDカード中にこのファイルを作成しておくとよいと思います。データは消えることなく、ファイルの一番下に追加されていきます。

動作状況

加熱した半田ごてを@センサーに近づける、A触れさせる、という操作をした時の読み取りを行い動作をチェックしました。正確な校正には氷水と沸騰水を使うのが良いかと思いますが、その時にはセンサICをケーブルの先に接続する必要がありますね。


動作状況。USBから1.3 V*4=5.2 Vを電力供給。
コンパクトにするには9 V角型電池をVinに入れるのが良いかと思います。


温度計測の例。半田ごてを@センサーに近づける、A触れさせる、の後、自然冷却

データ保存容量

今回は900行のデータでおよそ9kBの容量でした。一行あたり約10バイト(もちろん、数字の桁数に比例しますが)ですので4 GBのSDカードを使えば400×100万行のデータを保存できます。1秒に100回のデータを保存しても400万秒=14年連続してデータが保存できます。読み取り速度とデータ書き込み速度で制限されますが、10 kHzの周波数でデータを読み取っても半年程度もちます。最近のフラッシュメモリの容量増大はすごいですね。


一冊買って読みながらスケッチを作ると楽です。
〈 Arduino 〉SD card shield for Arduino V2.1

〈 Arduino 〉SD card shield for Arduino V2.1
価格:1,502円(税込、送料別)

Arduino工作アイデア集 (マイコンと電子工作 No.6) 【CQ出版】

Arduino工作アイデア集 (マイコンと電子工作 No.6) 【CQ出版】
価格:2,100円(税込、送料別)


戸田システムウェア

ここで公開するアイデア/装置は安全性を保障しておりません。 用途に応じた設計を行い、十分な安全検査を行ってからご利用ください。 本サイトの情報の営利目的での利用はご遠慮ください。 本サイトの内容の無断転載を禁じます。© 2011,2012 TYK