2013年12月6日 星期五

用 AVR 控制 Canon E-TTL 閃光燈

閃光燈屬高電壓設備, 燈管高壓達到 250 伏特以上
拆卸閃光燈是有極高的風險, 高壓電會對人體構成嚴重傷害
若無相關技術背景請勿嘗試, 玩死不賠!

這是一個持續約三個月的計畫, 一開始只是想改變閃燈強度
結果改這不行, 改那也不行, 試來試去, 最後就做出這了

這是我常用的閃燈, 對岸製的 CY-20 拆開的樣子

上網找一下閃燈相關線路圖就發現這是經典設計, 也就是傳統工法

這裡有一個範例

取自 http://www.next.gr/video/index8.html

基本原理是兩組線圈, T1 和 T2
T1 用來升高電壓並儲存起來供閃光燈發光用
電壓會升到 250V 以上, 儲存在電容 C2
要用線圈感應升壓會需要交流電, 所以 T1 左側是震盪器
我記得以前學過最簡單的震盪器就是一顆電容加上一顆電阻
這裡應是 R1 和 C1, 不過細節已經忘光了XD 所以差不多就好(?)
IL1 這個元件則會影響前端震盪器, 我有找過這元件但很快就忘記它的原理
看不太懂的東西很快就忘了XD 精神就是當電壓升足夠時讓震盪器停止工作
然後它會發光, 也就是閃燈上 OK 的燈號

接著就可以發閃光, 按下 S2 就擊發
S2 上方有個線圈 T2, 當 S2 接地, C3 那裡存的 250V 高壓會被引過來
C3 的電來自 C2, 被 R2 那顆 1M 電阻限制, 以小電流進行充電
當 S2 接地時這小電流的高壓電通過 T2 線圈初級往低電位處移動
在這顆 T2 的另一側線圈會產生感應電流
變成 2000-20000V 的超高壓小電流引入閃燈燈管側邊
這會吸引 C2 儲存的高壓電, 引導它們穿越燈管到另一端, 穿越時釋放能量變成強光
我記得有翻到文獻提到這是有極性的, 上圖燈管中有方形頭的應該要在負極
接地端頭較大, 較接近觸發線, 這樣才會有引導的效果,我記得是這樣
以上是翻一堆文件零散拼湊成的知識, 可能存在錯誤, 僅供參考
若有專家路過歡迎踢館XD

觸發 S2 那裡雖然畫成開關, 但現在數位系統是不會用機械開關的
那個開關現在是做成測試紐, 若用數位系統驅動則要用一個光觸發開關
即前篇 SONY NEX-5N 外接閃光燈 用的 MOC3020, 耐壓 400V 的光觸發開關
這種可雙向的光觸發開關內部通道是矽控整流器, 可參考 wiki
看了才知道它只可開, 沒法關, 要等電流縮小到一定程度才自動斷開
一開始還在想可不可以透過控制光觸發時間長度來限制閃燈亮度
看來是不行, 另外, 這 S2 的原理是觸發, 一觸發了就沒它的事了
剩下發光就是大電流通過燈管
這樣想想就覺得它不可能有辦法控光, 於是就要從 "發光" 的地方下手
這裡有份文件描述各種閃燈控光的方法

High Performance Flash ! by Excelitas

(可以注意到這文件中燈管的大頭端都畫在負極)
它概略的描述了接線方法,以及閃燈能量的特性
控光的原理很簡單, 就是斷開燈管中大電流的通道
夾一顆 IGBT 晶體在燈管另一端, 斷開它電流就跳不過去, 就沒辦法釋放能量變成光
原理很簡單, 材料找不到XD
這是相當強的能量, 瞬間電流 150A, 電壓 250V
我靠, 高壓馬達的功率都沒這麼高
我買了幾顆高壓馬達用的 IGBT, 沒多久就都被打爛了



