Libec PH-9アダプタの製作

SONY(LANC)制御編

さて、LANC制御についてだが、まずLANCプロトコルとはどんなものかということからまとめてみた。

1.LANC(Control-L)の概要

LANCとは、ソニーが開発したコントロール端子の名称。
ビデオデッキやビデオカメラをVbox(ビデオ機器をまとめて制御するためのインタフェース)や、編集コントローラから制御するために使われる。
一方的にリモート操作などで指示を送るだけでなく、双方向の通信ができる端子。民生用としては最高の編集精度を誇る。

2. 通信プロトコル


2.1. トポロジ

  • Peer to Peerの構成をとり、Master-Slaveの関係を持つ。
  • 物理的には1bitの双方向通信。(φ2.5のステレオジャックがよく使用される)
  • MasterはSlaveから送出されるフレームタイミングに同期させてコマンドを送る必要がある。
  • 8byte=1packetデータとして扱い、ビットレートは9600bpsに相当する。
  • 簡単にいうと、フレーム同期の非同期bit転送通信みたいなものである。

2.2. フレーム構成


LANCのデータはコントローラ(MASTER)からデバイス(SLAVE)方向へのコマンド4byteとデバイスからコントローラ方向へのデータ4byteの
合計8byte=1packetデータとして扱われる。
1byteデータは1bitのスタートビットと少し長い(2bit分くらい?)ストップビットから成り立つ。
スタートビットおよびデータ1bitの長さは約104usecでこれは9600bps相当である。
データは負論理でLOWレベルが”1”に相当し、HIGHレベルが”0”に相当する。
データの転送方向はLSB Firstである。また、スタートビットは”1”(LOWレベル)である。
スタートビットと次のスタートビットの間隔はほぼ1.2msec~1.4msecでこれはSlaveデバイスに依存する。
NTSCの場合パケットデータ間は1/60=16.67msecでこれはビデオのフレームと同期している。ちなみにPAL/625の場合は20msecである。
ということもあり、ビデオ機器の制御のためのIFであり、他の用途での使用は想定されていない。

図 2‑1:LANCのフレーム構成とタイミグ

2.3.       波形で見るLACN制御

以下はSONYのDSR-30(MASTER)とVX2000(SLAVE)とをLANC接続し、その間の通信をおこなっている実際の波形。(何も制御していない状態ではデバイスからステータスなどの情報が絶えず流れてきている)

図 2‑2:DSR30→VX2000を制御したときのLANC信号

2.4.       LANCコマンド集

1Octet~4OctetまではMaster→Slave方向のコマンドであり、その主な内容を以下に示す。
ただ、実質制御として使用するのは1Octet、2Octetの2byteデータがほとんどである。
詳細はhttp://www.boehmel.de/lanc.htmにあるが、その中の抜粋を以下に示す。
1byte目(Master→Slave)

Binary codeBinary code(HEX)Description
0001 100018Normal command to VTR or Camera
0010 100028Special command to Camera
0011 100038Special command to VTR

1byte目が18(HEX)の場合のSub-Command (2byte目)

command (hex)action
0program 1
2program 2
4program 3
6program 4
8program 5
0Aprogram 6
0Cprogram 7
0Eprogram 8
10program 9
12program 0 (10: SL-HF950 MKII)
14program 11 (SL-HF950 MKII)
16enter, program 12 (SL-HF950 MKII)
18program 13
1Aprogram 14
1Cprogram 15
1Eprogram 16
20program +
22program –
24
26
28x2
2Apower (or viewfinder) off
2Bphoto write
2Ceject
2Emain/sub
30stop
32pause
33start/stop
34play
35tele (only CCD-V90)
36rew
37wide (only CCD-V90)
38fwd
39photo capture
3Arec
3Crec-pause (some devices)
3E
40still
42
44x1/10
46x1/5 (sometimes: vis. scan)
48
4Ax14
4Cx9
4Etracking auto/manual
50search –
52search +
54TV/VTR
56
58
5AVTR
5Bdate search / photo search / photo scan
5C
5Epower off
60rev frame
62fwd frame
64
65edit-search –
66x1
67edit-search +
68
69rec-review (not i.e. TR-2200)
6A
6Csleep
6Etracking normal
70
72
74rew+play
76
78AUX
7Aslow +
7Cslow –
7E
80
82display mode
84menu up
86menu down
88tracking/fine +
8Atracking/fine –
8Ccounter reset
8Ezero mem
90index mark
92index erase
94shuttle edit +
96shuttle edit –
98data code or goto
99data code or recording parameters
9Amenu
9C
9Einput select
A0
A2execute
A4quick timer
A6index
A8
AA
ACindex search +
AEindex search –
B0tape speed
B2goto zero / tape return (not DV)
B4counter display, data screen
B6open/close (SL-HF950), replay (FauHaEss)
B8timer display
BA
BC
BDdate display off
BE
BFdate display on
C0timer set
C2menu right, next
C4menu left
C6timer clear
C8timer check
CAtimer record
CC
CE
D0audio dub
D2
D4edit assemble
D6edit mark
D8synchro edit
DA
DCdigital off (VCR), print (DV)
DEspeed +
E0speed –
E2stop motion
E4
E6
E8channel scan / flash motion
EA
ECvoice boost
EE
F0
F2
F4
F6
F8digital scan
FAhigh-speed-rew
FCstill/shuttle (EV-S880)
FE

