Arduinoを使って様々なセンシングを容易に行うことが可能です。しかし、ATmega328(168)のROMへ保存できるデータは1 k(0.5k)バイトに限られます。今回はSparkfunのSDカードシールドを使って、市販のmicro SDへデータを保存することにチャレンジしました。データとしてはIC温度センサ(LM35D)を用いて0.1℃単位の温度を測定することにいたしました。これにより非常に長時間(電池が持てば1年でも2年でも)の計測データを保存することが可能となります。
温度計測には測温抵抗体(サーミスタ)、熱電対などの方法がありますが、今回は精度が高く、扱いやすい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番端子への接続としました。
アナログ電圧の読み取りでは、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カードへ保存するための準備です。今回はSparkfun社のmicro SD card shield(マイクロSDカードシールド)をスイッチサイエンスから購入いたしました。スイッチサイエンスは送料も安いですし、すぐに届いて本当に便利ですね。5 Vを3.3 Vに落とす回路を入れて自作されている方もたくさんいらっしゃいますね。回路は簡単ですが、カード差し込み口のはんだ付けが難しそうですね。このシールドのフリーのボード領域に温度センサーをはんだ付けしたのが以下の写真になります。
追記: ATmega328をArduinoから取り外して動作させるにて、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をケーブルの先に接続する必要がありますね。
今回は900行のデータでおよそ9kBの容量でした。一行あたり約10バイト(もちろん、数字の桁数に比例しますが)ですので4 GBのSDカードを使えば400×100万行のデータを保存できます。1秒に100回のデータを保存しても400万秒=14年連続してデータが保存できます。読み取り速度とデータ書き込み速度で制限されますが、10 kHzの周波数でデータを読み取っても半年程度もちます。最近のフラッシュメモリの容量増大はすごいですね。
ここで公開するアイデア/装置は安全性を保障しておりません。 用途に応じた設計を行い、十分な安全検査を行ってからご利用ください。 本サイトの情報の営利目的での利用はご遠慮ください。 本サイトの内容の無断転載を禁じます。© 2011,2012 TYK