반응형

목차

1. HC-05, HC-06 테스트 및 설정 : https://coding-yoon.tistory.com/206

 

글을 시작하기 전에 내가 대학생일 때 들었었으면 좋았을 강의 하나가 있다. 이용성 교수님께서 강의해 주시는 건데 회로부터 하나하나 설명해 주시니 진짜 너무 좋은 영상이다.

아두이노 UNO 와 블루투스 모듈과 0, 1번을 사용하면 안 되는 이유

가끔 블로그를 보면 아두이노와 블루투스 모듈을 0, 1번에 서로 연결하는 경우가 있다. 완성 시 컴퓨터와 분리했을 때는 문제가 되지 않고, 아두이노에 코딩을 할 때 문제가 발생한다.

아두이노에서 통신 방식은 대표적으로 UART, I2C, SPI 방식이 있다. 특히 UART를 조심히 사용해야 한다.

가장 많이 사용되는 아두이노 UNO 같은 경우 UART는 한 개이며, 각각 0번 핀(RX:수신), 1번 핀(TX:송신)이다. 그런데 아두이노는 이상한 특징을 가지고 있다. UART 0, 1번 핀이 컴퓨터와 연결되는 USB 케이블 부분과 연결돼 있다.

우리는 아두이노에서 출력되는 값을 아두이노 serial monitor를 통해서 확인할 수 있다. USB 케이블을 통해 데이터가 출력되지만, 이 USB 케이블은 0, 1번과 연결돼있다. 정리하자면 컴퓨터에 아두이노를 연결하는 순간 이미 아두이노와 컴퓨터는 서로 serial 통신을 하고 있다.

그렇다면 블루투스 모듈을 0, 1번에 사용하면 어떻게 될까? 당연히 충돌 난다. 하지만 간혹 운이 좋아 동작할 수 있지만 올바른 동작이라고 할 수 없다.

그렇다면 아두이노 UNO는 UART를 사용할 수 없는가?

하나밖에 없는 UART는 이미 사용하고 있기 때문에, 아두이노는 softwareserial를 사용해 uart를 사용할 수 있다. 몇 개든 uart를 선언해서 사용할 수 있지만 software로 구현돼있기 때문에 굉장히 느리다. 그렇기 때문에 아두이노 코딩 할 때는 softwareserial을 사용할 수 밖에 없고, 완성 후에 하드웨어 serial을 사용하면 된다. 이것에 대한 팁은 나중에 올리려고 한다.

*아두이노에 대한 UART를 더 알고 싶으시면 아래 블로그를 참고하시길 바랍니다.

아두이노 UNO 와 블루투스 모듈(HC-05, HC-06) 연결

아래와 같이 아두이노와 블루투스 모듈을 연결했고, 코드는 아래와 같다.

코드는 굉장히 간단하다. 블루투스로 수신 받은 값을 serial monitor에 출력하는 코드이다. 

#include <SoftwareSerial.h>

#define BT_RXD 3
#define BT_TXD 2
SoftwareSerial bluetooth(BT_RXD, BT_TXD);

void setup() {
  Serial.begin(115200);     // 이전 글 참고
  bluetooth.begin(115200);  // 이전 글 참고
}

void loop() {
  if (bluetooth.available()) {
    Serial.write(bluetooth.read());
  }
  if (Serial.available()) {
    bluetooth.write(Serial.read());
  }
}

 

올바르게 연결하고 펌웨어에 코드를 입혔다면, Arduino bluetooth controller를 설치해서 Terminal mode로 테스트한다. Hello를 입력해보면, Arduino IDE의 Serial monitor에서 값을 확인할 수 있다.

 

 

HC-05, HC-06

블루투스 모듈인 HC-05와 HC-06에서 LED를 확인할 수 있는데, 이는 state에 대한 LED이다.

LED 점멸 : 기기 Pair 가능 상태

LED 꺼짐 : 연결 상태

HC-05, HC-06에는 VCC, GND, TX, RX 외에도 state, EN 단자가 있다. state는 블루투스 상태를 출력하는 단자로 위 LED에 연결돼있다. EN 단자는 만약 블루투스가 연결 상태라면 강제로 신호를 주어 블루투스 연결을 끊을 수 있다.

728x90
반응형
반응형

아두이노 블루투스 모듈 중 가장 유명한 것은 HC-05, HC-06이다.

이번 블루투스 프로젝트를 진행하면서 많은 사람들이 놓치고 가는 것을 짚고 가려 한다.

이 글은 HC-05, HC-06 모듈이 있다는 가정하에 진행된다.

 

