Canon EF レンズをArduino UNOで動かす

あちこちの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

 

上記の資料を参照して、レンズから信号線を引き出す。マウントの信号配置は画像の通りとなっている。

f:id:PanariLab:20210123101954j:plain

 

そのままレンズに線を直付けするのもなんなので、延長アダプタを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 の配線を別々にした。コマンドを与えるのみでレンズ側からの信号は接続していない。

f:id:PanariLab:20210123110656j:plain

配線したアダプタにレンズを取り付けて Arduino UNOと接続。

f:id:PanariLab:20210123110749j:plain

レンズを動作させる主要なコマンドは以下のようになっている。

f:id:PanariLab:20210123123429j:plain

スケッチはこんなふうで、およそ 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 の規格内となっている。