사실 안드로이드 기기를 제어 용도로 사용해 보려고 보관 하고 있던 것들인데 바빠서 손을 못대고 있다가 이번에 건드려(?) 보았다.
안드로이드 기기의 경우 구형 모델이라 할지라도 하드웨어 FPU에 멀티코어, 클럭 속도는 보통 1GHz이상으로 제어용으로 쓰기에는 차고 넘치는 성능이다.
심지어 GPS와 IMU센서에 나침반 센서도 내장되어 있다.
다만 안드로이드 어플리케이션이 Dalvik이라는 자바 가상 머신위에서 돌아가므로 CPU 성능이 좋다하더라도 제어 코드를 Dalvik위에서 돌아가는 Java 어플리케이션으로 만들면 원하는 만큼의 성능이 나오지 않을 수 도 있다.
처음 접근은 Dalvik을 걷어내고 GUI는 리눅스 프레임버퍼에 직접 접근하는 QT나 SDL같은 라이브러리를 사용하려 했으나, 제어코드 몇 줄 돌릴려고 엄청난 삽질을 해야하는 상황이 발생 되었다.
조금더 검색을 해보니 나와같은 변태들을 위해 구글에서 NDK라는 툴을 제공한다는걸 알게 되었다.
NDK (Native Development Kit)는 안드로이드 시스템의 리눅스레벨, 즉 Dalvik과 관련없이 안드로이드의 리눅스용으로 빌드하여 안드로이드 기기에서 동작 가능하도록 만들어 주는 개발 툴이다.
다만, 단독 사용은 안되고 라이브러리 형태로 만들어서 Dalvik용 어플리케이션에 종속되어 동작하는 구조이다.
사용자 인터페이스 GUI는 Dalvik에서 돌아가는 Java 어플리케이션 (안드로이드 앱)으로 만들고 고속 혹은 Soft-Realtime 태스크가 필요한 제어의 코어 부분은 NDK로 만들어 접근하면 될듯 하다.
외부 제어를 하려면 우선 외부와 통신을 해야하니 안드로이드 4.0부터 제공하는 USB-HOST기능을 활용하여 'USB to CAN' 및 'USB to UART' 하드웨어를 부착하여 통신 연동시험을 해봤다.
CAN이나 UART만 뚫려도 왠만한 제어 연동은 가능해 진다.
우선 'USB to CAN' 컨버터 하드웨어를 하나 구했는데 요놈은 파이썬으로 동작시키는 용도로 드라이버에 접근하는 C API나 예제 소스하나 제공하지 않는다.
하는 수 없이 DLL 호출 및 USB transaction을 리버싱하여 USB control/bulk transfer 데이터 포멧을 찾아내 분석하고 NDK에 쑤셔 넣었다.
C와 Java를 왔다갔다 하며 코딩/디버깅 할라니 아주 지랄맞게 즐겁다.
[그림 1. 앱 및 NDK 동작]
[그림 2. PC 측 USB to CAN 연동 화면]
시험은 안드로이드 기기에 'USB to CAN'하드웨어를 부착하고 NDK가 포함된 앱을 실행 시킨다 (그림 1). 반대쪽은 일반 PC에 같은 'USB to CAN'하드웨어를 부착하여 서로 CAN 패킷을 주고 받는 테스트를 하였다 (그림 2).
잘 되는군...
껌이네?
해보세요 정말정말 쉽습니다. 손가락만 까딱거리면 됩니다. 흐흐
혹시 이글 보시는 관리자분들, 실무자들한데 '봐~~ 쉽대잖아' 하시면 산채로 땅에 묻히는 수가 있습니다.
[그림 3. 실제 타겟 디바이스 XT-60]
[그림 3. USB to CAN 컨버터 부착]
실 타겟 디바이스는 XT-60이라는 싸구려(?) 타블렛을 사용했다.
Soft-Realtime 태스크는 NDK상에서 생성하였으며 CAN 디바이스에 접근하여 CAN 패킷을 주고 받도록 구성하였는데 수[ms] 주기에 대해서도 잘 동작되었다.
나쁘지 않군...
'USB to UART'도 NDK를 구성하여 테스트 해보았는데 잘 동작한다.
FTDI칩셋 기반은 리눅스용 디바이스 드라이버 소스가 공개되어있어 안드로이드 NDK용으로 포팅하는데 좀 수월했다.
내장된 센서가 많아 장비나 로봇에 직접 탑재해서 사용해도되고, 외부 점검/검사/제어용 펜던트등으로 활용해도 좋을꺼 같다.
카메라도 있으니 능력되면 영상기반 제어까지...
CAN, UART에 WIFI까지 연동이 되니 기쁘지 아니한가...
안녕하세요 글 잘 봤습니다. 저도 지금 태블릿에 can 통신을 시도하려고 하는데
답글삭제제가 자바에 대한 지식이 없어서 고생중입니다.
지금 hello world 를 제 태블릿에서 보는 것 까지 했는데 그 이상은 어떻게 코드를 짜야하는 지 모르겠습니다. ㅜㅜ 혹시 코드를 어디서 참고 하셨는지 알려주실 수 있나요??
사실은 만드신 코드를 받고 싶은데 가능할까요...?? 염치없는 부탁 죄송합니다 ㅜㅜ
일과 관련된 코드가 엮여 있어 코드 공유는 불가함을 양해 부탁드립니다.
삭제안드로이드 USB-OTG 혹은 USB-HOST 관련 자바 코드는 많이 공개 되어 있습니다.
USB통신을 위한 자바 API 메뉴얼도 안드로이드 사이트 가면 잘 설명 되어 있습니다.
자바로 USB 통신을 하는 앱과 소스도 검색해 보면 많습니다.
자바를 이용해 USB 장치와 연동하는 것은 어렵지 않을 것입니다.
자바가 익숙치 않다면 익숙해져야 함은 당연하겠지요?
NDK를 이용해 USB 통신을 하고자 하신다면 libusb에 익숙하셔야 합니다.
리눅스나 윈도우 C/C++ 프로그래밍으로 libusb를 먼저 접하시고, 그 다음 안드로이드로 넘어가면 수월 하실 겁니다.
정말 감사합니다!! 자바부터 공부하고 libusb 공부해야겠네요!!
삭제많은 도움이 됐습니다 ^^
건투를 빕니다.
삭제