HC-05, HC-06

수중에 가지고 있는 블루투스 모듈인 HC-05이다.

HC-05, HC-06과 같은 블루투스 모듈은 사전에 프로그래밍 된 AT 명령어를 통해 쉽게 제어할 수 있어 많은 인기가 있다.

블루투스 모듈에는 이미 기능이 구현돼있으며, 우리는 AT 명령어만 사용하면 되니 굉장히 간편하다. 만약 블루투스 모듈을 구매하기 전이라면, UART to USB 도같이 구매하는 것을 추천하고 싶다.

이유는 나중에 아두이노 구조에 대해 설명할 때 작성하겠다.

 

선 연결

HC-05를 설정하기 위해 HC-05와 UART to USB를 연결해야 한다.

UART to USB는 HC-05, HC-06 와 컴퓨터 연결을 도와주는 역할을 한다. 만약 UART to USB를 구매하지 않았다면, 아두이노로 대체 가능하다.

UART to USB와 HC-05, HC-06의 선 연결은 그림과 같다. TX와 RX는 서로 교차하는 것이 맞다.

GND - GND

VCC(5V) - VCC(5V)

TX - RX

RX -TX

UART to USB와 HC-05, HC-06을 올바르게 연결했다면, UART to USB를 컴퓨터에 연결한다.

올바르게 연결됐으면, [장치 관리자]에서 확인할 수 있다.

 

Teraterm

터미널 프로그램인 teraterm은 인터넷에서 쉽게 다운로드 받을 수 있다. 아두이노 serial monitor을 사용해도 되는데 굉장히 답답하다.

1. Teraterm을 실행하면 아래와 터미널 창이 열린다. 시리얼 포트는 우리가 연결한 UART to USB를 선택한다.

2. [설정] - [시리얼 포트]를 클릭한다.

 

3. [시리얼 포트]를 클릭하여 HC-05, HC-06 모듈에 맞게 설정한다. 만약 처음 구매 시 사용하는 것이라면 기본적으로 아래와 같을 것이다. 만약 제대로 동작하지 않는다면 속도를 115200으로 다시 설정해 볼 것.

속도 (Baudrate) - 9600 or 115200

데이터 비트 - 8bit

패리티 비트 - none

스톱 비트 - 1bit

4. 이제 터미널을 설정해야 한다. [설정] - [터미널]을 클릭한다.

5. [줄바꿈]에서 수신(R)과 송신(M)을 CR에서 CR+LF로 변경한다. 왜 이렇게 변경해야 하는지는 나중에 포스팅하겠다. 우선 정의만 알고 넘어간다.

(CR : Carriage Return (\r) LF : Line Feed (\n). 해당 용어(CR, LF)와 이 용어들의 조합(CRLF)은 새로운 줄 (New line)으로 바꾸는 방식)

 

AT command 테스트

AT command를 사용하는 모듈 같은 경우, 처음 테스트를 위해 "AT"를 입력하여 "OK"를 확인다. 올바르게 UART to USB와 HC-05, HC-06 모듈이 연결됐다면, 터미널에 OK라고 출력된다. 만약 아무 값도 출력되지 않는다면, 위 과정을 천천히 다시 해본다.

 

그럼에도 아무 반응이 나오지 않는다면 추측건대 HC-05, HC-06의 UART 설정값을 올바르게 설정하지 않은 것이다. 나 같은 경우에도 예전에 사용했던 HC-05를 다시 사용하는 것이므로 설정값을 잊어 먹을 수 있으므로 모듈 뒤편에 설정값을 따로 적어 놓았다. 설정값을 따로 알 수 있는 방법이 없으므로, 결국 때려 맞추는 수밖에 없다.

 

HC-05 AT command 설정
1. 버전 확인
AT+VERSION  //  VERSION:3.0-20170609   OK

2. 블루투스 이름 "Test"로 변경
AT+NAME=Test  //  OK

3. 블루투스 이름 확인
AT+NAME?      // +NAME:Test   OK

4. 블루투스 연결을 위한 비밀번호 변경, 초기 비밀번호 : 1234
AT+PSWD=9999  // OK

5. 블루투스 비밀번호 확인
AT+PSWD?     // +PIN:"9999"

6. UART 설정 확인  
AT+ UART?    // +UART:115200,0,0

Baudrate는 115200으로 올렸지만, 스탑비트나 패리티 비트는 따로 설정하지 않았다.

