fc2ブログ

【Processing】ライブラリの入れ方【Arduino】

前回の「センサーが反応しない」より続編で、ライブラリの入れ方を教えます。
主にArduinoにStandardFirmataを入れて、Processingで動かす場合を説明していきます。

MacとWindows、ほぼ一緒です。

●Macの場合
1,はじめてProcessingを起動すると、書類フォルダにいつの間にかProcessingフォルダができてます。(Arduinoの場合はArduinoフォルダ)
2.その中にまず「新規フォルダ」を作成して、librariesフォルダを作りましょう。
スクリーンショット 2012-10-20 23.45.05

次にライブラリ。だいたいどうすればいいか英語で説明してあります。
http://www.arduino.cc/playground/interfacing/processing
とりあえず processing-arduino.zip をダウンロードします。
これをクリックすると自動的に解凍(Unzip)して、arduinoというフォルダができます。
このフォルダを先ほどのlibrariesフォルダにいれると、Processingでセンサーが使えるはずです。

●Windowsの場合
はじめてProcessingを起動すると、ドキュメントフォルダにいつの間にかProcessingフォルダができてます。
中にはlibrariesフォルダがすでにできてます。(Arduinoの場合はArduinoフォルダにあります)
Mac同様にprocessing-arduino.zipを解凍して、arduinoフォルダごと、さっきのlibrariesフォルダをいれます。


さほど違いはありません。
ライブラリは探すとたくさんネット上にあるので、興味がある人はどんどん試しましょう。

参考程度に…
■Processing用ライブラリ一部 (*印ははじめから入ってる)
音系ライブラリ…逆再生やエフェクト、イコライザーなど
 minim *
 Sonia
 Ess 
通信系
 oscP5 …OSCでネットワークを使って離れたところから制御する。OSCulatorを使えばWiiリモコンが使えます。
 Syphon …Processingの描画画面を対応したソフトに転送します。(MadMapper, oF、Max6、Modul8など)
 proMidi …MIDI信号を出す。MIDI対応ソフトを操れます。(Virtual DJ pro、Modul8など)
カメラ系
 processing.video* …カメラや動画が使える
 SimpleOpenNI …Kinectが使える(別途インストールが必要)
 NyAR4psg …拡張現実感(AR)アプリケーションを開発

文責:目次護
スポンサーサイト



tag: [Arduino][Processing]

テーマ : ゼミ
ジャンル : 学校・教育

【Processing】「センサーが反応しない!」【Arduino】

これからどんどん作品を作るゼミ生のみなさま

今回よく聞く「センサーが反応しない!」について解決法をご紹介します。
確認する項目はこの順番です。
1.値がきてるかprintlnで確認
2.センサーのつなぎ方があってるか
3.ArduinoにStandardFirmata入ってるか
4.57600や9600があってるか
5.arduino = new Arduino(this,Arduino.list()[0]);
6.パソコンがArduinoを認識していない
7.ライブラリが入ってない

それでは各項目について、詳しく説明いたします。
とりあえず、Processingでセンサー使って四角の大きさを変えるプログラムを書いておきます。




import processing.serial.*;
import cc.arduino.*;

Arduino arduino;

int pin = 0;
int rect_size = 0;

void setup() {
size(600, 600);

println(Arduino.list());
arduino = new Arduino(this,Arduino.list()[0]);
}
void draw() {
update_arduino();
rect(10, 10, rect_size, rect_size);
println(rect_size);
}

void update_arduino(){
rect_size = arduino.analogRead(pin);

}




それでは順に解説していきます。

1.値がきてるかprintlnで確認
まずセンサーの値がきちんと来ているかどうか確認しましょう。
  println(rect_size);
でセンサーからの値がProcessingのプログラム下部(黒いとこ)に数値が出てきます。
ちなみにrect_sizeはあくまで例なので、センサーの値を読み取る部分が
  val = arduino.analogRead(pin);
とかだったら
  println(val);
ですよ。言うまでもないですが。

センサー動かしてもこの数字が全く変化がない場合、以降の問題を解決する必要があると思われます。

2.センサーのつなぎ方があってるか
よくある間違いは「センサーのつなぎ方」です。
教わったとおりにつながっているか確認してください。
もし間違えると致命的な故障を引き起こす可能性があります。
大抵その前にMac側がシャットダウンしてくれますけどね…。
Arduinoやセンサーが熱くなってるかもしれないので注意しましょう。
直してもできないときは、Arduinoを認識しているか確認しましょう。
USBを抜き差しすれば大丈夫だと思います。

3.ArduinoにStandardFirmata入ってるか
これもよく見ます。
棚から出したArduino全てにこのプログラムが入っているとは限りません!
「前は反応してたのに、反応しない…。」という時にはこれが多いです。

