반응형

HC-05 / HC-06 블루투스 모듈을 연결한 아두이노 우노와 안드로이드 앱간 블루투스 통신하는 방법을 다루고 있습니다.



1. Arduino Uno와 Android 폰간의 페어링


2. LED 제어 테스트


3. 채팅 테스트



마지막 업데이트 - 2018. 8. 30




진행하기 전에 다음 두 포스팅을 먼저 확인하세요.


1. 아래 포스팅에 있는 안드로이드 앱 소스 코드를 사용하여 폰에 앱을 설치해주세요.



Android와 PC JAVA 프로그램 간 블루투스 통신 예제

http://webnautes.tistory.com/849   




2. 아래 포스팅을 참고하여 아두이노 우노와  HC-05 / HC-06 블루투스 모듈을 연결해주세요.



Arduino Uno에 HC-05 / HC-06 Bluetooth 모듈 연결하여 사용하는 방법

http://webnautes.tistory.com/846





1. Arduino Uno와 Android 폰간의 페어링

Arduino Uno에 HC-05 Bluetooth 모듈 연결하고 소스 코드를 업로드한 상태에서 진행합니다.

LED 제어 테스트 또는 채팅 테스트 소스코드를 아두이노에 업로드하면 됩니다.



1. 안드로이드 폰의 설정에서 블루투스를 활성화해줍니다.





2. 주변에 있는 블루투스 디바이스를 찾기 위해 검색을 터치합니다.





3. HC-05 블루투스 모듈이  검색되면 해당 항목을 선택합니다.





4. PIN 번호 1234를 입력하고 등록을 선택합니다.





5. 잠시후 등록된 기기에 HC-05가 추가됩니다.





2. LED 제어 테스트

1. 아두이노 우노에 다음 코드를 업로드합니다.

아두이노 우노와 PC 간에 테스트 하기 위해 사용했던 코드와 차이가 있으므로 다음 코드로 바꾸어 주어야 합니다.  


#include <SoftwareSerial.h>

SoftwareSerial softwareSerial(2, 3); // RX, TX


void setup() {

 softwareSerial.begin(9600);
 pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {

 if (softwareSerial.available() > 0 ) {


   char command = softwareSerial.read();
   int ledStatus = digitalRead(LED_BUILTIN);

   switch (command){

     case '1':
     
       if (ledStatus == LOW){
         digitalWrite(LED_BUILTIN, HIGH);
         softwareSerial.println("LED가 켜졌습니다.\n");
       }
       else{
         softwareSerial.println("이미 LED가 켜져있습니다.\n");
       }
       break;

     case '2':
     
       if (ledStatus == HIGH){
         digitalWrite(LED_BUILTIN, LOW);
         softwareSerial.println("LED가 꺼졌습니다.\n");
       }
       else{
         softwareSerial.println("이미 LED가 꺼져있습니다.\n");
       }
       break;

     case 'S':
     case 's':
         
       if (ledStatus == LOW){
         softwareSerial.println("LED 상태: 꺼짐\n");
       }
       else {
         softwareSerial.println("LED 상태: 켜짐\n");
       }
       break;
     
   }   
 }
}




2. 안드로이드 앱을 실행하면 페어링된 HC-05가 목록에 보입니다.  선택해줍니다.





3. 연결이 되면 상단에 connected to HC-05라고 표시됩니다.



안드로이드와 아두이노 간에 블루투스 통신 중에는 HC-05 블루투스 모듈의  LED가 두번 연속 깜빡이는 것을 반복하게 되는데 통신이 연결된 상태라는 의미입니다.


안드로이드앱에서 백버튼을 눌러 종료하면  통신이 종료되어 HC-05의 모듈이 연속적으로 계속 깜빡이게 됩니다.




4. 몇가지 테스트해본 결과 입니다.

최근에 주고 받은 문자열이 맨위에 올라오게 됩니다.





3. 채팅 테스트

이번엔 안드로이드와 아두이노 간 서로 문자열을 주고 받는 테스트를 진행합니다.



1. 아두이노에 아래 코드를 업로드해줍니다.


#include <SoftwareSerial.h>

int bluetoothTx = 2;
int bluetoothRx = 3;

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);

void setup()
{
 //Setup usb serial connection to computer
 Serial.begin(9600);
 bluetooth.begin(9600);
}


