안드로이드 스튜디오

알기 쉬운 안드로이드 스튜디오 블루투스 아두이노 LED ON OFF 예제

coding art 2020. 4. 9. 17:14
728x90

파이선 코딩 초보자를 위한 텐서플로우∙OpenCV 머신 러닝 2차 개정판 발행

https://blog.daum.net/ejleep1/1175

 

파이선 코딩 초보자를 위한 텐서플로우∙OpenCV 머신 러닝 2차 개정판 하이퍼링크 목차 pdf 파일

본서는 10월 26일 교보문고 퍼플 POD 출판 신청하였습니다. 일정 기간 검토 후 출판 결정이 될 것이며 11월 초부터 주문 구입이 가능합니다. 참고로 책 목차에 따른 내용별 학습을 위한 코드는 이미

blog.daum.net

________________________________________________________________________________________________

최근 Remake 된 버전을 읽으세요.

http://blog.daum.net/ejleep1/1280

 

안드로이드 스튜디오에서 꼭 작성해보고 싶은 코드가 바로 무선 WiFi 라든지 또는 Blurtooth 통신일 것이다. 주어진 순서대로 따라해서 100% 성공하세요.

 

ListView를 충분히 연습했으면 ListView 기법을 사용하는 블루투스 코드를 다루어 보기로 한다. 스마트 폰 간의 사진파일 전송 기법이 있을 수 있으나 그 보다 간단한 블루투스 클라이언트 응용으로서 스마트폰에서 원격으로 아두이노 우노 보드의 13번 붙박이 LEDToggle 방식으로 ON/OFF 하고 아울러 아두이노로부터 문자열 Count + 숫자를 Read Buffer에서 출력해 보기로 한다. 물론 이 정도의 블루투스 LED on/OFF 코드는 앱 인벤터에서 아주 쉽게 코드 작성이 가능하긴 하지만 그래도 원조 격인 안드로이드 스튜디오를 사용하여 블루투스를 실행해 본다는 것은 코드 작성 능력 향상에 상당히 큰 도움이 되리라 본다.

 

스텝 1. Android.Manifest.xml MainActivity.java에서 프로젝트 명 처리

안드로이드 스튜디오 앱 프로젝트명을 “BT”로 정의하고 “Empty“ 템플리트를 클릭하자. 만약 사용자가 BT 코드를 복사 붙여넣기 할 계획이라면 최소한 자신의 앱프로젝트 명을부여 후 그 프로젝트 명이 영향을 미치는 파일을 수정해야 할 필요가 있다. Android.Manifest.xml에서는 다음과 같이 자신이 부여한 앱 프로젝트 명이 처리되어 있음을 확인 할 수 있으며 MainActivity.java 파일의 첫줄에서도 앱 프로젝트 명이 같아야 함을 알 수 있다.

 

아울러 스마트폰의 bluetooth 통신을 위해서는 아래에서 볼 수 있는 것처럼 임시로 단말기 통신하드웨어 사용 승인(uses-permission)을 받아야 할 것이다. 이와같이 세부적인 코딩에 앞서 전체 시스템적인 설정을 Android.Manifest.xml에서 처리해야 하는 것이다.

 

스텝 2. reslayoutactivity_main.xml 레이아웃의 padding 디자인

스마트 폰 화면 전체를 “matched_parent” 로 설정 후 좌우 상하 padding10 dp로 설정 하자. 애초에는 “10dp” 대신 “@dimen/activity_horizontal_margin @dimen/activity_vertical_margin 으로 입력 표현되어 빨간 색으로 표현되어 있다    하지만 Alt+Enter “Create dimen value ∙∙∙을 더블 클릭하자.

 

그림과 같이 values 입력 창이 나타난다. 아래 위 양 옆 마진을 10dp 로 입력하면 values 폴더 밑에 dimens.xml 이 생성되며 빨간 색이 초록색으로 바뀐다.

 

반면에 단순하게 다음과 같이 직접 “10dp”를 입력해도 무방하다.

 