上圖閃燈微亮, 那不是室內反光, 是閃燈以極低的電流觸發
圖左是 MOC3020, 觸發開關, 圖上側紅色是升壓變壓器, 它的上方有顆電晶體, 就是由它限制電流
小電流還行, 隨著加強基極電壓和延長電流通過時間, 電流量越來越大
到一定程度時它就被打爛了, 呈現短路狀態, 基極控制失效
這時閃光燈會突然放出強光, 然後打爆晶體的電流會串到上圖下方 AVR, 我的 AVR 就升天了XD
所以之後就知道地線和閃燈對接時要串電感防爆XD

之後又試了幾種晶體, 沒有一種可以撐住
後來找到三菱 (現在改由瑞薩生產) 有做一顆閃燈專用晶體:CT40KM-8H
不過這類晶體很難買, 後來在掏寶看到, 很便宜, 買回來發現是假貨
對岸最常做這種生意了XD 什麼散新貨, remark, 型號重疊...等鬼事對岸最多了
雖然知道但因為想解決問題所以還是試了一下
最後沒招啦, 原理很簡單, 但沒有料也沒輒啊
後來就想說要不要乾脆找二手閃燈來拆, 可是想想拆了又不一定是符合規格的
而且如果又打爆了我還要找替代品更麻煩, 於是就換方向 : 那不如我對閃燈下命令吧
讓它幫我設定亮度, 透過閃燈廠商專業妥善驗證過的線路自動完成
所以就變成現在這計畫, 控制 E-TTL

E-TTL 的資料其實蠻多的, 但是來源都失效了
許多討論是在 2008-2010 年的, 但是連到的網址都已經關閉
後來在大陸網站找到一篇有人把整篇原文貼到自己 blog 的文章
這種無斷轉貼是很不好的習慣, 不過此時卻派上用場, 所以我想也沒什麼好念的了XD

Canon E-TTL Protocol

這裡有位大哥做了些實驗去探相機和閃燈的通訊
eTTL interface
我的新的光圈值對應表就是抄他的數據XD
源碼附在文末

這裡簡單的描述一下其通訊方式
首先是接腳定義

DFC : Data from Flash to Camera
CLK : Clock
X (Trigger) : Flash Trigger
DCF : Data from Camera to Flash
ID : Enabling the pilot lamp in the flash

上圖是相機端的接點, 從外型應該不難看出
把 X 和上圖最右邊灰色的接地短路即構成觸發
數位的作法就是接上 MOC3020 的矽控整流器那兩隻腳



接著是時序:

這張圖修改自前篇 用 AVR 控制 Canon EF 鏡頭 裡的時序圖
它的傳輸方式幾乎和 EF 鏡頭一樣, 高位元先傳, 上緣觸發的序列傳輸
但是電壓不同, 還有多了 Busy 狀態表示
當 Flash 把 DFC 拉低時表示它在忙碌, 此時相機不應對 Flash 進行操作
通信時高電位 3-5V 都可, 以我的閃燈來說是 5V
可是低電位卻不是 0V, 而是卡在中間的 2.1V, 上圖以藍色線表示
如果 CLK 和 DCF 拉低到 0V 則識別為休眠, 經過一段時間後我的閃燈會關機
但只要再次偵測到 2.1V 電壓的信號就會自動開機進入工作狀態
為了讓電壓停在 2.1-5V 真是讓我傷透腦筋
雖然解決方法不困難, 但是由於設備欠缺加上原先 WT-09 有沒被發現的缺陷
導致不斷的嘗試失敗, 真是抓狂
果然還是要有數位示波器啊, 就在此時我那台用五年的二手類比示波器出狀況了
它大概知道我若繼續用它會沒法找到問題所以自爆了(誤XD)
後來又買一台便宜貨

又是對岸做的, 自討苦吃專用XD
它很便宜, 硬體組裝品質很好, 但軟體很爛XD
這裡有作同業的老外在罵它XD Hantek 6022BE 20MHz USB DSO ←注意 Reply #12
老外認同這售價, 它有符合其內容, 只要 70 美金
但是如果真的是要使用, 老外建議最好遠離它XD
這貨雖然爛, 但是對於傳輸速度只有 100KHz 的 E-TTL 和 EF 鏡頭來說, 這還行
而且可以螢幕截圖, 也因為它我才發現一些我板子上設計的問題, 像這樣

