회원정보

레이어닫기

[EF-NX AF 어댑터 자작 프로젝트] 아두이노로 삼성 NX 바디 속이기 - 부팅 타이밍

록키산맥 | 04-05 13:35 | 조회수 : 3,610

이래저래 안팍으로 바쁘다 보니, 게시글을 제대로 올리지 못했네요.

오늘은 흔하디 흔한 아두이노로 NX 바디를 속이는 방법을 알려드리겠습니다.

EF-NX AF 어댑터를 제작하려면, 가장 까다로운 부분은 일단 NX 바디를 속여서, 마치 NX 렌즈가 달려있는 것으로 착각하도록 하는 것이겠습니다.

EF렌즈든, NX렌즈든 바디에서 질문하는 것에 답변하는 형태로 작동을 하기 때문에, 사실 속이기가 수월한 편인데,
NX 바디를 속이는 것은 또다른 차원의 과제입니다. 제대로 된 렌즈가 물려있고, 그 렌즈로 부터 정보를 수집하기 위한 일련의 작업들이 수행되기 때문인데, 일단 지난 번의 게시글을 통해 바디와 렌즈가 부팅하면서 오고가는 데이터에 대한 것을 알아 보았습니다만, 그것을 빼고라도, 몇가지 고려해야만 하는 것들이 있습니다.

첫번째는 아두이노와 NX 바디간에 SPI 통신 때 사용하는 로직 전압의 차이입니다. 그동안, 제가 잘못알고 있던 것이 제가 사용하는 Arduino Nano가 3.3V 로직 전압을 갖고 있는 것으로 알고 있었는데, 잘못알고 있었습니다. 로직 전압은 5V 사용합니다. 반면 NX 마운트의 경우 로직 전압은 3.3V를 사용합니다. 그러니, NX와 아두이노 SPI를 통해 통신을 하려면 두 통신 사이에 로직 전압을 변환해주는 회로가 필요합니다.

좀 뒤져보다보니, www.pololu.com/product/2595 라는 것을 찾았습니다. 4채널 양방향 로직 레벨 변환기... 요걸 아두이노 로직과 NX 마운트 사이에 끼워 넣으면 문제는 해결 됩니다.

아래는 Arduino Nano를 메인 프로세서로 이용하고, NX 바디의 핀에 열결하는 중간에 4체널 로직 변환기 회로를 넣은 배선입니다.
기본적으로 3.3V와 5V는 모두 NX 카메라 바디에서 얻어내 사용하는 회로로 구성되었습니다.

NX 마운트는 NX 바디와 렌즈의 연결 인가 작업에서 4번핀 (ATT)의 역할이 없습니다. 4채널 로직 변환기를 사용하다보니 부득이 4번 핀을 제외했습니다.



이 회로를 프로토타입 보드에 얼기설기 배선을 연결한 모습입니다.

NX1 | Aperture Priority | 26.00mm | ISO-500 | F2.5 | 1/125s | 0.00 EV | Multi-Segment | Auto WB | 2016-04-04 21:05:13


(1) 아두이노 나노에 프로그램을 얹기 위해 사용한 USBasp 라고 하는 프로그래머입니다. 이베이어서 단돈 2달러 정도에 구할 수 있는 물건입니다.
(2) "아두이노 나노" 보드입니다. 이것도 이베이에서 중국제 클론을 구하면 2-3달러면 구할 수 있습니다.
(3) 4 채널 로직 변환회로. 이것도 대충 2-3달러면 구할 수 있습니다.
(4) 디버깅용 로직 애널라이져.

지저분하게 배선된 테스트 보드입니다.
NX1 | Aperture Priority | 38.00mm | ISO-400 | F2.8 | 1/125s | 0.00 EV | Multi-Segment | Auto WB | 2016-04-04 21:06:26



두번째는 NX 바디에서 전원을 켰을 때, 적절한 타이밍에 NX 카메라 바디의 명령을 처리할 수 있는지에 대한 여부입니다.

일단 NX 바디에 렌즈가 없는 상태로 전원을 켜면 어떤 일이 벌어지는지 한번 간략하게 보도록 하겠습니다.



(1) - NX 바디가 전원을 켜면 최초 렌즈 확인 작업의 싯점입니다.
(2) - 첫번째 확인 작업에 실패하면 약 0.5 초 후에 전원을 끄고, 다시 재 부팅을 시도합니다.
(3) - (1)과 (2)의 작업을 총 9번 반복하면서, 렌즈 확인 작업을 하고, 그래도 실해하면 전원을 완전히 끄고 수동렌즈 모드로 설정합니다.


