あちこちのWEBで取り上げられているが、Canon EFレンズをArduinoでコントロールする実験をしてみた。
いつものとおり先人の結果を見る。
などのページが参考にした。
CanonからEFレンズのプロトコルが正式に公開されているわけでないが詳細に解説した資料がある。
http://jp79dsfr.free.fr/_Docs%20et%20infos/Photo%20Tech%20_%20Canon%20EOS-EF%20Protocol.pdf
なんと100ページもあり、フランス語なので読むのはちょっと大変だが。
こちらは、同じ著者による Arduino を使っていろいろとテストしたもの。
http://jp79dsfr.free.fr/_Docs%20et%20infos/Elec%20_%20Arduino%20-%20Testeur%20Canon%20EOS.pdf
上記の資料を参照して、レンズから信号線を引き出す。マウントの信号配置は画像の通りとなっている。
そのままレンズに線を直付けするのもなんなので、延長アダプタをAliexpressから購入して使用することに。
これを使って以下のように配線
EFレンズ Arduino
VBAT --> +5V
P-GND --> GND
VDD --> +5V
DCL --> PIN11(MOSI)
DLC
LCLK --> PIN13(SCK)
D_GND --> GND
本来、モーター用の電源 VBAT は 6V となっており、WEB の作例も別電源としているのが多いが負荷が小さいので USB のバスパワー 5V を使用する。Logic の信号に影響を与えないように GND、VDD の配線を別々にした。コマンドを与えるのみでレンズ側からの信号は接続していない。
配線したアダプタにレンズを取り付けて Arduino UNOと接続。
レンズを動作させる主要なコマンドは以下のようになっている。
スケッチはこんなふうで、およそ 3秒ごとに絞りを開け閉めして Foucus を Mini/Max に移動させる簡単なもの。
#include "SPI.h"
void SPIWrite(byte cmd){
SPI.transfer(cmd);
delayMicroseconds(250);
}
void setup(){
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE3);
SPI.setClockDivider(SPI_CLOCK_DIV128);
delay(500);
}
void loop(){
SPIWrite(0x07); // Diaphragm Open
SPIWrite(0x13); // Full Open
SPIWrite(0x80);
delay(3000);
SPIWrite(0x05); //Turn focus ring to AF min
delay(3000);
SPIWrite(0x07); // Diaphragm Open
SPIWrite(0x13); // Mid Open
SPIWrite(0x10);
delay(3000);
SPIWrite(0x06); //Turn focus ring to AF max
delay(3000);
}
これを書き込んで動作させると、うまく動作する。気になる動作電流はレンズによって違うがモーター起動時に最大で 400mA 程度流れるがなんとか USB の規格内となっている。