더 다양한 AT명령어를 확인하기 위해 아래의 HC-05, HC-06 데이터시트를 확인하면 된다. 혹시 몰라 나는 HC-05 모듈을 사용하기 때문에 위 명령어를 사용했지만, HC-06 AT 명령어는 HC-05 명령어와 살짝 다르므로 HC-06 데이터시트를 따로 참고해야 한다.

HC-06 Datasheet.pdf
0.74MB
HC-05 Datasheet (4).pdf
0.82MB

728x90
반응형
반응형

안녕하세요! 아두이노, 안드로이드 블루투스 실습 두번 째 시간입니다. 

 

오늘은 안드로이드 스튜디오로 센서 값을 받아오는 어플을 만들어 보도록 하겠습니다.

 

아마 많은 분들께서 Code-jun님의 블루투스 예제를 보셨을거라고 생각합니다. 

 

실제로도 라이브러리가 상당히 잘 만들어져 있어 사용하는데 어려움이 없다고 생각합니다.

 

저는 이번에 Code-jun님이 올리신 라이브러리 예제를 통해 블루투스 무선통신을 하도록 하겠습니다. 

 

https://blog.codejun.space/13

 

아두이노, 안드로이드 블루투스 통신하기

아두이노로 미세먼지 측정기를 만들던 도중 안드로이드와 연동하여 데이터를 주고 받고 싶어 제작하던 중 유용한 정보가 될 것 같아 포스팅 합니다. 이번 개발환경은 DESKTOP과 TEST DEVICE를 동시에 사용합니다...

blog.codejun.space

 

위 사이트 방법대로 라이브러리를 추가한 후 이제 제 방식대로 코딩을 해보도록 하겠습니다. 

 

 

 

1. 디자인

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:textSize ="40sp"
android:layout_gravity = "center"
android:text="온습도센서('C, %)" />

<Button
android:id="@+id/btnConnect"
android:layout_gravity = "center"
android:layout_width="300dp"
android:layout_height="50dp"
android:text="연결"

/>

<TextView
android:id="@+id/temp"
android:layout_width="match_parent"
android:layout_height="80dp"
android:textSize ="50sp"
android:gravity="center_horizontal"
android:hint="온도" />

<TextView
android:id="@+id/humd"
android:layout_width="match_parent"
android:layout_height="80dp"
android:textSize="50sp"
android:gravity="center_horizontal"
android:hint="습도" />

</LinearLayout>

 

굉장히 간단한 어플 레이아웃

 

디자인에 신경쓰시는 분들께서는 자신의 입맛대로 고쳐 쓰시면 됩니다.

그리고 사용하시기 전에 주의할 점이 있습니다. 제가 굵게 표시한 android.hint 부분은 블루투스에서 값이 전달되기

시작하면 textview 부분이 바껴야 하기 때문에 android.text로 하시면 안됩니다.

값이 올바르게 가더라도 값이 변하지 않습니다. 

 

 

 

2. 데이터 수신

 

bt.setOnDataReceivedListener(new BluetoothSPP.OnDataReceivedListener() { //데이터 수신
       public void onDataReceived(byte[] data, String message) {
                 Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
                  }
});

출처: https://blog.codejun.space/13 [CodeJUN]

라이브러리 출처 : https://github.com/akexorcist/Android-BluetoothSPPLibrary

 

위 함수는 데이터를 수신받고 있습니다. 그렇다면 어떻게 해야할까요?

방법은 두 가지입니다. 아두이노에서 문자로 보내는 방법, 바이트로 보내는 방법. 두가지 입니다.

우리는 바이트로 계산을 해서 값을 보내는 것은 어려우니 저희는 문자로 보내도록 하겠습니다.

 

 하지만 생각해 봐야할 문제가 있습니다.

우리가 아두이노에서 안드로이드로 보낼 값은 온도, 습도 두 가지인데 어떻게 해야하나.

 

정답은 한 번에 문자열로 보낸 후, 수신부에서 쪼개면 됩니다. 

 

 

 

bt.setOnDataReceivedListener(new BluetoothSPP.OnDataReceivedListener() {
       TextView temp = findViewById(R.id.temp);
       TextView humd = findViewById(R.id.humd);


       public void onDataReceived(byte[] data, String message) {


                 String[] array = message.split(",");

                 temp.setText(array[0].concat("C"));
                 humd.setText(array[1].concat("%") );

                 }
});

 

그리고 문자열의 끝은 개행문자로 끝이 납니다. (중요 중요)

개행문자?? new line(띄어쓰기)을 말합니다.

 

 

그럼 아두이노 송신 스케치를 다시 한번 보도록 하겠습니다.

 

아두이노 온습도 송신

자! 다시 보니 이해가 가시나요?

