このブログへの投稿/アップロードについて(コメントは誰でも、投稿は受講者+スタッフのみ)
コメント/投稿/ラベルについて(基本事項)投稿時間の設定(下書き/予定など)プログラム(ソースコード)を投稿する際の注意点Processingのプログラム(Applet)を表示する方法
ArduinoやProcessingについては「建築発明工作ゼミ2008」の方にまとめてあります。
秋葉原の電子工作マップ、Arduino販売店についてはこちら。 :

2009年6月28日日曜日

Arduinoで計測した値を指定のwebサーバに送信、保存する

上に乗っかっているのがEthernet Shield、下にあるのがArduino。



















参考
「Arduino Ethernet Shield」--イーサネットシールドを使って、ArduinoをWebサーバとして機能させる
「Processing HTTPサーバ/Webページ表示」--Networkライブラリを使ってWebサーバとして機能させる
Arduino と Ruby で温湿ネットロガー
Hobby Robotics » Arduino, Xport, PHP and the Internet
Making Things Talk -Arduinoで作る「会話」するモノたち
PHP マニュアル

材料
Arduino Duemilanove
Arduino Ethernet Shield
温度センサ LM35DZ



ゼミで行う植物データの計測とデータの記録方法はそれこそ手書きでメモを取ったり、写真や映像に記録したりといろいろな方法があるのだと思います。
今回は、温度計測の値を指定のレンタルサーバに送信し、サーバのテキストファイルに記録保存してみます。
まず、この記録方法のメリットとデメリットを考えてみました。

メリット
・Arduinoを使用して計測記録するのが前提である場合、記録データは指定したweb上のサーバに保存するので、Arduinoと自宅のPC( もしくはMac )を常時接続しなくてもよい。
・記録したデータはwebにあるので、ネットに接続できる環境にいるならばいつでも記録データを閲覧できる。

デメリット
・ちょっとだけ設定が難しい(目的はあくまでも植物の観察なのですが、そこに行くまでが面倒です)。
・自宅webサーバを組める技術がない場合、レンタルサーバを借りなければならない(今回は、月500円のYahoo giocities を使っています)。
・サーバサイドスクリプトを書かなければいけない(今回は、PHP使います)。
・ネットワークの知識がちょっとだけ必要。


回路図

回路図は以前アップした「温度センサ」の時と変わりません。Ethernet Shieldは、Arduinoをネットに接続してデータの送受信を行えるようにするシールドで、上の写真のようにArduinoに装着します。
ピンはArduinoとほぼ同じように使えます。

全体的な流れですが、

・まず、以前アップした温度計測の時と同じようにArduinoでデータを取得する(今回は最大温度と最小温度の計測は省きます)。
・ルータに接続したEthernet Shield から、ArduinoのEthernetライブラリを使って指定のサーバにデータをアップ。
・受け取ったデータを、下記のPHPスクリプトで指定のディレクトリにテキストデータとして保存する。

となります。















Arduinoのスケッチ

#include <Ethernet.h>
int    A_inPin    = 0;     // アナログ入力ピン番号
int    A_val;              // アナログ入力値(0?1023)
int    outputTerm = 10;    // 計測結果出力ターム(10秒ごとに平均摂氏値を出力する)
float  v          = 5;     // 基準電圧値( V )
int    tempC      = 0;     // 摂氏値( ℃ )
float  tempCPlus  = 0;     // 10秒ごとの合計摂氏値( ℃ )
float  maxTempC   = 0;     // 10秒ごとの最大摂氏( ℃ )
float  minTempC   = 0;     // 10秒ごとの最小摂氏( ℃ )
/* サーバのポート番号を定義 */
#define PORT 80
// Ethernet Shild MACアドレス
byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
// Ethernet Shild IPアドレス
byte ip[] = { 10 , 0 , 1 , 100 };
// 接続先のIPアドレス
byte server[] = { 123, 456, 789, 012 };
// 指定したIPアドレスとポートに接続するクライアントを生成
Client client = Client(server, PORT);

void setup(){
Serial.begin(9600);
// Ethernetライブラリとネットワーク設定を初期化
Ethernet.begin(mac, ip);
delay(1000);
Serial.println("connecting...");
}

void loop(){
// 1秒に一回、10秒間分温度計測
for (int i = 0; i < outputTerm; i++ ) {
// アナログピンから計測値を取得(0~1023)
A_val =  analogRead( A_inPin );
// 摂氏に換算
tempC = ((v * A_val) / 1024) * 10000;
// 現for文ループ内で使わなくなった変数は解放
A_val = 0;
// 平均値を取得するために1秒ごとの値を10秒分合計しておく
tempCPlus += tempC;
// 現for文ループ内で使わなくなった変数は解放  
tempC = 0;
// 1秒間ストップ
delay(1000);
}
// 10秒間の平均摂氏値
tempC = tempCPlus / outputTerm;
// 現loop()ループ内で使わなくなった変数は解放
tempCPlus = 0;
// 指定したwebサーバへの接続開始
// 成功
if (client.connect()) {
Serial.println("connected");
// 指定のwebサーバのPHPスクリプトにGET送信
// 'temp'という名前で計測した温度値を送信
client.write("GET /temp_write.php?temp=");
client.print(tempC, DEC);
client.write(" HTTP/1.1\n");
client.write("HOST: www.○○○.net\n\n");
// 接続を終了
client.stop();
// 失敗
} else {
Serial.println("connection failed");
client.stop();
}
// 現loop()ループ内で使わなくなった変数は解放
tempC = 0;
delay(20000);
}