一開始我只看到 CH2 (綠線) 那裡有奇怪的波形, 接著把 CH1 (黃線) 接上板子 VCC
發現開關電源時異常, 導致我不管送啥閃燈都不理我, 這種彎彎曲曲的波形它看得懂才怪

最後找到問題以後, 修改電路, 用簡單的電阻分壓就可以送出信號
但因為是電阻分壓所以會有一些阻抗匹配上的問題
像這樣, 下圖是原廠 Canon 單眼和閃燈通信的波形

CH1 是 CLK, CH2 是資料, 從 0 先升 2.1V, 注意最左側升起段, 方方正正, 非常漂亮
傳輸時的 2.1 - 5V 也是, 方方正正
要聽這資料需要修改 E-TTL 閃燈延長線, 從中攔截

這是最近很流行的 "監聽風雲" (?)XD

接著看看我的搞笑電阻分壓後長怎樣XD

彎彎曲曲, 還刺刺的XD
這是電壓升起段, 因為用邏輯 IC 緩衝
不知道為什麼就算把 IC 的 VCC 切掉, 它還是可以從 IO 引電
所以電壓沒法降到 0, 只能從約 1.2V 開始升, 然後緩緩的, 圓弧帶刺的升到 2.1V ...XD
接著開始傳輸資料

CH1 是 CLK, CH2 是資料, 都是圓圓的, 不過沒關係, 反正我的閃燈看得懂, 不管 ! XD
這是閃燈回我的

雖然我送的 CLK (CH1) 圓圓的, 但閃燈回我的資料 (CH2) 還是有對上 CLK, 行的 ! XD

這顆閃燈如果沒有開啟 E-TTL 模式, 它會像這樣

畫面乾乾淨淨, 一動也不動, 像北七一樣(?)XD
就算接上線觸發它, 一樣不閃, 一定要像這樣

先進入 ETTL 模式, 對它進行設定, 這時再去觸發它才會閃
它如果接上 Canon 的相機就能用, 但我的 Canon 收起來很久了, 暫時也不打算拿來用
這也是為什麼我會絞盡腦汁要讓它能動, 燈都買了卻點不起來會很噢的
想盡辦法也要讓 Nex 能用它

全部的樣子

同時加上之前控制 EF 鏡頭的技術
除非接上 Canon 的單眼, 不然通常你很難看到 EF 鏡頭光圈半開, 然後閃燈進 E-TTL 模式XD


中文字幕, 本地支援 !
閃燈強度 0-16 段, 可調光圈, 並偵測當前鏡組焦距

WT-09 下方子板的樣子

主要元件是兩顆邏輯 IC 和 MOC3020

各接頭功能


這裡放出線路圖和部份程式供參考

ettl-avr.zip

程式就不整包放了, 因為通訊方式和 EF 鏡頭一模一樣
不同之處主要都在外面的電阻分壓
還有指令格式不同, 但和鏡頭一樣都是類似 SPI 傳輸

說明一下電路圖
這電路主要是接在 WT-09 上面, 所以需參考前篇 自製 MP3 播放機
可以想像 WT-09 Input 那裡就是 AVR 的接腳
Nex-5N In 那裡使用了億光 (2393) 的光耦合開關, 不同於 MOC3020, 這是電晶體
因此是可以斷開電流的, 所以只要串顆電阻就可以當 I/O 放大
Nex-5N 輸出的閃燈信號是一個約 1.5V 高, 約 100ms 的方波
那不足以當 3.3V 或是 5V 的輸入, 太少了, 無法被識別為高電位
所以加個光耦合開關, 如果要應用到別種相機需視其閃燈接口特性而定
電路圖中 U4 是德州儀器的整流 IC, 帶有 Enable 可以開關電源, 原先以為斷開就會變成 0 輸出
結果如前面描述, 似乎是邏輯 IC 的特性, 會留下小電壓
如果不需要讓閃燈休眠可以整個 U4 附近的料都砍掉, 直接 5V 進邏輯 IC 保持永遠開啟
板上兩顆邏輯 IC 當緩衝以及準位轉換使用, 我的 WT-09 上的 Atmega32 和 OLED 都是 3.3V
而 Canon 的 EF / ETTL 都是 5V, 因此要轉換
ETTL 輸出可以考慮加上 OP 放大器輸出, 那顆放大器要有在 5V 下運行 100KHz 以上的能耐才行
我手邊便宜的 OP 像是 LM324 雖然可以到 1MHz
但是那是低電壓, 5V 時沒法跑那麼快, 這類 OP 就不能用
若有需要可以試試音響用的 NE5534, 那應該可以
最後, ETTL 輸出那裡, 閃燈地線進來要串電感才下地以防爆, 大概就這樣