4.57600や9600があってるか
多くの方はStandardFirmataを入れる時に
  Firmata.begin(57600);

  Firmata.begin(9600);
に変えましょう、と言われています。
中にはそのままUploadしてる人もいますが、まあそれでも大丈夫でしょう。
ただ、Processing側で
  arduino = new Arduino(this,Arduino.list()[0], 57600);
もしくは
  arduino = new Arduino(this,Arduino.list()[0], 9600);
と数値を設定している人は、きちんと合わせないとダメだと思います。
後ろの数字は実はいらなかったりすることもある。

5.arduino = new Arduino(this,Arduino.list()[0]);
ここまでやってできなかった人は少し特殊な環境のPCをお使いのようです。
とりあえずsetupの中に
  println(Arduino.list());
を入れてください。
これでRunすると下部の黒いところに接続ポート番号が出てきます。
  [0] "/dev/tty.○○○○○○"
  [1] "/dev/cu.○○○○○○"
  [2] "/dev/tty.Bluetooth-Modem"
  [3] "/dev/cu.Bluetooth-Modem"
  [4] "/dev/tty.Bluetooth-PDA-Sync"
  [5] "/dev/cu.Bluetooth-PDA-Sync"
こんな感じに出なくてもいいです。
ここからArduinoのポート番号を見つけます。
Arduino UNOもしくはMEGA 2560だと
  "/dev/tty.usbmodemfd[数字]"
Arduino Duemilanoveとかだと
  "/dev/tty.usbserial-[ID]"
がArduinoのポート番号になります。
このポート番号の横の番号を
  arduino = new Arduino(this,Arduino.list()[0]);
の[0]と入れ替えてやってください
「起動毎に変わるからめんどくせぇ」と思う方は、
  arduino = new Arduino(this,"ポート番号");
にすれば指定のポート番号に接続してくれます。

6.パソコンがArduinoを認識しているか
上記の2でショートを起こしてる場合があります。
もう一度USBを抜き差ししてください。

また大抵のMacなら勝手に認識しますが、Windowsや古いArduinoだとそうでない場合があります。
そういう時は、面倒なので先輩や先生に聞きましょう。学校のWindowsならMac使え!
Googleで検索するのもひとつのお勉強ですよ。(検索ワード:arduino ftdi ドライバ)

7.ライブラリが入っているか
これは別にセンサーやプログラムの問題ではないですが…。
学校のMacなら大抵入ってます。自分のパソコンだと入ってないかもしれません。
(最近のProcessingなら元から入ってる?)
1.http://arduino.cc/en/Main/Software(間違ってました)
http://www.arduino.cc/playground/interfacing/processing でライブラリをダウンロード
2.書類のProcessingのフォルダにlibrariesフォルダを作って、先ほどのファイルを解凍したフォルダを入れる

これについては少し詳細にした記事があります。

なにかあれば、また聞いてください。

文責:目次護 tag: [Arduino][Processing]

テーマ : ゼミ
ジャンル : 学校・教育

Processingレクチャー 8回目

遅くなりましたが最終回の内容をまとめます。
最終回は特別回として、Arduinoに関しての補足説明をしました。
ほとんどがペーパーに書いてある内容のままなので主に補足です。


ペーパーの表面で色がついてある部分は変数および関数の名前です。
あくまで名前なのでプログラム上の意味はなく、
その名前でなければならないという事はありません。
他の名前を付けても大丈夫です。用途に合わせた名前を付けましょう。
ただし、同じ色で統一されている箇所の名前は同じでなければなりません。


裏面では各センサーのArduinoへの接続の大雑把な説明をしています。
しかし誤った繋ぎ方をすると熱を持ったり壊れたりと危険なので
各センサーの説明が記載されたレジュメも見ながら接続してください。


以上でProcessingレクチャーを終了します。
やはりこのレクチャーで教えた事は基本的な事に過ぎないので、
各自参考書を読んで映像ジャンクションに備える事をおすすめします。 tag: [Processing]

Processingレクチャー 7回目

7回目の内容をまとめます。
このレクチャーは次回のArduino特別回をもって最終回とします。


前回の動画では1フレームに同時に1つの図形しか描画しませんでした。
複数の図形を描画する場合、位置や大きさなどを描く数の分だけ制御する必要があります。

変数をx1、x2、x3…、y1、y2、y3…、と宣言してそれぞれの要素にしてもいいですが、
x1やy1の「1」は変数名の一部であって、数字を変数に置き換えて使用する事は出来ません。