IPアドレスは参考リンクを参照しました。接続先(webサーバ)のIPアドレスは、下記のPHPスクリプトを使いました。

<?php
$ipAddress = gethostbyname($_SERVER['SERVER_NAME']);
print $ipAddress;
?>
テキストエディタなどでこのPHPスクリプトを作成し、 'print_ip.php' と命名して下記のディレクトリ構成図のtemp_write.phpと同列に設置し、webブラウザのURLに

http://www.○○○.net/print_ip.php

と打ち込めば、このスクリプトが実行されたサーバのIPアドレスがわかります。

上記スケッチの

client.write("GET /temp_write.php?temp=");
client.print(tempC, DEC);
client.write(" HTTP/1.1\n");
client.write("HOST: www.○○○.net\n\n");

の部分が、PHPスクリプトに値を送信している箇所です。「temp」という名前の「tempC」の値を送信しています。
注意しなければならないのは、write()メソッドは byte型か char型のデータしか正しく送信しないので、int型の変数値を送信するときは print()メソッドを使うことです。
もし、複数の値を送信したければ、

client.write("GET /temp_write.php?temp=");
client.print(tempC, DEC);
client.write("&water_temp=");
client.print(water_temp, DEC);
...

などと「&」でつなげてゆきます。そうすると、リクエスト文字列は

GET /temp_write.php?temp=○○○&water_temp=○○○

となります。

データをアップするwebサーバのディレクトリ構成は右のようになります。

Document Root
+ / data
|   + data.txt
+ / temp_write.php


Document Rootとはこの場合、http://www.○○○.net/ となります(○○○の部分は設定した私のドメイン)。webブラウザのURL入力部分に

http://www.○○○.net/temp_write.php

と打ち込めば、temp_write.php の処理が実行されます。

http://www.○○○.net/data/data.txt

と打ち込めば、このデータファイルが画面に表示されます。
(セキュリティをまったく考慮していないということです。)









PHPスクリプト(temp_write.php)

<?php
// 'temp' という名前で Arduino からGET送信された温度の値を受け取る
$strTempVal = $_GET['temp'];
// 値をフォーマット(小数点以下の数値を1桁まで切り詰める)+ 改行コード
$strTempVal = number_format(($strTempVal / 100), 1) . "\n";
// データを保存するテキストファイルの相対パス
$strDataFilePath = 'data/data.txt';
// データを保存するテキストファイルを追記モードでオープン
$fp = fopen($strDataFilePath, "a");
// 送信された値をテキストファイルに書き込み
fwrite($fp, $strTempVal);
// ファイルポインタをクローズ
fclose($fp);
?>


これで、

/data/data.txt

に、値が下のように記録されていきます。

23.4
23.6
22.7
23.1



あとは、processing applet test(2) でやったように、processing などでデータを好きに加工表示できます。
注意しなければならないのは、processing などで加工表示するためにデータを読みに行く時、PHPスクリプトの書き込みとバッティングするとデータが壊れる可能性があるので、Arduino の DateTime ライブラリなどではなく、NTP ライブラリなどでネットから時刻を取得し、書き込みと読み込みの時刻を完全にずらせるように調整する必要があります。



植物・農業・エレクトロニクス・音楽...。実験とプロジェクトのblog。 ▶ projects : Biotope

2009年6月23日火曜日

FIO(Funnel I/O)をArduino+Xbeeとして使ってみる

FIOはLilyPad Arduino v1.6から派生してデザインされたArduino互換機です。リチウムポリマー電池に接続でき、USBから給電する充電回路も内蔵しています。また、ボードの下面にXBee用のソケットがあります。(funnelサイトから引用)

通常FIOは、無線が搭載されたGainerのような使い方をします。また、funnelサーバを介しての操作になります。

でも、私は、
①折角Arduinoの機能を持っているのでそれを活かしたい
②Xbeeシールド+Arduino+Xbeeよりもコストが安い(だいたいXbeeシールド分安い)
③Arduino DuemilanoveとXbeeシールド+Xbeeよりもコンパクト
④funnelサーバを介さず、操作したい(サーバ用に新たに記入ルールを覚えるのが億劫)
⑤スタンドアローンで成立させたい

こんな思いから、FIOを通常のArduinoで使えないか試してみました。

ただし、基本的な仕様はLilyPadベースということなので、3.3V電源、8MHzの動作、ATmega168などのスペックでは、不十分、不便という方は、普通にXbeeシールドで構築した方がいいかもしれません。