void loop()
{
 //Read from bluetooth and write to usb serial
 if(bluetooth.available())
 {
   char toSend = (char)bluetooth.read();
   Serial.print(toSend);
 }
 
 //Read from usb serial to bluetooth
 if(Serial.available())
 {
   char toSend = (char)Serial.read();
   bluetooth.print(toSend);
 }
}




2. Android 앱을 실행하여 페어링된 디바이스 목록에서 HC-05를  선택해줍니다.





3. 연결이 되면 상단에 connected to HC-05라고 표시됩니다.





4. 아두이노 IDE의 메뉴에서 툴 > 시리얼 모니터를 선택합니다.

하단에 있는 콤보박스를 새 줄로 변경합니다.





5. 안드로이드앱에서 문자열을 적은 후, SEND를 선택합니다.





6. 시리얼 모니터에 수신된 문자열이 출력됩니다.





7. 이번엔  시리얼 모니터에서 문자열을 적은 후 엔터를 누르거나 전송 버튼을 클릭합니다.





안드로이드에서 받은 한글 문자열이 깨져서 나옵니다.   한글의 경우에만 인코딩 문제가 있는 듯합니다.







반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 ~~

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">
  1. 이전 댓글 더보기
  2. thumbnail
    akius
    2016.05.06 21:00

    저도 같은 증상이에요... akimdh@naver.com
    저두 답변좀부탁드릴게요
    아두이노 시리얼모니터로 보낸 문자는 스마트폰 앱에서는 잘 받아지는데 반대로 스마트폰앱에서 보낸 내용은 폰에만 남고 시리얼모니터에는 안찍혀요...

  3. thumbnail
    supremejin
    2016.07.07 23:29

    오...위에 두분과 같은 질문이에요!

    안드로이드에서 아두이노로는 보내지지만 시리얼 모니터에서 보내는 값은 전혀 안드로이드로 보내지지 않네요...
    저도 같은 답변을 메일로 받아 볼 수 있을 까요?
    supremejin03@naver.com 입니다!!
    감사합니다!!

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.07.08 00:21 신고

      아두이노는 단지 안드로이드에서 받은 문자열 확인하고 해당되는 문자열을 보냅니다..

      지금 코드론 시리얼모니터에서 입력한다고 안드로이드에서 보이지않습니다.

  4. thumbnail
    2016.10.13 00:18

    비밀댓글입니다

  5. thumbnail
    jieum
    2016.11.30 22:48

    안녕하세요 덕분에 블루투스 연결에 성공했습니다ㅜㅜ 좋은 포스팅 너무 감사드려요!
    다름이 아니라 제가 두번째 액티비티도 만들어서 그 안에 데이터 주고 받는 코드만 넣었는데
    메인 액티비티에서는 데이터를 주고 받는데 다음 액티비티로 넘어갔을 때 블루투스 연결은 계속 되지만 데이터 보내는게 안되서요
    조언을 구할 수 있을까요?ㅜㅜ

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.11.30 23:00 신고

      간단하게 하려면..

      다른 액티비티로 넘어갈때 통신을 끊어버리고 넘어간 액티비티에서 통신을 다시 하면 어떨까 싶네요..

  6. thumbnail
    jieun
    2016.12.01 09:02

    빠른 답변 감사드립니다!!^^
    액티비티를 여러개 만들거라 끊었다 연결했다 하는 방법이 안 맞을것 같아서요ㅜㅜ
    다른 방법은 없을까요??ㅜㅜ
    아 그리고 혹시 이 코드를 응용해서 블루투스를 여러개 연결 할 수 있을까요??
    답변 너무너무 감사드립니다!!ㅜㅜ

  7. thumbnail
    jieun
    2016.12.01 17:00

    흠...조금 더 자세히 알려주실 수 있을까요??ㅜㅜ
    번거롭게 해드려서 죄송합니다ㅜㅜ

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.12.01 17:27 신고

      기존 코드보고.수정해보시는게.좋을듯 합니다..

      github에서 찾은 블루투스 통신 부분을 서비스화 시킨 프로젝트입니다. 수정해서 블로그에 올릴려고 찾아둔건데 아직 태스트를 못해봤네요.

      https://github.com/pieceoftoast/android-bluetooth-media-controller

  8. thumbnail
    jieun
    2016.12.01 20:05

    정말 감사합니다!!ㅜㅜ
    혹시 저 코드가 어떤 역할을 하는건지 알 수 있을까요?
    정확히 알면 코드를 더 잘 이해할 수 있을 것 같아서요!!

  9. thumbnail
    Korenaks
    2016.12.01 23:06

    MainActivity 안드로이드 코드가 어떤 역할들을 하는지 큰틀만 설명해주실수 있나요??

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.12.02 04:26 신고

      코드에 큰 흐름만 주석으로 추가했습니다.

      onCreate 메소드에 있는 1번부터 번호 순으로 보시면 됩니다.

  10. thumbnail
    2016.12.18 22:34

    비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.12.18 22:49 신고

      tagData에 태그 데이터를 넣어놓은 후,
      아두이노에 연결된 버튼이 눌러지면 보내는 식으로 하면 될듯합니다.

      val = digitalRead(inPin);
      if (val == LOW) { //버튼이 눌러졌다면
      bluetooth.print(tagData);
      }


      혹 안드로이드에서 명령내리면 전송하게 하려면.. 아래처럼 안드로이드에서 2가 전송되면 tagData 데이터를 전송하도록 하면 될듯합니다.

      if (bluetooth.available() > 0 )
      {
      ch = bluetooth.read();

      delay(100);

      if (ch=='2')
      {
      bluetooth.print(tagData);
      }
      }

    • thumbnail
      2016.12.18 23:07

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.12.18 23:36 신고

      태그 읽는 장비가 어떤 건가요? 그냥 시리얼로 넘어오는 거면..제어하기 힘들 수 도 있습니다.

    • thumbnail
      2016.12.19 09:34

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.12.19 09:42 신고

      https://github.com/miguelbalboa/rfid/blob/master/examples/ReadAndWrite/ReadAndWrite.ino

      여기 라이브러리 예제처럼 읽어오는거 하시면 될듯하네요..버퍼에 저장이 되는군요

      https://github.com/miguelbalboa/rfid

    • thumbnail
      2016.12.19 10:40

      비밀댓글입니다

    • thumbnail
      2016.12.19 15:04

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.12.19 15:06 신고

      아두이노에서 포스팅에 있는 채팅 소스코드로만 해서 동작하는지 먼저 확인해보세요.. 안드로이드 코드는 수정할 필요 없습니다..

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.12.19 15:08 신고

      그리고 안드로이드에서 첨에 Bluetooth Opened라는 메시지가 안보이면 블루투스 연결에 문제 있는 겁니다. 아두이노에 전원을 다시 연결해주고 하면 해결될겁니다.

    • thumbnail
      2016.12.19 15:24

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.12.19 15:27 신고

      블루투스 모듈하고 아두이노가 잘연결되있나보세요..

    • thumbnail
      2016.12.19 17:18

      비밀댓글입니다

    • thumbnail
      2016.12.19 17:18

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.12.19 17:51 신고

      태그 데이터가 전송되는 시점에 태그 데이터 대신에 hello같은걸 보내보세요.. hello가 안드로이드에 도착한다면 태그 데이터가 문자열이 아니라 hex라 안보이는거 같네요..

    • thumbnail
      2016.12.19 18:32

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2016.12.19 18:35 신고

      장비없이 코드만 가지고는 문제 확인해보기가 힘듭니다..

    • thumbnail
      2016.12.19 18:40

      비밀댓글입니다

  11. thumbnail
    wltmdgus555@naver.com
    2017.01.16 04:26

    제가 이소스를 기반으로 실시간으로 센서값을 임배디드 cortex m3 로 보내려고하는데 제가 센서를 세개를 써서 총 3개 값을 보내려하는데 어떻게해야하는지 예제가 나와있는것도 없고 해서 막막한데 어떤식으로 해야하는지 소스좀 알려주실수있나요 ㅠ?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2017.01.17 11:12 신고

      패킷을 만들어야 합니다..
      3개의 센서값이 0~255사이 값이라면 3바이트로 만들수 있습니다. 16진수로 바꾼후.. 문자로 바꾸면 됩니다..
      예를들어 센서값이 모두 255라면 FFFFFF 이렇게 됩니다..

  12. thumbnail
    Favicon of http://webnautes.tistory.com/848 BlogIcon 급한 초보자
    2017.04.05 02:41

    관련 소스를 이용하여 아두이노에서 안드로이드로 통신을 하고 싶습니다.
    bluetooth.print("~~")를 이용하고 싶은데 안드로이드에서 아무 반응이 없어서요...
    Serial.read를 이용하여 bluetooth.print를 하면 정상적으로 돌아가는데 제가 원하는 텍스트 문자를 이용해서 print를 했을 때
    app이 꺼지거나 아무것도 안나오더군요 ㅠㅠ
    아무래도 android쪽 소스를 바꿔야할것 같은데 조언 부탁드립니다 ㅠ

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2017.04.05 08:54 신고

      2번 채팅소스코드 보면

      시리얼이 입력이 있을 때 아래 문들을 실행하라고 조건을 걸어놓았습니다.
      //Read from usb serial to bluetooth
      if(Serial.available())
      {
      char toSend = (char)Serial.read();
      bluetooth.print(toSend);
      }

      아래 문장만 원하는 곳에 두시면 됩니다.
      bluetooth.print("send string");

    • thumbnail
      급한 초보자
      2017.04.06 01:01

      빠른 답변 감사합니다.
      그런데, if(Serial.available()) 조건을 빼면 안드로이드측에서 데이터 수신을 못하고 bluetooth.print("~")를 실행하면 아무 데이터도 전송되지 않습니다ㅠㅠ 혹시 안드로이드 소스측에서 변경되야할 것은 없는지 궁금합니다!!

  13. thumbnail
    2017.04.05 20:51

    비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2017.04.06 01:13 신고

      hm-10도 동일한 아두이노 코드로 동작하기 때문에... 똑같이 동작해야 합니다..

      앱 실행시 목록에 hm-10이 보이나요?
      그리고 로그캣에 에러가 있나 확인해보세요..

  14. thumbnail
    Favicon of http://webnautes.tistory.com/848 BlogIcon 급한 초보자
    2017.04.10 15:21

    답변 감사합니다..ㅎㅎ 정말 친절하신것 같아요~

    한가지 더 궁금한점이 있어서 질문드립니다..
    HC-05를 페어링할 때 list로 목록을 보게 되는데 사용자가 선택하지않고 자동으로 paring할 수는 없을까요,,??
    app을 실행시킬때마다 list목록을 선택해야 해서 불편함이 있는 것 같습니다!!

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2017.04.11 00:07 신고

      늦었네요.. 좀 전에 보냈습니다..

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2017.04.11 00:16 신고

      해보지는 않았는데 가능하다고 합니다.. 아래 블로그를 참고해보세요..

      http://www.londatiga.net/it/programming/android/how-to-programmatically-scan-or-discover-android-bluetooth-device/

  15. thumbnail
    Favicon of http://webnautes.tistory.com/848 BlogIcon 급한 초보자
    2017.04.11 00:31

    너무많은 도움을 받은 것 같아서.. 정말 감사합니다 ^^
    관련 프로젝트를 진행중이었는데 많은 문제를 해결할 수 있었습니다!!
    감사합니다~~

  16. thumbnail
    2017.11.09 23:40

    비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2017.11.10 17:54 신고

      안드로이드 코드는 다음 포스팅에 있습니다.

      Android와 PC JAVA 프로그램 간 블루투스 통신 예제
      http://webnautes.tistory.com/849



      PC와 HC-05/HC-06 간에 테스트를 진행한 다음 포스팅을 검토해보세요...

      Arduino Uno에 HC-05 / HC-06 Bluetooth 모듈 연결하여 사용하는 방법
      http://webnautes.tistory.com/846

  17. thumbnail
    안녕하세요
    2018.11.15 00:07

    안녕하세요 지금 아두이노와 안드로이드 앱 공부중에 있습니다.
    코드를 고친거 하나 없이 사용을 하였는데 어플에서 시리얼창으로는 제대로 문자열이 입력되는데
    시리얼 창에서 입력하면 아무 반응이 없는데 혹시 왜 이러는건지 알 수 있을까요?
    이런 경우에는 아두이노에서 어플로 데이터 전달이 안된다는 건가요??

  18. thumbnail
    Favicon of http://kyhoo0511@naver,com BlogIcon kyhoo0511
    2018.11.29 16:21

    아두이노/안드로이드를 블루투스로 연결해서 안드로이드에서 1234를 전송하면

    아두이노 시리얼모니터에서 1234로 나오는데

    이걸 문자열로 변환해서 1 2 3 4 이렇게 따로 받으려면 어떻게 설정해야하나요?

    현재 저희의 문제점은 블루투스로 3333을 보내면 3333이 비밀번호로 저장이 안되고 설정해놓은 1234로만 된다는 것 입니다.

    앱에서 나온 임의의 숫자를 비밀번호로 저장하려면 어떻게 해야 하나요?


    #include <SoftwareSerial.h>



    #include <Password.h> //http://playground.arduino.cc/uploads/Code/Password.zip //tells to use password library
    #include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip //tells to use keypad library
    #include <Servo.h> //tells to use servo library

    SoftwareSerial btSerial(53, 52);

    Servo myservo; //declares servo
    Password password = Password( "0000" ); //password to unlock, can be changed (여기가 비밀번호 바꾸는곳)

    const byte ROWS = 4; // Four rows
    const byte COLS = 4; // columns
    // Define the Keymap
    char keys[ROWS][COLS] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'}
    };
    // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
    byte rowPins[ROWS] = { 9, 8, 7, 6 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
    byte colPins[COLS] = { 5, 4, 3 };
    //char key[4];

    // Create the Keypad
    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

    void setup(){

    Serial.begin(9600);
    btSerial.begin(9600);
    Serial.write(254);
    Serial.write(0x01);
    delay(200);
    pinMode(11, OUTPUT); //green light
    pinMode(12, OUTPUT); //red light
    myservo.attach(13); //servo on digital pin 9 //servo
    keypad.addEventListener(keypadEvent); //add an event listener for this keypad
    }

    void loop(){
    keypad.getKey();
    password.set("1234");
    myservo.write(0);
    if(Serial.available())
    btSerial.write(Serial.read());

    if(btSerial.available()){
    Serial.write(btSerial.read());
    //key = btSerial.read();
    //Serial.print(key);
    }
    }
    //take care of some special events
    void keypadEvent(KeypadEvent eKey){
    switch (keypad.getState()){
    case PRESSED:

    Serial.print("Enter:");
    Serial.println(eKey);
    delay(10);

    Serial.write(254);

    switch (eKey){
    case '*': checkPassword(); delay(1); break;

    case '#': password.reset(); delay(1); break;

    default: password.append(eKey); delay(1);
    }
    }
    }
    void checkPassword(){

    if (password.evaluate()){ //if password is right open

    Serial.println("Accepted");
    Serial.write(254);delay(10);
    //Add code to run if it works
    myservo.write(150); //deg

    digitalWrite(11, HIGH);//turn on
    delay(15000); //wait 5 seconds (여기가 초록불 시간 제어 n초 * 1000)
    digitalWrite(11, LOW);// turn off
    }
    else{
    Serial.println("Denied"); //if passwords wrong keep locked
    Serial.write(254);delay(10);
    //add code to run if it did not work
    myservo.write(0);
    digitalWrite(12, HIGH); //turn on
    delay(5000); //wait 5 seconds (빨간불 n초 * 1000)
    digitalWrite(12, LOW);//turn off
    }
    }

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2018.11.29 17:26 신고

      코드에 비번 넣지 않고 파일에 기록하는 방식을 써야할듯합니다.

    • thumbnail
      kyhoo0511
      2018.11.29 21:37

      파일에 기록한다는게 어떤 방식을 말씀하시는건지 알려주실 수 있나요?

      제가 코딩이 처음이라서요,,.,,

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2018.11.29 22:22 신고

      아래 링크를 참고해보세요.

      https://www.arduino.cc/en/Tutorial/EEPROMWrite

      https://www.arduino.cc/en/Tutorial/EEPROMRead

  19. thumbnail
    초짜
    2019.11.04 22:08

    시리얼 모니터에서 나온 정보를 블루투스로 보내려면 어떻게 해야하나요...?
    그냥 연결하면 되는 건가요?
    dbstpqls13@naver.com

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.11.05 00:28 신고

      시리얼 모니터로 보낼 데이터를 블루투스로 보내도록 바꾸어줘야 합니다.

      시리얼 모니터로 이미 보여진 데이터를 블루투스로 보낼 방법은 없을듯합니다.

  20. thumbnail
    2020.12.16 11:50

    비밀댓글입니다

  21. thumbnail
    Favicon of https://haruvely.tistory.com BlogIcon 개발자하루

    아두이노 우노에 hc-06 대신 FBL780을 이용하여 BLE통신을 하고싶습니다.
    코딩식은 똑같이 했는데 어플에서 연결이 안되네요ㅠ 왜 그런건지 조언을 구하고싶습니다.

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2021.04.09 18:04 신고

      아두이노코드가 FBL780에서 정상동작하는 코드인지 확인해야 할거 같습니다. 구글로 검색해서 다른 사람들의 코드를 찾아보세요