안녕하세요

블로그를 새로 옮기게 되었습니다.

많은 관심 부탁드립니다.

감사합니다.

 

https://blog.kloa.kr

 

Taylor Blog

Taylor Blog

blog.kloa.kr

https://chadole.com

 

차돌이 » 차돌이 팬클럽

 

chadole.com

 

안녕하세요 


오늘은 애플 아이폰 제조년월(제조연월/제조일자) 확인하는 방법에 대해 알려드리겠습니다.


아이폰 제조년월의 경우엔 해외 사이트 일부에서만 조회가 가능한데 그 중 몇 개 사이트는 정상적으로 조회가 되지 않고 있습니다.


그 중 에서 작동하는 사이트도 조회가 제한되어 있거나 날짜 표시 방식이 한국과 달라 이해하기가 어려운데요,


한국 사이트들 중에 아이폰 제조년월을 확인할수 있는 사이트가 있습니다.


해외 홍콩이나 미국에서 구입한 아이폰도 조회가 가능합니다.


http://apple.kloa.kr



이 사이트 인데요, 간단하게 시리얼 번호를 검색창에 복사한 후 조회 버튼을 누르면 제조년월을 확인하실수 있습니다.


시리얼 번호는 아이폰에서 [설정 앱] - [일반] - [정보] - [시리얼 번호] 에서 확인이 가능합니다.


시리얼 번호를 일일이 입력하는게 힘드니 시리얼 번호가 표시되어 있는 부분을 꾹 누르시면 "복사" 버튼이 뜨는데 복사 버튼을 눌러 복사하신 뒤 위의 사이트 입력창을 한번 누르신 뒤 커서가 뜨면 꾹 눌러서 "붙여넣기" 버튼을 띄워 붙여 넣으시면 쉽게 조회가 가능합니다.


확인해보니 애플 아이폰 이외에 아이패드나 맥북, 아이맥 등 기타 기기들의 제조년월도 확인이 가능합니다.





안녕하세요,


After Effect 를 사용하다 보면 스크립트가 들어간 프로젝트를 열 때에 스크립트가 깨지면서 스크립팅 된 애니메이션이나 오브젝트들이 다 같이 깨져서 이상하게 보일때가 있는데요 이럴때에는 프로젝트 제작자에게 스크립트를 Language Universal 하게 수정해달라고 하거나 애프터 이펙트 언어를 영어로 변경해야 합니다.


프로젝트 파일 제작자가 스크립트를 Language Universal 하게 변경해준다면 문제 없이 한글 애펙에서도 사용이 가능하지만 불가능할 경우는 부득이 하게 애펙 언어를 변경해야 합니다.


그런데 After Effect CC 부터는 언어를 변경하기가 조금 까다로워졌는데요, 대부분 사람들은 Adobe Installation Manage 의 언어를 English 로 변경한 뒤 AE 를 재설치 하라고 하지만 시간도 오래걸리고 불편하기 때문에 재설치 없이 언어를 변경하는 법에 대해 알아보도록 하겠습니다.


재설치 없이 AE CC 의 언어를 변경하는것은 생각보다 엄청나게 간단한데요


내 문서(My Document) 폴더에 ae_force_english.txt 라는 이름을 가진 텍스트 파일을 하나 만들어 주시면 됩니다.


내 문서에 들어가셔서 빈 부분에 오른쪽 클릭 후 [새로 만들기 ->  텍스트 문서] 를 누르신 후 이름을 ae_force_english 로 바꾸어 주시면 됩니다.

(파일을 만들기가 힘들다! 하시는 분들을 위해 텍스트 파일 첨부 해놓았으니 다운받으셔서 내 문서에 바로 집어넣으시면 됩니다)

ae_force_english.txt



이후 After Effect CC 를 켜시면 언어가 강제로 영어로 변경되어 나오며 스크립트가 깨지던 프로젝트 파일도 정상적으로 나오게 됩니다.


굳!



안녕하세요


요즘 테슬라 출시가 다가옴에 따라 전기차 충전소와 충전 인프라에 관한 관심이 높아지고 있습니다.


대부분의 충전소 홈페이지들이 일부 전기차 충전소만 보여주거나 사용할수 없는 전기차 충전소를 별다른 경고 없이 표시하고 있어


실제 사용자가 충전을 하기위해 충전소에 가도 충전기가 고장나서 충전이 불가능한 경우나 다른 차가 충전하고 있어 충전이 불가능 한 상태가 흔히 발생한다고 합니다.


