2014年4月14日月曜日

ArduinoとProcessingを連携させてみよう!

考えてみれば簡単なことだったのに気づかず僕は何をやっていたんだという一日。

知識だけでも結構面白いから読んで。

まずArduinoとは・・・


こんな感じの回路基盤!
これにいろいろつないでシリアル通信を行い、取得した情報を元にプログラムに処理を与えようというもの。

PCへのつなぎ方は簡単に見つかるので割愛。

これを利用するにあたって必要なのが、

インストールすると、




















このようにProcessingによく似たウィンドウが表示される。
ここにArduinoのメモリに記録する基本的な処理を記述し、メモリに書き込む。

ためしにLEDを光らせるコードを使ってみよう。
ファイル/スケッチの例/01.Basics/Blink
を開くと、テンプレートが読み込まれる。

解説:
整数型の変数ledには13という数字が入っているが、これは上にあるArduinoの画像でいう13番のI/Oピンを使うという感じ。
setup()関数ではpinMode()によって、13番のI/Oピンを出力として使うよ!という書き込みを行う。
loop()はProcessingのdrawと同じくループして呼び出される関数。
ただし、メモリに書き込むので、ここでのコンパイルでループするのではなく、Arduino側でループされるということになる。
digitalWrite()は簡単にいうと電気を通す関数で、指定I/OピンがOUTPUTの時、HIGHでは5V(3.3Vのボードの場合3.3V)を出力し、LOWでは0V、つまり電気を通さない。
指定I/OピンはdigitalWriteの第一引数ledとなる。
delayは一定時間処理が止まる関数。単位はmsのはず。





チェックマークを押してコンパイルし、右向き矢印でメモリに書き込む。
書き込んだ状態でArduinoのGNDと13にLEDを繋ぐと、1秒感覚でLEDが付いたり消えたりする。

といった感じで動かせる。

しかし、これではまだArduinoIDEしか使えていない。

ここからが本番のProcessingとの連携である。

まず必要なこととして、シリアル通信というものがある。
電子通信での伝送において、ビット単位で通信を行うものである。

簡単にいうと、Arduinoが得た情報をPCに送る方法である。

これを行うためにArduino側にあらかじめどのポートを通信に利用するか示す必要がある。
ここで出てくるのがSerial.begin()関数で、引数としてシリアルポートを指定することができる。
書き方としてはこんな感じ。




















これでシリアルポート9600を使うという設定ができる。

そしてもう一つ重要なこと。
それはポートを使って何を送る(受けとる)かということ。

これに利用するのはSerial.write()関数で、引数に整数や文字列などを与えることで送ることができる。

書き方としてはこんな感じ。

引数にはもちろん変数が使える。

文字列の場合はダブルクォーテーションを使おう!
もしくはString型の変数を使おう!















これで200という整数を送ることができる。
delayがあるので0.1秒置きに送信(というか書き込み?)するという感じ。

次はこれをProcessingで受け取る方法だ。
Processingはいわずと知れたビジュアライズが得意なソフトウェアである!
iTunesのビジュアライザとして一斉を風靡した「Magnetosphereもこれでできてたりするのは結構有名。

それはさておき、Processingを起動するとこんな感じ。


ここに実際にPCで動く動作を書き記すのだ。
何を書くかはみんなの自由だが、本題のArduinoから送られた情報を得る方法を書こう。

必要なことを列挙すると、
・Processingのシリアル通信用のライブラリ(processing.serial.*)をインポートする。
・Arduinoが接続されているポートの名前を取得する。
・Serial型の変数にシリアルポートを代入する。
・Arduinoが接続されているされているポートから情報を読み取る。
といった感じ。

これらをまとめるとこんな感じになる。

解説:
importはそのままライブラリをインポートする。
Serial型とint型の変数を用意。

setup()でArduinoが接続されているポート名を取得
なお、*1の部分はArduinoが接続されているポート番号となる。
myPortにはポート名と通信用のシリアルポートとして設定された9600の情報をいれる。

draw()でint型の変数inByteにシリアルポートを通してArduino側の情報を読み取り代入する。
この場合200という整数になる。

println()はログとしてしたの黒い画面に引数を表示する。
inByteとなっているので200が表示されるはず。




といった感じでシリアルポートを通してArduinoとProcessingの連携を行える。

基盤の処理はArduinoIDEで、それらから得られた情報はProcessingで処理をする。といった感じ。

もちろん基盤側で光センサーや感圧センサーを用いて、それらを数値化してやり取りすることもできる。
さぁみんなもはじめよう!

0 件のコメント:

コメントを投稿

人気の投稿