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

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カメラを一定場所に設置し、いよいよ植物の定点観測をしていく予定です。

2009年6月9日火曜日

arduino016 vistaの人注意!

最新版のarduino016をダウンロードしたけど、なぜか起動しない。
vistaのサービスパック2を入れたけど、それでも起動しない。
arduino015でも試したけど動かない!
互換モードでXPに設定したけど動かない!

ネットで調べてみたら、なんとaruduinoの中のjavaファイルを削除すると起動するという書き込みが!
まさかそんな単純なことで…。

そのとおりにしたら動きました。

vistaを使っている人は要注意!

2009年6月2日火曜日

屋上栽培_6/2

キュウリが大きくなりました。



2009年5月31日日曜日

バクスター効果

バクスター効果は、植物にうそ発見器のような電極回路を接続すると、植物が環境の変化(人間の意思も含めて)に反応するという不思議な現象です。いわゆる、植物との対話ができるという感じの研究です。
興味ある方は、試してみてはいかがでしょうか?

リンク:
http://www.d1.dion.ne.jp/~yamato__/plant.htm
http://portal.nifty.com/summer/freeresearch/0829/4.htm

植物に電気を流しておき(マイナスを土にプラスを葉や茎に接続、あるいはテスターを洗濯バサミやクリップで固定し)、電流、電圧、抵抗値などを計測してみると変化が見られるかもしれません。
また、建築発明工作ゼミ2008の「Arduino タッチセンサ」を応用して植物に接続することで変化を計測できるかもしれません。

*