FIOのセッティングは、Funnel.ccサイト(http://funnel.cc/Hardware/FIO?userlang=ja)を参考にしてください。やや情報不足気味なので、こちらも参考にしてみてください。私は、最初どうやってFIOにプログラムをUPLOADすればよいか分からず、苦労しました。まずは、通常の使い方を試してからの方がスムーズかもしれません。
http://www.hara3.net/blog/2009/02/funnel-set-up.html

前置きがながくなりましたが、やり方はとても、簡単でXbeeの設定変更だけですぐにできました。なお、Xbee+FIOを2つにしても問題なく動作しました。(いろいろ試行錯誤してやっとできました・・・)

ちなみにwindowsの場合は、X-CTUというツールを使うと、Xbeeの設定がやりやすくなります。ターミナルでコマンド打つよりは、楽なインターフェースです。状態も分かりますしね。ダウンロードはこちら。無料です。
http://www.digi.com/support/productdetl.jsp?pid=3352&osvid=57&tp=4&s=316

その中で、今回設定したのは、

親Xbee(Xbee Explorer USB側)
ID:1234
CH:C
MY:1111
DH:0
DL:FFFF
BD:4(19200bps)

子Xbee(FIO側)
ID:1234
CH:C
MY:2222
DH:0
DL:1111
BD:4(19200bps)

設定の参考にさせてもらったサイトです。

建築発明工作ゼミ2008
http://kousaku-kousaku.blogspot.com/2008/10/arduinoxbee-shieldprocessingxbee.html

2009年6月21日日曜日

processing applet test(2)

再び実験してみます。
こんどは、サーバにアップしたテキストデータを読み込み、視覚化してみます。
読み込みは10秒ごとです。





テキストデータを表示


processingスケッチ

/*
webサーバにアップされたテキストデータ(日付時刻と温度)を
読み込み、加工表示する
*/

PFont font; // フォント情報
String dateTime; // 日付時刻
int Temp; // 温度
int Correction = 2; // 表示補正

// データファイルから1行づつ読み込むためのJAVAのクラス
BufferedReader reader;

void setup()
{
// 画面サイズ

size(245, 260);

// 四角形のモード
rectMode(CORNERS);

// フォントを読み込む
font = loadFont("FranklinGothic-Medium-12.vlw");

// dataフォルダからデータを読み込む
// ○の部分は個々に設定
reader = createReader("http://www.○/data/.txt");
}

void draw()
{

// エラーがない場合
try {

// 1行分読み込む
String line = reader.readLine();

// もし読み込んだ1行分のデータが存在するならば
if (line != null) {

// テキストデータを「|」で分割、配列に格納
// 例)
// columns[0] には'2009/06/21 00:03:20'などの日付時刻部分が格納される
// columns[1] には'015'などの温度データ部分が格納される
String[] columns = split(line, '|');

// 日付時刻部分のテキストデータを変数に格納
dateTime = columns[0];

// 温度部分のテキストデータを数値型に変換して変数に格納
Temp = int(columns[1]);
}

// なんらかのエラーがあった場合
} catch (IOException e) {

// エラーメッセージを出力
e.printStackTrace();
}

// 描画前にdraw()ループごとに一度画面全体をクリアする
background(255);

fill(255);
rect(30, 10, 230, 210);
stroke(200);
line(30, 30, 230, 30);
line(30, 50, 230, 50);
line(30, 70, 230, 70);
line(30, 90, 230, 90);
line(30, 110, 230, 110);
line(30, 130, 230, 130);
line(30, 150, 230, 150);
line(30, 170, 230, 170);
line(30, 190, 230, 190);

fill(255);
textFont(font, 12);

fill(0);
text("90", 10, 35);
text("80", 10, 55);
text("70", 10, 75);
text("60", 10, 95);
text("50", 10, 115);
text("40", 10, 135);
text("30", 10, 155);
text("20", 10, 175);
text("10", 10, 195);
text("(C)", 10, 215);
text("datetime : " + dateTime, 45, 230);
text("temp : " + Temp + " C", 45, 245);

// 棒グラフ
rect(125, (210 - (Temp * Correction)), 135, 210);

// 10秒間ストップ
delay(10000);
}



植物・農業・エレクトロニクス・音楽...。実験とプロジェクトのblog。
projects : Biotope

processing applet test

実験してみます。




このスケッチは、ProcessingのExamplesからの引用です。
File->Examples->Topics->Simulate->Fluid

植物・農業・エレクトロニクス・音楽...。実験とプロジェクトのblog。
projects : Biotope

段ボールコンポスト

段ボールコンポストを作りました。

材料

段ボール箱(ダブルが好ましい)
新聞紙
ガムテープ
ピートモス18ℓ
くん炭12ℓ
水1ℓ


みかん箱程度の大きさの段ボール箱に新聞紙を貼付ける。











参考
6月20日の農業ゼミ
wikipedia - 段ボールコンポスト

そのなかにピートモスとくん炭をいれる。よくかき混ぜて、さらに水を加える。




















中にいれる生ゴミなどを分解する微生物は好気性とのことなので、蓋に穴を開けておく。

できあがり。



















さっそく、昨日のみそ汁の残りかすを入れ、よくかき混ぜる。
蓋をして、直射日光のあたらない風通しのよい場所に設置する。
なるべく生ゴミはこのコンポストで処理するようにしてみます。



植物・農業・エレクトロニクス・音楽...。実験とプロジェクトのblog。
projects : Biotope

2009年6月20日土曜日

投稿する際の投稿時間の設定

「投稿を作成」画面の投稿記事記入欄左下の「投稿オプション」をクリックすると、以下の画像のように「閲覧者のコメント」と「投稿日と投稿時刻」の設定が可能になります。


・「閲覧者のコメント」については「許可(初期設定)」にしておいてコメント可能にしておいて下さい。

・「投稿日と投稿時刻」については、投稿日や時刻を指定して投稿することが可能です。

記入されている投稿日によって、このブログの投稿記事の表示される順番が変わります。
通常は、投稿記事を記入し最初に保存された時間が、自動的にその記事の投稿時刻となります。
投稿記事は、最新の投稿日ほどページの前(あるいは上)に表示されます。
投稿してから、新たに記事の表示順番を変えたいときなどに設定すると便利です。

また、「すぐに保存」だけを押して(「投稿を公開」ボタンを押さずに)記事内容を保存すれば、記事の公開を保留あるいは非表示に設定できます。その際に、一番下にある「投稿のリストに戻る」(上画像)をクリックすれば、以下のような画面が現れ、その投稿記事は「下書き」状態として保存されていることが確認できます。
画面左の「編集」をクリックすれば、続けて記事内容を編集し直すことができます。


あるいは、前述の「投稿日と投稿時刻」を将来的な日時に設定し、「投稿を公開」ボタンを押すことで以下の画面のように「予定」として保存され、その後設定した日時がくると自動的に公開表示されることになります。


再度「編集」をクリックすれば、いつでも記事内容と同様に日時の設定も編集し直すことができます。
記事を削除するには投稿リスト画面左側の「削除」をクリックして下さい。

ゴーヤ、サツマイモ栽培

5月17日、自宅のベランダでゴーヤとサツマイモの栽培を開始。

手前がサツマイモ(種子島紫)。
奥がゴーヤ。

毎日朝に水をだいたい2ℓほど与えています。























サツマイモ(種子島紫)。




















ゴーヤ。





















6月20日

サツマイモ(種子島紫)。
愛情をかけて毎日水やりを続けた結果、土がみえないほどに成長しました。
近々肥料を与える予定です。


















ゴーヤ。
愛情をかけて毎日水やりを続けた結果、いつのまにか僕の背丈をゆうに超えていました。

























円状に循環させようと、ホームセンターで購入した棒を折りまげて設置しました。



























・使用した土  有機野菜の土 25リットル 有限会社粂谷商店
 成分     赤玉土 鹿沼土 堆肥 ピートモス バーミキュライト パーライト
        木炭(粉状) ニーム核 有機質肥料(バットグアノ)
 PH値    6.5±0.5
 EC値     0.9±0.1
・使用した石  硬質鹿沼土 有限会社粂谷商店
・農業ゼミでやった通り、土の袋をそのままプランタとして使用
・設置場所   家の南側のベランダ(直射日光が一日およそ8時間ほどあたる)

できれば毎日明るい時間に定点観測(写真撮影、観測メモ)する。こちらは実際に目でみて触ってと、PCなどの技術を使用しないで観測する。自然に触れることが目的。あわよくば食してみる。




植物・農業・エレクトロニクス・音楽...。実験とプロジェクトのblog。
projects : Biotope

音響比較栽培


ピンチです!!
青唐辛子が病気になってしまいました。。。

おそらく病名は「うどんこ病」です。
葉っぱの裏が白く粉をふいたようになって、
葉っぱが内側にくるんと丸くくるまってしまいました。

しかたなく農薬を少量散布し、現在闘病中です><







比較栽培については4つのパターンの音響
を聴かせて、その変化を見る計画でしたが、
まず音響にさらしておく環境作りが必要と考えプランを練り直しました。

<現状の問題点>
 4つの音響の差異をはっきりと区別させなければならない。現状、夜30分ずつスピーカーの前に置いて聴かせているだけ。音量、時間ともに不足のような気がする。4つの音響の差異以外は条件は同じであるから、差異ははっきりとさせるべき。

音響に少しでも長くさらしておける環境作りが必要!

防音BOXを制作することにする。
青唐辛子ではそのサイズの防音BOXは現実制作不可能。(サイズが大きすぎで重量がかさむ)

★プランを変更★
規模を縮小し、小型の防音BOXでも対応でき、音響に敏感な植物をチョイス

↓ 悩みに悩んだ末。。。

多肉植物 ベンケイソウ科 セダム属 
CRASSULACEAE SEDUM に決定!!


今、防音屋さん
に W : 10cm D : 10cm H:20cmの防音BOXを制作依頼中です。

日中は箱から出し、日照に当てる。
夜間はこのBOXに入っていただき、たっぷりと音響を浴びていただく予定です。








他の植物たちのその後。。

ゴーヤ♪

花をつけました〜。
実は伸びていったツルがまきつくところがなく、自分の体に巻き付いていたのを、整備してあげた直後でした。
苦しそうにツルに絡まっていたのをキレイにとって、ツルを誘導してあげたら、いきなりポンを花をさかせました^^



サツマイモですー。
こいつがいちばん元気です。
あふれんばかりに葉っぱが成長しました☆







「ペパーミント」「レモンバーム」「バジル」
この子たちもものすごい勢いで生長しています。
フレッシュハーブティーにして美味しくいただきました。

「比較栽培」に利用できそうなセンサや部品について

以下は植物の比較栽培に利用できそうなセンサや部品類のリストです。その他、利用できそうな部品類があれば投稿/コメントして下さい。随時、追加していきます。

温度センサ
一定時間の温度変化、また複数用いて場所ごとの温度差の計測など
LM60BIZniwaさんのサンプル
LM35DZpolanetさんのサンプル

湿度センサ
温度センサ同様、それぞれの湿度計測など
HSM20G
SHT15搭載温度湿度センサモジュール
HS-15P(交流用)

ガスセンサ
ガスなどのにおいを検知する
においセンサ
アルコールセンサ

光センサ
明るさ(照度)の計測
照度センサ(フォトトランジスタ)使用例
フォトICダイオード
CDSセル建築発明工作ゼミの使用例

色センサ
植物の各部位の色測定など
デジタルカラーセンサ建築発明工作ゼミのサンプル
・Webカメラで色認識(建築発明工作ゼミのサンプル

距離センサ
成長変化する植物の部位までの距離測定など
GP2Y0A21YK建築発明工作ゼミのサンプル
Parallax超音波レンジファインダー建築発明工作ゼミのサンプル
Maxbotix LV-EZ1

定点観測(Webカメラ)

・一定時間あるいは定刻に撮影/連続撮影(建築発明工作ゼミのサンプル
・形態変化の差、色変化の差などの記録/分析(建築発明工作ゼミのサンプル

発光部品類
マトリクスLED建築発明工作のサンプル
冷陰極管(液晶ディスプレイ用の細い蛍光灯)
EL発光シート(自由に切断・曲げ加工できる発光シート)

熱関係
各種加熱装置/部品(ニクロム線など)
フィルムヒーター(発熱)
ペルチェ素子(冷却)

発電
太陽電池モジュール

交流電源のスイッチング
交流AC100Vの機器類(一般電球、ポンプ、ヒーターなど)の電源のオン/オフ切替や調節
ソリッドステートリレー(20A)
トライアック万能調光器(20A

2009年6月19日金曜日

定点観測

定点観測の状況をお知らせいたします。

観測対象:ナス
植えた日:5月16日
購入場所:ロイヤルホームセンター宮崎台店
比較内容:
 Type-A 常に潤沢に水を与える
 Type-B 枯れない程度の水やり(表面の土が乾ききったあと、ぬれる程度に水を与える。)


5月28日 TYPE-A


6月12日 TYPE-A



5月28日 Type-B


6月12日 Type-B



6/20 今日の様子 右:Type-A 左:Type-B (webCAMで撮影)

我が家のゴーヤ:すくすくと成長しています。最近花がつき始めました。まだ小さいですね。

現在、温度の測定ログと、写真によるログを実施しています。本当は、湿度も測定して自動的にログを取りたかったのですが、Arduinoで計測することが難しく現在保留中です。

最近Type-Aの方が大きく成長しています。目でわかる位の差がここ数日でつき始めました。ですが、なんと、アブラムシがたくさんついていてちょっと病気気味です。葉の色が茶色くなり元気がありません。アブラムシを除去するスプレーを掛けることにします。

花がいくつか咲き始めましたが、まだ実はつきません。想定していたよりも、幹が細く、あまり大きく育ちそうもありません。そろそろ剪定を考えています。

今後の展開(どこまでできるかは分かりませんが…)
1)webカメラの設置
⇒固定冶具の作成

2)明るさ計測
⇒CdSセルのよる計測 Arduinoのアナログin

3)無線で計測。
⇒Xbeeシールドによる無線化の方法を検討

4)自動水やりのシステムを構築する。
⇒水汲み上げポンプシステム(市販ポンプ+SSRによるスイッチング制御)
⇒乾き具合の判定方法の検討(土の色による画像判定、土の濡れ判定、乾燥具合による静電容量の変化を読み取る?)

5)webサーバへ自動UPシステム
⇒イーサネットシールドによるwebアクセスの方法を検討
⇒サーバ構築の勉強