그럼 최초로 NX 바디는 전원을 켜고 나서 렌즈에 대한 확인작업을 시작할까요?

아래는 최초로 아두이노 나노에 NX바디에서 최초 명령인 0x03 0xAA 0x55라는 데이터를 받으면, 다시 0x03 0xAA 0x55라는 응답을 하도록 프로그램을 심은 상태로 연결했을 때, 벌어진 상황을 보여주는 모습입니다.



(1) - NX 바디에 전원이 인가되고, 아두이노 보드로도 전원이 들어갑니다.
(2) - NX 바디는 전원이 인가되고, 약 5.3ms초 후에 처음으로 렌즈로 0x03 0xAA 0x55 라는 세개 바이트 데이터를 보내고 있습니다.
(3) - 아두이노 나노 보드는 전원이 인가된 후, 66.78ms 후에야 처음 준비작업에 착수 합니다.

이런 상황에서 아두이노 보드는 이미 바디에서 보낸 데이터를 놓치게 되고, NX 바디가 하는 인가 작업은 실패를 하게 됩니다. 그럼 아두이노 나노 보드의 부팅 속도를 더 빠르게 할 수 없을까?

그럼 아두이노 나노 보드가 사용하는 마이크로 콘트롤러인 Atmel 사의 ATmega328p 마이크로 콘트롤러에 대해 좀 뒤져봐야 합니다. Datasheet에 보면, 부팅 시간에 대해 설명하는 부분이 나옵니다.

아래 부분인데, 기본적으로 아두이노 나노 보드는 빨간색으로 표시가 값을 기본값으로 설정해 놓고 사용합니다.
시동 시간은 1만6천 싸이클이고, 그 후에 1만4천 싸이클과 추가고 65ms의 지연시간을 갖는다고 되어있습니다. 이것을 녹색으로 표시한 값으로 변경을 하면 추가로 지연되는 시간 중 65ms 시간만큼 절약할 수 있습니다



이 값은 ATmega328 콘트롤러의 lfuse 레이스터라고 하는 값에 저장이 되어져 있는데, 이 레지스터 값을 변경하면 됩니다. (변경법에 대한 설명생략하겠습니다. ㅎㄷㄷㄷ)

이 fuse 레지스터 값을 변경한 후 테스트한 모습입니다.


(1) NX 바디에서 전원이 켜지고, 아두이노 나노 보드에도 전원이 인가되었습니다.
(2) 약 2.5ms 후에 아두이노 나노 보드가 첫번째 작업을 시작했습니다. 이전에 60ms도 훨씬 많이 걸리던 것에 비하면 아주 빨라졌습니다.
(3) NX 바디가 0x03 0xAA 0x55라는 값을 렌즈로 내려보냈습니다
(4) 아두이노 보드가 NX 마운트 프로토콜에 따라 5번 핀(LDR) 신호를 LOW로 변경하고 바디에서 보내는 sync 클록에 맞춰, 0x03 0xAA 0x55라는 응답을 보냅니다.

그리고 그 후에 NX 바디는 렌즈에 렌즈 세부 정보를 보내라는 명령을 보내는 것 까지 정상적으로 잘 보내지는 모습을 보이고 있습니다. 그러나, 아직 아두이노 나노 보드는 그 명령어 처리 로직을 만들지 않은 상태입니다.

어쨌든, 아두이노로 NX 바디를 속이는 가능성에 대해 고찰해보았습니다.

이번 게시글에 올라온 회로와 아두이노 나노의 프로그램은 아래 링크의 GitHub에 공유해 놓았습니다.

github.com/blueringlab/Sams...

단.... 아두이노 나노에는 절대 BootLoader가 있으면 안됩니다. 아두이노 부트로더는 시간을 좀 잡아먹는 부분이 있기 때문에, 번거롭지만, 부트로더를 밀어버리고, 프로그램을 바로 심어야 합니다.

관심있으신 분은 한번 해보세요. ㅎㅎㅎ 테스트는 NX20 바디에 연결해 수행했습니다.

오늘은 이상입니다. ^^


★ 록키산맥님의 팝코 앨범 ★
https://photo.popco.net/44539

접기 덧글 25 접기
SNS 로그인

이전글 다음글 목록

맨위로

이전이전 613 614 615 616 617 다음 다음