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

2.4. LANCコマンド集
1Octet〜4OctetまではMaster→Slave方向のコマンドであり、その主な内容を以下に示す。
ただ、実質制御として使用するのは1Octet、2Octetの2byteデータがほとんどである。
詳細はここにあるが、その中の抜粋を以下に示す。

1byte目(Master→Slave)

Binary code code(HEX) Description
0001 1000 18 Normal command to VTR or Camera
0010 1000 28 Special command to Camera
0011 1000 38 Special command to VTR


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

command (hex) action
0 program 1
2 program 2
4 program 3
6 program 4
8 program 5
0A program 6
0C program 7
0E program 8
10 program 9
12 program 0 (10: SL-HF950 MKII)
14 program 11 (SL-HF950 MKII)
16 enter, program 12 (SL-HF950 MKII)
18 program 13
1A program 14
1C program 15
1E program 16
20 program +
22 program -
24
26
28 x2
2A power (or viewfinder) off
2B photo write
2C eject
2E main/sub
30 stop
32 pause
33 start/stop
34 play
35 tele (only CCD-V90)
36 rew
37 wide (only CCD-V90)
38 fwd
39 photo capture
3A rec
3C rec-pause (some devices)
3E
40 still
42
44 x1/10
46 x1/5 (sometimes: vis. scan)
48
4A x14
4C x9
4E tracking auto/manual
50 search -
52 search +
54 TV/VTR
56
58
5A VTR
5B date search / photo search / photo scan
5C
5E power off
60 rev frame
62 fwd frame
64
65 edit-search -
66 x1
67 edit-search +
68
69 rec-review (not i.e. TR-2200)
6A
6C sleep
6E tracking normal
70
72
74 rew+play
76
78 AUX
7A slow +
7C slow -
7E
80
82 display mode
84 menu up
86 menu down
88 tracking/fine +
8A tracking/fine -
8C counter reset
8E zero mem
90 index mark
92 index erase
94 shuttle edit +
96 shuttle edit -
98 data code or goto
99 data code or recording parameters
9A menu
9C
9E input select
A0
A2 execute
A4 quick timer
A6 index
A8
AA
AC index search +
AE index search -
B0 tape speed
B2 goto zero / tape return (not DV)
B4 counter display, data screen
B6 open/close (SL-HF950), replay (FauHaEss)
B8 timer display
BA
BC
BD date display off
BE
BF date display on
C0 timer set
C2 menu right, next
C4 menu left
C6 timer clear
C8 timer check
CA timer record
CC
CE
D0 audio dub
D2
D4 edit assemble
D6 edit mark
D8 synchro edit
DA
DC digital off (VCR), print (DV)
DE speed +
E0 speed -
E2 stop motion
E4
E6
E8 channel scan / flash motion
EA
EC voice boost
EE
F0
F2
F4
F6
F8 digital scan
FA high-speed-rew
FC still/shuttle (EV-S880)
FE

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

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

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

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

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のデータを使用する。
図 4 1に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)を追加しているため、当初、想定していた電流値より多くなっている。
Libecから出ているZC-3DVなんかは電源不要だが、松下の時は単純なうボリュームとスイッチであり、
LANCの時はSlaveから供給される電源をもとに動作しているものと思われる。

動作モード 消費電流(mA) 760mAhでの連続動作時間
松下制御モード 1.4 542時間(約22日)
LANC(SONY)モード 4.0 190時間(約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制御でのシリアル転送が可能となる。

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

松下とLANC制御に対応したR8C/1Bのソースとオブジェクトはこちら
(このS/Wの開発にはRenesasのHEW+E8を使用した。)
今回の内容であればR8Cは1BでなくてもR5F21142のクラス(ROM8Kbyte,RAM512byte)でも動作するだろう。(試していないけど)

5. 接続図


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帯を使用して簡易無線通信で制御することも可能となる。
それよりも、これらの制御をなにに使用するかという企画的アイデアの方が大事だ。
今後は必要に応じて製作していくので、何かおもしろいアイデアがあれば提言していただきたい。

PH-9でLANC対応のビデオカメラを制御しているところ。