6)Arduino直付け外部メディアで記録
http://www.switch-science.com/products/detail.php?product_id=161

7)できれば、ソーラー発電を利用して動作させる。

これらのデータ同士が何らかの相関があることを調べて行きたいと思っています。
毎日のデータを収集し、グラフ化していき、変化を感じられるようにしていきたいと思います。

ガラス瓶の中の生態系 定点観測(1)

 ひと月ほど前に、ガラス瓶の中に小さな生態系を作りました。それぞれ、若干環境を変えてあります。環境の内約は以下を参照してください。
 目的は、生態系の変動するデータの収集、バランス観測および研究です。ガラスで密閉されている環境内は物質の出入りがなく、生態系のバランス移行はすべて、最初に設定したガラス内の物質と生物、そして変化する日光と温度に依存します。
  例えば、エコノートであるヤマトヌマエビが死ねば、排出するCO2が少なくなって植物の光合成が弱まり、酸素が減ります。それによって、ガラス内の全ての 生物が死んでしまうかもしれません。しかしそれは逆に、初期設定した環境に適応できなかった生物の淘汰によって環境がバランスを取り戻すことを示すのであ るかもしれません。
 目で観ているだけでも楽しめますが、目では見えないデータを収集するために、Arduinoとセンサを使用します。












参考
Make: Technology on Your Time Volume 04
MAKE: Japan: Biology Archives


