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

2009年6月13日土曜日

ProcessingとArduinoの学習方法

これからプログラミングを学ぼうとする際(初心者向け)のヒントについてです。

Processing、Arduinoともプログラミングすることで様々な機能や表現を可能にしますので、まずはプログラミングの仕方としてProcessingから開始することをおすすめします。一旦プログラミングの流儀に慣れれば、Arduinoでのエレクトロニクス制御のプログラミングも理解しやすくなると思います。最終的にはシリアル通信という方法を用いてProcessingとArduinoを連動させ、デジタルとフィジカルの世界を行き来する内容へと発展させます。

以下は段階ごとの大まかな学習方法のリストです。各項目の詳細については「建築発明工作ゼミ」のサイトでも紹介してありますので参考にしてください。

Processing:
Processingは、任意の図形やイメージなどをコンピュータのスクリーン上に表示するツールだと思ってください。図形は数値や各コマンドによって定義されます。
また、アニメーションのように図形を動かしたり、インタラグティブな要素としてマウスやキーボード入力のコマンドを利用することで、画面表示内容にリアルタイムで変化を与えることが可能になります。

・表示画面サイズの設定
・図形の塗り面/外形線、色、線の太さ、基準位置の設定
・図形(点/線/矩形/円など)の描画方法(種類、サイズ、画面上での位置)
・図形のアニメーション(ループの利用)
・マウス入力/キー入力

ループと変数

アニメーションやリアルタイムで動くプログラムの場合は、「ループ(繰返しの処理)」や「変数」という方法を用います。最初のうちは、「ループ」や「変数」という概念に戸惑いを感じるかもしれません。
例えば図形をアニメーションで動かしたい場合は、「何秒後にここへ」というように時間と位置を指定したくなるのですが、プログラム上では、速度の値がどのくらいであり、何ループさせるかを実行処理させます。つまり、動画の1コマずつの位置の変化量(速度)をプログラム上で定義し、それら変化量を累積する計算をさせて距離(位置)を導きだすことになります。距離を微分すると速度になり、速度を積分すると距離になるという捉え方です。
また、静止画の円の場合、中心座標と半径(あるいは幅や高さ)で定義しますが、動的に円を描かせるプログラムになると、円の描画開始点と曲率で定義することになり、中心座標は結果的に導きだされるのであって最初に定義する項目ではなくなります。
等速度運動の場合であれば、時間の進み方(1秒間に何コマ:初期設定60コマ)と速度は一定であり、距離だけが変化します。自由落下のような加速度運動の場合であれば、時間の進み方は一定ですが、速度と距離は常に変化していきます。このように、変化しない値と変化する値を区別し、変化する値を計算上代入可能にするために「変数」を用いると便利になります。
変化したり移動したりするものを、時間と位置(距離や結果)でとらえるのではなく、変化量で把握できるようになれば、どのようにプログラムすればいいのかが分かってくると思います。同時にプログラミングに慣れていくことで、ものごとの現象を変化量あるいは微分・積分でとらえる感覚が身に付くと思います。
というように、必要な結果を導きだすプロセスをデザインし計算させるのであって(アルゴリズム)、必要な結果を無理矢理コンピュータにお願いするのではないという点に注意して下さい。


Arduino:
Arduinoでは、エレクトロニクスを制御するためにプログラミングが必要であり、それに加え電気の知識も必要になりますが、基本はスイッチのオン/オフ(デジタル出力)となります。まずは、センサなどを用いず、プログラムだけで出力方法(点灯/点滅/明るさ調節など)を制御するところから始めるといいと思います。delay()というコマンドを使うことで、一定時間点灯させるなどの制御が可能です。

・デジタル出力(プログラムによるLEDのオン/オフ制御)
・アナログ出力(プログラムによるLEDの照度を段階的に制御、256段階で調節可)

つぎにセンサを接続し、そのセンサから読み取った値を出力に反映させます。センサには複雑なものもありますが、まずは可変抵抗器(ボリューム:音量調節用の回転式のつまみ)を手に入れて(安価で仕組みが理解しやすい)利用するといいと思います。

・デジタル入力(オン/オフ切替式のスイッチやセンサを接続しLEDのオン/オフ制御)
・アナログ入力(度合いを調節可能なセンサを接続しLEDの照度を段階的に制御)

これらデジタル出力/アナログ出力/デジタル入力/アナログ入力の組み合わせによって、複雑な仕組みの構築を可能にします。


ProcessingとArduinoとの連動:

さらに次の段階では、ProcessingとArduinoを「シリアル通信」という方法で連動させます。この段階でようやくデジタルとフィジカルな世界を行き来する内容が可能になります。シリアル通信の方法については、建築発明工作ゼミの「シリアル通信1〜6」を参考にしてみてください。


初心者の方はここを目標に:
まずは、基本操作としてProcessingによる図形描画やArduinoによるLED点灯実験から始めることになるのですが、それだけでは退屈なので、学習意欲もあまり湧きません。
そこで、最初の目標として「建築発明工作ゼミ」の「Arduino-Processing シリアル通信1」を実践してみてください。

Arduino-Processing シリアル通信1」では、ArduinoとパソコンはUSB接続されており、Arduinoには可変抵抗器が接続されており、Processing上には連動する図形が描かれています。内容的には、自作の入力装置をパソコンに接続し、パソコン上に表示されている図形をリアルタイムで操作するということになります。
ここでは:
・Arduinoにおけるアナログ入力(センサからの値の読取り)
・Processing-Arduino間のシリアル通信(値の送信/受信)
・Processing上での図形描画(受信した値を図形描画に反映させる)
ということを学習することになります。

当然ながら、この段階に到達するためにもある程度知識やスキルは必要になります。質問、トラブル、不明な点については、投稿/コメントして下さい。「ここまでやってみたけど、その先が分からない」、「〜ってなんだ?」とか「全然動かない」など初歩的な質問や失敗談でも構いませんので投稿してみてください。皆さんで解決していきましょう。

定点観測




遅ればせながら真面目に課題をやり始めました。
対象は『ラズベリー』で、普通に土に植えた物(屋外)と
水耕栽培(室内)で成長の比較を行ないます。




カメラを2つ使い定点からそれぞれの成長状態を
画像として記録します。

Processingからソフトウエア的に2つのカメラを操作し
記録画像はファイルとして保存されるので、現状では
パラパラ漫画的な表示が可能です。

記録方法と表示方法はソフトウエア的な処理なので
随時機能を追加していこうと思います。


そろそろ工作ネタの方も作りはじめたいと思います。

2009年6月11日木曜日

投稿の際のヒント

プログラムのコードを投稿する際のヒント(記事内に特定の文字や記号を使う場合)
ブログに記事を投稿する際に「HTMLの編集」と「作成」という二つの記入モードがありますが、以下の説明は「HTMLの編集」を選んで記入する際のヒントです。

以下はArduinoにおけるサーボのソース(建築発明工作ゼミより)ですが、以下の内容を直接記入して投稿するとブログでは表示上問題が出てきます。

#include <Servo.h>
Servo servo;

void setup(){
servo.attach(3);
}

void loop(){
float val=analogRead(0)*0.176;
servo.write(int(val));
Servo::refresh();
}

まず、ソース内一行目の「<」と「>」は、このままだとHTMLのタグ記号として扱われるので、「<」を「&lt;」に「>」を「&gt;」に置き換える必要があります。そのままだと表示されないかエラーがでることがあります。

変更前:
#include <Servo.h>

変更後:
#include &lt;Servo.h&gt;

また、「x<a」のような場合も置き換えて下さい。あるいは、「<」記号のあとに半角スペースを挿入して下さい。

変更前:
x<a

変更後:
x&lt;a
あるいは
x < a


次に、void setup(){...}やvoid draw(){...}で囲まれたなかの行頭を右にずらして表示させるには、HTMLタグの<pre>...</pre>を使って以下のように全体を囲んでおきます。そうすれば複数の半角スペースで右にずらされたまま表示されます。

投稿の記入例:

<pre>
#include &lt;Servo.h&gt;
Servo servo;

void setup(){
servo.attach(3);
}

void loop(){
float val=analogRead(0)*0.176;
servo.write(int(val));
Servo::refresh();
}
</pre>


<pre>...</pre>を使わないで記入すると以下のように、すべての行が左寄りになってしまいます。

#include &lt;Servo.h&gt;
Servo servo;

void setup(){
servo.attach(3);
}

void loop(){
float val=analogRead(0)*0.176;
servo.write(int(val));
Servo::refresh();
}

行頭を右にずらす方法として、通常半角のスペース(あるいはタブ)を使いますが、行頭に半角のスペースを挿入しても左に寄せられてしまいます。そのかわりとして全角のスペースを挿入する方法がありますが、通常の文章であれば問題ないけれども、プログラムのソースコードなどに使うと、半角のスペースのかわりに全角のスペースが挿入されているため、表示されているソースをコピー&ペーストして使う際にエラーが出てきます。見た目にはどちらもスペースなので分かりにくいエラーとなってしまいます。

