본문 바로가기

[아두이노] USB HOST SHIELD - 입/출력 테스트(feat. 안드로이드폰)

by rudals.kim 2021. 1. 6. 댓글 개
반응형

USB Host Shield 라이브러리에서 제공되는 demokit_20.ino 예제는 안드로이드 폰과 USB Host Shield간의 입/출력 테스트를 할 수 있는 좋은 예제라 생각되어 테스트 해 보았습니다.

 

이전의 예제는 데모용 안드로이드 앱을 같이 제공되고 있는데 이번 예제는 데모용 안드로이드 앱을 제공 해 주고 있지 않습니다.

 

그래서 제 입맛에 맞게 안드로이드 어플을 만들어 보았습니다.

 

Android Studio - ConstraintLayout 사용하기

오랜만에 안드로이드 어플리케이션을 작성할 필요가 있어서 살펴보니 그간 많은 것이 바뀌었네요. 제가 마지막으로 안드로이드 어플리케이션을 작성했으때만 해도 이클립스에서 android sdk를 설

rudalskim.tistory.com

 

Android Studio - USB Accessory 사용하기

안드로이드 USB에는 액세서리 모드라는 것이 있는데, 이를 사용하여 사용자는 Android 지원 기기용으로 특별히 설계된 USB 호스트 하드웨어를 연결할 수 있습니다. 어떤식으로 사용 할 수 있는지는

rudalskim.tistory.com

아래는 제공되는 예제인데 LED와 버튼을 한개씩 사용하여 Host Shield와 안드로이드 폰과 양방향으로 데이터를 전송하여 처리되고 있는것으로 보입니다.

#include <adk.h>
#include <usbhub.h>

// Satisfy IDE, which only needs to see the include statment in the ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>

USB Usb;
USBHub hub0(&Usb);
USBHub hub1(&Usb);
ADK adk(&Usb, "Google, Inc.",
              "DemoKit",
              "DemoKit Arduino Board",
              "1.0",
              "http://rudalskim.tistory.com",
              "0000000012345678");
uint8_t  b, b1;


#define LED1_RED          3
#define BUTTON1           2

#ifdef ESP32
#define LED1_RED_CHANNEL  0
#endif

void init_buttons()
{
  pinMode(BUTTON1, INPUT);

  // enable the internal pullups
  digitalWrite(BUTTON1, HIGH);
}

void init_leds()
{
  digitalWrite(LED1_RED, 0);

#ifdef ESP32
  ledcAttachPin(LED1_RED, LED1_RED_CHANNEL); // Assign LED pin to channel 0
  ledcSetup(LED1_RED_CHANNEL, 12000, 8); // 12 kHz PWM, 8-bit resolution
#else
  pinMode(LED1_RED, OUTPUT);
#endif
}

void setup()
{
  Serial.begin(115200);
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
  Serial.println("\r\nADK demo start");

  if (Usb.Init() == -1) {
    Serial.println("OSCOKIRQ failed to assert");
    while (1); //halt
  }//if (Usb.Init() == -1...

  init_leds();
  init_buttons();
  b1 = digitalRead(BUTTON1);
}

void loop()
{
  uint8_t rcode;
  uint8_t msg[3] = { 0x00 };
  Usb.Task();

  if ( adk.isReady() == false ) {
#ifdef ESP32
    ledcWrite(LED1_RED_CHANNEL, 255);
#else
    analogWrite(LED1_RED, 255);
#endif
    return;
  }
  uint16_t len = sizeof(msg);

  rcode = adk.RcvData(&len, msg);
  if ( rcode ) {
    USBTRACE2("Data rcv. :", rcode );
  }
  if (len > 0) {
    USBTRACE("\r\nData Packet.");
    // assumes only one command per packet
    if (msg[0] == 0x2) {
      switch ( msg[1] ) {
        case 0:
#ifdef ESP32
          ledcWrite(LED1_RED_CHANNEL, 255 - msg[2]);
#else
          analogWrite(LED1_RED, 255 - msg[2]);
#endif
          break;
      }//switch( msg[1]...
    }//if (msg[0] == 0x2...
  }//if( len > 0...

  msg[0] = 0x1;

  b = digitalRead(BUTTON1);
  if (b != b1) {
    USBTRACE("\r\nButton state changed");
    msg[1] = 0;
    msg[2] = b ? 0 : 1;
    rcode = adk.SndData( 3, msg );
    if ( rcode ) {
      USBTRACE2("Button send: ", rcode );
    }
    b1 = b;
  }//if (b != b1...


  delay( 10 );
}

 

아래와 같이 회로를 구성하였습니다.

안드로이드폰과 USB Host Shield를 USB 케이블로 서로 연결시킵니다.

제대로 연결이 되면 "USB 액세서리에 연결됨"이라고 팝업창이 나타납니다.

ArduinoDemo 앱을 실행 시킵니다.

 

앱의 가운데 슬라이드바를 조절하면 아두이노의 LED의 밝기가 변하며, 아두이노에 연결된 버튼을 누르면 안드로이드 앱의 LED 이미지가 켜진 이미지로 변경됩니다.

아래는 테스트된 동작 영상입니다.

 

반응형

댓글