【初期設定(環境データ)】5月5日

共通項目

 1.脱塩素済みのバクテリア入り水1リットル
 2.水生植物 数種
 3.川砂利 数個
 4.アサリの貝殻 数個
 5.流木、もしくはプラスチックのオブジェ

環境1

  設置場所   家の東側の窓際
  底泥     多摩川の汽水域で採取した泥
  エビ     ヤマトヌマエビ(エコノート)1匹
  ヨコエビ  (数ミリの小型甲殻類)8匹
  巻貝     4匹

環境2

  設置場所   室内の光のあたらない暗箱内(LEDライトを 赤9 : 青1の割合で一日16時間照射)
  底泥     千葉県印幡沼付近の水田で採取した泥
  エビ     ヤマトヌマエビ(エコノート)1匹
  ヨコエビ  (数ミリの小型甲殻類)8匹
  巻貝     4匹

環境3

  設置場所   家の東側の窓際
  底泥     ヨコエビ生息地のライブサンド
  エビ     ヤマトヌマエビ(エコノート)1匹
  ヨコエビ  (数ミリの小型甲殻類)8匹
  巻貝     4匹

環境4

  設置場所   家の東側の窓際
  底泥     多摩川の汽水域で採取した泥 ヨコエビ生息地のライブサンド
  エビ     ヤマトヌマエビ1匹 ミナミヌマエビ1匹
  ヨコエビ  (数ミリの小型甲殻類)16匹
  巻貝     6匹

 環境1と環境2では、唯一の外部要素である光に焦点をあてて観測します。日光と比較して、LEDライトによる光合成では生態系は維持できるのか。途中でLEDの色や配分、照度を変えてみたり。
 環境3では、底泥のかわりにヨコエビの生息地であった砂を使用します。見た目では微生物が底泥よりも少なそうなので(完全に主観)最もわかりにくい微生物の作用がどれほどであるのかを他の環境と比較します。
 環境4では、本来よりもあえて生物の数を2倍にして、過度の密集した生物バランスでなにが起きるのか観測します。