軟體方面只要呼叫上面源碼裡的幾個函數就能初始化
關鍵就這幾行:

// check if E-TTL flash exist
ettl_start();
if(ettl_cmd_start() == 0x86){  //閃燈有回應, 表示接口上有安裝閃燈, 若沒有則不操作
  ettl_set_camera_mode(0x80);  // maunal mode
  ettl_set_zoom(0x32);   // 50mm
  ettl_get_flash_status();
  ettl_set_flash(0x12, 0x06);
  ettl_set_iso(0x58);   // ISO400
  ettl_set_aperture(0x30);   // F5.6
  ettl_set_shutter_time(0x40);
  // 執行下面這幾行之後閃燈才可以被觸發
  ettl_set_trigger_mode(0x1D);
  ettl_set_flash(0x00, 0x00);
  ettl_set_flash_intensity(0x80+level*4); // 亮度控制
  ettl_set_trigger_mode(0x25);
}
ettl_end();

各函數實作部份請參考上面附的原始碼
裡面的固定數字像是傳回值 0x86 等來源是根據文章前面老外寫的 Canon E-TTL Protocol
為什麼會是這些數字我不知道, 老外也是用監聽的
若非知道不可, 可以打電話去 Canon 總公司問問, 希望不會被罵XD
對我來說只要控光的功能有了, 剩下的細節像是參數資訊就不重要了

測試:
以下照片拍攝時光圈快門都是固定不變的
只有閃燈強度有變, 0-16 級照片太多, 而且也沒必要全貼
以下我只每四級貼一張, 反正知道強度會變就好XD
小模型直打會過亮, 所以這裡改用跳燈, 不過閃燈的位置也是固定不動的

無閃光↓


0 級↓


4 級↓

0 級和 4 級感覺起來沒有差, 不過這是除錯預留
這表示餵給 ettl_set_flash_intensity( 0x80 + level * 4 ); 這函數的參數中
0x80 - 0x90 的亮度是相同的, 但每個閃燈能力不同, 我想以後拿別的閃燈可能會有不同反應
所以才留了 0x80, 純粹只是想湊整數(?)XD

8 級↓


12 級↓


16 級↓


這線路圖改了五次, 製造了一堆垃圾, 加上前面串燒的料, 總算圓滿了





更新測試結果 :

CWT 35 Cosplay

RELEASE NOTE:
============================
使用機身: SONY NEX-5N
使用鏡頭: Canon EF-S 18-55mm 1:3.5-5.6 IS (傳說中的 Kit 鏡)
閃光燈: Metz 28AF-3C
延伸組件: EOS-NEX轉接環(改), 閃光燈濾色片, WT-09-Cam 整合控制器
對焦形式: 人體對焦 (峰值觀察)
曝光策略: 人體控制 (M模式)
轉載須知:
盡量避免直連圖以免被視為違規使用, 其餘無限制
可上傳至別的相簿, 亦不須註明出處

照片命名規則: 於檔名字尾加上英文字母, 含f者為有修圖
顏色全部有調整, 調整時依據人體感覺
調整方式為色彩平衡以及顏色重對應, 如不精確純屬正常現象
修圖以明顯雜點 / 開眼(?) / 貼除雜物為主, 無大幅度翻修


2016.2.24 更新

因應回應製作這測試版,板子為 WT-10

只上 E-TTL 以及觸發閃燈部份的零件, 多一顆 LED 顯示狀態, 一個按鈕觸發


把觸發的 MOC3020 換成光觸發晶體 EL-817

實驗結果:




2016.8.12 更新

