저번 포스팅에서는 짐벌의 작동을 돕기 위한(...) Gimbal Assistant에 필요한 기능을 대략적으로 생각해봤고, 기본적인 인터페이스를 구성해 봤습니다. 중간의 문구를 Recording으로 할까, 아니면 Stablizing으로 할까, 아니면 Time Elasped 로 할까가 지난 번 포스팅에서의 가장 큰 고민거리였습니다. 결과적으로, 아래에 스톱워치가 굴러가기 때문에, Time Elasped 문구가 가 가장 적절할 것으로 보았고, 아마 인터페이스의 메인 화면은 Time Elasped가 장식하게 될 것 같습니다.
조이스틱 Joystick
이번에 다룰 내용은 ‘조이스틱’에 관한 내용입니다. 조이스틱은 xy에 대한 입력을 받는 장치로, 일종의 가변저항과도 같습니다. 지금 만드는 짐벌에서는 팬과 틸트 기능으로 yaw축과 pitch축 조정을 담당할 예정입니다. 조이스틱은 짐벌의 구동에 있어 필수적인 요소는 아닙니다..만 있으면 쓸만할겁니다.
짐벌을 몇 번 테스트하는 동안 짐벌에 어느정도 각도를 주게 되면 모터의 힘이 부족해 제어를 잃게 되는 문제를 발견했습니다. 모터의 힘이 생각보다 너무 부족한가봅니다. 테스트를 조금 더 해보면 문제의 원인을 밝힐 수 있을텐데..일단 짐벌 바디 모델링이 먼저 끝나야겠군요. 어쨌든 이런 상황에서 짐벌을 움직이는 것을 조이스틱 움직이는 걸로 대신한다면 아마 조이스틱이 모터가 힘을 덜 쓰도록 돕지 않을까 하는 생각이 듭니다.
이번 포스팅에서 사용할 조이스틱은 psp에 들어있는 작은 조이스틱입니다. 가로 세로 크기가 2cm도 되지 않아 활용도가 높습니다. 다만 전에 조금 걱정했던 것은, 이게 xy 움직임을 제대로 표현해줄까였는데 막상 써보니 예상대로 실망감만 안겨주는군요. 다른 조이스틱을 찾아봐야겠습니다.
Wiring
조이스틱은 일반적인 가변저항과 같이 연결해줍니다. VCC에는 VCC, GND에는 GND, X, Y는 각각 아두이노의 아날로그 핀에 연결해주면 되겠습니다.
Sketch
1 2 3 4 5 6 7 8 9 10 | if((joystickXdata>=68 || joystickXdata<=60)||(joystickYdata>=26 ||joystickYdata<=18)){ display.clearDisplay(); display.setTextSize(1); display.setCursor(20,50); display.println("Joystick working.."); display.drawCircle(display.width()/2, display.height()/2-10, 20, WHITE); display.drawCircle(display.width()/2, display.height()/2-10, 21, WHITE); for(int i = 5 ;i>0;i--) display.drawCircle(joystickXdata,joystickYdata-10, i, WHITE); | cs |
조이스틱의 스케치 역치 일반적인 가변저항 취급하듯 analogRead()를 이용해 코드를 짜면 됩니다.
원래 스크린에 조이스틱의 움직임을 나타내려 했고 어떻게 표현할지 약간의 고민에 휩싸였습니다. 처음에는 스크린의 외곽선을 조이스틱의 표현 영역으로 만들려 했습니다. 그러기 위해 저번 포스팅에서 일부러 배터리와 전압 표시하는 공간을 스크린 외곽으로부터 1px 씩 떨어지게 위치하도록 하기도 했구요. 그러나 아무리 생각해도 별로 미려하지도 않고, 직관적이지도 않아서 조이스틱이 움직이는 동안은 새로운 화면에서 조이스틱의 모양만 구현하도록 하는 편이 나을 것 같았습니다.
아무런 소프트웨어적인 처리를 거치지 않은 조이스틱의 X 영점 값은 약 668정도이고, Y영점 값은 약 330정도에 수렴합니다. 스크린의 정 중앙지점이 (64, 32)정도인 것을 생각해보면 영점 값에 10만 나눠주고 대략 중앙에 맞게 값을 더하고 빼주면 스크린에 조이스틱의 영점이 이상적으로 표현될겁니다. 위의 스케치에서는 그런 내용을 반영했습니다. 그런데 그렇게 만들어보고 나니 새로운 문제가 발생했습니다. 조이스틱의 값이 변할 때도 있다는 겁니다. +Y축으로 끝까지 조이스틱을 땡긴 후에 다시 원점 상태로 돌려놓으면 값이 약간 더 올라가있고, -Y축으로 땡기고 원점 상태에 두면 값이 약간 더 내려가 있습니다...우선은 써먹긴 하겠지만 이건 코드로 조정하기에는 고민을 많이 해봐야 하는지라..차라리 조이스틱을 바꾸는 편이 더 나을 것 같습니다.
조이스틱 움직임으로 화면 바꾸기
처음에는 조이스틱 값의 변화를 감지해 화면을 바꾸려 했습니다. dx/dt 와 dy/dt를 구한 후 변화가 감지되면 스크린을 새로 띄우려 했습니다. 하지만 여기서 바뀐 스크린은 변화가 없으면 스크린이 기존 화면으로 돌아와 버립니다. 보통 팬& 틸트시 0.5초 이상 같은 방향으로 밀 텐데, 카메라가 조이스틱에 맞춰 이동하는 동안은 조이스틱 값에 변화가 발생하지 않기에 원래 화면으로 돌아와버리는 것입니다. 근데 또 생각해보니 더 쉬운 방법이 있기도 했습니다.
그냥 조이스틱이 원점 벗어나는 동안 스크린에 조이스틱 움직임을 뿌리면 되는 게 아닌가? 하는 생각이 불현듯 떠올라 스케치를 수정해 업로드 해봤더니 간단하게 끝나는군요.
정리
생각보다 어려운 문제는 아니었는데, 괜히 어렵게 생각하니 어려워지는 것만 같습니다. 그렇지만 조이스틱 연결 역시 그리 어렵지 않게 완료되어서 다행입니다. 크게 고민하지 않았던 문제가 큰 고민 없이 넘어가는 일은 정말 좋은 것 같습니다. 생각지도 못한데에서 고민이 생기면 고생이 이만저만이 아니거든요.
사진들을 보시면 현재 죄다 납땜을 이용해 부품들이 연결되어 있는 것을 확인하실 수 있습니다. 이게 장점이라고 생각되지는 않습니다. 부품들이 선을 이용해 연결되기때문에 따로 놀기도 하고, 보드에 선이 잘못 닿기라도 하면 바로 요단강행이니까.. 지금 겁이 좀 납니다. 사실 지금 쓰고있는 보드를 살 때 2개 구입했는데, 하나는 사고 나서 업로드하자마자 오류뜨는바람에 사용못하고 있는 상황입니다. 슬레이브로 연결해서 부트로더 다시 구워주면 되긴 한다는데...정 아두이노 없을 때 한 번 시도해보도록 하겠습니다.
처음의 목표를 다시한번 되돌아 보면 계획했던 기능은 총 5가지로 아래와 같았습니다.
*짐벌에 필요한 기능들:
1. 촬영 경과 시간 표시하기
2. 배터리 전압 표시하기
3. 배터리 잔량 퍼센티지로 표시하기
4. 조이스틱 방향 표시하기
5. 2nd imu의 값을 받아 nt로 bgc에 전달하기
사실상 필요한 기능은 어느정도 다 구현한 셈이네요. 배터리 전압과 잔량 퍼센티지는 배터리와 연동해야하는 과정이 남아있긴 한데, 특별한 기술이 필요 없으니 빠르게 끝날 것 같고, 조이스틱은 일차적으로 아두이노와 연결되어 있으니 아두이노에서 조이스틱 신호를 뽑아 STORM32 보드로 넘겨주면 되겠습니다. 마지막 2ND IMU 값을 받아 NT 형식으로 BGC에 전달하기..가 가장 빡센데, 결국에는 SPI로 전달하면 되는 문제이긴 합니다만....이런 경험은 전무해서 잘 모르겠습니다. 잘 되겠죠 뭐.
취향차이겠지만, 짐벌에서는 적어도 팬과 틸트가 구분되어 쓰일 필요는 있다고 봅니다. 패닝(panning)만을 원했는데 틸팅(tilting)도 같이 되는 상황을 겪고 싶진 않습니다. 뭐랄까...불편하다는 말이 적절할 것 같습니다. 지금 테스트중인 psp 조이스틱은 생각보다 뻑뻑하고 x축과 y축 각 축에 대한 움직임이 따로 구분되어있다는 느낌이 전혀 들지 않습니다. 아마 완전히 완성된 후에는 조이스틱을 바꾸지 않을까 하는 생각이 듭니다. 지금 psp 조이스틱 말고 H8 mini 드론 조종기에서 빼낸 조이스틱이 있는데, 아무래도 이놈을 쓰게 될 것 같습니다. 조이스틱에 버튼도 있고 느낌도 적당히 미묘하게 쫀쫀하거든요.
감사합니다.