収集したいデータの種類

 水中のPh値
 気温
 水温
 酸素(できれば水中)
 二酸化炭素
 瓶内の湿度
 瓶内の光の照度


【途中経過報告】6月20日

環境1














日光のあたる時間帯は酸素が水草の葉から泡となって吹き出しています。










巻貝は現時点で4匹とも生存確認。










浮草が枯れて来ています。












環境2
設置した環境の中で、水草や苔の繁殖が進んでいる。
エコノートであるエビが死んでしまったので、LEDによる光合成はまだ開始していません。












写真ではわかりにくいですが、ガラス瓶の表面は苔の色でうっすら緑色をしています。













これもわかりにくいですが、設置した4つの環境のなかで唯一ヨコエビの姿が確認できました。写真中央ちょっと左、ちょっとしたあたりのしろい粒みたいのが
ヨコエビです。








浮草はやはり枯れて来ている。酸素の泡がみえるので、光合成はまだしている。











環境3
生物密度はおそらく最も低い。













巻貝は現時点で3匹確認。もう1匹は未確認。























環境4
生物密度が最も高い。













巻貝は現時点で5匹確認。もう1匹は、未確認。










浮草はやはり一部枯れている。












 五日目に環境1と環境2、環境4のヤマトヌマエビが1匹死亡し、七日目に環境3と環境4のヤマトヌマエビが死亡しました。計測装置を設置する前に全滅してしまったので目測による考えしかできませんが、直射日光による水温の上昇が原因であると思われます。水温計は昼間で30℃を上下していました。ヤマトヌマエビに適している水温は21℃〜27℃です。
 その後、環境2の巻貝が1匹死亡し、微生物によるエビと巻貝の分解が始まったようです。ヤマトヌマエビは1週間後には身体がバラバラになり、殻をのこして底泥に消えました。巻貝は身体から妙な植物が生えだし、2週間後には殻ごと底泥に消えてしまいました。どうも、環境2の微生物およびバクテリアの力が強すぎる気がします。現時点で、ヤマトヌマエビと巻貝の姿が確認できないのはこの環境だけです。ガラス瓶内の生物が多ければ酸素の消費量も増えますが、排出されるCO2を吸収する植物の量はどの瓶でも変らないため、酸素消費量の一番おおいエビと巻貝が姿を消してゆきます。
 全体的に、水草の量が増えています。しかし、CO2を排出する生物が減っている為、浮き草、水草には茶色に変色している部分がかなりみうけられます。あと、初期に設置した生物の密度がどの瓶も高すぎたようです。浮き草と水草はもっと少なくてよいし、微生物を含む底泥はもう少し量を減らすべきでした。それに、計測できていないPh値が気になります。


【今後の予定】

 現時点でのデータを利用し、もっと生物密度を低くしてもう一度環境を設置しなおします。現時点で用意できるセンサは光、気温、水温程度ですが、なるべく早めに設置して観測を再開します。
 暗箱も設置してLEDのみの環境も作成したいと思います。

データに関して

 とりつけたセンサを、Arduino のEthernetShildを用いてwebサーバにアップ後、同じくアップしたprocessingスケッチによりデータを取得、視覚化を行います。webブラウザからアクセスできる環境視覚化アプリ作成を予定しています。



植物・農業・エレクトロニクス・音楽...。実験とプロジェクトのblog。
projects : Biotope

2009年6月16日火曜日

温度センサー LM60BIZ版

内容はかぶってしまいますが、違う温度センサーを使って温度を測定してみました。
このセンサーは、-40℃~+125℃の範囲で測定できます。氷点下の温度が測りたい人にはいいかもしれません。

national Semiconductor製 LM60BIZ(TO-92) 温度センサー
+6.25mV/℃ 1℃温度が上がると、6.25mVずつ増加
0℃のとき、424mV流れる
ex)25℃ のときは、424+25×6.25≒580mV

http://akizukidenshi.com/catalog/g/gI-02490/

プログラムの流れは
1)変数を用意
2)アナログ入力値を読み取る
3)読み取ったアナログ入力値を0.1秒×10 回読み取り、加算する
4)10回加算したアナログ値を10で割り、平均の入力値を出す。
5)mapをつかって、0から1023の入力値を電圧値である0~5000へリマッピングする
6)温度を計算するために、入力値-424(mV) を6.25で割る。
7)シリアルモニタへ出力
8)変数をすべてリセット
です。

センサーとArduinoの接続は、前出のpolanetさんと同じです。
http://ken-nou-kou.blogspot.com/2009/06/blog-post_14.html

//-------------Arduino code--------------------
long val = 0;//センサーからの入力値の変数 (なぜかintだと上手くいかず。longにした)
long val_2 = 0;//入力値を一時的に足す変数
float ave_val = 0;//入力値の平均用変数
float re_volt = 0;//リマッピング用変数
float temp = 0;//温度変数

void setup(){
  Serial.begin(9600); // シリアルポートを9600bpsで開く
}