NJL7502L 光感測器, 感測波長 560nm
某賣家 LED 有標波長就順便抄下來

紅外線(940~850nm) 紅(620nm) 橘(605nm) 黃(590nm)
黃綠(569nm) 綠(560nm) 藍綠(527nm) 藍(470nm)

NJL7502L 是可見光的光感測晶體, 主要接收顏色應為綠色
這不好買且單價高啊, 不常用要訂才有, 所以我拿紅外線的加減測
Wiki Xenon arc lamp 上有氙氣燈的光譜
紅外線佔的成份較少但還是有, 我用一樣的方法接, 測兩種:


此為 850nm 接收, 此波長的光多用於監視器補光
收到會像這樣:

距離一公尺多和貼近的結果相同

接著第二顆

此為 940nm 接收, 此波長的光多用於遙控器發射
近距離收到結果和 850nm 相同, 但是距離到一公尺多時會像這樣:

可能佔的成份少很快就衰減到感測器收不太到的程度
從實驗結果看來, 雖然目視看起來像連續光但實際上應該仍然是脈衝光

14 則留言:

  1. 結果我關心的點在那台很爛的示波器xd實際上有多爛w?爛到寧願撿學校換下來的二手crt類比示波器的程度嗎xdd?

    回覆刪除
    回覆
    1. 我兩台示波器都很爛, 不知你是指哪台?XD
      對岸製數位那台爛在軟體, 它的觸發是有缺陷的
      看起來不像觸發, 比較像是定時擷取一定量資料, 然後找看看有沒有超過我設的觸發點
      每次都要把畫面左右捲動很長才找得到我的觸發點
      軟體又沒法很方便的捲動, 要用滑鼠很有耐性的慢慢拉, 然後有時還找不到XD
      這軟體似乎是在 windows update 後的平台開發, 若是使用 "奇蹟版" 的 windows 沒更新, 這軟體就無法執行...
      這是我看到的, 而老外注意在它不能校正, 還有...只能量測 +/-5V, 1:10 探棒則是 +/-50V
      如果要量測的是音響系統等會有高電壓的應用就完全沒辦法了
      我的前一台就是類似學校汰換的類比示波器, 量數位信號常常就是瞪著螢幕多按幾次產生信號XD
      如果是做音響的話學校示波器可能還行, 因為我們可能會產生固定頻率的信號進去然後觀察其變形
      這種不需要擷取固定段的應用就可以用類比的, 由於可以量高壓它確實會比對岸這台好用, 這要看應用方向
      只能說兩台各有爛處, 不太好比較XD

      刪除
  2. 您好!
    我之前也作過用MCU控制E-TTL閃燈。
    早知道有這網頁,當時就不會走那麼多冤枉路了!

    現在在計畫一個類似的案子,不知道您對自作high speed sync的閃光燈有沒有興趣?

    回覆刪除
    回覆
    1. 高速閃燈以前查過資料, 那個要閃燈和相機同時也支援才行吧?
      要做的話是有興趣但沒有頭緒, 我沒有其他有用的資料可提供
      目前我這裡用 NEX-5N 搭配 YONGNUO YN500EX 走無線觸發
      前廉快門設定為開, 快門 1/4000 可以得到這結果:
      https://3.bp.blogspot.com/-KpM2Hz16zHU/Vsr_JSNjPaI/AAAAAAAAJwo/Hce8oy4B5AU/s1600/DSC03344.JPG
      閃燈功率必須全開, MOC3020 換成另一顆光觸發電晶體, 無 eTTL 模式
      我也試過把這閃燈裝到 Canon 500D 上, 發現高速閃燈模式好像只能全功率輸出
      YONGNUO 的 eTTL 和 Metz 的不太一樣, 觸發信號要完全拉到 GND 才行
      而且在 eTTL 模式可能連 CLK 也要拉到 GND, 這種電路目前我沒方案
      反正 YONGNUO 這顆有按鈕可以調功率, 我就懶得研究怎麼用 eTTL 驅動它了
      目前狀態大概就這樣

      刪除
    2. 作者已經移除這則留言。

      刪除
    3. 對於如何實現HSS閃燈有一些設計,想要驗證這猜測對不對.
      有在ptt.cc/bbs/Electronics提出,但是沒有得到比較具體的回應
      https://www.ptt.cc/bbs/Electronics/M.1454734865.A.7D1.html
      其實應該拆一台別人的來看看,不過怕自己功力太差...
      請接受來自skoo00的Hangout邀請

      刪除
    4. 高速頻閃喔...我記得 eTTL 是有這功能, 不過能不能持續到 80ms 就不知道了
      重新設計電路這種事我不會考慮, 如同文章最上面描述, 料件難尋
      日本人用馬達的那只是玩具, 轉幾下可能還行, 轉到高速三兩下就壞了
      繼電器也不用考慮, 接上和彈開的時間就超過 10ms 了, 而且高電壓這樣跳也容易壞
      拍牛奶滴圖有人這樣裝
      http://big5.3mt.com.cn/g2b.aspx/ido.3mt.com.cn/Article/200912/picview1784692c32p18.html
      應該是不需要客製化閃燈, 如果是為了錄影, 頻閃還是有可能會產生畫面問題
      沒法保證同步, 還不如拿打光用的攝影燈泡, 強調色溫 5500K 的那種
      Hangout 沒辦法, 沒有掛線的習慣, 已經沒法像學生時代掛著通訊軟體...

      刪除
    5. 直接連續觸發閃燈可以到約 0.3 秒, 詳細請見文章下方 2016.2.24 更新部份
      但是亮度不能全開, 由於我那隻 YN500EX 目前是設手動, 如果要實作
      只需要用一隻 GPIO 去拉光觸發晶體, 每 5mS 拉一次即可, 不用做 eTTL

      刪除
    6. 作者已經移除這則留言。

      刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. 非常感謝特地做實驗!可以用示波器和簡單的測光電路看一下發光的結果嗎?(可參考: http://yaplog.jp/kazuikazui/image/135/324)

    前一陣子我也做了類似的實驗,不過是用GPIO直接拉動閃光燈optical slave的受光部分。結果間隔5ms以下的情況會有沒閃的情況(出力已手動調為最低1/128),可能是電容電不夠或補電來不及。不過這台閃光燈明明有支援HSS,可以達到以50kHz連續頻閃6ms才對啊。所以HSS有可能是用不同的電路達成。
    您的實驗結果和我的目標的差異處是
    1. 總發光時間: 0.3秒 -> 0.04秒
    2. 發光間隔: 5ms -> 20us
    3. 發光次數: 100次 -> 2000次

    為了避免燈管爆掉,應該考慮調亮度為1/512, 1/1024或更低,可能需要藉由縮短觸發信號長度達成。
    如果您有興趣,請用這ID的gmail來信詳談。
    總之,謝謝了!!

    回覆刪除
    回覆
    1. ***因工作延後回覆請見諒***
      測試的部份我再找時間驗, 不過亮度再往下的部份短期沒辦法
      我這隻 YN500EX 閃燈似乎是 eTTL-II, 協議有改, 無法下命令
      它會有回應, 但是值和預期的不同, 目前無法控制, 只有 Metz 那隻可用
      而且觸發要完全拉到 0 才行, 如果是矽控整流器會留下一點點電
      雖然不多, 但是閃燈會卡死失去回應, 直到短路到 0 才會恢復
      目前改用光耦合晶體解決, 但是光耦合晶體電壓容許低, 無法相容舊閃燈
      十分頭痛, 由於切手動模式還是可以用光耦合晶體觸發, 我就沒有花時間研究了
      高速頻閃既然是 Canon 官方的功能, 應該是能做到, 只是可能不是直接觸發
      也有可能要 eTTL 觸發, 印象中看過文章說 eTTL 拉到 2.1V 和拉到 0 V
      這兩個有不同的功能, 而且都是和觸發有關, 我司下半年有頭痛的案子
      業餘排程也已滿, 短期內沒法繼續做這計畫, 只能提供我最後看到的現象供參考

      刪除
    2. 已用替代的紅外線接收測試, 請見文章 2016.8.12 更新

      刪除

注意:只有此網誌的成員可以留言。