そこで使うのが配列です。配列を使うと自動で番号を振られた複数の変数を宣言できます。
変数arrayをn個配列で宣言したなら、array[0]、array[1]…、array[n-1]まで作られます。
この[]内の数字なら変数を用いて制御できます。forループと組み合わせるのが簡単です。


配列の宣言の仕方

int[] hairetsu = new int[3];

これを宣言すれば、hairetsu[0]、hairetsu[1]、hairetsu[2]の3つのint型の変数が作られます。
他の型の配列を宣言したければ2つあるintをfloatやcolorなどに変更します。
hairetsuは変数名、[3]は配列の要素数を指定します。数字でなくint型の変数でも指定できます。

これで配列は宣言できますが、宣言しただけでは何も格納されていないので、
setup() 関数内などでforループを使って初期化しましょう。


マウスで操作できるプログラムの説明をします。

以前、システム変数として mouseX と mouseY を紹介しました。
これはリアルタイムでキャンパス上のマウスカーソルの座標を自動で取得します。
これを描画の各要素に使用すればマウスを動かす事で変化させる事が出来ます。


新しいシステム変数を説明します。

mousePressed
マウスボタンが押されているかを調べるシステム変数です。
何かしらマウスボタンが押されているとtrue、離しているとfalseを自動で取得します。
if文の条件文として使う事で、ボタンを押す事での変化を制御できます。
一般的に、マウスカーソルがどこの座標にあるかを判別するif文と合わせて使用します。

mouseButton
マウスのどのボタンが押されているかを調べるシステム変数です。
RIGHT、LEFT、CENTERのみ格納する事が出来、それぞれのボタンに対応します。
上記の mousePressed を用いたif文の中などで更にif文やswitch文を用いて使用します。

pmouseX、pmouseY
1フレーム前のキャンパス上のマウスカーソルの座標を自動で取得するシステム変数です。
例えばmouseX、mouseYとの差を計算する事でマウスの動く速さを計算出来ます。



イベントハンドラ関数について説明します。
これは draw() 関数とは別の関数で、マウスを動かしたりボタンを押したりなど、
特定の操作をした時のみ draw() 関数内の一番最後に自動で呼び出されます。
そのため draw() 関数内で変更された座標情報の影響を受けます。

void mouseMoved(){
}
マウスボタンを離しながら動かしている時に呼び出される関数です。
マウスを動かしていなければボタンを離していても呼び出されません。

void mouseDragged(){
}
マウスボタンを押しながら動かしている時に呼び出される関数です。
マウスを動かしていなければボタンを押していても呼び出されません。

void mousePressed(){
}
マウスボタンを押した時に呼び出される関数です。

void mouseReleased(){
}
マウスボタンを離した時に呼び出される関数です。

void mouseClicked(){
}
マウスボタンを押してその場で動かさずに離した時に呼び出される関数です。
mouseReleased() 関数も設定している時にはその関数より後に呼び出されます。

マウスを操作する以外にもキーボードを用いた操作もプログラムする事が出来ます。
詳しくは参考書を見て下さい。



ペーパーのプログラムの補足です。

続きを読む

tag: [Processing]

Processingレクチャー 6回目 その2

6回目の内容をまとめの続きです。

今までは静止画の描画について学んでいきましたが、今回から動画について学習していきます。
静止画では point() や rect() などの関数を用いて描いてきましたが、
これからはその関数自体を構築するという流れになります。


動画を作成するには最低でも2つの決められた関数を構築する必要があります。
また、変数を宣言する場所にも注意が必要になります。

関数内で宣言された変数は「ローカル変数」として扱われ、その関数内でしか使用できません。
例えば、for文では繰り返し回数を制御するために int i などが宣言されますが、
このfor文が終了すればそれらの変数は使用できなくなります。
逆に、関数外で宣言された変数は「グローバル変数」として扱われ、どこからでも使用できます。
その反面プログラムが長くなると、どの関数で変更されているのか把握しづらくなります。


void setup(){
  ~
}

この setup() 関数は起動したときに最初の一回だけ実行され初期設定を行う関数です。
size() や colorMode() 、 background() 、 frameRate() など他にも色々ありますが、
主に変更の必要がない設定をする関数を入力します。
また、宣言されたばかりのグローバル変数の初期化も行ってもよいでしょう。
当然ここで変数を宣言してもローカル変数のため他の関数で扱う事は出来ません。

frameRate(a);
1秒間にa回フレームを更新するように設定します。基本的に30か60しか設定しません。


void draw(){
  ~
}

この draw() 関数は setup() 関数が実行された後に停止するまで繰り返し実行される関数です。
今までの静止画の描画はこのこの関数の1フレームを描画しているというニュアンスになります。

random() を用いたり、この関数内でグローバル変数を変化させて用いたりする事で
描画を変化させる、つまりはアニメーションさせる事が出来ます。
ここで変数を宣言、初期化してから変化させても繰り返される度にリセットされてしまいます。

