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.3. 波形で見るLACN制御
以下はSONYのDSR-30(MASTER)とVX2000(SLAVE)とをLANC接続し、その間の通信をおこなっている実際の波形。(何も制御していない状態ではデバイスからステータスなどの情報が絶えず流れてきている)
2.4. LANCコマンド集
1Octet~4OctetまではMaster→Slave方向のコマンドであり、その主な内容を以下に示す。
ただ、実質制御として使用するのは1Octet、2Octetの2byteデータがほとんどである。
詳細はhttp://www.boehmel.de/lanc.htmにあるが、その中の抜粋を以下に示す。
1byte目(Master→Slave)
Binary code | Binary 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. マイコンとの結線
マイコンとの基本結線を図 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.3. 動作クロックと消費電流
R8Cの動作クロックは松下モードでは内蔵リングオシレータの低速クロック125kHzだったがLANC制御はフレーム同期処理をおこなう必要があるため、高速御チップオシレータを8MHz動作させることにする。また、ボルテージコンバータの部品(NJU7660)を追加しているため、当初、想定していた電流値より多くなっている。
動作モード | 消費電流(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.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 4:IO制御の遅延時間」はLANC信号のフレーム先頭を検出して、int3割り込み後、外部へIOの変化としてタイミング信号を取り出した場合、
約9.22usecの処理遅延が生じることを示す図である。
この遅延時間が104usec以内なので、ここでbit転送タイマーをうまくやれば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帯を使用して簡易無線通信で制御することも可能となる。
それよりも、これらの制御をなにに使用するかという企画的アイデアの方が大事だ。
今後は必要に応じて製作していくので、何かおもしろいアイデアがあれば提言していただきたい。