안드로이드 기기에서 CAN 및 UART 통신 사용

  집에 안쓰는 안드로이드 기기가 몇개 굴러다닌다.
사실 안드로이드 기기를 제어 용도로 사용해 보려고 보관 하고 있던 것들인데 바빠서 손을 못대고 있다가 이번에 건드려(?) 보았다.

  안드로이드 기기의 경우 구형 모델이라 할지라도 하드웨어 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까지 연동이 되니 기쁘지 아니한가...