그래서 오늘은 Connect EV 라는 서비스를 소개해드리려 합니다.


Connect EV 는 일반 사용자가 사용이 불가능한 전기차 충전소를 제외하고 간단한 가입만으로 사용이 가능한 전기차 충전소를 표시하고 있으며, 현재 충전기의 상태를 표시하여 지금 바로 충전이 가능한지 아닌지 여부를 바로 확인할수 있도록 되어있습니다.


Connect EV  의 홈페이지는 https://connectev.kr 로 접속하실 수 있으며 최신 테슬라 OS 를 장착한 테슬라 모델 S, 모델 X, 모델 3 에서 접속하여 사용하실수 있고, 물론 모바일 스마트폰이나 일반 PC를 통해서도 접속이 가능합니다.


네이버지도, 다음지도, 카카오네비, 김기사, T Map, Mappy 경로안내 연동을 지원합니다.








HDMI 신호를 받아서 RTMP 신호로 전송해주는 HDMI Encoder 의 메뉴얼입니다.


제품설명

http://www.aliexpress.com/item/MPEG-4-AVC-H-264-HDMI-Encoder-Replace-HD-Video-Capture-Card-Wifi/32311010514.html


모델명

BM1000HDMI WiFi version




맥을 기준으로 만들어졌으며 리눅스에서도 작동합니다.


FFMPEG가 필요합니다.

(맥의 경우 brew 를 통해 brew install ffmpeg / 우분투 일 경우 apt-get install ffmpeg / 센토스 일 경우 yum install ffmpeg)


이 스크립트를 실행한 위치의 하단에 있는 모든 디렉터리 안의 M2T 파일을 MOV로 변환합니다.


encode.sh 와 같이 저장해주신 뒤 


sh encode.sh 로 실행하시면 됩니다.


저는 파이널컷으로 영상작업하기 위해 이 스크립트를 사용하였습니다.


https://gist.github.com/taylor224/b6609a43ce6520ddafca



for DIR in */ ; do
echo "[ALERT] DIRECTORY - "$DIR;
cd $DIR;
for file in *.M2T *.m2t;
do
name=`echo $file | cut -d'.' -f1`;
if [ ! "$name" == "*" ];
then
echo "[ALERT] File Name - "$name;
if [ ! -f $name.mov ];
then
ffmpeg -i "$file" -f mov "$name.mov";
else
echo "[ALERT] Already Encoded";
fi
fi
done
cd ..;
done


[본 글은 드론 파일럿 커뮤니티 서비스 종료로 이관된 글 입니다]

[작성일 : 2015.01.28 19:30]


아래의 개발후기는 제가 2013부터 약 1년동안 개발을 진행했던 프로젝트에 관한 후기입니다.


처음에 미래창조과학부의 지원을 받아 프로젝트를 시작하게 되었습니다.


프로젝트 기간은 약 6개월으로 짧은편이었습니다.


처음엔 간략하게 리눅스 우분투로 구동되어 자동비행이 가능한 무인기를 목표로 잡았습니다.


그리고 기획을 거쳐 기종은 DJI F450 쿼드콥터로 결정하게 되었고 일단 셋트로 컨트롤러와 조종기셋트로 구매하게 되었습니다.


전에 일반 RC비행기는 날려본적이 있었지만 쿼드콥터나 헬기를 날려본적은 없었기에 구조에 대해 알아보려 집 근처 공터에서 몇번 날려보았습니다.


주로 헬리콥터 RC의 경우 날리기가 힘들다고 많이 들어서 쿼드콥터도 비슷하지 않을까 내심 긴장을 했었는데 실제로 조종해보니 생각보다 많이 쉬웠습니다.


자체 컨트롤러가 수평을 잡아주고 또 GPS키트를 구매했기 때문에 조종간에서 손을 놓으면 알아서 정지후 해당 위치와 고도에 정지하고 있었습니다.


사실 쿼드콥터를 구매하고 날려보기전 까지 수평잡는것과 위치고정 그리고 이동하는걸 어떻게 컨트롤 하면 좋을지 굉장히 많이 고민 했었는데 그 부분이 한번에 날아가는 느낌이었습니다.


프로젝트 기간이 짧았기 때문에 가장 기본적인 수평잡기, 위치고정등의 기능을 컨트롤러가 해준다는것을 보고 생각보다 많이 개발할 수 있을것 같았습니다.


개발을 시작하고 가장 첫번째로 이 쿼드콥터를 어떻게 조종할 것 인지 고민하기 시작하였습니다.


