
概要 📖 – シリアル通信入出力
Serial CHOPは、シリアルポート(COM)を介して外部デバイスと双方向通信し、受信値と送信スクリプトをチャンネルとして扱う CHOPです。ボーレート・データビット・パリティ等の通信パラメータを設定し、Arduino やセンサーモジュールとのデータ送受信を 1 オペレータで完結します。
主な用途 🎯
- Arduino / マイコンとの双方向シリアル通信(センサー値受信・コマンド送信)
- COM ポート経由のハードウェア入力(圧力センサー・ロータリーエンコーダ等)の取り込み
- チャンネル変化イベントに連動した制御コマンドの送出(オン / オフ / 値変化トリガー)
- ボーレート・データビット・パリティ・ストップビットの細かい通信設定
- Callback スクリプトでの受信データのカスタム解析・整形
データフロー 🔄
入力: COM ポート経由のシリアルデータ
↓
State 監視(チャンネル変化検出)
↓
Script 配列に応じた送信 / Callback で受信処理
↓
出力: チャンネル値とコマンド送出
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
Port Page 📋
Active .active 🔌
Active .active ✅
– シリアル接続を有効化するトグル
– オフの間は COM ポートを占有せず通信を停止
State .state 🎛️
監視する入力チャンネルの遷移タイプを決定するメニューパラメータ
| 項目 | 内部名 | 説明 |
|---|---|---|
| Off to On | .offtoon |
チャンネルがオフからオンに切り替わったタイミングで送信 |
| While On | .on |
チャンネルがオンの間、毎フレーム送信 |
| On to Off | .ontooff |
チャンネルがオンからオフに切り替わったタイミングで送信 |
| While Off | .off |
チャンネルがオフの間、毎フレーム送信 |
| Value Change | .valuechange |
チャンネルの値が変化したタイミングで送信 |
Port .port 🔢
シリアル接続に使用する COM ポートの選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| COM3 | .com3 |
システムで認識されている COM ポート(環境に応じて COM1 / COM4 等が選択肢として出現) |
Baud Rate .baudrate ⚡
Baud Rate .baudrate ⚡
– コントロールビットを含み、1 秒あたりに伝送される最大ビット数
– 入力デバイス側のデフォルト値を確認して合わせる
Baud Rate Menu .baudmenu 📜
代表的なボーレートをメニューから選択して Baud Rate に反映するためのプリセット
| 項目 | 内部名 | 説明 |
|---|---|---|
| 1200 | .1200 |
1200 bps |
| 2400 | .2400 |
2400 bps |
| 9600 | .9600 |
9600 bps(Arduino デフォルト) |
| 19200 | .19200 |
19200 bps |
| 38400 | .38400 |
38400 bps |
| 57600 | .57600 |
57600 bps |
| 115200 | .115200 |
115200 bps(高速通信の標準値) |
| 230400 | .230400 |
230400 bps |
| 460800 | .460800 |
460800 bps |
| 921600 | .921600 |
921600 bps |
| 1382400 | .1382400 |
1382400 bps |
Data Bits .databits 🔠
1 フレームあたりに送信されるデータビット数を決定するメニュー
| 項目 | 内部名 | 説明 |
|---|---|---|
| 6 | .6 |
6 ビット |
| 7 | .7 |
7 ビット |
| 8 | .8 |
8 ビット(最も一般的) |
| 9 | .9 |
9 ビット |
※ 注意: データビットは LSB(最下位ビット)から MSB(最上位ビット)の順に「逆向き」に送信されます。受信側で値を解釈する際は右から左に読む点に注意してください。
Parity .parity 🧮
データビットに付加されるエラー検出用パリティビットの種類
| 項目 | 内部名 | 説明 |
|---|---|---|
| Even | .even |
データビットとパリティビットの 1 の数が偶数になるよう設定 |
| Odd | .odd |
データビットとパリティビットの 1 の数が奇数になるよう設定 |
| None | .none |
パリティビットなし(エラー検出機能を使わない) |
Stop Bits .stopbits 🛑
1 フレーム送信の終端に付加されるストップビット数
| 項目 | 内部名 | 説明 |
|---|---|---|
| 1 | .1 |
ストップビット 1 個(標準) |
| 2 | .2 |
ストップビット 2 個 |
Scripts Page 📝
Script .script 📤
Script .script 📤
– 入力チャンネルに対応する送信文字列のシーケンス
– 例: Script 2 は 3 番目の入力チャンネルが State 条件を満たした時に送信される
– <CR> / \n(キャリッジリターン)、\r(ラインフィード)等のエスケープシーケンスを自動変換
Callback .script0callback 🔁
Callback .script0callback 🔁
– Script 0 として送信されるスクリプト文字列を直接入力する欄
– 受信側のカスタム解析ロジックの起点として使用
Common Page 🔧
Time Slice .timeslice ⏱️
Time Slice モードの強制設定:
- オン: チャンネルを「タイムスライス」モードに強制
- タイムスライス: 前回のクックフレームから現在のクックフレームまでの時間
Scope .scope 🎯
影響を受けるチャンネルの絞り込み:
- Scope 文字列: 影響を受けるチャンネルを指定する文字列
- パターンマッチング:
*や[1-10]等のパターンが使用可能
Sample Rate Match .srselect ⚡
複数の入力 CHOP のサンプルレートが異なる場合の処理方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Resample At First Input’s Rate | .first |
最初の入力のレートで他をリサンプル |
| Resample At Maximum Rate | .max |
最高サンプルレートでリサンプル |
| Resample At Minimum Rate | .min |
最低サンプルレートでリサンプル |
| Error If Rates Differ | .err |
レート不一致でエラー |
Export Method .exportmethod 📤
CHOP チャンネルをパラメータに接続する方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| DAT Table by Index | .datindex |
DAT テーブルのインデックスでチャンネルとパラメータを対応付け |
| DAT Table by Name | .datname |
DAT テーブルの行名でチャンネルとパラメータを対応付け |
| Channel Name is Path:Parameter | .autoname |
チャンネル名を `path:parameter` 形式で記述し直接対応付け |
Export Root .autoexportroot 🌳
Channel Name is Path:Parameter モード時のパス基点:
- Export Root パス:
autonameモードでチャンネル名のパス部分を相対化する基点 OP のパス
Export Table .exporttable 📋
DAT Table エクスポート方式での参照 DAT:
- Export Table DAT:
datindex/datnameモード時に参照する DAT のパス
Rename from .commonrenamefrom 🔤
リネーム対象チャンネルのパターン:
- Rename from パターン: リネーム対象とするチャンネル名のパターンマッチング文字列
Rename to .commonrenameto 🔁
リネーム後の置換パターン:
- Rename to パターン: Rename from にマッチしたチャンネルの新しい名前パターン (デフォルトはリネームなし)
実践アイデア 💡
Example 1: Arduino からセンサー値を受信して映像制御 🎵
Arduino → Serial CHOP (COM3, 9600bps) → Math CHOP (Range) → TOP Parameter
- Arduino 側で
Serial.begin(9600)+Serial.println(analogRead(A0))を実装 - Serial CHOP の Port を Arduino が接続された COM ポートに設定、Baud Rate Menu を 9600 に
- 受信したアナログ値(0〜1023)を Math CHOP で 0〜1 に正規化
- 正規化値を TOP の Level / Blur などのパラメータに Export してリアルタイム制御
Example 2: ロータリーエンコーダの回転検出で UI 切替 📊
Rotary Encoder → Serial CHOP (State: Value Change) → Logic CHOP → Switch TOP
- ロータリーエンコーダの値を Arduino 経由でシリアル送信
- Serial CHOP の State を「Value Change」に設定して値変化のみ検出
- Logic CHOP で増減方向を判定し UI のページインデックスを更新
- Switch TOP で表示パネルを切り替えるインタラクティブ UI を構築
Example 3: TouchDesigner からデバイスへコマンド送信 🎮
Trigger CHOP → Constant CHOP (チャンネル切替) → Serial CHOP (Script 配列) → 外部マイコン
- Serial CHOP の Script 0〜N に送信したいコマンド文字列を記述(
\n等のエスケープ可) - 入力チャンネルの状態を State で監視(例: Off to On)
- Trigger CHOP / Constant CHOP で入力チャンネルを切り替えコマンドを発火
- 受信側マイコンでコマンドを解釈し LED や モーターを駆動
Example 4: Callback スクリプトでカスタムパース 🔄
External Device → Serial CHOP (Callback) → Custom Python Parsing → DAT Table
- 受信文字列に CSV / JSON 等の独自フォーマットが含まれる場合、Callback に Python スクリプトを記述
- Callback 内でデリミタ分割やバイト解析を行いチャンネル値に変換
- DAT Table に書き出して後段の CHOP / TOP で使用
- 通信プロトコル固有の処理を Serial CHOP 内に閉じ込めて再利用性を向上
関連オペレータ 🔗
類似機能OP 🔍
- Serial DAT — シリアル通信を DAT 側で扱う場合の選択肢(文字列・テーブル中心の処理)
- OSC In CHOP — ネットワーク経由の制御信号を受信する CHOP(用途が近い)
組み合わせ推奨OP 🔄
- Math CHOP — 受信生値を正規化・スケーリング
- Filter CHOP — ノイズの多いシリアル入力を平滑化
- Logic CHOP — 受信値を閾値判定してオン / オフ信号に変換
- Trigger CHOP — 送信タイミングのエンベロープ制御
- Analyze CHOP — 受信ストリームのピーク検出や統計値抽出
前処理・後処理CHOP 🎯
Info CHOP情報 📊
Serial CHOPは Info CHOP による詳細情報取得に対応しています。
CHOP固有情報 🎚️
start: CHOPインターバルの開始(サンプル単位)length: CHOPのサンプル数sample_rate: フレーム毎秒のサンプルレートnum_channels: CHOPのチャンネル数time_slice: タイムスライス有効時は1、無効時は0export_sernum: Export接続の更新回数
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間(ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: COM ポートに接続できない / 警告が発生する
✅ Solution:
- 他のアプリケーション(Arduino IDE のシリアルモニタ等)が同じ COM ポートを占有していないか確認
- Active をオフにしてから別のポートに切り替え、再度 Active をオンにする
- デバイスマネージャで実際に割り当てられている COM 番号を確認し Port パラメータと一致させる
❌ Problem: 受信データが文字化けする / 値が想定外
✅ Solution:
- 送信側と Baud Rate / Data Bits / Parity / Stop Bits が完全一致しているか確認
- Baud Rate Menu のプリセット値を使い独自値の入力ミスを排除
- 受信側でデータビットが LSB→MSB の順に届く点を考慮し、必要なら後段でビット反転処理
❌ Problem: 送信タイミングが意図通りにならない
✅ Solution:
- State パラメータの選択が用途と合っているか確認(Off to On / While On / Value Change 等)
- 前段に Logic CHOP を入れて条件を明示化
- Script 配列のインデックスと入力チャンネル順序が対応しているか確認
❌ Problem: ノイズが多くて値が安定しない
✅ Solution:
- 後段に Filter CHOP を入れて時間方向にスムージング
- 送信側マイコンで複数回サンプリングして平均化してから送信する
- ケーブル長を短くし、グラウンド共通化やシールド線を使用してハードウェア起因のノイズを抑える
参考資料 📚
その他 🔗
- TouchDesigner Wiki — CHOP 概要
- TouchDesigner Wiki — Category:CHOPs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group