イメージとしては透明のセル画に描画して、幾重にも重ねるといった感じです。
軌跡を消したければ、draw() 関数の最初に画面を背景色で塗りつぶす命令をします。
軌跡をフェードアウトしたければ、透明度を持った背景色で画面を塗りつぶします。

また、この draw() 関数が繰り返される度に座標情報はリセットされます。
translate() や rotate() など座標情報を変更してアニメーションさせる場合は
グローバル変数を変化させて用いるとよいでしょう。


これらの関数以外にも自分で新しく関数を作り出す事も出来ます。
関数を作る利点は、一連の命令を一つにまとめ名前を付ける事で使いやすくする事です。
一例として以下の関数を見てみます。2つの整数を引数として渡してその和を返す関数です。

int tashizan( int a, int b ){
  int s = a + b;
  return s;
}

tashizanは関数の名前です。命名規則は変数のそれと同じです。(参照:3回目のまとめ)

( int a, int b )で引数を設定します。()の中に、変数を宣言するように型と変数名を指定します。
, で区切る事で複数の引数を使用できます。引数を使用しない場合は()の中に何も入力しません。

intの部分で戻り値の型を指定します。戻り値とは最終的に関数で導き出したい値の事です。
関数の中で戻り値とする変数を宣言します。最終的にこの変数の値を関数の値として扱います。
そして関数の最後に返す変数を指定して return を実行する事で戻り値を返します。
なお、intの部分をvoidとした場合は、戻り値を必要としないので return も実行しません。


この関数の使い方の一例を見てみます。

int x = 3;
int y = 5;
int z = tashizan(x, y);

int tashizan( int a, int b ){
  int s = a + b;
  return s;
}

zに格納する値として tashizan(x, y) が呼ばれています。引数がxとyなので、
tashizan() 関数では()内で宣言されたaとbにxとyの値である3と5がそれぞれ格納されます。
そして関数内で宣言されたsにaとbの和が格納され戻り値として関数の値として返されます。

その結果、zに tashizan() 関数内の変数sの値が格納される事になります。
見方を変えれば、zに格納される tashizan(x, y) はそれ自体を変数として見る事も出来ます。
int型の変数「tashizan(x, y)」にxとyの和の値が格納されている、というイメージです。


関数は大きく分けて、「戻り値の型がvoid型であるかそれ以外か」、
および「引数があるかないか」の2*2の4パターンがあります。

戻り値がvoid型以外の場合は、先の説明の通り変数のように扱われます。
void型の場合は戻り値を返さないので、関数内の命令を実行するだけになります。
point() や rect() などProcessingで描画に扱う関数はこのvoid型の関数です。

引数を受け取る関数はその引数に応じて導き出される値が変わります。
引数がない関数では呼び出される度に同じ値を返します。
ただし関数内に random() があるならその限りではありません。


1. void型で引数を受け取る関数
rect(x, y, a, b) などでおなじみの引数の値に応じて命令を実行する関数です。
//例 頂点数v、半径rの正多角形を原点を中心に描きます。
void polygon(int v, float r){
  biginShape();
  for(int i = 0; i < v; i++){
    vertex( r*cos(TWO_PI*i/v), r*sin(TWO_PI*i/v) );
  }
  endShape(CLOSE);
}

2. void型で引数のない関数
smooth() や noFill() といった呼ばれる度に同じ命令を実行する関数です。
//例 キャンパス一杯に日の丸を描きます。
void nihon(){
  noStroke();
  background(255);
  fill(255,0,0);
  ellipse(width/2, height/2, width/2, height/2);
}

3. void型以外で引数を受け取る関数
dist(x, y, a, b) や pow(a, b) といった引数の値に応じて計算された値を返す関数です。
//例 加速度accelでtime時間動いた時の距離を求める関数です。
float dash(float accel, float time){
  float distance = accel * sq(time) / 2.0;
  return distance;
}

4. void型以外で引数のない関数
常に同じ値しか返さない関数です。 random() を使わない限り作る意義は薄いです。
//例 サイコロを振って値を得る関数です。
//  random() はfloat型で値を返すので、頭に(int)を入力してint型に変換しています。
int dice(){
  int num = (int)random(6) + 1;
  return num;
} tag: [Processing]
プロフィール

Moonwalkers

Author:Moonwalkers
メディアアート、インタラクティブメディア制作ゼミ

最新記事
タグクラウドとサーチ

カテゴリ
月別アーカイブ
ディクテーション
Polyglot Free Language Lessons Online
リンク
Twitter
検索フォーム
RSSリンクの表示
QRコード
QRコード