드론개발 정보 게시판에 썼던 [DJI F450  조종 신호 분석] 글에 나와있는것 처럼


1. 쿼드콥터 로터들을 직접 제어하는 방식

2. 기존 쿼드콥터 컨트롤러를 사용하면서 조종하는 방식


이 두가지가 있었습니다.


1번의 경우는 기존 쿼드콥터 컨트롤러를 제거하고 그 컨트롤러가 하는 일(수평제어, 위치고정)을 직접 하는 방식입니다.

2번의 경우는 기존 쿼드콥터의 컨트롤러를 사용하면서 사람이 조종기를 통해 조종하듯이 우분투 시스템이 쿼드콥터를 조종하는 방식입니다.


확실히 1번의 경우가 시간이 더 많이 들었기 때문에 저희는 2번의 방법을 선택하여 개발하기로 하였습니다.


2번의 경우는 일반 조종기 수신기의 인터페이스를 그대로 사용하기 때문에 쿼드콥터 뿐 만 아니라 멀티콥터, 헬리콥터, 비행기 등 다양한 무인기에도 적용할 수 있는점도 선택의 이유중 하나가 되었습니다.


그렇게 조종 방식을 결정하고 바로 인터페이스 분석을 진행하여 프로토타입 조종시스템을 만들었습니다.


가장 처음엔 오드로이드 보드를 통해 쿼드콥터로 조종신호를 전송하려 하였지만 위 글에 나와있는 여러 이유로 인해 아두이노를 통해 조종신호를 전송하게끔 구현하였습니다. 


임베디드는 처음이었기 때문에 여기까지 한 3달 걸린것 같습니다.


간단하게 

쿼드콥터 - 아두이노 - ODROID X2 (Ubuntu 12.04) --- 내부망 WiFi --- PC 

이렇게 테스트를 진행하여 잘 작동하는걸 확인하였습니다.


우분투 보드는 x86 아키텍쳐를 쓰는건 여러모로 비효율적이기 때문에 ARM 아키텍쳐를 사용하는 보드로 사용하기로 하였습니다.


그 중 삼성 엑시노스 쿼드코어를 사용하는 ODROID-X2 가 가장 괜찮았습니다.


총 2개를 구매를 했었는데 그 중 하나는 테스트 중 전압 5V를 넣는다는걸 12V를 넣는 바람에 64GB SD카드(비싼거..)와 함께 사망하였습니다..


쿼드코어 프로세서가 달린 보드로 결정한 이유중 하나는 HD급의 비디오를 PC로 전송을 하기 위함이었습니다.


자동비행도 좋지만 현재 상황을 관제자에게 전달하는것 역시 중요하였기 때문이었습니다.


비디오 전송은 여러가지를 사용해보다 결국 MJPEG를 사용하기로 하였습니다.


별도 스트리밍 서버를 구축할 필요도 없고 가장 가벼운게 MJPEG 였습니다.


아무리 쿼드코어라도 CPU에 너무 부담을 주게 되면 전력소모도 심하고 다른 서비스에 영향을 줄 수도 있었기 때문입니다.






위 사진이 개발에 사용된 ODROID-X2 보드입니다.






여기까지 되어서 나온 PC에서의 조종 프로그램입니다.


Control Status 는 PC에 연결된 조이스틱의 상태를 보여주고

MODE는 현재 비행모드

MODE 오른쪽의 버튼은 모드선택

그리고 Network Statics 의 IP는 ODROID의 IP

MODE는 Connect Status (연결상태)인데 잘못 적혀있습니다.

그리고 Wireless Signal 은 WiFi의 신호세기를 말합니다.


비행모드 설명:

GPS 모드 - 자동으로 고도,위치 고정 / 자동으로 수평유지

Attitude 모드 - 자동으로 고도 고정 / 자동으로 수평유지

Manual 모드 - 수동모드 / 수평유지 안함


왼쪽편에 나오는 영상은 HD급은 아니지만 현재 비행상태를 충분히 확인할수 있을 정도의 화질이었습니다.



여기까지 개발이 된 후 첫번째로 테스트 비행을 해보았습니다.


테스트비행은 주말에 아무도 없는 학교 운동장에서 허가를 받고 진행하였습니다.





원래는 노트북을 보며 조종을 해야 했는데 햇빛이 너무 강해 노트북 화면이 제대로 보이지 않았고 


카메라가 심하게 떨려 전송되는 화면을 통해서는 조종할 수 없는 정도였습니다..


