최종적인 목표는 쿼드콥터를 ARM 리눅스 보드로 제어하는 것 이었기 때문에 제가 선택할 수 있는 방법은 두가지가 있었습니다.
첫째는 DJI F450 컨트롤러인 NAJA-M를 제거한 뒤 모터를 수동으로 제어하는 법
두번째는 DJI F450의 컨트롤러 NAJA-M를 사용하면서 조종기가 발생시키는 신호를 시뮬레이션 해서 제어하는 법
이었습니다.
많은 분들은 첫번째 방법으로 많이 하시는것 같습니다만 저는 프로젝트 기간이 그리 길지 않았고 하나의 소프트웨어로 다양한 기종에 적용하고 싶었기 때문에 두번째 방법을 사용하였습니다.
여기서 다양한 기종에 적용을 할 수 있다는 것은 하나의 조종기를 쿼드콥터와 비행기에 장착시켜도 작동하는 것과 같이 여러 기체에서 공용으로 사용되는 연결방식(인터페이스)를 지원하게 되면 다양한 기종에서도 사용할 수 있다는 뜻 입니다.
따라서 저는 기존 조종기가 발생시키는 신호를 분석해서 조종을 하는 가장 기본적인 것 부터 시작하였습니다.
일단은 분석하기에 앞서 구글에 검색을 해서 일을 조금 덜어보려 했지만 아무리 검색해도 신호분석에 대한 글은 없더군요..
제가 유별난건지 아니면 사람들이 관심이 없었던건지 모르겠습니다.
그래서 오실로스코프로 조종기 수신기에서 나오는 신호를 분석하기 시작하였습니다.
확인해보니 1.5ms 동안 신호를 보내고 있네요!
한칸이 500us 입니다 (1000us = 1ms)
그럼 조종기를 한번 움직여볼까요
확인해보니 최소 1.0ms 최대 2.0ms 를 보내고 있는것을 확인하였습니다.
1.0ms 일 경우 최소 2.0ms 일 경우 최대인것이죠
1.0ms 일 경우엔 스로틀이 최저 2.0ms 일 경우 스로틀이 최대가 되는것 입니다.
주기는 20ms
즉 20ms 마다 1.0ms ~ 2.0ms 의 신호를 보내어 쿼드콥터를 조종을 하는것 입니다.
20ms 마다 반복되는 모습 보이시죠?
한 칸이 5ms입니다.
조금 더 테스트를 해보았는데 그 결과는 이렇게 나왔습니다.
1.0 ms <----------> 2.0ms
오른쪽 왼쪽
기수상승 기수하강
스로틀최저 스로틀최대
일반적으로는 1.0 이 왼쪽 2.0이 오른쪽 일 것 같은데 반대네요 이 부분은 주의하셔야 할 것 같습니다.
AILE, ELEV, THRO, RUDD 는 위를 참고하시면 됩니다.
AUX1 의 경우는 비행모드 설정에 대한 신호입니다.
모드는 총 3가지가 있습니다.
ms신호는 F450 시스템 셋팅에 따라 다를수 있으니 참조 하시어 수정하시기 바랍니다.
GPS 모드 – 1.86ms – 자동으로 고도,위치 고정 / 자동으로 수평유지
Attitude 모드 – 1.52ms – 자동으로 고도 고정 / 자동으로 수평유지
Manual 모드 – 1.20ms – 수동모드 / 수평유지 안함
AUX2 의 경우는 기체의 기수방향 모드에 대한 신호입니다.
모드는 총 2가지가 있습니다.
일반모드 – 1.86ms – 기체 앞 부분이 향하는 곳이 앞쪽 방향으로 인식
고정모드 – 1.20ms – 북쪽방향이 기체의 앞쪽 방향으로 인식 (라디오 조종기를 사용할때 어느부분이 기체의 앞쪽방향인지 모를때 유용한 기능인것 같습니다)
저는 일반모드로 해놓고 계속 사용하였고 아두이노 코드도 그렇게 되어있습니다.
EXT1 은 사용하지 않습니다.
그럼 이제 분석한 결과를 토대로 ARM 보드로 쿼드콥터를 제어해보려 합니다.
제가 사용한 ARM보드는 ODROID-X2 모델입니다.
쿼드코어라서 성능에 걱정은 없었습니다.
그럼 이 보드의 GPIO포트(신호 출력을 위한 포트)와 NAJA 컨트롤러를 연결해보도록 하겠습니다.
그리고 GPIO PIN MAP에 따라 리눅스 디바이스 드라이버를 만들어서 시도를 했습니다만..
대실패를 하고 말았습니다.
제가 사용한 OS가 Ubuntu 12.04 였는데 일반적인 리눅스에서는 시스템 커널이 최우선이고 커널단에서 여러가지 프로그램들이 돌아가고 있기 때문에 Clock 신호(위의 조종신호와 같은 주기적인 신호)와 같은 정밀한 신호는 출력하기가 힘들다고 합니다.
만약 리눅스를 사용하면서 Clock를 출력하고 싶다면 리눅스를 커널단 부터 수정해서 직접 빌드한 후 사용하거나 RTOS를 사용해야 하는데 커널단부터 수정하기에는 시간도 너무 오래걸리고 안정성을 보장을 할 수가 없어서 불가능하고 RTOS를 사용하게 되면 Ubuntu 의 장점인 여러가지 어플리케이션들을 사용할 수 없게 되어 이것도 불가능했습니다.
그래서 한참을 고민하다 결국 처음부터 생각하고 있었던 차선책인 아두이노를 Clock신호를 발생시키는 용도로 사용하기로 하였습니다.
이 부분에 있어서 만약 호스트 머신인 ARM보드가 시스템 에러로 죽어도 재부팅 되는 동안 아두이노가 계속 쿼드콥터를 조종해 줄 수 있기 때문에 더 안전한 구조가 되었습니다.
한정적인 배터리 자원에서 전력을 사용하는 기기가 더 늘어 비행시간은 줄어들겠지만 여러가지 요인을 따져보면 이 방법이 가장 최선이었던것 같습니다.
이렇게 아두이노와 NAJA-M 컨트롤러를 연결해 주었습니다.
이렇게되면 NAJA-M 컨트롤러는 조종기가 연결된 것으로 인식하게 됩니다.
위에 적었던 신호 분석결과에 맞추어 아두이노를 프로그래밍 한 뒤 실행시키자 F450 LED가 노란색(조종기 탐색중)에서 초록색(조종기 찾음)으로 바뀌었습니다.
InitializeTouchInjection() 에 Parameter를 넣으면 터치이벤트가 아예 동작하지 않음
InitializeTouchInjection() 에서 Parameter를 모두 제거해서 해결
양손 적용시 터치가 한군데에서만 연속적으로 클릭되던 문제
각 손이 각각 업데이트 되지만 업데이트는 2개 모두 하던 방식에서 각 손만 임시 contact를 만들어 각각 업데이트 하도록 해서 Injection 시키도록 하여 해결
터치인젝션으로 터치클릭 & 무브가 안되는 문제
터치클릭을 위해서 UPDATE / INRANGE / INCONTACT 옵션을 사용했는데 문제는 이 이벤트를 발생시키기 전에 DOWN / INRANGE / INCONTACT 이벤트를 발생시켜야 이 이벤트가 정상적으로 동작하여서 터치가 UP된 후 다시 터치클릭 & 무브 하려할때 해당 이벤트가 발생되지 않았으면 발생시키도록 수정
터치가 한쪽밖에 안됨
기존에 터치가 한군데에서만 연속적으로 클릭되던 문제의 원인이 LeftHand 신호를 받지 않았기 때문에 발생했던 문제였기 때문에 임시로 해결했던 contacttemp 를 만들어 각각 업데이트 하도록 Injection 시키던걸 양손 모두 한꺼번에 업데이트 하도록 변경하여서 수정
Touch Down and Move 하기 전 이전 포인트 플래그가 터치가 올라갔을때 이면 Touch Down 플래그를 등록하는데 등록한 후 한번 Move 를 진행하고 그 다음번에 Touch Down and Move 를 위한 플래그로 변경시키는 방식에서 애초에 이전 플래그가 터치가 올라갔을때 이면 Touch Down 플래그를 등록한 후 바로 TouchInjection()을 호출하여 처리한 후 Touch Down and Move 를 위한 플래그를 넣고 Move 하고 Injection 하도록 하여서 해결
아래 설정은 기본설정 (Organization, Extension, User 등이 셋팅되어 있어야 합니다)
언급하지 않은 셋팅은 기본값으로 두시면 됩니다.
————————————————-
+ SIP 설정
– Elastix :
PBX – Trunks 에서 [SIP] Create New Trunk 선택 (체크박스를 SIP로 설정)
Descriptive Name 은 알기쉽게 설정 (저는 Main)
Outbound Caller ID 에 SIP 계정의 전화번호 입력
Organization 선택
Peer Settings 탭으로 들어가서
Name 은 알기쉽게 암거나 (저는 Main)
Type = peer
secret = SIP 계정 비밀번호
username = SIP 전화번호
context = from-trunk
disallow = all
allow = ulaw;alaw;gsm
qualify = yes
nat = auto
dtmfmode = rfc2833
insecure = port,invite
(Advanced Settings 를 누름)
fromuser = SIP 전화번호
defaultuser = SIP 전화번호
fromdomain = SIP 서버주소
outboundproxy = SIP 프록시 주소(없으면 입력하지 않아도 됨)
User Settings 탭으로 들어가서
Peer Settings 이랑 똑같이 하되
type = user
로 변경
Registration 탭으로 들어가서
Register String 에
SIP전화번호:SIP계정비밀번호@SIP서버주소
라고 입력한다
그리고 저장
만약 incoming 전화가 에러가 난다면
SIP Setting 에서 Local network 가 셋팅되어 있는지 확인해보자
아래는 FreePBX 용 셋팅
CID Option 을 Force Trunk CID 로 셋팅
(이렇게 안하면 송신자가 Call Fail 뜸)
SIP Trunk
PEER Trunk
host=서버주소
username=번호
secret=비번
type=friend
disallow=all
qualify=yes
insecure=port,invite
context=from-trunk
fromuser=번호
defaultuser=번호
authuser=번호
allow=ulaw
위 대로 해서 안된다면 이렇게 해보자 (한국쪽 SIP Provider)
host=서버주소
username=070번호
secret=비밀번호
type=friend
disallow=all
qualify=yes
insecure=port,invite
context=from-trunk
fromdomain=서버주소
outboundproxy=서버주소
callbackextension=070번호
defaultuser=070번호
fromuser=070번호
allow=ulaw
————————————————-
————————————————-
전화 자동으로 연결되게 설정하기
PBX – Inbound Routes 에서
ADD Incomming Route 클릭
Description 에 설명입력
Set Destination 에 연결할 곳을 선택하면 끝
그리고 저장
————————————————-
————————————————-
+ SIP 설정 후 Inbound 전화가 연결음만 나고 연결이 안될때
– Asterisk :
/etc/asterisk/sip.conf 에 아래 옵션을 추가한다
externaddr=외부아이피
localnet=내부아이피
– Elastix :
PBX Admin Settings – General Settings Admin – SIP Settings 에서
Nat Support 에서
Type of NAT 을 static 으로 변경
Local Network 를 172.30.1.0 / 255.255.255.0 으로 설정
Extern Addres 에 외부아이피 입력
그리고 저장
그리고
/etc/asterisk/sip_general_custom.conf 에
bindaddr=0.0.0.0
추가 후 저장
+ Inbound 전화가 Call Fail (비프음이 나고 끊어질 때) 뜰 때
SIP 설정이 위와 같이 제대로 설정되어 있는지 확인
추가로 다른 설정이 기본값을 벗어났는지 확인
확인된 에러:
– Outbound Caller ID 가 설정되어 있으면 에러남
– Queue 로 전화를 연결한 후 끊으면 그 다음 전화가 Fail 날 때 Queue 의 Destination 을 지정해준다 (예: Terminate Call)
– IVR -> Queue 으로 라우팅 된 후 Queue 에서 대기하고 있을때 Queue 설정이 변경되고 Asterisk 가 reload 되면 일정확률에서 송신자 Call Fail 이 뜬다. Asterisk 를 재시작하거나 Trunk 에서 CID Option 을 다른걸로 변경하고 Apply Config 한 후 다시 원상복귀 하면 정상작동 한다 (버그인듯 하다)
멍청한 짓이였다…
No route to peer for ‘Caller ID’ from ‘IP Address’
라는 에러메세지가 떴는데 이게 요청을 보낸 아이피주소와 요청이 오는 아이피주소가 달라서 그랬던거다.. host에 아이피주소 대신 도메인 주소를 썼기때문..
그래서 SIP Trunk 의 host 를 모두 IP 주소로 변경했더니 잘 동작한다
————————————————-
SIP Trunk 에서 컬러링(Ring back tone)이 들리지 않고 그냥 기본 통화연결음만 들릴때:
이건 기본적으로 Asterisk 가 통화가 연결될 때 까지 통화연결음을 만들어 내기 때문이다.
외국에는 컬러링 같은 개념이 없나보다..
SIP.conf 에 아래 두개를 추가해주면 된다
(Freepbx – Setttings – Asterisk SIP Settings – 오른쪽 탭 Chan SIP – 맨밑에 Other SIP Setting)
progressinband=yes
prematuremedia=no (확인해보니 이건 안넣어도 되네요)
————————————————-
+ Asterisk SIP Provider 인증상태 확인
asterisk -rx “sip show registry”
+ Asterisk Log 실시간 확인
tail -f /var/log/asterisk/full 혹은 tail -f /var/log/asterisk/messages
제가이렇게까지 CUCM을설치하려는이유의첫째는 Cisco IP Phone을사용하고싶어서이고(조금멋져보임) 둘째는 Auto Attendant(ARS)를사용하고싶어서입니다.
사실 Auto Attendant는다른 VoIP 시스템에서도가능하지만그냥시스코것을써보고싶었습니다ㅎㅎ
-> 2014.12.4 = 오늘 CUCM 구매를하려고기존에알아봤던곳에전화를했는데 1유저라이센스는너무작아서판매가어렵하고하네요… ㅠㅠ.. 그래서 Cisco 쪽에전화했더니시스코총판인 A회사라는곳을알려주는데이곳에서 B회사라는곳을또연결해주었습니다.. (302 Redirect 만몇번째인지ㅠㅠ) 지금 B회사쪽이랑얘기중인데아무래도여기서는 CUCM을구매할수있을것같은느낌이듭니다! 개인 + 소량구매유저에게 Enterprise 급제품을정말잘안팔긴하나봅니다…
-> 2014.12.5 = B회사에서 오늘 견적을 받았습니다만.. 이해가 안가는 부분이 있어서 다시 전화를 드렸습니다. 시스코 CUCM 라이센싱은 포트(?) 때문에 한 유저당 6유저 라이센스가 필요하다고 하네요.. 이 부분이 이해가 안가서 다시 여쭈어보고 연락을 기다리는 상황입니다..
제가 다른회사에서 전해들은 금액은 대충 20~30만원 선에서 구매하는 정도였는데 견적을 받은 대로라면 거의 40만원이 넘어가는 금액이라 예산을 초과하게 됩니다.. 근데 정말 이번 거래를 하면서 느낀점이 큰회사가 아닌 작은회사들은 시스코같은 큰 회사 제품을 구매하기 조차 힘들다는 것 이었습니다… 돈주고 구매하겠다는데도 안팔려고 하는곳도 많고 홀대하는 느낌을 많이 받네요… 많이 실망입니다..
2014.12.5 15:55 = 솔직히 맘같아선 CUCM 말고 그냥 Asterisk 로 구축하고 싶습니다.. 이번 거래 끝나면 Cisco 본사에 컴플레인 메일을 보낼 예정입니다. 기분이 나쁘군요
Cisco VoIP 시스템을 구현하고 사용하기 위해서 Cisco CP-9971 인터넷전화기를 구매했다
일단은 CUCM이라는 VoIP 매니저 서버를 구축한 뒤 그 서버에 이 전화기를 연결하면 된다고 하는데 아직 해보지는 않아서 잘 될지 모르겠다.. CUCM 10.5 Enhanced 라이센스가 $180 정도 하는것 같은데 이것도 구매하려 하는데 시스코 한국 파트너사들이 개인고객에게 친절하지 않아서 애를 먹고있다.. 차라리 외국 파트너에게 구매하는게 나을 정도..