[1] UART 통신
- UART (범용 비동기화 송수신기, Universal Asynchronous Receiver/Transmitter)
- 병렬 데이터의 형태를 직렬 방식으로 전환하여 데이터를 전송
- 자세한 건 wiki에서...
https://ko.wikipedia.org/wiki/UART
UART - 위키백과, 우리 모두의 백과사전
UART(범용 비동기화 송수신기: Universal asynchronous receiver/transmitter)는 병렬 데이터의 형태를 직렬 방식으로 전환하여 데이터를 전송하는 컴퓨터 하드웨어의 일종이다. UART는 일반적으로 EIA RS-232, RS-4
ko.wikipedia.org
- 아두이노 UART 통신
- 아두이노에서 UART 통신을 위한 핀은 RX/TX 하나씩 밖에 없다.
- PC와 연결하고나면, 추가 장치와 UART 통신이 불가능하다.
- 여러 장치와 UART 통신을 위해서는 가상포트를 만들어서 소프트웨어적 접근을 한다.
- 소프트웨어적 접근이란 제공되는 라이브러리(SoftwareSerial.h)를 이용하는 것
- 위 사진과 같이 PC와 연결할 경우, 0, 1번 핀은 사용할 수 없다.
- 따라서 가상으로 TX, RX 핀(위 사진에서는 3, 4번 핀)을 설정하여 UART 통신이 가능하도록 만들어 준다.
- SoftwareSerial.h : 아두이노에서 기본으로 제공되는 라이브러리
https://docs.arduino.cc/learn/built-in-libraries/software-serial
SoftwareSerial Library | Arduino Documentation | Arduino Documentation
SoftwareSerial Library The SoftwareSerial library allows serial communication on other digital pins of an Arduino board. The SoftwareSerial library allows serial communication on other digital pins of an Arduino board, using software to replicate the funct
docs.arduino.cc
[2] 블루투스 모듈 (HC-06)
- SoftwareSerial.h 라이브러리를 이용해 블루투스 모듈를 사용해 보자.
- SoftwareSerial.h 라이브러리는 객체 선언 외에는 기본 Serial과 함수 이름과 사용 방법이 거의 동일
1. 기본 세팅
- 시리얼 통신 연결이 잘 되었는지 확인
1) CODE
#include <SoftwareSerial.h>
// 블루투스 통신을 할 수 있는 SoftwareSerial 객체 생성
SoftwareSerial myBTSerial(2, 3); // SoftwareSerial(rxPin, txPin, inverse_logic)
void setup() {
Serial.begin(9600);
myBTSerial.begin(9600); // 블루투스와 통신 시작
}
void loop() {
//블루투스 통신으로 수신된 데이터가 있으면
if(myBTSerial.available()){
// 블루투스 통신을 통해 읽은 데이터를 시리얼 모니터에 출력
Serial.write(myBTSerial.read());
}
// 시리얼 통신으로 수신된 데이터가 있으면
if(Serial.available()){
// 시리얼 통신으로 입력된 데이터를 블루투스로 출력
myBTSerial.write(Serial.read());
}
}
2) 회로
- CODE의 객체 생성 시 설정한 대로 연결
① 블루투스 모듈의 TX -> 아두이노 보드의 2번 핀(RX)
② 블루투스 모듈의 RX -> 아두이노 보드의 3번 핀(TX)
③ 블루투스 모듈의 VCC, GND -> 아두이노 보드의 5V, GND
3) 시리얼 모니터
- 블루투스에 명령어를 전송하여 모듈과 관련된 사항들을 확인할 수 있다.
① 통신 가능한 상태 확인 명령어 전송
- AT 입력하고 전송 -> OK 메시지가 돌아오면 통신 가능한 상태
- 블루투스 버전에 따라서 Both NL & CR 대신 line ending 없음 으로 해야 메시지가 뜰 수 있다.
② 블루투스 모듈 이름 변경 명령어 전송
- AT+NAME이름 입력하고 전송 -> 버전에 따라 다르지만, OK가 포함된 메시지가 돌아오면 완료
- 블루투스 전원을 끊었다가 다시 연결해야 바뀐 이름이 적용된다.
- 버전에 따라 AT+NAME=이름 으로 입력해야 할 수도 있다.
- AT+NAME 만 입력하면 현재 설정된 이름을 확인할 수 있다.
③ 블루투스 모듈 버전 확인
- AT+VERSION 입력하고 전송 -> v2.0.1 임을 확인할 수 있다.
4) 스마트폰과 연결
① 스마트폰 블루투스에 연결 가능한 디바이스에 내가 설정한 이름의 장치가 뜨는지 확인
② 해당 장치 연결되는지 확인 (기본 설정 비밀번호는 1234)
③ 플레이스토어에서 Arduino Bluetooth Contoller(개발자 Guimig Apps) 를 찾아서 설치
④ 연결한 디바이스 눌러서 Temerminal mode 열기
⑤ Terminal mode 에서 메시지 보내고, PC의 시리얼 모니터에 뜨는지 확인
⑥ 반대로 시리얼 모니터에서 메시지 전송하고, 스마트폰에 메시지 뜨는지 확인
2. 블루투스 예제
- 스마트폰으로 메시지를 보내고, 이를 한 글자씩 받아서 문자열로 만든 뒤, 한 번에 시리얼 모니터에 출력
- 시리얼 모니터에서 전송한 메시지를 한 글자씩 받아서 스마트폰에 전송하고 한꺼번에 출력
(while문이 아닌 if문이고, 딜레이가 있기 때문에 다 읽어오는데 시간이 걸림)
// bluetooth_hc06_test2
#include <SoftwareSerial.h>
// 블루투스 통신을 할 수 있는 SoftwareSerial 객체 생성
SoftwareSerial myBTSerial(2, 3); // SoftwareSerial(rxPin, txPin, inverse_logic)
String mystr = "";
void setup() {
Serial.begin(9600);
myBTSerial.begin(9600); // 블루투스와 통신 시작
Serial.println("통신준비...");
}
void loop() {
// 블루투스 모듈이 데이터를 읽을 준비를 할 수 있도록 delay()
delay(1000);
while(myBTSerial.available()){
char myChar = myBTSerial.read();
mystr = mystr + myChar;
}
Serial.println("input Val :" + mystr);
mystr = ""; // mystr 초기화
if(Serial.available()){
myBTSerial.write(Serial.read());
}
}
3. 블루투스 + LED + 조도센서 예제
- 블루투스 통신을 통해서 장비를 제어할 수 있도록 작업
- on/off 메시지를 보내서 led를 블루투스를 통해서 켜고 끌 수 있도록 제어
- 조도 센서의 값을 블루투스 통신을 이용해서 전송하기(0.5~1초에 한번)
- 문자열.equals(비교할 문자열) : 문자열이 비교할 문자열과 같으면 true, 다르면 false 리턴
1) CODE
// bluetooth_exam
// 블루투스 통신을 통해서 장비를 제어할 수 있도록 작업
// on/off 메시지를 보내서 led를 블루투스를 통해서 켜고 끌 수 있도록 제어
// 조도 센서의 값을 블루투스 통신을 이용해서 전송하기(0.5~1초에 한번)
#include <SoftwareSerial.h>
#define LED_PIN 4
#define PHOTO_PIN 0
SoftwareSerial myBTSerial(2, 3);
String control = "";
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
myBTSerial.begin(9600);
}
void loop() {
// 스마트폰에서 전송된 문자열을 한 글자씩 받아서 문자열 생성
while(myBTSerial.available()){
char mychar = myBTSerial.read();
control = control + mychar;
}
// 빈 문자열이 아니면, on인지 off인지 판별하여 LED on/off
// 그 외 문자열이면 스마트폰에 "잘못된 명령어입니다."라는 메시지 전송
if(control!=""){
if(control.equals("on")){
digitalWrite(LED_PIN, HIGH);
}else if(control.equals("off")){
digitalWrite(LED_PIN, LOW);
}else{
myBTSerial.println("잘못된 명령어입니다.");
}
control = "";
}
// 조도 센서의 값을 스마트폰으로 전송
int photo_val = analogRead(PHOTO_PIN);
myBTSerial.println(photo_val);
Serial.println(photo_val);
delay(1000);
}
2) 동작
- 끝 -
'프로젝트형 IoT 서비스 개발 4회차 > 2. 엣지 디바이스 제어' 카테고리의 다른 글
[Day44] 2022-03-31(목) 미니 프로젝트 - 김서연 강사님 (0) | 2022.03.31 |
---|---|
[Day44] 2022-03-31(목) 아두이노9 - SPI 통신, RFID - 김서연 강사님 (0) | 2022.03.31 |
[Day43] 2022-03-30(수) 아두이노8 - LCD2, I2C통신, I2C LCD - 김서연 강사님 (0) | 2022.03.30 |
[Day42] 2022-03-29(화) 아두이노7 - 부저, 조도센서, PIR센서, 온습도센서, LCD1 - 김서연 강사님 (0) | 2022.03.29 |
[Day41] 2022-03-28(월) 아두이노6 - RGB LED, 서보모터, 초음파센서 - 김서연 강사님 (0) | 2022.03.28 |