追記:(kotobukiさんのコメントから)
Arduino 0016からはTools>Copy as HTMLで、ソースをクリップボードにHTMLフォーマットでコピーできるようになりました。
以下は「Copy as HTML」機能を使ってコピー&ペーストした表示例。
一行目の「<」と「>」は「&lt;」と「&gt;」に要変更。

 
#include <Servo.h>
Servo servo;

void setup(){
servo.attach(3);
}

void loop(){
float val=analogRead(0)*0.176;
servo.write(int(val));
Servo::refresh();
}

2009年6月10日水曜日

servoモータ

秋月電商で購入したサーボモータを動かしてみました。
サーボは、パルス出力の長さをArduinoなどで制御して、任意の角度に設定できるものです。
購入したサーボは、秋月電子 GWSサーボ 360°回転するタイプです。


GWSサーボ S125-1T/2BB/JRタイプ
http://akizukidenshi.com/catalog/g/gM-01723/


このサーボモータの上にwebカメラを設置し、一定時間ごとに角度を変えれば2つの植物に対して定点観測ができます。

一定時間ごとに撮影するのは、pcの時計を利用してprocessingでコントロールします(そのうちUPします)
サーボモータのコントロールはprocessingでシリアル通信をして動かしてみます。
processingからAruduinoにシリアル通信するときには、8ビット(0~255)の数値で送らなければならないので、その数値を何倍かさせてパルス信号のHIGH時間をコントロールしました。今回はだいたい7倍くらいかなと思い実行させてみました。

サーボとArduinoの接続は、サーボの赤をArduinoの5V、黒をGND、白をデジタルピンの3ピンに接続します。

processingのコード

//シリアルライブラリの取り込み
import processing.serial.*;
Serial port;
PFont font; //フォントの使用
//X座標の変数
int x=0;

void setup(){
font = loadFont("MS-Gothic-48.vlw");
//フォントを使用開始、サイズ:24
textFont(font,24);
size(255,100);
//シリアルポートの設定
port=new Serial(this,"COM5",9600);
}

void draw(){
background(100);
x=constrain(mouseX,0,255);
port.write(x);
port.read();
text(x,width/2,height/2);
}

Arduinoのコード

int val=0;
void setup(){
//パルス出力ピンの設定
//(デジタル出力なのでどのピンでも可)
pinMode(3,OUTPUT);
Serial.begin(9600);
}

void loop(){
//パルス:HIGHを出力
val = Serial.read()*7;//シリアル通信
digitalWrite(3,HIGH);
//パルス最小値を550としvalを代入
delayMicroseconds(val+550);
//パルス:LOWを出力
digitalWrite(3,LOW);
//HIGHの継続時間を差引いて周期を20000usに調整
delayMicroseconds(10000-(val+550));
delayMicroseconds(10000);
}



processingのプログラムを動かし、マウスを動かして、0~255の値を入れます。
マウスのX座標がシリアルでArduinoに送られパルス信号を作ります。

まず、0を入力してみました。
すると、0だとずっと回転してしまいます。
つぎに、255を入力すると1回転以上してある角度でとまります。
だいたい、15位である角度でとまるようになります。

これは、サーボモータの特性ではないかと考え、最低値が15以上になるようにしなければなりません。
いろいろ試してみるとだいたい155位で360°回転することが分かりました。
そこで、127という中間を中心に上下に振ってみます。

最低値:127-77=50
最大値:50+155=255

50~205でコントロールすると安定して動作します。
これで動かすとすると、50のときは、0度、180度のときは127、360度のときは205の数値を入れます。

これだと、分解能が155になり、数値1あたりは、360/155=2.32°ほど回転する計算になります。
例えば、30°の位置に回転させたいならば、30/2.32= 12.93
 50+13=63 を入力すればいい計算になります。

ちょっと説明不足で分かりにくかったかもしれませんが、こんな感じでコントロールできます。
もし、いつも同じ角度で回転させることが決まっていればArduino側で設定してもよいかもしれません。そうすれば、もっと分解能が高く設定できます。 また、今回はパルスを生成する際に7倍しましたが、もっと小さな値にすれば、155以上の分解能は確保できそうです。

今回は、Arduinoでパルスを作りましたが、ライブラリを使ってもできるみたいです。

http://kousaku-kousaku.blogspot.com/2008/06/arduino.html
ちょっと、やってみましたが、うまくいかなかったので、だれか上手くいった人がいたら教えてください。


今後は、実際にwebカメラを一定場所に設置し、いよいよ植物の定点観測をしていく予定です。

*