Sync Controller の製作
#earthMetronome 中で必要とされる、映像・音楽・イベントなどの多拠点での絶対時刻同期を実現するコントローラーの製作。
といってもこれ自体は機能的にはとても単純で、
ネットワーク上の時刻同期プロトコルを受け取って、ビデオ同期用SMPTEタイムコード信号(LTC)と、音楽・イベント・照明同期用MIDIタイムコード(MTC)を生成する
だけである。 #earthMetronome プロジェクトは、基本的にはコンポーネントやモジュールの組み合わせで実現されることを目指しているので、実際にどう使うかは使う人に任される。ただ、私の場合は、
4K x 4カメで収録する映像と、オーディオインターフェース+PC+DAW(音楽制作収録用ソフトウェア)で収録するマルチトラック音声を同期させたい
という用途がとても重要なので、それを可能にする最小機能から実現していく予定。収録の場合はインターネットや外部ネットワークに繋げない場合もあるので、高精度リアルタイムクロック(RTC)も内蔵して、ローカルの時間でのタイムコード生成も行う。
また外部ビデオ信号に同期したタイムコードを生成することも可能。
全体像
全体の機器構成の中での位置づけはこんな感じになる。HD-SDIビデオ信号からのデジタル音声分離(S/PDIFまたはAES)によって、サンプリング単位では同期しているが、絶対時間をカメラ4台と同期させるためにこれを使用する。
パーツ構成
・コアモジュール : NXP LPC1768 mbed ボード
・液晶ディスプレイ : I2C 接続 16桁x2行 キャラクタディスプレイ(機種は今後選定)
・ビデオ同期信号分離 : Texas Instruments LM1881N
・パルストランス付きLANコネクタ : Pulse Electronics J0011D21B (別機種に変更するかも)
・低電圧単電源オペアンプ(LTC出力用) : JRC NJM2732D
・高精度リアルタイムクロック : MAXIM DS3231SN
など。回路そのものはとても簡単&単純。
ブロック図
TBD
プロトタイピング
ブレッドボードを使ってプロトタイピング中。
中核となるマイコンボードが結構お高いのだが、生産性と拡張性を考えてこれをこのまま最終版でも使うことにする。
ビデオ同期信号に同期したSMPTEタイムコード信号を生成できたところ。赤丸で示したのは同期パターンで、下の水色のビデオフレーム(1/29.97秒)同期信号の立ち上がりにぴったり同期しているのがわかる。
ソフトウェアでPLL (Phased Lock Logic)を実装したので、6時間たってもビデオフレーム同期信号から400μ秒ぐらいの遅れで追従している。(水色が元の信号。横軸ひとマスは1ミリ秒)
ソフトウェア
mbed 標準のMbed OSおよびそのWeb上の開発環境を使用する。SMPTEタイムコード生成を含めて既存のオープンソースライブラリを使用するが、そのまま使えることはあまりなく、かなり手を入れることになる。(その辺ArduinoやRaspberry Pi系と違うmbed文化?なのかな)
Arduinoとも違って、ほぼネイティブに近い C++ なので、C/C++系に慣れ親しんだ人には扱いやすい。スクリプト系からIoTに入ってきた人にはしんどいかもしれない。
公開するかどうかは未定...。ただ興味がある人or mbed開発やってみたい人には共有するかも。
外観
ケースはこの辺のどれかかな...(未定)
スイッチ類は最小限になる。電源オンですぐ使用できるようにするのが目標。
今後の方針
とりあえずブレッドボード上でのフル機能実装を目指し、ケースに組み込む際に基板化するかどうか考える。プリント基板を作る場合は最低単位が10枚なので、基板だけか、主要部品込みで頒布するかも。もし興味ある方がいらしたらコメントに書いてください。
進捗 - 2021/03/26
NTPサーバーのアクセスに思いのほか手間取ったけれど、
- RTC(リアルタイムクロック)から時刻取得
- NTPからの時刻取得
からのLTC出力は実装完了。
こんな感じで。
↑動画の埋め込みはできないのか...。
まあいいや、残るは
- ロータリーエンコーダーを使った以下の項目の設定
--- 時刻ソース(NTP/RTC)の切り替え -> DONE
--- フレーム同期/フリーランのあるなし -> DONE
--- 29.97ドロップフレーム(DF)、29.97 NDF、 23.976 NDF、24 NDF の切り替え(こんなもんで足りる?) -> コード検討中
--- 出力レベルの切り替え -> 半固定抵抗で実装
- 基板...はどうしようかな。プリント基板を起こすほどじゃないな
- ケースに組み込み(自分で現場で使うからねー) -> DONE
以上 DONE となっているのは、これで実装しました。稼働中。