728x90

안드로이드는 USB 통신을 위한 두가지 모드를 제공 : Host Mode, Accessory Mode


Host mode : 안드로이드 기기가 USB 호스트가 되어 장치에 전원을 공급하는 모드이다.
이 모드를 사용하려면 안드로이드 기기가 OTG를 지원해야 하고 OTG 케이블이 별도로 필요하다.
Android USB Host 모드는 안드로이드 3.1 이상에서 지원
Host 안드로이드 장비는 USB host로서의 역할을 수행하고 전력을 공급하며 연결된 USB 장비를 열거한다.


Interface와 Endpoint를 취득하여만 실제적으로 USB 통신을 진행할 수 있다.

- UsbManager, UsbDevice : device를 받고
- UsbInterface, UsbEndpoint : interface와 endpoint 를 찾고
- UsbDeviceConnection : 연결한다.


bulkTransfer() : 파라미터로 전달되는 Endpoint 방향에 따라서 Bulk Data의 송/수신 작업을 수행
controlTransfer() :  Endpoint Zero(0)로 Control Data의 송/수신 작업을 수행

Accessory mode : 안드로이드 기기가 주변기기가 되고 연결되는 USB 장치가 호스트가 되는 모드이다.


케이블을 구매할 때 별도의 전원이 공급되어야만 동작되는 케이블은 Accessory mode 로 동작한다고 보면 된다.

별도의 전원 공급없이 동작되는 케이블을 구입하는 것이 좋다.


모든 USB 장치는 Vendor ID 와 Product ID를 갖고 있다. 이 두개의 값으로 장치의 종류를 구분할 수 있다.


검색하면 "아두이노와 안드로이드" 연결에 대한 게시글들이 검색된다.

Android Serial 통신 소스코드는 https://github.com/godstale/Arduino-Serial-Controller 를 다운로드 한다.

usbSerialForAndroid 에 코드는 프로젝트에 별도 폴더로 옮기고 import 는 상황에 맞게 수정한다.

소스코드는 수정하지 않고, import 만 변경한다.


arduinocontroller 코드에 나온 4개의 파일을 약간 수정한다.

ArduinoControllerActivity.java 파일 수정

 - OTG Cable이 연결되면 자동으로 찾도록 BroadcastReceiver mUsbDeviceReceiver = new BroadcastReceiver() 에 대한 코드를 구글 검색하여 추가한다.

- Scrollview 시 키보드 입력에 따라 화면이 자동으로 변경되도록 코드를 추가한다.

  https://link2me.tistory.com/1613 게시글에 테스트한 코드를 참조하면 도움된다.

- https://android-er.blogspot.com/2014/03/android-send-command-to-arduino-in-usb.html 게시글을 참조하여

  두 게시글의 코드를 조합하여 만들면 원하는 결과를 얻을 수 있을 것이다.

- 나머지는 구글 플레이 스토어에서 USB Console 을 검색하여 앱을 사용해보고 원하는 기능을 추가한다.

- 핸들러 개념은 https://link2me.tistory.com/1233 참조한다. 좀 부족할 수 있다.

  https://zbomoon.tistory.com/10 참조

  링크된 예제에 구현된 handler 만으로도 충분히 원하는 결과를 얻을 수 있다.


SerialConnector.java 파일 수정

- UsbSerialDriver mDriver, UsbSerialPort mPort 는

   usbSerialForAndroid의 driver 파일과 연관되어 있으므로 모두 ArduinoController 폴더로 복사한다.

- public class SerialMonitorThread extends Thread 내 void run() 코드 중에서

  // Extract data from buffer 부분은 콘솔용으로 사용시에는 별 필요가 없다.

  SerialCommand.java 의 public void addChar(char c) 부분을 약간 수정한다.

public class SerialMonitorThread extends Thread {
    // Thread status
    private boolean mKillSign = false;
    private SerialCommand mCmd = new SerialCommand();

    private void initializeThread() {
        // This code will be executed only once.
    }

    private void finalizeThread() {
    }

    // stop this thread
    public void setKillSign(boolean isTrue) {
        mKillSign = isTrue;
    }

    /**
     *    Main loop
     **/
    @Override
    public void run() {
        byte readBuffer[] = new byte[4096]; // 아두이노 128

        while(!Thread.interrupted()) {
            if(sPort != null) {
                Arrays.fill(readBuffer, (byte)0x00);

                try {
                    // Read and Display to Terminal
                    int numBytesRead = sPort.read(readBuffer, 2000);
                    if(numBytesRead > 0) {
                        Log.d(tag, "run : read bytes = " + numBytesRead);

                        // Print message length
                        Message msg = mHandler.obtainMessage(Constants.MSG_READ_DATA_COUNT, numBytesRead, 0, new String(readBuffer));
                        mHandler.sendMessage(msg);

                    } // End of if(numBytesRead > 0)
                }
                catch (IOException e) {
                    Log.d(tag, "IOException - sDriver.read");
                    Message msg = mHandler.obtainMessage(Constants.MSG_SERIAL_ERROR, 0, 0, "Error # run: " + e.toString() + "\n");
                    mHandler.sendMessage(msg);
                    mKillSign = true;
                }
            }

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }

            if(mKillSign)
                break;

        }    // End of while() loop
        // Finalize
        finalizeThread();
    }    // End of run()
}    // End of SerialMonitorT



나중에 기회되면 https://github.com/felHR85/UsbSerial 를 테스트 해보련다.


'안드로이드 > Android Serial 통신' 카테고리의 다른 글

usbDeviceConnection.controlTransfer  (0) 2019.04.27
Log 파일로 저장하는 코드  (0) 2019.04.25
ScrollView 데이터 자동 화면 표시  (0) 2019.02.19
Android USB Host  (0) 2019.02.15
UART 와 RS232C 개념 이해  (2) 2019.02.14
블로그 이미지

Link2Me

,