아두이노에서는 블루투스로

[temp(value), humd(value) /n] 이러한 형태의 문자열로 1초에 한 번씩 블루투스에게 값을 보내줍니다. 

 

 

어? 만약 안드로이드 스튜디오에서 String으로 값을 받았네?

나는 숫자로 받아서 안드로이드 스튜디오에서 계산해서 값을 집어넣고 싶은데?

 

방법 : 안드로이드 스튜디오 : String에서 double형태로 바꾸기

 

double dTemp = Double.parseDouble(array[0]);

double dHumd = Double.parseDouble(array[1]);

 

간단하죠?

여러분들도 온습도 센서말고도 원하는 센서를 달아 보시면 상당히 재미있습니다.

저 같은 경우는 

 
     음속 = (331.5 + (0.6*celsius)) m/s 
      왕복거리 = 음속 * 시간

거리 = (음속 * 시간)/2

 

공식을 사용하여 온도에 따른 좀 더 정확한 초음파 센서를 만들어 보았습니다.

 

이것으로 블루투스 모듈에 관한 두 번째 글을 마치도록 하겠습니다.

 

Copyright (c) 2014 Akexorcist

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

728x90
반응형
반응형

안녕하세요. 아두이노에 관해 3번 째 글입니다. 

이번에는 블루투스와 아두이노를 연결해서 센서값을 읽어 활용하는 예제입니다.

 

저는 HT21UD 온습도 센서를 사용해 온도('C), 습도(%)를 아두아노에서 읽어와 

블루투스를 통해 안드로이드에 보내볼 생각입니다.

 

 

 

 

 

자 우선, HT21UD에 대해 설명해보자면, 위에 말처럼 온도와 습도를 읽어오는 센서입니다. 

 

1. HT21UD

HT21UD 온습도 센서

저는 HT21UD의 라이브러리의 예제를 약간 제 식대로 바꾸도록 하겠습니다.

라이브러리는 아래에 남겨 두도록 하겠습니다.

https://github.com/sparkfun/SparkFun_HTU21D_Breakout_Arduino_Library/

 

sparkfun/SparkFun_HTU21D_Breakout_Arduino_Library

HTU21D Breakout Arduino Library. Contribute to sparkfun/SparkFun_HTU21D_Breakout_Arduino_Library development by creating an account on GitHub.

github.com

 

#include <Wire.h>

#include "HTU21D.h"

 

 

HTU21D myHumidity;

 

void setup()

{

  Serial.begin(9600);

  myHumidity.begin();

}

 

void loop()

{

  double humd = myHumidity.readHumidity();    //습도

  double temp = myHumidity.readTemperature();    //온도

 

  Serial.print(temp);

  Serial.print("C");

  Serial.print(humd);

  Serial.println("%");

}

 

온습도의 예제는 블루투스와 통신하기 위해 잠시 되는지 안되는지 점검을 하기 위해 간략화한 스케치입니다. 

되는 것이 확인되었다면 이제 바로 블루투스로 아두이노와 안드로이드를 통신해보도록 하겠습니다.

 

 

1. HC-06 블루투스 모듈

 

HC-06 블루투스 모듈

저 같은 경우는 눈에 보이는 것을 좋아해서

바로 HT21UD의 값을 블루투스로 전송하도록 하겠습니다. 

 

 

#include <Wire.h>

#include "HTU21D.h"

#include <SoftwareSerial.h>

 

#define BT_RXD 8

#define BT_TXD 7

SoftwareSerial bluetooth(BT_RXD, BT_TXD;

 

HTU21D myHumidity;

 

unsigned long time_previous, time_current;

 

void setup()

{

  Serial.begin(9600);

  myHumidity.begin();

  BT.begin(9600);

  time_previous = millis();

}

 

void loop()

{

  time_current = millis()

  double humd = myHumidity.readHumidity();    //습도

  double temp = myHumidity.readTemperature();    //온도

 

  if(time_current - time_previous >= 1000){

     BT.print(temp);

     BT.print(",");

     BT.print(humd);

     BT.print(",");

     BT.println();

     }

}



1초에 한 번씩 온도와 습도를 안드로이드에 보내는 예제입니다!

 

지금 이 스케치로는 어떻게 안드로이드와 아두이노가 블루투스로 연결되어서 센서값을 전달하는지 알 수 없습니다.

다음 글은 이제 안드로이드 스튜디오를 이용해 온습도 센서값을 받는 어플을 만들고 나서 위 예제와 함께 설명하면 바로 이해가 가실겁니다!!

 

 

728x90
반응형

+ Recent posts