1byte目が18(HEX)の場合のSub-Command (2byte目)

command (hex)action
0variable speed zoom Tele: slowest speed
2variable speed zoom Tele: faster than 00
4variable speed zoom Tele: faster than 02
6variable speed zoom Tele: faster than 04
8variable speed zoom Tele: faster than 06
0Avariable speed zoom Tele: faster than 08
0Cvariable speed zoom Tele: faster than 0A
0Evariable speed zoom Tele: fastest speed
10variable speed zoom Wide: slowest speed
12variable speed zoom Wide: faster than 10
14variable speed zoom Wide: faster than 12
16variable speed zoom Wide: faster than 14
18variable speed zoom Wide: faster than 16
1Avariable speed zoom Wide: faster than 18
1Cvariable speed zoom Wide: faster than 1A
1Evariable speed zoom Wide: fastest speed
25Fader
27rec start (DV)
29rec stop (DV)
30variable speed zoom Tele (avoiding digital zoom, some cameras): slowest speed
32variable speed zoom Tele (avoiding digital zoom, some cameras): faster than 30
34variable speed zoom Tele (avoiding digital zoom, some cameras): faster than 32
35Zoom Tele slow (working all cameras since approx. 1996)
36variable speed zoom Tele (avoiding digital zoom, some cameras): faster than 34
37Zoom Wide slow (working all cameras since approx. 1996)
38variable speed zoom Tele (avoiding digital zoom, some cameras): faster than 36
39Zoom Tele fast (working all cameras since approx. 1996)
3Avariable speed zoom Tele (avoiding digital zoom, some cameras): faster than 38
3BZoom Wide fast (working all cameras since approx. 1996)
3Cvariable speed zoom Tele (avoiding digital zoom, some cameras): faster than 3A
3Evariable speed zoom Tele (avoiding digital zoom, some cameras): fastest speed
41Auto-Focus on/off (not if there is a real switch at the camera)
45Focus manual far
47Focus manual near
49White balance toggle (not if white balance is selected via menu)
4BBacklight (not DV)
51Backlight (DV)
53Exposure
61Shutter
77White balance reset (not if white balance is selected via menu)
85Memory impose (models of the early 90’s)
87Color / Mode (models of the early 90’s)
89Superimpose (models of the early 90’s)

3.        LANCデバイスを外部から制御する

LANCデバイスを外部から制御する方法を検討してみる。まず、最終的な目的はPH-9でVX2000に対してLANCを用いてカメラズームと録音Start/Stop制御できるようにする。そのために今回小型、低消費電力を兼ねてRenesasのマイコンR8C(コアはM16C)を用いて制御することにする。

3.1.       マイコンとの結線

マイコンとの基本結線を図 3‑1に示す。LANCは1wireの双方向通信である。基本的にはオープンコレクタ(オープンドレイン)で結線をおこなう。フレームタイミングをとるために、RXはマイコンRXD0およびの割り込みに入れる。

図 3‑1:LANCとマイコンとの結線

4.        マイコンS/W(LANC処理部)の説明

4.1.       マイコンと物理IFでの問題

当初、ビットレートが9600bps相当ということもあり、R8CのUARTペリフェラルを使用しようと考えていた。(その前提の結線をおこなっていた)ところが、LANCプロトコルはSlaveの出すフレームタイミングに同期してMasterからのコマンドを出す必要があり、今回の場合、VX2000がSlaveでマイコン側がMasterという関係になる。あとで説明はするが、フレーム同期をとったあと、R8CのUARTペリフェラルを使用してコマンドを送出しようとすると、マイコン内部の送信バッファがあり、どうしても1bit程度の処理遅延が生じてしまう。また、UARTのCOMSレベルでのデータの論理がLANCと逆であり、そのためスタートビットが逆になってしまう。これはデータを反転することによりごまかすことができたとしても、タイミングズレはどうしようもなかった。
それで、マイコン側の「非同期シリアルモード」を「同期シリアルモード」にする方法も試してみた(同期クロックは使用しない)。これであれば1bitのスタートビットが無くなった分の遅延は取り戻せた。ただ、ここでも問題があり、「同期シリアルモード」を使用するとIOポートの状態が最後のビットのデータで固定されるらしく、オープンコレクタで双方向データ通信をおこなっているので、トランジスタを”ON”状態しっぱなしなることもあり、これではSlaveからのデータを受けることができなくなる。(タイミングがわからなくなる)
従って「非同期シリアルモード」あるいは「同期シリアルモード」ペリフェラルを使用することができない。またR8CにはSSUというチップセレクト付きの1byte同期シリアル転送機能もあるが、これもタイミング遅延のため使用できなかった。
ということで、最後の手段としてIOポートを手動で叩く方法をとった。(最後はこれしかないと思ったけど・・・) 1bit間隔時間はタイマーXをインターバルモードで使用することにした。