스텝 3. activity_main.xml 레이아웃 CheckBox layout_alignStart=@id+ /bluetoothStatus 디자인

 이 부분은 아래 그림에서처럼 코드 완성 후 실행 시에 확인이 가능하다. Status 항 뒤에 출력되는

<Bluetooth Status> 내용이 체크 박스 왼쪽 부분 즉 RX 와 Status와 연동된다는 의미이다

스텝 4. TextView

  

RX: , <Read Buffer>를 디스플레이 하지만 이번 예제의 특성 상 Toggle 신호를 아두이노에게 블루투스 송신 작업을 하지만 거꾸로 아두이노로부터 정보를 받아 오는 일이 없어 이 부분은 변동이 전혀 없지만 Status:,<Bluetooth Status> 부분은 스마트폰 상황에 따라 상황이 디스플레이 된다바로 앞 그림에 3가지 경우가 나타나 있다. Enabled, Bluetooth disabled, Connected to Device:HC-06 3종류 메시지이다.

 

놀리고 있는 <Read Buffer> 를 활용하여 아두이노 우노 보드에 DHT11 온습도 센서를 설치하고 아두이노 스케치를 수정 후 온습도 값을 전송 받아 디스플레이 해 보자. 별도로 아래 url의 블로그를 참조하자.

http://blog.daum.net/ejleep1/1294

 

스텝 5. ON, OFF, SHOW PAIRED DEVICES, DISCOVER NEW DEVICES 버튼

실제 블루투스를 작동시키기 위해서는 다음 그림의 빨간 색 동그라미 친 부분을 직접 클릭하여 블루투스를 ON OFF 시키지만 이 부분을 코드화 하였으므로 BLUETOOTH on, OFF 버튼이 그 역할을 수행한다.

  

스텝 6. 주변 블루투스 중 하나와의 Pairing ID 출력

 주변에 산재한 블루투스들이 ListView 에 의해 리스팅 되면 그 중에 하나를 선택 클릭하여 Connected to Device:HC-06 상태를 만들어야 블루투스 통신이 가능해 진다. 현재의 디바이스와의 통신을 끓고 다른 디바이스를 찾아서 통신하려면 NEW DEVICES 버튼을 사용해야 한다.

통신 연결이 되면 체크박스 크릭에 의해 Toggle 신호를 아두이노 보드에 보낼 수 있다.

 

스텝 7. ListView 설치

마지막 부분에 ListView를 설치하자. ListView 는 경우에 따라서 주변에 블루투스 소스들이 대단히 많으면 스크롤하여 원하는 소스를 찾아서 선택 클릭해야 한다. ListView 관련 MainActivity에서의 코딩은 항상 3개 요소 즉 저장을 위한 ArrayList, 리스팅 할 디바이스 데이터 및 연결을 위한 Adapter 를 준비해야 한다. 여기까지가 activity_main.xml 코딩이다.

 

스텝 8. MainActivity.java의 변수 멤버

스마트폰에서의 블루투스 통신 코드 실행은 동시 다발적인(concurrently multi-threaded) 특성을 가지고 있다. 즉 매 순간 마다 스마트 폰 화면의 업데이트를 진행하는 하나의 메인 코드 (main thread) 실행만으로 끝나는 것이 아니다. 항상 별도로 내부에서 블루투스 데이터의 수신 및 송신을 담당하는 background worker thread mConnectedThread가 있어 메인 코드와의 협업을 담당하는 Handler를 통해 데이터를 넘겨주거나 받게 된다. 이 작업이 원활하게 이루어지지 않으면 그래픽 병목현상이 발생하여 스마트 폰 화면이 반응하지 못하게 되므로 싱크로를 위해 scheduler에 의해 통제를 받아야 할 것이다.

 

이와 같은 블루투스 코드 실행은 매번 반복 때 마다 스마트폰 화면 시작 단계의 onCreate 이벤트를 감청(Listen)함과 아울러 화면 상의 텍스트 업데이트 상황을 처리할 수 있도록 Graphic User Interface(GUI)를 구성하는 모든 아이템들을 MainActivity Class에서 한 번에 참조할 수 있도록 모았다. 이 부분은 코딩이 아니라 디폴트로 넣어두어야 하는 내용이다.

