このブログへの投稿/アップロードについて(コメントは誰でも、投稿は受講者+スタッフのみ)
コメント/投稿/ラベルについて(基本事項)投稿時間の設定(下書き/予定など)プログラム(ソースコード)を投稿する際の注意点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

*