poisson
tutorial/ TouchDesigner/

TouchDesigner & Arduino for Beginners

Sample File

Arduinoとは

作例

光センサ × TouchDesigner
加速度センサ × TouchDesigner

使用するもの

ArduinoとTouchDesignerの連携方法

Serial通信

伝送路上を一度に1ビットずつ、逐次的にデータを送る通信方式

実際に動かしてみよう!!

Arduinoの “Hello World!”
Lチカ(LEDをチカチカさせます)

使用するもの

LEDは足が長い方が+で短い方が−になります
逆だと電気は流れません

LチカのプログラムLチカ

const int ledPin = 2;  //定数、変数の定義部分

void setup() {  //Arduino起動時に一度だけ実行される部分
  pinMode(ledPin, OUTPUT);
}

void loop() {  //ボードの電源が切れるまで繰り返し実行される部分
    digitalWrite(ledPin, HIGH);
    delay(1000);  //1000ms(1秒)待つ
    digitalWrite(ledPin, LOW);
    delay(1000);  //1000ms(1秒)待つ
}

Arduinoへプログラムの書き込む方法

プログラムを書き、保存をしたら
ツール->ボードを “Arduino/Genuino Uno” (使用しているボード)
ツール->シリアルポートを 表示されているポートに合わせてください
(WindowsだとCom3など、Macだと/dev/cu.usbmodem1421などのような表示です)

二つを設定したら、左上の矢印ボタンで書き込みができます

以下の画像のように表示されたら書き込み完了です

1秒間隔でLEDが点滅します!

Serial.begin() & Serial.print()

Arduinoからシリアル通信で情報を送信する場合
まず、シリアル通信の準備にSerial.begin()
送信にはSerial.print() という関数を用いますSerial.print()

int count = 0;

void setup() {
  Serial.begin(9600);  //シリアル通信の準備
}

void loop() {
    count++;
    Serial.print(count);  //データ送信
    delay(1000);  //1秒待つ
}

Arduino IDEのシリアルモニタから送信されたデータを確認

改行がされない…
Serial.print()ではデータのみを送信します
なので改行記号等も自分で書かなくてはいけません
そんなめんどくさい時に使うのがSerial.println()です
データの最後に自動で改行文字( \r\n )が挿入されます
使い方はSerial.print()と一緒です
先程のカウントのコードでSerial.print()をSerial.println()に書き換えてみましょうSerial.println()

int count = 0;

void setup() {
  Serial.begin(9600);  //シリアル通信の準備
}

void loop() {
    count++;
    Serial.println(count);  //データ送信
    delay(1000);
}

シリアルモニタを見てみると

送信されたデータごとに改行がされています
TouchDesignerでSerialを受信する時には、改行記号がデータの最後に付いていると扱いやすいです

TouchDesignerでSerialを受信

TDSW_Arduino.toe->/project1/serial_display
次はシリアルモニタではなくTouchDesigner側でSerialを受信してみましょう
SerialDATを作ります
パラメータでポートを繋いであるArduinoのもの(IDEで出たのと同じもの)
Baud Rate をSerial.begin() で設定した値にします(今回は9600)

その後ActiveをONにするとSerialDATに先程のシリアルモニタど同様の値が来ているのが確認できます

物理ボタンのOnOffをTouchにSerialに送信

TDSW_Arduino.toe->/project1/button_switching
次は物理的なボタンを用いてTouchDesignerの画像を切り替えてみましょう

ボタンが押されてるかどうかを0/1でSerialで送信

int inPin = 6;
int value = 0;

void setup() {
  pinMode(inPin, INPUT);
  Serial.begin(9600);
}

void loop() {
    value = digitalRead(inPin);
    Serial.println(value);

    delay(100);
}

押していない時0、押されている時に1を送るのでその値をTouchDesigner側で利用しましょう
まず最新の値一つしか用いない為SerialDATのMaximum Linesを1にします
datto->DAT : null1

countCHOP->Limit : Loop Min/Max

countCHOP->Limit Maximum : 

そしてcountCHOPの値を画像を切り替えるSwitchTOPのindexに入れてあげると完成

Touchで送った文字列がそのままシリアルで帰ってくるプログラム

TDSW_Arduino.toe->/project1/send_text

int incomingByte = 0;
char buffer[16];
int len = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0){
    int incomingByte = Serial.read();
    buffer[len++] = incomingByte;
    if (len >= 16){
        len = 0;
    }

    if (incomingByte == '\n'){
        Serial.print(buffer);

        for(int i = 0; i<len; i++){
          buffer[i] = ' ';
        }

        len = 0; // reset buffer counter
    }
  }  
}

加速度センサxyz軸の値をTouchに送る

TDSW_Arduino.toe->/project1/acceleration_xyz

int xPin = 2;
int yPin = 1;
int zPin = 0;

int x_val = 0;
int y_val = 0;
int z_val = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
    x_val = analogRead(xPin);
    Serial.print(x_val);
    Serial.print(",");
    y_val = analogRead(yPin);
    Serial.print(y_val);
    Serial.print(",");
    z_val = analogRead(zPin);
    Serial.print(z_val);
    Serial.println();

    delay(100);
}

TouchのSliderからLEDの光の強さを制御

TDSW_Arduino.toe->/project1/light_slider

int incomingByte = 0;
char buffer[16];
int len = 0;

int ledValue = 0;
int ledPin = 3;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available() > 0){
    int incomingByte = Serial.read();
    buffer[len++] = incomingByte;
    if (len >= 16){
        len = 0;
    }

    if (incomingByte == '\n'){
        ledValue = atoi(buffer);
        Serial.println(ledValue);

        analogWrite(ledPin, ledValue);

        for(int i = 0; i<len; i++){
          buffer[i] = ' ';
        }

        len = 0;
    }
  }  
}

最後に

TouchDesignerとArduinoの組み合わせはアイデア次第でどんなものでも作れます。
トライアンドエラーを繰り返し面白いものを作っていきましょう!
(怪我や火事等には十分ご注意ください)

参考文献

Arduino公式
Derivative Arduinoページ
O’Reilly Arduinoをはじめよう (書籍)


抵抗値の計算

使用するLEDのデータシートを見ると最大定格(mA)というものがあります
これはそのLEDに流すことの出来る最大電流でそれを超えて流し続けると劣化や破損をおこす値を表したものです
なのでLEDに流れる電流を抑えるために抵抗を使います
電圧=電流×抵抗値 オームの法則
例えば5VのArduinoで最大定格20mA(=0.02A), 順電圧2VのLEDを使う場合
(5-2)V = 0.2A × 抵抗値 となるので
使う抵抗の抵抗値は150Ωとなります
参考文献
http://www.my-craft.jp/html/aboutled/led_jyundenatsu.html

Back