Arduino, SuperCollider, コンピュータ

SuperCollider -> Arduino(TLC5940)

SuperColliderとArduinoを同期させる場合、どちらかと言えばArduinoからSCの音を制御することが多いようで、SCからArduinoと繋がったものを制御するのに興味のある人はあまりいないかもしれない。Arduino Uno本体だけではDigital Outが大して多くないので、TLC5940で出力数を増やした上で、SCでRGBのLEDをチカチカさせたい。

実際、やってみようと思ってネットで少し検索してみたけれど、例えば、”TLC5940 SuperCollider”では参考になりそうなサイトがそれほど見つからなかった。そもそも、何でもかんでもネット経由のコピペで済まそうと思うのが良くない。いろいろ振り回されて、やれSCPyduinoだの、やれArduinoSMSだの、訳も分からずに試してみたのだが、結局SerialPortのHelpファイルを参考にしてSCのコードを書き、Arduino側はそのHelpファイルで参考にするようにと書いてあったexample(Examples -> 04.Communication -> Dimmer)とTLC5940のexampleを手掛かりにして、何とか最低限のことはできるようになった。5つのフルカラーLEDを赤、緑、青と順番に色を変えながら1つずつ点滅させようとして書いたものが、以下の通り。

Arduino

#include "Tlc5940.h" 
#define BRIGHTNESS 512 // brightness: 0-4095 
 
TLC_CHANNEL_TYPE ch; 
byte val;
 
void setup() { 
  Serial.begin(9600);
  Tlc.init(); 
  Tlc.clear();
} 
 
void loop() {
  if (Serial.available()) {
    val = Serial.read();
    if (val<128) {
      ch = (char) val;
      Tlc.set(ch, BRIGHTNESS);
      Tlc.update();
    } else {
      ch = (char) val-128;
      Tlc.set(ch, 0);
      Tlc.update();
    }
  }
}

SC

(
~arduino = SerialPort(
    "/dev/tty.usbXXXXXXX",    //edit to match your port. SerialPort.listDevices
    baudrate: 9600,    //check that baudrate is the same as in arduino sketch
    crtscts: true);
)
(
r = Routine{
	loop{
		15.do{|i|
			~arduino.put(i);
			["red on", "green on", "blue on"].wrapAt(i).postln;
			0.5.wait;
			~arduino.put(i+128);
			["red off", "green off", "blue off"].wrapAt(i).postln;
			0.5.wait;
		}
	}
}.play;
)
 
// to stop blinking
r.stop;
~arduino.close;

SCのコードで、SerialPortの最初の引数、パス文字列の部分は、予めSerialPort.listDevicesを実行して調べておく必要がある。ここで”/dev/tty.usbXXXXXXX”となっているのは、あくまで仮のものである。

配線は、ArduinoのサイトにあるTLC5940の使用例を示した図を基にして、LEDのアノードを電源側に、RGBのカソードをそれぞれTLC5940側に繋げた。カソードとTLC5940の間には抵抗を挟んだ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です