4.2.       LANCコマンド送出の全体の関係

今回制御コマンドとして1Octet目のSpecialコマンドとそれに付随する2Octet目のSub-Commandの2byteのデータを使用する。
図 41にLANCコマンド送出の動作を示す。MasterからSlaveに対する制御コマンドはフレーム周期に同期させて常に2byteのコマンドを送ることにする。なぜ常にデータを送るかというのには理由があり、はじめ、単純にイベントによる単一のコマンドのみを送っていたが、それではSlaveの機器が反応しなかった。どうも複数回送る必要があるようで、同じコマンドを送ったとしても、次に異なるコマンドを受け取るまで、それは1つのコマンドとして解釈するようだ。REC制御の場合はStart/Stopともに18(h),31(h)であるが、このコマンドの間にダミーでもいいから別のコマンドを挟むことにより、カメラのStart/Stopのトグル動作となるようだ。

図 4‑1:LANCコマンド送出の全体の構成

4.3.       動作クロックと消費電流

R8Cの動作クロックは松下モードでは内蔵リングオシレータの低速クロック125kHzだったがLANC制御はフレーム同期処理をおこなう必要があるため、高速御チップオシレータを8MHz動作させることにする。また、ボルテージコンバータの部品(NJU7660)を追加しているため、当初、想定していた電流値より多くなっている。

動作モード消費電流(mA)760mAhでの連続動作時間
松下制御モード1.4542時間(約22日)
LANC(SONY)モード4.0190時間(約8日)

4.4. RECボタンと状態遷移

先ほどにも説明したように、常にMaster側(この例ではマイコン)のLANC送信バッファ(2byte)をフレーム周期で送信する。
このバッファに対し、各方面でのイベントにより書き換えることにより、目的の動作になるようにしている。
PH-9でのRECボタンに動作に対しては図 4 2のようにINT0割り込みでREC STAER/STOPコマンドを送っており、1回押下したときに、1つのコマンドとして認識するように、ボタンを放したときにダミーを送信するようにしている。

図 4‑2:RECボタンが押された時の動作

4.5. 状態更新タイミン(ZOOM操作)

PH-9のZOOMボリュームの状態はタイマーCの擬インターバル動作で60msec周期にポーリングをおこない、A/D値で値を読み込む。
この周期時間は1packetのデータ周期よりも長く設定をおこない、REC STAER/STOP制御のINT0割り込みイベントでも確実にRECコマンドを送出するようにした。
従って、ZOOM操作については必要なイベントに限定し、A/Dの値が前回測定した値より±2digit以上変化がないとLANCコマンドを送出しないようにした。

4.6. フレーム同期処理ブロック

LANC IFを使用してMASTER→SLAVEへコマンドを送る場合、Slave機器で生成されるタイミングに同期してMasterからのデータを送出しなければならない。
で、どうするか?
「図 2 1:LANCのフレーム構成」をよく見ると、Idle Time部分があり、この部分はデータの変化は起こらない。約7msec程度ある。
そこで、マイコンのタイマーを使用して、例えば5msec以上、Slaveから信号が来ない場合はIdle区間と判断し、そのあとのデータの変化をとらえ、Packetデータのはじめのスタートビットと判断すればいいのである。これはマイコンの世界でおこなうと、常にダウンカウントするタイマーを用意し、外部からの割り込み(ここではint3)が入れば、カウンターを5msecカウント値にリロードする。このカウンタタイマー設定で5msec以上カウントすると、タイマーのオーバーフロー割り込みを発生するようにし、ダウンカウンターがオーバーフローしたあとのint3割り込みをフレームのPacketフレームの先頭と判断するのである。いわゆる「ウォッチドックタイマ」方式に似ている。今回、そのタイマーとして“タイマーZ”を使用する。
タイマーの状態とMasterがデータ送信する状態遷移を図 4 3に示す。

