加速度センサーの値をサンプリング

- 2008-11-22

最近絵画を研究しています。しかも今回はスパコで絵画をする予定。

画家/小数点 どういうことかというと鉛筆に加速度センサーをつけてスケッチしてセンサーの値をサンプリングしている。それを元にサーボモータをドライブしている。

せっかくBoArduinoがあるので加速度センサーからのAD値をスパコで受け取りそれを元にサーボのドライブ部もスパコで行きたいと思う。(ついでに実はムービーの再生もSCMovieView使ってスパコのGUIから再生してる、どうでもいいことだけど、でもサーボと映像の同期にはこの方法がいいかと)

で、AD値のサンプリングで、へたにFloatArrayとか作らないでオーディオバスに流してバッファしてサウンドファイルにしてしまおうという作戦。くわしいことはめんどくさいので割愛するが、要はAD値を振幅に収まるようにマッピングしてあとはサーバで普通にレコーディング。

(こういうセンサーの値のマッピングに役立つのは.linlin()とか あとオーディオレートとカーネルレートの変換にはA2Kとかが便利)

さてデータを元にサーボを動かしたいのだけど、SimpleMessageSystemnライブラリにはデジタルi/oとアナログi/oがあるだけなのでこのままだとめんどー。 幸いAdruinoソフトウエアにはサーボ用ライブラリが用意されていてサンプルもあるのでそこから転用する。

以下SimpleMessageSystemのwritepin()のswitch文に書き足したコード、ディレイのタイミングとかかなり適当なので、てきせん変えてください。

int state;

  case 's' :       state = messageGetInt ();  // Gets the next word as an integer

      myservo. write(state );        delay (15);                        // waits 15ms for the servo to reach the position 

      Servo::refresh ();  

's'(char)につづけてサーボの位置をintで投げてあげるようにする。

下の動画はサンプリングじゃなくてリアルタイムにサーボを動かしてみたもの。

今のところただ動かしてるだけだから、ちゃんと積分とか、サーボの位置とかの部分書かないとだ。

こんな感じでスーパーコライダーでも立派にフィジカルコンピューティングできるよー! 特に音関係ではとっても有用さ!