簡単なトコロから、ボタン付きロータリーエンコーダでタイムスライダをスクラブ、ボタンで再生、停止出来るようにしてみました。
間にProcessingで作成したアプリを入れていますが、MayaへpyserialモジュールをインストールしてArduinoとMayaを直接シリアル通信でつなげる事もできるかも。
ロータリーエンコーダが返すグレイコードの扱いがあってるか分かりませんが、以下がArduino IDEのコード。
const int ENCA_PIN PROGMEM = 10; const int ENCB_PIN PROGMEM = 9; const int BTN_PIN PROGMEM = 8; int lastBtn = HIGH; int lastu = -1; int lastv = -1; int count = 0; void setup() { Serial.begin(115200); pinMode(ENCA_PIN, INPUT); pinMode(ENCB_PIN, INPUT); pinMode(BTN_PIN, INPUT_PULLUP); } void loop() { int u = digitalRead(ENCA_PIN); int v = digitalRead(ENCB_PIN); if((lastu != u) || (lastv != v)){ if((u == 1) && (v == 1)){ if(lastu == 1){ count ++; sendData("r",count); //Serial.println("plus"); } if(lastu == 0){ count --; sendData("r",count); } } } int btn = digitalRead(BTN_PIN); if((btn == LOW) && (btn != lastBtn)){ sendData("c",0); delay(100); } lastBtn = btn; lastu = u; lastv = v; } void sendData(char *id,int value){ Serial.print(id); Serial.print(","); Serial.println(value); }
ロータリーエンコーダとArduino Uno R3を以下のように結線。
- CLKとDigital10
- DTとDigital9
- SWとDigital8
- +と5V
- GNDとGND
次にProcessing、Mayaへ直接melコマンドを送っています、Processing上にハードコードするより、Maya側でコマンドを持っておく方が良いとは思いますが。
import processing.net.*; import processing.serial.*; Serial myport; Client myclient; int value = 0; int lastValue = 0; void setup(){ size(512,128); printArray(Serial.list()); myport = new Serial(this, Serial.list()[1], 115200); myport.bufferUntil('\n'); myclient = new Client(this,"127.0.0.1", 7001); noLoop(); } void draw() { background(0); textSize(32); text("Maya w/Arduino", 10, 30); } void stop(){ myport.stop(); myclient.stop(); } void serialEvent(Serial myport){ String mystr = myport.readStringUntil('\n'); String data[] = split(trim(mystr), ','); //printArray(data); if(data[0].equals("r")){ value = int(data[1]); if(lastValue - value < 0){ myclient.write("currentTime (`currentTime -q`+1);"); }else{ myclient.write("currentTime (`currentTime -q`-1);"); } lastValue = value; } if(data[0].equals("c")){ myclient.write("if(`play -q -st`){play -st false;}else{play -st true;}"); } }
後はMayaを起動して以下を実行しmelコマンド用に7001番ポートを開きます。
import maya.cmds as cmds try: cmds.commandPort(name=":7001", close=True) except: cmds.warning('Could not close port 7001 (maybe it is not opened yet...)') cmds.commandPort(name=":7001", sourceType="mel")
Arduino IDEもProcessingも接続が出来ない場合の処理を省いています。Arduino、Maya(ポートを開ける)、Processingの順に起動してひとまず出来上がり~。