일단 좌우로 움직이고 앞뒤 위아래 등 다양한 동작에서 적은 딜레이로 날렵한 움직임을 보여주었습니다.


물론 전혀 문제도 없었습니다.


다만 테스트중 와이파이 신호가 끊기면 어떻게 되는지 궁금해서 쿼드콥터를 멀리 보내보았습니다.


결과는 쿼드콥터가 연결이 끊기기 바로 전 상태 그대로 앞으로 돌진을 하더군요....


예외처리를 하긴 했었는데 무언가 부족한 부분이 있었나봅니다..


팀원들이 완전 사색이 되어서 와이파이를 들고 다시 연결시키려 뛰어가는데 이번엔 PC 클라이언트가 에러를 일으키며 멈추었습니다.


다행히 쿼드콥터는 운동장을 벗어나지 않고 운동장을 구분하는 나무에 걸렸습니다.


그런데 어딘가 선이 빠진 모양인지 와이파이도 자동으로 잡지 못하고 연결이 안되더군요..


결국 배터리가 다 되어 멈추기를 기다렸고 10분쯤 뒤에 모터가 멈춘 뒤 나무를 타고 올라가 꺼내왔었습니다.


지금 다시 생각해도 소름이 끼치게 무섭습니다..


이 경험을 토대로 예외처리는 확실히 하게 되었습니다..





테스트에 사용했던 완벽한 무선랜입니다.


전원도 배터리를 사용해 완벽한 무선입니다.


외부에 연결될 필요 없어 내부망만 있으면 되었기 때문에 이렇게 구성하였습니다.


이렇게 한번 추락시키고 나니 그 다음에는 외부에서 테스트하기가 겁나더군요..


그래서 여러 부분을 수정하고 최적화 해서 이번엔 실내에서 시험비행을 하였습니다.


실내비행에 앞서 쿼드콥터의 프로펠러가 굉장히 위험하기 때문에 스티로폼을 잘라 가이드를 만들었습니다.






이렇게 가이드를 만든 뒤 회사 소강당에서 테스트 비행을 시도해보았습니다.





비행에 앞서 비싼 프로젝터도 혹시나 다치지 않게 꽁꽁 싸맸습니다.





바로 위의 형광등도 이불을 덮어주고 쿼드콥터를 셋팅하였습니다.





와이파이를 켜고 노트북으로 쿼드콥터에 연결한 후 테스트로 시동도 걸어보고 비행을 시작하였습니다.






결과는 부드럽게 잘 비행하였습니다.


배터리가 부족해서 출력이 부족하긴 했지만 생각보다 부드럽게 잘 비행해주었습니다.


여기까지가 아마 5개월째 였던것 같습니다.


원래는 자동조종까지 기획을 하고 있었지만 그 부분은 차후 프로젝트로 미루기로 하였고 가장 기본적인 수동조종을 충실히 하는쪽으로 개발을 진행하였습니다.


ODROID에 올라간 서버는 Python 으로 제작하였고 PC와는 내부와이파이를 통해 Socket통신을 하였습니다.


PC는 C#으로 개발하였고 조이스틱 라이브러리를 통해 Logitech 의 비행게임용 조이스틱을 지원하였습니다.

미국 공군이 사용하는 XBox 조이스틱도 지원이 가능한것 처럼 보였지만 가지고있지 않아 테스트는 할 수 없었습니다.





ODROID는 어디에 붙이면 좋을까 고민하다가 결국엔 쿼드콥터 바닥에 거꾸로 붙이게 되었습니다.





Scotch 에서 만든 Dual Lock 이라는 찍찍이로 붙이니 튼튼하게 고정되었습니다.






왼쪽 다리에는 아두이노를 붙였습니다.


사실 쿼드콥터는 균형을 잘 맞추어야 하는데 따로 붙일곳이 마땅치 않아 무게도 얼마 나가지 않기 때문에 왼쪽다리에 살짝 붙였습니다.


그리고 이 사진에는 안나와있지만 최종적으로는 전선들의 합선을 막기위해서와 선이 빠지지 않게 하기위해 글루건으로 마감처리를 해주었습니다.






Netgear 의 무선랜카드를 사용하였습니다.

ARM보드에서 지원되는 무선랜카드가 많지 않다고 가장 호환성이 좋은 이 모델로 구매했는데 알고보니 많은 무선랜카드들이 ARM보드에서 지원이 되더군요..

덕분이 이 무선랜카드는 무려 영국에서 직수입해왔습니다.


