TouchDesigner...Arduinoとパソコンの間で通信ができると、色々なソフトウェアと連携をとることができます。今回はいくつかの通信手段を使って、パソコンと連携する方法を解説していきます。親戚にRS-232CやRS-485がいる今までArduinoでデータをやり取りしていたUSBシリアル通信は、1対1の双方向通信をするための、シンプルでポピュラーな方法です。USBでシリアル通信をするのでUSBシリアルと言って、親戚のようなものにRS-232Cや、DMXのベースとなっているRS-485という規格のものがありますが、ここでやりとりするデータも基本的には同じ内容です。プログラム上においてで複雑なルールは無く、1バイトずつデータをやりとりします。「バイト」とは2進数の0と1を8個並べたものが「1バイト」0~255までの要素を表現できる16進数では0x00~0xFFのように2桁で表現できるバイトとはコンピュータ上で扱う数字の単位で、0と1だけで数を表す「2進数」の数字8桁を1バイトとしています。この1バイトで表せる数字は10進数の0~255までです。Arduinoでは2進数を0b00001111のように0bを付けて表現することもできます。ちなみに16進数も0x5Aのように0xを頭に付けて記述できますが、16進数が使われるのは1バイトを表記するのに2桁で収まって見やすいという理由があります。2/8/10/16進数の相互変換https://hogehoge.tk/tool/number.htmlバイトの列を送る0-255までの数字を1個ずつ送るのがシリアル通信データの意味や区切りなど、自分でルール(仕様)を決めてやり取りするこの1まとまりの数字を1個ずつ送れるというのが、シリアル通信の基本的な機能です。1バイトずつデータを送るので、この255までの数字にどういう意味を持たせるのかを決めながらやり取りしていく必要があります。touchdesignerシリアル通信では決まったデータのルールが特に無いため、やり取りの決め事をArduinoとソフトウェア側で決めながら実装していく必要があります。基本的なArduinoでのシリアル通信の記述方法と、PCとの連携についていくつか具体的な方法を紹介していきます。Arduinoシリアル送受信(基礎編)指定したピン番号のアナログ値を返すサンプルまずは、とてもシンプルなArduinoのシリアル通信サンプルを用意します。これはPCから0~5までの数字を受け取って、その番号のアナログピンの値を返すというサンプルです。アナログの値は0~1023まで取ることができますが、返す値は1バイトだけなので、0~255までしか送れません。大きい数字を送る方法は色々あるのですが、ここはひとまずアナログの値を255までに圧縮します。}}max/mspとの連携max/mspでシリアル通信をするときは、serialパッチを使います。1つ目の引数にポート名、2つ目には通信速度を記載します。ポート名はprintを送信すると右のアウトレットから出力されます。数字をメッセージで送るとその数字が1バイトだけ送信されます。1バイトなので、255を超える数字を送ろうとするとオーバーフローが起きて、256で割った余りの数字になってしまいます。ここではアナログ5番のデータが欲しいので5を一定間隔で送りました。Arduinoからは返事が返ってきますが、返事はserialオブジェクトの中に格納されたままになっていて、bangを送る事でアウトレットから出力されます。touchdesignerとの連携serialDATを使うTDはアスキーコードとして使うのがデフォルト(後述)続いてTouchdesignerでの連携です。touchdesignerではSerialDATというオペレータを使って送受信をします。ColumnをONに設定します。ColumnをONにしたことで、1バイト分のデータが数字で表示されるようになります。Linesは1にしておきます。StartをONにし、onFrameStart内でserial1オペレータのsendByteメソッドを呼び出します。これで毎フレーム5が送られるので、アナログ入力値がserialDATに送られます。CHOPに入れ込みます。DATから数字をもらってきても良いですが、これで使いやすくなりました。TOPのZパラメータに入れてみます。TOPのtzに入れます。アナログの値をぐりぐり動かすとNoiseの模様がリニアに変化していきます。processingとの連携processing.serialライブラリを使用serialEventメソッドが呼び出される続いてprocessingの場合です。processing.serialからライブラリをインポートして、Serialクラスを使います。writeメソッドで1バイト分のデータを送る事ができます。Processingではデータを受信するとserialEventが呼び出されるので、そこでデータを受信することができます。serial.read();}openFrameworksとの連携C++なので、Arduino側と読み書きの構造は近い今日紹介した中で処理速度は最速openFrameworksでは、ofSerialというクラスが用意されています。C++ということもあって、書き方はArduinoとかなり近くなります。通信速度(9600/38400/115200bpsなど)データ長・パリティビット・ストップビット8ビット長・パリティ無し・1ストップビット(SERIAL_8N1)がArduinoデフォルト最後に、USBシリアルではいくつかルールがあってこれをArduino側とソフトウェア側でそろえなくてはいけません。通信速度はノイズ等でデータの取りこぼしがあるので早すぎない程度に高い数字を使いましょう。データ長・パリティ・ストップビットについては通信のタイミングを決めるルールですが、基本的には8ビット・パリティ無し・1ストップビットが今スタンダードなようなので、特に意識する事はないと思います。メーカー製の装置等と通信する時に違った設定があることがあるので、なぜかちゃんと通信できないという時に思い出す程度で大丈夫です。各項目の意味については検索するとたくさん情報が出てきますが、これも自分で組み込みデバイスを設計しない限りあまり使うことはないかなと思います。補足:通信速度9600だと60fpsの世界では1フレーム160バイト115200で1フレーム1920バイトなので無難?自分の感覚としてはUSBシリアルなら9600未満は遅いかなという感じで、115200当たりが無難に思います。映像的に考えると、9600bpsで1フレームに送れるデータ量は9600÷60=160バイトなのでちょっと遅いかも、115200bpsなら1フレーム1920バイトなので十分かなという感じです。補足の補足:クロックとの組み合わせArduinoのクロック数(UNOでは16MHz)によってエラーレートが変わる高いほどエラーが起きやすいという事でもないその後、ツイッターで情報をいただいたのですが、実はクロック数と通信速度でデータを取りこぼしやすい組み合わせがあるということでした。https://cache.amobbs.com/bbs_upload782111/files_22/ourdev_508497.htmlここによると16MHzでエラー率が低く、速度が速いのは76800bpsだそうです。115200だと3.7でやや高く、57600は少し遅いけど位相がずれていくのでエラー率が高くなっています。https://ja-support.renesas.com/knowledgeBase/17794551理論上は4.375%までが許容範囲ということなので、115200はギリギリですね...16MHzのArduinoでは76800くらいが丁度良さそうです。生のバイナリ(数字)データでシンプルにやりとり複数種類のデータや大きい数字など複雑にしづらい以上が、各ソフトウェアで扱える簡単なシリアル通信の方法です。単純なデータのやりとりはできますが、これではちょっと機能に物足りなさを感じます。「1種類のインプットと、それに対応した1種類のアウトプットを持つもの」その組み合わせがどういう意味を持つか、どういう意味を持たせられるか考える6月も半分を超えたので、ここで前期課題を出そうと思います。デバイスを使った作品プランを考えてみてください。後期は実際に作品を作ってもらいたいと考えているので、ここで少し作品についてや実現可能性についてディスカッションをできればと思っています。聴講生の提出も歓迎です。しても作りたいものがある場合は、Arduinoかその他デバイスを使っていれば自由に考えてもらっても構いませんが、一応トライしてみてほしいテーマを「1種類のインプットと、それによって変化する1種類のアウトプットを持つもの」とします。何かセンサーや入力を1種類と、それによって制御される出力を1種類決めて、その現象がどういう意味を持つか、どんな意味を持たせることができるか考えてみてください。7/19に発表してもらいたいので、7/19のお昼12時を提出期限とします。課題用のページを作りますが、Googleのドキュメントかスライド、PDFなどWebで共有できる形式をいくつか指定します。コメントをキャンセルメールアドレスが公開されることはありません。