Imaginary Code

from kougaku-navi.net

ProcessingでGlueMotorをコントロールする

Maker Faire Tokyo 2013でも展示されていた寺崎和久さんのGlueMotorをProcessingからコントロールするコードを書きました。
 

GlueMotorはサーボモータスマートフォンタブレットに繋いで手軽にコントロールできるケーブルです。マイコンや複雑な回路は不要で、電池とヘッドフォンプラグだけという驚異のシンプル設計です。オーディオ端子に挿して、音声信号を流すことによってサーボモータを制御します。

通常、サーボモータArduinoやPICなどのマイコンを用いてPWM信号を出力して制御するのが王道ですが、それをオーディオ端子からの音声出力で代替したところがこの手法の賢いところです。iPhone/Android用のアプリも提供されており、ケーブルを作ってすぐに動かせる手軽さがあります。

Processingのコード

というわけで、GlueMotorをProcessingから動かしてみたいなと思ったので、コードを書きました。ケーブルの作り方はGlueMotorのページをご覧ください(ちなみに共立電子産業から商品化も予定されているそうです)。

import ddf.minim.*;
import ddf.minim.signals.*;

Minim minim;
AudioOutput out;
PulseWave pulse_L;
PulseWave pulse_R;

float FREQ = 50;            // パルスの周波数(Hz)
float MIN_PULSE_WIDTH = 4;  // 最小角度時のパルス幅 [1〜30](要調整)
float MAX_PULSE_WIDTH = 20; // 最大角度時のパルス幅 [1〜30](要調整)

void setup() {  
  size(512, 512);
  minim = new Minim(this);
  out = minim.getLineOut(Minim.STEREO, 2048);

  // 左チャンネルのパルス波の設定
  pulse_L = new PulseWave(FREQ, 1.0, out.sampleRate());
  pulse_L.setPan(-1);      // 左チャンネルに設定
  out.addSignal(pulse_L);

  // 右チャンネルのパルス波の設定
  pulse_R = new PulseWave(FREQ, 1.0, out.sampleRate());
  pulse_R.setPan(1);      // 右チャンネルに設定
  out.addSignal(pulse_R);
}

void draw() {
  background(0);

  // 十字線を描画
  strokeWeight(4);
  stroke(255);
  line(mouseX, 0, mouseX, height);
  line(0, mouseY, width, mouseY);
}

void mouseMoved() {
  // マウスカーソルの位置に応じてパルス幅を変更
  float wL = map(mouseX, 0, width, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
  float wR = map(mouseY, 0, height, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
  pulse_L.setPulseWidth(wL);
  pulse_R.setPulseWidth(wR);
}

void stop() {
  out.close();  
  minim.stop();
  super.stop();
}

起動すると画面に十字線が表示され、「ガー」というノイジーな音が出ます。マウスカーソルを上下左右に動かすと、信号のパルス幅が変化し、それに伴ってサーボモータが動きます。

いくつか注意点があります。

  • 使用するサーボモータによってパルス幅が異なりますので、MIN_PULSE_WIDTHとMAX_PULSE_WIDTHを適宜調整してください。
  • 音声出力が小さいと動きません。ボリュームを大きくしてください。
  • PCによっては出力が足りず、動かないことがあります。

それにしてもProcessingは便利ですね。周波数やパルス幅をインタラクティブに変化させるプログラムが楽々書けました。