그리고 실내에서 개발 할 때는 이렇게 유선랜을 연결하여 개발하였습니다.


나중에는 쿼드콥터를 실외에서 테스트 할 때 도망가지 못하게 하기 위해 아예 랜선을 연결하고 쿼드콥터에 칭칭감아서 고정시킨 후 강아지 목줄처럼 사용하자는 의견도 나왔었지만 실내테스트를 마지막으로 테스트는 하지 못하였습니다.



마지막으로 제 개발환경입니다.





저는 자리가 여러개 있어서 쿼드콥터 개발하는 자리, 납땜하는 자리, 소프트웨어 개발하는 자리 이렇게 있었는데 


그 중 쿼드콥터를 가장 많이 만졌던 자리의 사진을 올려보았습니다.


사실 굉장히 더러웠었는데 사진찍기전 많이 치웠습니다^^



마무리를 지으면서


프로젝트 기간은 많이 짧았는데 지금 생각해보면 굉장히 긴것 같았고 재밌었던 시간이었습니다.


지금은 그 회사에서도 나왔고 팀원도 다 흩어진 상태지만 나중에 여유가 되게 된다면 다시 이어서 진행해보고 싶은 프로젝트 입니다.


이 때 개발했던 쿼드콥터는 제가 집으로 가져와 지금 책장 위에 먼지만 쌓이고 있네요


요즘은 다시 먼지를 털고 항공촬영용 Gimbal을 달아 다시한번 날려볼까 합니다.


언젠간 제가 만든 드론 제어 시스템으로 집에 앉아서 외국을 돌아다녀 볼 수도 있었으면 좋겠네요^^

[본 글은 드론 파일럿 커뮤니티 서비스 종료로 이관된 글 입니다]

[작성일 : 2015.01.26 01:26]


DJI F450 NAJA M PWM Signal Analysis


DJI F450 의 조종신호를 분석해 본 내용에 대해 정리 해보았습니다.


처음에 제가 DJI F450을 구매를 했을땐 Futaba 조종기와 연결이 되있었습니다.


최종적인 목표는 쿼드콥터를 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가 노란색(조종기 탐색중)에서 초록색(조종기 찾음)으로 바뀌었습니다.


잘 인식되는것을 확인하고 아두이노를 종료시키니 F450 LED가 빨간불로 바뀌며 조종기 연결이 끊어졌다는걸 표시합니다.





일단 임시로 이렇게 올려두었는데 실제 비행때는 잘 고정시켜야 할 듯 합니다.



그리고 이제 실제 조종을 위해 아두이노 코드를 실제 사용을 위해 ARM보드에서 보내오는 조종신호를 NAJA-M 컨트롤러로 보내는 코드로 프로그래밍 한 뒤 ARM 보드에 연결하고 Ubuntu 위에 간단한 Python 서버와 PC에서 C#으로 클라이언트를 만들었습니다.






위의 사진은 PC에서 조이스틱을 통해 쿼드콥터를 조종하게 해 줄 클라이언트 입니다.


이 사진은 프로젝트가 많이 진행되었을 때의 사진인데 이해를 위해 가져왔습니다.


ARM보드에 카메라를 달아 실시간 영상도 볼 수 있습니다.






오른쪽에 숫자가 많은것이 ARM보드에 올라가있는 Python 서버로 가운데 PC 클라이언트에서 보내는 조종신호를 받아 아두이노로 전송하여 최종적으로 쿼드콥터를 조종하게 됩니다.


내부망에서 테스트를 해서 딜레이는 거의 없었고 아주 매끄럽게 잘 조종되었습니다.


이제 이 코드를 응용해서 실제 비행을 위한 코드를 만들면 될 것 같습니다.




- 첨부


DJI NAZA-M 컨트롤러 제어에 사용된 아두이노 코드입니다.


https://github.com/taylor224/DJI-Naja-M-Remote-Controller/blob/master/arduino.c


아두이노에 해당 코드를 컴파일하여 넣어주신후


아두이노 디지털 핀 2, 3, 4, 5, 6, 7, 8 번 포트에 각각 DJI NAZA-M 의 


AILE, ELEV, THRO, RUDD, MODE, AUX1, AUX2 와 연결하여 주시면 됩니다.


그리고 NAZA-M 컨트롤러의 접지( - 단자) 를 아두이노의 GND(Ground) 에 연결하여 주셔야 합니다.


