다음 1과 같은 정보를 UART로 송출하는 센서노드가 있습니다.
접속 설정은 2와 같습니다.
안드로이드로 센서노드에서 보내는 정보를 모니터링 하는 앱을 개발하려 합니다.
PC 에서는 그림과 같이 UART로 모니터링이 잘되지만
안드로이드 앱으로는 어떠한 방법으로 구현을 해야할지 잘모르겠습니다.
이것저것 찾아본결과 UsbAccessory 나 Usb host 를 사용하여서 통신하는 방법이 있던데
위와같은 상황에서도 적용이 되는지가 궁금합니다.
많은 답변 부탁드립니다..
덧1. 찾아보니 안드로이드 퍼미션 문제 때문에 루팅을 하는 방법도 있던데, 사정상 루팅하는 방법은 힘들것같습니다.
덧2. 개발 환경은 갤럭시 S2, 안드로이드 버전 4.0.3 입니다.
덧3. 가입하고 처음 작성하는 글이라 질문글의 형식에 맞는지 모르겠습니다.( 공지사항은 읽어봤습니다.)
//매발톱
답변 감사합니다.
답변중에 이해가 안가는 부분이 2군데 있는데..
/* UsbControllerActivity.java */
...
public static class DeviceID {
//새로운 클래스파일을 생성하여 새로운 클래스를 만드는건지..
//public DeviceID(int vid, int pid) 메소드만 필요한건지 이해가 잘 안됩니다..
int VID;
int PID;
public DeviceID(int vid, int pid) {
VID = vid;
PID = pid;
}
}
...
devices.add(new DeviceID(arduVID, arduPID)); <-- divices 가 뭘뜻하는지를 모르겠습니다.
devices.add(new DeviceID(ftdiVID, ftdiPID));
devices.add(new DeviceID(cp2102VID, cp2102PID));
답변 부탁드립니다.
갤럭시 s2 는 usb 호스트 기능이 있으니까 usb-to-serial 변환젠더와 otg 케이블이 있으면 가능합니다. 이것들은 시중에서 쉽게 구할 수 있습니다.
센서 노드는 usb 를 지원하더라도 보통 값싼 usb-to-serial 칩을 사용하기 때문에 usb host 기능이 없습니다. 대신, 안드로이드 기기가 otg 또는 usb host 기능을 가지고 있으면 통신이 가능합니다. (사실 안드로이드 기기에서 ADK 같은 걸 사용하려면 usb host 기능을 가진 아두이노 보드와 연동되어야 하는데, 이런 보드가 전세계에 얼마나 될까요. 그래서 ADK 와 같은 건 별로 실용성이 없죠)
안드로이드에서 usb 호스트 통신 방법에 대한 자세한 설명과 예제 프로그램은 다음 링크를 참고하세요.
http://android.serverbox.ch/?p=549
그리고, uart 통신을 하기 전에 usb 프로토콜을 통해 전송 속도 등의 속성을 설정해야 하는데, 센서 노드 또는 usb-to-serial 변환젠더는 링크의 아두이노보드 대신 ftdi 나 cp2102 와 같은 usb-to-serial 칩을 사용하기 때문에 예제 프로그램의 소스코드를 수정해야 합니다. 다음 코드를 참고하세요.
/* UsbControllerActivity.java */
...
public static final int arduVID = 0x2341;
public static final int arduPID = 0x0001;//I believe it is 0x0000 for the Arduino Megas
public static final int ftdiVID = 0x0403;//FTDI
public static final int ftdiPID = 0x6001;//FTDI
public static final int cp2102VID = 0x10C4;//CP2102 Silicon Labs factory default
public static final int cp2102PID = 0xEA60;//&0xEA61 CP2102 Silicon Labs factory default
public static class DeviceID {
int VID;
int PID;
public DeviceID(int vid, int pid) {
VID = vid;
PID = pid;
}
}
...
devices.add(new DeviceID(arduVID, arduPID));
devices.add(new DeviceID(ftdiVID, ftdiPID));
devices.add(new DeviceID(cp2102VID, cp2102PID));
/* UsbController.java */
...
if (!conn.claimInterface(mDevice.getInterface(mDevice.getInterfaceCount()-1), true)) {
return;
}
// Arduino Serial usb Conv
if (mDevice.getVendorId() == UsbControllerActivity.arduVID
&& mDevice.getProductId() == UsbControllerActivity.arduPID) {
conn.controlTransfer(0x21, 34, 0, 0, null, 0, 0);
conn.controlTransfer(0x21, 32, 0, 0, new byte[] { (byte) 0x80,
0x25, 0x00, 0x00, 0x00, 0x00, 0x08 }, 7, 0);
}
// FTDI Serial usb Conv
else if (mDevice.getVendorId() == UsbControllerActivity.ftdiVID
&& mDevice.getProductId() == UsbControllerActivity.ftdiPID) {
conn.controlTransfer(0x40, 0, 0, 0, null, 0, 0);//reset
conn.controlTransfer(0x40, 0, 1, 0, null, 0, 0);//clear Rx
conn.controlTransfer(0x40, 0, 2, 0, null, 0, 0);//clear Tx
conn.controlTransfer(0x40, 0x03, 0x4138, 0, null, 0, 0);//baudrate 9600
}
// CP2102 Serial usb Conv
else if (mDevice.getVendorId() == UsbControllerActivity.cp2102VID
&& mDevice.getProductId() == UsbControllerActivity.cp2102PID) {
conn.controlTransfer(0x41, 0, 1, 0, null, 0, 0);//enable
conn.controlTransfer(0x41, 0x07, 0x0303, 0, null, 0, 0);//RTS & DTR set low
conn.controlTransfer(0x41, 0x01, 384, 0, null, 0, 0);//baudrate 9600 (0x384000/9600)
}
UsbInterface usbIf = mDevice.getInterface(mDevice.getInterfaceCount()-1);
...