図 4‑3:タイマー状態とデータ送信の状態遷移

「図 4 4:IO制御の遅延時間」はLANC信号のフレーム先頭を検出して、int3割り込み後、外部へIOの変化としてタイミング信号を取り出した場合、
約9.22usecの処理遅延が生じることを示す図である。
この遅延時間が104usec以内なので、ここでbit転送タイマーをうまくやればIO制御でのシリアル転送が可能となる。

IO制御の遅延時間

「図 4 5:マイコンでのLANCコマンド送信時の様子」はR8CでSlaveからのPacketフレームに同期してMaster側から”STOP”コマンド”18(h)” “30(h)”を送信した様子である。Slave機器は無事にコマンド解釈をおこない、正しい動作したことを確認した。

回路図

6. 思った通りのH/Wトラブル?

6.1. アナログSW、4066の周辺回路

今回のアダプタは松下の制御方式(アナログ)とSONYのLANC方式(コマンド)両方に対応できるように、制御結線をアナログSW、4066を用いて切り替えられるようにした。
ここで注意しなければならないのは4066のアナログ入力レンジはGND~Vccの範囲となる。また、Vccの電圧が低いとON抵抗が高くなる特性を持っている。
当初、マイコンを2.8V動作させるため、制御信号の電圧のこともあり、4066の電源を2.8Vにしていた。2.8Vというのは4066の動作保証範囲以外であったが、MOSプロセスなので動作すると思っていた。確かに動作はしたものの、ON抵抗が400Ωと高かった。
Vcc=5Vで使用すると120Ω前後となる。
最初、松下モードから製作し始めた。松下制御の場合は機器から電圧が加わることも無かったため、ON抵抗が高いことを除き、動作してしまえば、特に支障になることでは無かったし、実際に松下モードでは問題無かった。
ところが、SONYの場合、制御信号のHIGHレベルが約5Vであり、4066のアナログレンジを超えてしまった。
でも、動くだろうと過信していたら、アナログSWをOFFにしているつもりが、電圧が出てくる(切れない)現象となり、電圧が思わぬところにかかるやらで動作が不安定になってしまった。(やっぱり・・・)ということで、急遽JRCのNJU7660というボルテージコンバータを使用して2.8V→5.6Vの電圧を生成し、これを4066のVccとした。
そうなると、マイコンからの制御電圧が今度は足りなくなるのでオープンコレクタ(オープンドレイン)ロジックデバイスを追加して電圧も合わせるのだが、実際にはマイコンからの2.8Vの制御で4066のON/OFF動作していたので、制御電圧のコンバートは今回見送ることにした。(本当はダメだけど、手抜き(^^ゞ)
そのおかげで、ON抵抗が低くなり、確実な動作をするようになった。
また、ボルテージコンバータの部品追加をしたことにより740uA程度、電流が増加した。NJU7660を追加する前、松下モードでは660uAだったので、全体の消費電流が1.4mAになってしまい少し残念。

教訓:
面倒くさいと思って手を抜くと、やはり思ったようなトラブルに巻き込まれる。 \(__ ) ハンセィ

6.2. ダイオード(D2)の必要性

これは原因がよくわからないのだが、LANCモードで使用していたとき、4066のセレクタはSONY側(IC4B.IC4CがON)になっているにもかかわらず、GNDはしっかりととれないという現象があった。どうも中途半端に電位が浮いているように見え、一度GNDにショートさせると、そのあとはうまく動作するのである。根本な原因はわからなかったが、ダイオードD2を入れることにより安定した動作になった。(コンデンサではダメだった)

7. 今後の展開

松下のビデオZOOM、REC制御については内容的に見ても単純であり、松下系の他のビデオカメラでも使用できるものと思われる。
たとえ、制御抵抗値が変わってもアダプタ内部のS/Wを変更することにより柔軟に対応できる。
またSONY系のLANC制御においても基本的なプロトコルを理解したので、ビデオカメラのZOOM、REC制御以外の幅広い制御の応用が考えられる。
ちなみにHi8のビデオカメラTRV-95でも正常な制御動作することを確認した。特にこれ以上必要な制御は思いつかないが、使用するアプリケーションによってはこれをベースにしてコマンド追加をすれば容易に拡張できる。
Slaveからの受信はまだおこなっていないが、これはUARTペリフェラルを使用したほうがS/W実装が楽かもしれない。
いずれのやり方にしても特に大きな問題はないであろう。
例えば315MHz帯を使用して簡易無線通信で制御することも可能となる。
それよりも、これらの制御をなにに使用するかという企画的アイデアの方が大事だ。
今後は必要に応じて製作していくので、何かおもしろいアイデアがあれば提言していただきたい。

コメントを残す

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