NAZA-M 의 AILE 등 조종기를 연결하는 부분의 핀이 2개씩 있는데 그 중 어떤핀이 접지이고 어떤핀이 신호를 넣는 핀인지 확인을 하셔야 합니다.



위처럼 하신 후 아두이노를 115200bps 시리얼로 연결하신 후 아래와 같은 신호를 보내주시면 됩니다.


>1000:1000:1000:1000:1/


> 는 시작을 뜻하고 /는 끝을 뜻합니다.

순서는 첫번째부터 AILERON, ELEVATOR, THROTTLE, RUDDER, MODE 입니다.

값은 0~1000 까지 있습니다.


MODE와 THROTTLE을 제외한 모든값은 위에서 말한 방식이 적용됩니다(왼쪽은 높은값, 오른쪽은 낮은값).

예시: 

왼쪽으로 최대 1000

오른쪽으로 최대 0


THROTTLE 의 경우 0이 최저 1000이 최대입니다.


MODE 는 1 (GPS) , 2 (Attitude) , 3 (Manual) 입니다.


멀티콥터 모터 시동은 일반 조종기처럼 신호를 보내주시면 됩니다.

BMW i3 i8 Alert Sound & Startup Sound


System Start Sound




Alert Sound 1




Alert Sound 2




Original Alert Sound





Please record clearly and send these sound to me if you have i3 or i8.


BMW i3 i8 시스템 엔진 시동 사운드 소리

BMW i3 i8 경고음 알림음 알림 경고 소리




Download







Kinect For Windows V2 로 특정 좌표의 Z값(깊이)를 가져오는 코드입니다.


이 코드를 통해 x, y 값으로 z 값을 가져오실수 있습니다.


X, Y 좌표는 ColorFrame 의 해상도인 1920x1080 기준입니다.


Z 값은 Float 으로 리턴되며 키넥트 센서로부터의 미터 거리를 뜻합니다.


먼저 이 코드를 사용하시려면 Kienct for Windows V2 센서와 Kinect SDK 2.0, Visual Studio 2013 이 필요합니다.


이 코드는 WPF 프로그램의 소스 일부이며 사용하실때 자신의 코드에 맞게 수정하시어 사용하시기 바랍니다.


MapColorFrameToCameraSpace() 함수가 아래처럼 매번 프레임이 들어올때마다 실행될 경우 프로그램이 많이 느려지는 영향이 있으므로 주의하시기 바랍니다.



더 자세한 설명은 이 링크에서 영문으로 확인하실수 있습니다.

https://gist.github.com/taylor224/1a534cb9287a4205c91f




public partial class MainWindow : Window
{
private KinectSensor kinectSensor = null;
private CoordinateMapper coordinateMapper = null;
private MultiSourceFrameReader multiFrameSourceReader = null;
public MainWindow()
{
InitializeComponent();
// one sensor is currently supported
this.kinectSensor = KinectSensor.GetDefault();
// get the coordinate mapper
this.coordinateMapper = this.kinectSensor.CoordinateMapper;
// get the depth (display) extents
FrameDescription colorFrameDescription = this.kinectSensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra);
FrameDescription frameDescription = this.kinectSensor.DepthFrameSource.FrameDescription;
// open multiframereader for depth, color, and bodyindex frames
this.multiFrameSourceReader = this.kinectSensor.OpenMultiSourceFrameReader(FrameSourceTypes.Depth | FrameSourceTypes.Color | FrameSourceTypes.Body);
this.multiFrameSourceReader.MultiSourceFrameArrived += this.Reader_MultiSourceFrameArrived;
}
private void Reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
MultiSourceFrame multiSourceFrame = e.FrameReference.AcquireFrame();
if (multiSourceFrame != null)
{
using (DepthFrame depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame())
{
if (depthFrame != null)
{
// Specified X, Y coordinate
// In 1920 x 1080 color frame
double x = 1000;
double y = 900;
FrameDescription depthFrameDescription = depthFrame.FrameDescription;
depthWidth = depthFrameDescription.Width;
depthHeight = depthFrameDescription.Height;
depthframeData = new ushort[depthWidth * depthHeight];
depthFrame.CopyFrameDataToArray(depthframeData);
CameraSpacePoint[] csp = new CameraSpacePoint[1920 * 1080];
this.coordinateMapper.MapColorFrameToCameraSpace(depthframeData, csp);
// Depth(Z Position) of specified coordinate
float DepthPosition = csp[(1920 * Convert.ToInt16(y)) + Convert.ToInt16(x)].Z;
}
}
}
}
}