해당 게시물에서는 VS Code PlatformIO를 사용합니다. 참고바랍니다.
안녕하세요 데브구일입니다!
오늘은 SoftwareSerial 라이브러리를 사용해보도록 하겠습니다 :D
우선 아래 사진은 HM-10 블루투스 4.0 모듈입니다.
HM-10 모듈의 경우 RX, TX핀을 이용해서 시리얼 통신을 하는데요!
시리얼 통신으로 AT 커맨드를 사용해서 제어가 가능합니다!
먼저 아래와 같이 회로를 먼저 연결해보도록 할게요!
시리얼 통신을 하려면 RX, TX핀을 사용해야 하지만 여기서 RX와 TX를 D0번과 D1번에 연결하지 않는 이유는
D0번과 D1번의 경우 업로드와 시리얼 모니터를 확인할 때 사용되는 핀이기 때문에 사용하지 않습니다!
사용했을시 업로드가 안되고, 시리얼 모니터를 확인할 수 없게되는데요!
물론 메가보드 처럼 RX, TX핀을 여러개 가지고 있다면 그걸 사용하시는게 가능하지만,
SoftwareSerial이라는 라이브러리를 사용하면서 어떻게 사용하는지 알아보겠습니다 :D
회로가 연결이 되셨다면, 코드를 보도록 하겠습니다!
#include <Arduino.h> // PlatformIO IDE를 사용하시는게 아니라면 이 라인은 지워주세요!
#include <SoftwareSerial.h> // SoftwareSerial 라이브러리 포함
#define SOFT_RX_PIN 2 // 가상 RX핀 정의
#define SOFT_TX_PIN 3 // 가상 TX핀 정의
SoftwareSerial btSerial = SoftwareSerial(SOFT_RX_PIN, SOFT_TX_PIN); // SoftwareSerial 선언
void setup() {
pinMode(SOFT_RX_PIN, INPUT); // 가상 RX핀 입력 설정
pinMode(SOFT_TX_PIN, OUTPUT); // 가상 TX핀 출력 설정
Serial.begin(9600);
btSerial.begin(9600); // 가상 시리얼 전송속도 설정
}
void loop() {
if (Serial.available()) {
char read_data = Serial.read();
btSerial.write(read_data);
}
if (btSerial.available()) {
char read_data = btSerial.read();
Serial.write(read_data);
}
}
코드가 조금 복잡해 보일 수 있는데요!
우선 아래 아두이노 공식 레퍼런스 문서 링크를 걸어두도록 하겠습니다.
참고하시면 좋을 것 같습니다 :D
이제 코드를 하나씩 살펴보도록 하겠습니다 :D
#include <Arduino.h> // PlatformIO IDE를 사용하시는게 아니라면 이 라인은 지워주세요!
#include <SoftwareSerial.h> // SoftwareSerial 라이브러리 포함
#define SOFT_RX_PIN 2 // 가상 RX핀 정의
#define SOFT_TX_PIN 3 // 가상 TX핀 정의
SoftwareSerial btSerial = SoftwareSerial(SOFT_RX_PIN, SOFT_TX_PIN); // SoftwareSerial 선언
먼저 SoftwareSerial.h 파일을 먼저 포함시켜주었습니다!
SoftwareSerial의 경우 아두이노 기본 라이브러리에 포함 되어있으므로 따로 다운받으실 필요는 없습니다!
그리고 SOFT_RX_PIN, SOFT_TX_PIN 두 핀을 정의해주었습니다.
이 두 가지 핀은 각각 아두이노의 RX와 TX 핀의 역할로 사용하게될 핀을 정의합니다.
다음으로 SoftwareSerial을 선언하게 되는데요.
여기서 매개변수의 경우 다음과 같이 구성되어있습니다.
SoftwareSerial(rxPin, txPin, inverse_logic)
- rxPin : 시리얼 데이터를 받을 핀
- txPin : 직렬 데이터를 전송할 핀
- inverse_logic : 들어오는 비트의 의미를 반전하는 데 사용됩니다. 설정되면 SoftwareSerial은 RX 핀의 LOW를 1비트로 처리하고 HIGH를 0비트로 처리합니다. 또한 TX 핀에 쓰는 방식에도 영향을 줍니다. 기본값은 false입니다
여기서 inverse_logic의 경우 기본값이 false이기 때문에 따로 입력하지 않아도 기본값으로 적용됩니다!
저는 SoftwareSerial을 btSerial로 선언을 하고,
선언된 btSerial에 SoftwareSerial(SOFT_RX_PIN, SOFT_TX_PIN)을 넣어서 RX, TX핀을 설정하였습니다.
void setup() {
pinMode(SOFT_RX_PIN, INPUT); // 가상 RX핀 입력 설정
pinMode(SOFT_TX_PIN, OUTPUT); // 가상 TX핀 출력 설정
Serial.begin(9600);
btSerial.begin(9600); // 가상 시리얼 전송속도 설정
}
다음은 RX_PIN과 TX_PIN을 각각 입력과 출력 설정을 해주었습니다.
그리고 앞서 선언된 btSerial 또한 가상의 시리얼 포트라 보시면 되기때문에,
시리얼 전송속도를 설정해주셔야 사용 가능합니다!
btSerial.begin(9600)을 통해 전송속도를 9600으로 설정하였습니다.
void loop() {
if (Serial.available()) { // PC -> Arduino
char read_data = Serial.read(); // Read
btSerial.write(read_data); // Arduino -> HM-10
}
if (btSerial.available()) { // HM-10 -> Arduino
char read_data = btSerial.read(); // Read
Serial.write(read_data); // Arduino -> PC
}
}
먼저 PC에서 입력한 데이터가 Arduino로 전송되었을 때
Serial.available()이 True가 되며, if문 내부 코드가 동작하게됩니다!
내부 코드는 다음과 같습니다.
Serial.read()를 통해서 1byte의 데이터를 읽고, read_data라는 char 변수에 입력한 뒤에,
char read_data = Serial.read();
read_data 변수에 입력된 값을 HM-10이 연결된 시리얼 포트(btSerial)로 출력하게 됩니다.
btSerial.write(read_data);
그 아래있는 코드는 HM-10에서 Arduino로 전송되었을 때
btSerial.available()이 True가 되는 방식으로 위 코드와는 반대로 동작하는 코드입니다!
이제 코드를 업로드하고 동작을 시켜보도록 하겠습니다.
업로드를 하신 뒤에 AT 커맨드 중에 가장 기본 명령어인 AT를 입력하시게되면
다음과 같아 OK이라는 값이 되돌아 오게됩니다!
AT 커맨드의 경우 데이터 시트를 통해서 확인하실 수 있습니다! 아래 링크를 참고해주세요!
이 커맨드 외에 몇 가지 소개해드리면,
AT+NAME(세팅할 이름)을 입력하시면 모듈의 이름을 바꾸실 수 있습니다.
AT+NAME에 바로 붙여서 이름을 입력하시면됩니다.
ex) AT+NAMEBTBT 는 모듈의 이름을 BTBT로 변경하는 명령입니다.
AT+NAME? 를 입력하게되면 현재 세팅되어있는 모듈의 이름을 얻을 수 있습니다.
입력시 세팅되어 있는 모듈 이름이 출력됩니다.
ex) AT+NAME?
이렇게 SoftwareSerial을 사용해서 HM-10 모듈의 AT 커맨드를 사용해보았는데요.
다음에는 스마트폰으로 HM-10과 통신을 하는 방법을 알아보도록 하겠습니다 :D
감사합니다 :D
'Arduino' 카테고리의 다른 글
[PlatformIO] 아두이노와 아이폰 블루투스 통신하기 (HM-10 모듈) (0) | 2022.06.20 |
---|---|
[PlatformIO] 아두이노 SimpleTimer 라이브러리 (0) | 2022.06.06 |
[PlatformIO] 아두이노 인터럽트 사용하기 (0) | 2022.05.20 |
[PlatformIO] 아두이노 가변저항으로 LED 밝기 조절하기 (0) | 2022.05.19 |
[PlatformIO] 아두이노 PWM 사용하기 analogWrite() (0) | 2022.05.17 |