12월 242011
 

그동안 NX 신호를 분석하다 보니 느낌이랄까… NX 렌즈는 NX 바디와 통신 함에 있어서, 렌즈 구동과 통신이 동시에 이뤄진다는 느낌을 받았습니다.

물론 프로세싱을 하는데 있어 부지런히 찢어 조각조각 역할을 나누면되지만, 개발자 입장에서 그렇게 하기는 손이 많이 가는 일이고….
그래서, 멀티태스킹 (실제 구현은 멀티 쓰레딩이지만요…)구현이 가능한 RTOS를 이용하기로 결정했습니다.

펌웨어가 좀 무거워지는 단점이 있지만, 그래도 태스크 스케쥴링에 대해 특별히 신경을 쓰지 않아도 되니까말입니다.

아래 그림은 NX용 AF 어댑터 내에 구현될 SW의 개략적인 구조도입니다.

S/W Architecture
1. 하드웨어

지금으로선 특별한 이유가 없는한 32비트의 ARM Cortex-M3를 코어로 가지는 AT32F103R 칩을 사용할 예정입니다. 클록 스피드는 72MHz로 충분할 것 같고, SPI통신등을 하드웨어에서 지원하기 때문에 구현이 나름 용이한 장점이있습니다.

2. RTOS (Realtime O/S)

앞서 설명을 하였듯이 NX용 AF 어댑터는 NX바디와 통신을 해야하고, 동시에 AF용 모터도 운용을 해야합니다. (차후, 조리개 조절용 모터도 구현을 염두에 두고 있습니다.) 렌즈가 NX 바디에 대해 수동적으로 동작을 하기 때문에 통신에 타이밍이 상당히 중요하므로, 이를 염두에 둔 선택이었습니다.
RTOS는 ChibiOS/RT는 상당히 작은 크기의 RTOS로 오픈소스로 알려진 것 중엔 그래도 작업전환 속도가 가장 빠릅니다. 거기에 더해 한가지 더 마음에 들었던 것은 HAL (Hardware Abstract Layer: 하드웨어 추상화 계층)을 구현하고 있어서, 개발자입장에서 HW를 컨트롤 하기 위해 아주 밑바닥까지 내려가지 않아도 된다는 장점이 있습니다
뭐… 진정으로 HAL이 되느냐하며… 실제로는 그렇지는 않습니다. 어차피 하드웨어에 대한 정보는 당연히 가지고 있어야 합니다. 다만 그나마 이게 있어서 상당한 노가다를 줄여주는 장점이 있습니다.

이 부분에 있어서 NX가 SPI 통신에 있어 변형된 간략형을 사용하고 있습니다. 보드가 SPI에서 Slave모드로 정의 되어야 하는데, 불행히도 이 ChibiOS는 SPI를 사용하는데, Master모드로만 사용할 수 있도록 되어있습니다.

이부분의 소스코드를 수정해서 Slave모드도 지원하도록 수정을 하기는 했습니다. 기타 하드웨어와 관련된 부분도 조금씩 수정을 했습니다. 추후 라이센스와 관련된 부분은 좀더 들여다 봐야겠습니다.

3. 구현

3.1 NX 마운트 통신

NX마운트와의 통신을 담당하는 독립 Thread 입니다. 렌즈의 부팅과 바디에서 오는 명령을 해석하고, 응답을 바디로 보내는 등, 바디와 통신을 담당합니다.

앞에 언급했지만, NX마운트는 통상적으로 알려진 SPI 통신의 간략형 변형 프로토콜을 이용합니다. 원래 SPI는 Master 기기 하나와 Slave를 여럿을 두었을 경우를 상정해 설계된 프로토콜인데, NX 마운트의 경우, 바디와 렌즈가 1:1로 매치되기 때문에 굳이 Full SPI 프로토콜이 필요가 없기는 합니다. 어쨌든 NX의 바디가 Master이고, 렌즈가 Slave모드로 운용되는 SPI 프로토콜이라고 해두겠습니다.

3.2 AF 모터 제어

역시 이 제어부분도 독립된 Thread입니다. 이전에 구현한 테스트 영상은 Arduino 보드를 이용하고 전용 라이브러리를 이용해 테스트 동작을 시켰는데, 이번에 보드도 바뀌었고, RTOS를 쓰고 있기 때문에, 간단했던 그 테스트 코드는 이용할 수가 없습니다.

그래서 이번에 새로이 bipolar stepper 모터를 운용하는 새로운 소스코드를 만들었습니다. 역시 NX 마운트의 운용에 적합하도록 디자인을 했습니다. 즉 목표 지점을 주면 거기까지 움직여 가고, 이동 속도를 따로 지정할 수 있게끔 했습니다.

3.3 Attention (4번 핀) 신호 감시

이것도 역시 독립된 Thread 입니다. AF동작시 4번 핀, ATT의 신호는 절대적인 역할을 수행합니다. 더구나, 이 핀에서 발생하는 신호는 상당히 짧습니다. AF동작의 개시와 종료는 이 신호가 5us 정도 수준이고, 그외 렌즈에게 포커싱 정보 보고를 지시하는 신호는 10us 의 신호라서… 지금으로선 독립된 감시 Thread가 있는 것이 좋겠다는 생각을 하고 있습니다.

이렇게 조합된 개별 Thread는 서로 간에 Event 를 발생시켜 통신을 하도록할 예정입니다.

아래 동영상은 위의 도표를 바탕으로 펌웨어를 구현하여 간단하게 테스트한 영상입니다.
RTOS를 돌리면서 거기에 NX 마운트 통신과 AF용 모터를 제어하는 멀티쓰레딩을 구현한 것입니다. 현재까지는 특별히 신호를 누락하거나 모터 동작이 부자연스럽거나 하지는 않아보입니다.

어쨌든 구상한 SW 구조가 그다지 틀리지 않았다는 것을 증명하기 위한 테스트 였습니다. ^^

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)