void loop(){
  for (int i=0; i < 10; i++){
   val = analogRead(0);//アナログ入力ピン0番の値
  val_2 += val; //入力値を足していく
  delay(100);//0.1秒ごとに測定
  }
  ave_val = val_2*0.1;
  re_volt = map(ave_val,0,1023,0,5000);//10ビットの入力値を0~5000mvへリマッピング
  temp = (re_volt-424)/6.25;//電圧から温度に変換

  Serial.print("temp.");//シリアルモニタに"temp."文字を送る
  Serial.println(temp);//シリアルモニタに温度を送る
  //それぞれの変数をリセット
  val = 0;
  val_2 = 0;
  ave_val = 0;
  temp = 0;
  re_volt = 0;
}

2009年6月14日日曜日

温度センサ LM35DZ

LM35DZ
温度センサのLM35DZとArduinoで温度測定をしてみました。
ほとんど参考のリンク先からの引用です。詳しく記載されています。
































参考
エレキジャック フィジカル・コンピューティング 連載(22)Arduinoで何でも制御
エレキジャック フィジカル・コンピューティング 連載(23)Arduinoで何でも制御

材料
温度センサ LM35DZ
最高/最低機能付 小型温度計モジュール


回路図

GNDをマイナス電源に接続し、V+にプラスの電源を接続すると、真中のVoutに温度に応じた出力電圧が得られます。
0℃で0Vとして10mV/℃と、1℃当たり10mVの出力が得られます。25℃の場合、250mVの出力が得られます。
(参考リンク先からの引用)


今回、基準電圧として5VをV+に入力します。温度に対してVoutピンから検出できる値は0〜1023なので、温度換算の計算式は以下のようになります。

 xV : 取得した電圧値
 aVal : 取得したアナログ値(0〜1023)

とすると、

 xV : 5V = aVal : 1024

となり、

 xV = ( 5V × aVal ) / 1024

例)取得したアナログ値が 50 の場合、

 xV = ( 5 × 50 ) / 1024
 xV = 0.2441...

つまり、取得した電圧は約244mV なので、温度は24.4℃となります。


Arduinoスケッチ


/* 
1秒ごとに摂氏温度を計測
10秒ごとに平均摂氏、最大摂氏温度、最小摂氏温度を
シリアルモニタに出力
*/
// DateTimeライブラリをインポート
#include <DateTime.h>
// プログラム開始日付時刻
int year = 2009; // 年
int month = 6; // 月
int day = 14; // 日
int hour = 18; // 時
int minute = 3; // 分
int second = 0; // 秒
int A_inPin = 0; // アナログ入力ピン番号
int A_val; // アナログ入力値(0〜1023)
int outputTerm = 10; // 計測結果出力ターム(10秒ごとに平均摂氏値を出力する)
float v = 5; // 基準電圧値( V )
float tempC = 0; // 摂氏値( ℃ )
float tempCPlus = 0; // 10秒ごとの合計摂氏値( ℃ )
float maxTempC = 0; // 10秒ごとの最大摂氏( ℃ )
float minTempC = 0; // 10秒ごとの最小摂氏( ℃ )
voidsetup(){
// シリアル通信速度
Serial.begin(9600);
// DateTime ライブラリの makeTime() メソッドで日付時刻作成
time_t prevtime = DateTime.makeTime(second, minute, hour, day, month, year);
// DateTime ライブラリの sync() メソッドで初期設定(日付時刻設定)
DateTime.sync(prevtime);
}
void loop(){
// 1秒に一回、10秒間分温度計測
for (int i = 0; i < outputTerm; i++ ) {
// アナログピンから計測値を取得(0〜1023)
A_val = analogRead( A_inPin );
// 摂氏に換算
tempC = ((v * A_val) / 1024) * 100;
// 現for文ループ内で使わなくなった変数は解放
A_val = 0;
// 平均値を取得するために1秒ごとの値を10秒分合計しておく
tempCPlus += tempC;
// 1秒過去の最大摂氏値と現在の摂氏値を比較
// 大きい方を格納

maxTempC = max( maxTempC, tempC );
// 1秒過去の最小摂氏値と現在の摂氏値を比較
// for文1ループ目のみ、現在の摂氏値を格納
if (i == 0) minTempC = tempC;// 小さい方を格納
minTempC = min( minTempC, tempC );
// 現for文ループ内で使わなくなった変数は解放
tempC = 0;
// 1秒間ストップ
delay(1000);
}
// 10秒間の平均摂氏値
tempC = tempCPlus / outputTerm;
// 日付時刻更新
DateTime.available();
// シリアルモニタに出力
// 日付時刻
Serial.print(DateTime.Year+1900,DEC);
Serial.print("/");
Serial.print(DateTime.Month,DEC);
Serial.print("/");
Serial.print(DateTime.Day,DEC);
Serial.print(" ");
Serial.print(DateTime.Hour,DEC);
Serial.print(":");
Serial.print(DateTime.Minute,DEC);
Serial.print(":");
Serial.print(DateTime.Second,DEC);
// 10秒間の平均摂氏値
Serial.print(" Temp / ");
Serial.print( outputTerm );
Serial.print("sec | Average : ");
Serial.print( tempC );
Serial.print(", ");
// 10秒ごとの最大摂氏値
Serial.print("Max : ");
Serial.print( maxTempC );
Serial.print(", ");
// 10秒ごとの最小摂氏値
Serial.print("Min : ");
Serial.println( minTempC );
// 次loop()ループの計測に影響を及ぼさないように変数の値を0に戻す
tempCPlus = 0;
maxTempC = 0;
minTempC = 0;
}


やたらと長くなってしまいましたが、やっていることはシンプルです。