스텝 9. MainActivity.javaonCreate 이벤트 처리

첫 번째 @overideprotected void onCreate을 검토해 보자. protected 이므로 subClass 범위까지 공유가 가능하다. 다시 말하자면 @이하 override 되는 부분이 subClass 라면 그 상위의 superClass가 있을것이므로 overide 즉 연동시킨다는 뜻이다. 즉 @ 기호가 들어가야 빌드를 담당하는 Compiler 가 알아 먹을 수 있게 된다.

구성 내용을 보면 첫 부분에 스마트 폰 화면 에서 처리해야 하는 모든 정보를 처리하기 위한 변수 값을 가져 오게 된다. 쉽게 말하자면 아두이노에서 setup( ) 과 유사한 기능에 해당한다.

스텝 10. 아울러 Handler 에 의해서 Read Buffer BluetoothStatus 값을 처리할 수 있도록 msg.what MESSAGE_READ 인지 아니면 CONNECTING_STATUS 인지에 확인한다. MESSAGE_READ 라면 문자열 버퍼 readMessge를 체크하여 mReadBuffer에 저장하도록 한다.

스텝 11. 그리고 CONNECTING_STATUS 경우에는 mas.arg1을 체크하여 “1”이면 “Connected to Device”“1”이 아니면 “Connection Failed”<Bluetooth Status>에 디스플레이 하도록 한다.

 

스텝 12. 아울러 mBTArrayAdapter null 로 체크 되면 해당 메시지를 mBluetoothStatus 뿐만 아니라 아예 Toast 디스플레이까지 해버리자.

스텝 13. 반면에 mBTArrayAdapter null 이 아니라면 즉 다음의 5가지 중 어느 하나의 블루투스 작업을 진행하자. mLED1.setOnClickListner 는 블루투스로 아두이노 보드의 LEDToggle 하는 명령을 실행한다.

스텝 14. mScanBtn.setOnClickListener는 스마트 폰의 위부분에 위치하고 있는 블루투스 스위치를 코드에 의해서 ON 시키는 명령이며 mOffBtn.setOnClickListener는 그 반대이다. 나머지 버튼을 포함하여 블루투스를 사용해 본 경험이 있다면 그 기능을 쉽게 이해 할 수 있을 것이다.

                                                              

스텝 15. 아두이노 블루투스 코딩

아두이노 우노 보드에서 핀 01번을 사용해서 HC-06 블루투스 배선을 하자. 하지만 01번 배선을 제거한 상태에서 업로딩을 완료하고 01번 점프선 배선을 완료하자. 전원이 ON 되어 있으면 블루투스 페어링이 이루어지기 전까지는HC-06LED 가 다소 빠르게 점멸 한다. 안드로이드 스마트폰과 페어링이 이루어지면 점멸이 멈추게 된다.

다음의 블루투스 데모 유튜브 영상 참조하세요. 구독 좋아요 꼭 부탁드려요!

https://youtu.be/0IfNtPE0wyw

 

첨부된 안드로이드 스튜디오 코드를 다운받아 실행해 보자. 2년 전과 동일한 내용이지만 최신 안드로이드 스튜디오에서 업그레이드 되었음을 참조하세요.

MyBluetooth.zip
0.14MB

 

 

첨부된 아두이노 코드도 복사하여 활용하자.

//BT_LED_Toggle.ino

//LED Toggle by Android Bluetooth
unsigned long previousMillis = 0; // will store last time
const long interval = 3000;// interval at which to delay
static uint32_t tmp; // increment this

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  if (Serial.available()) { // check if anything in UART buffer
    if(Serial.read() == '1'){ // did we receive this character?
       digitalWrite(13,!digitalRead(13)); // if so, toggle the onboard LED
    }
  }
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    Serial.print("Count: ");
    Serial.print(tmp++); // print this to bluetooth module
  }
}//끝

 

이 코드를 사용하여 RC CAR 조종을 위한 앱코드 작성을 원하면 아래 블로그 첨부 코드를 참조하기 바란다.

http://blog.daum.net/ejleep1/1285