まず、setup()関数内で、DateTimeライブラリで、プログラムを開始する日付時刻をセットします。
その後はひたすらloop()関数内を繰り返します。
loop()関数がひとまわりする間に、
1秒間に一回温度を計測し、それを10秒間繰り返します。
摂氏温度を10秒分合計し、それを10で割って平均摂氏温度を取得します。ついでにその10秒間の最大摂氏・最小摂氏も取得します。
ArduinoIDEのシリアルモニタで結果を出力します。10秒ごとに計測した日付時刻、平均摂氏温度、最大摂氏温度、最小摂氏温度が表示されます。

なぜ10秒間分の平均値をわざわざだしているのかというと、計測温度の精度をなるべく高めるためです。


実験してみました。
本当に的確な温度を計測できているのかを確認するために、秋月で購入した
最高/最低機能付 小型温度計モジュールと比べてみます。










左がLM35DZ、右がデジタル温度計の温度検出部です。
温めたお湯に同時にいれて、計測温度を比較してみます。










微妙に誤差があります。
LM35DZも個体差があるらしく、二つのLM35DZで計測しても誤差がでるそうなのでこれくらいは許容範囲です。






















追記
スケッチの先頭にあるDateTimeライブラリは標準でArduinoIDEにインストールされていないので、上記のスケッチをコピーして実行しようとするとエラーになります。
以下のリンクからDateTimeライブラリをダウンロードして解凍し、指定のディレクトリ内に配置しなければなりません。

こちらからダウンロード

ダウンロードして解凍したら、DateTimeというフォルダができます。
その中のDateTimeフォルダとDateTimeStringsフォルダをすでにインストールしてあるArduino内の以下のディレクトリにコピーします。

コピー先ディレクトリ
arduino-0016/hardware/libraries/

以上で、DateTimeライブラリとDateTimeStringsライブラリが使えるようになります。


植物・農業・エレクトロニクス・音楽...。実験とプロジェクトのblog。
projects : Biotope

Processingのプログラムをブログ上で表示する方法

Processingでプログラムした内容をWeb上で表示する際の出力方法(applet)があります。
Processingのメニューバー「File>Export Applet」を選択するとそのプログラムのスケッチフォルダ内に「applet」というフォルダが出来上がり、その中に「.jar」、「.java」、「.pde」「index.html」、「loading.gif」という最低でも5つのファイルが出来上がります。通常のWebサイトに表示するには、これら全てをサーバへアップロードすればいいのですが、このブログ(blogger)では「.jar」ファイルがアップロードできないため、少し工夫が必要となります。

以下は、「freehand」(建築発明工作ゼミより)というファイル名のProcessingのプログラムをappletで出力し、できあがった「freehand.jar」ファイルだけを用いてこのブログに表示させる方法です。この場合、appletフォルダ内には「freehand.jar」、「freehand.java」、「freehand.pde」「index.html」、「loading.gif」の5つのファイルが含まれています。

・無料ホームページなどを利用してアップロード可能なサーバを用意。
 (今回の場合、FC2無料ホームページを利用:http://web.fc2.com
・そのサーバへ「freehand.jar」ファイルだけアップロードする。
 (アップロードファイルのパス:http://kousakudata.web.fc2.com/freehand/freehand.jar)
・アップロード先のパスをメモしておく。
・ブログの投稿欄に、以下のように
  width:画面幅(プログラム内の画面サイズ、今回の場合:400)
  height:画面高さ(プログラム内の画面サイズ、今回の場合:300)
  code:ファイル名
  archive:ファイルのパス
 を指定して記入する。
 codeは「.java」ファイル内のjavaのクラス名(Processingで保存した際のファイル名と同じ)。
 archiveは、「.jar」ファイルのアップロード先のパスです。
 以下がブログ投稿欄へ記入する内容です。

<applet width="400" height="300" code="freehand" archive="http://kousakudata.web.fc2.com/freehand/freehand.jar">
</applet>

あるいは、「.jar」を含むディレクトリをcodebaseとして追加し(↑より↓の方がいいみたいです:追記)、

<applet width="400" height="300" codebase="http://kousakudata.web.fc2.com/freehand" code="freehand" archive="freehand.jar">
</applet>

複数の「.jar」ファイルがある場合は「archive」の部分を「,」コンマで区切って、

archive="aaa.jar, bbb.jar, ccc.jar"

となります。


以下が表示例です。白い矩形内をマウスでドラッグすると手描きの線が描けるプログラムです。「e」キーを押すと白紙にもどります。






このプログラムのソース:

void setup(){
size(400,300); //画面サイズ幅400、高さ300
smooth(); //滑らかな描画(アンチエイリアス)
background(255); //背景色を255(白)に設定
}

void draw(){
//特になし
}

//マウスドラッグ中のプログラム
void mouseDragged(){
line(pmouseX,pmouseY,mouseX,mouseY); //線を描画
}

//キーが押された時のプログラム
void keyPressed(){
if(key=='e'){ //もしキーが「e」なら
background(255); //背景色を白で塗り直す
}
}

このプログラム自体の説明はこちら

尚、全てのコマンドやライブラリがapplet出力に対応しているとは限らないので、ProcessingのReference内の各コマンド(関数:例えばline()など)のページへ行って「Usage」欄をチェックして下さい。「Usage」に「Web & Application」と書かれてあれば、Web上でも独立したアプリケーションとしても出力可能ですが、「Application」だけであれば、Web用のappletとしては出力できません。

練習でつくってみたプログラムや、試しに書いてみたというようなプログラムでも構わないので、appletで出力してブログへアップしてみて下さい。

*