Arduino IDE를 사용한 LoRa를 사용한 ESP32 – 시작하기
이 튜토리얼에서는 LoRa의 기본 원리와 Arduino IDE를 사용하여 IoT 프로젝트에 ESP32와 함께 사용하는 방법을 살펴봅니다. 시작하기 위해 RFM95 트랜시버 모듈로 간단한 LoRa 송신기와 LoRa 수신기를 만드는 방법도 보여드리겠습니다.
LoRa 소개
LoRa에 대한 간단한 소개는 아래 비디오를 보거나 아래로 스크롤하여 서면 설명을 볼 수 있습니다.
LoRa란?
LoRa는 Semtech LoRa 트랜시버 칩에서 생성할 수 있는 무선 변조 기술을 사용하는 무선 데이터 통신 기술입니다.
이 변조 기술은 소량의 데이터(즉, 대역폭이 낮음)의 장거리 통신과 간섭에 대한 높은 면역성을 허용하면서 전력 소비를 최소화합니다. 따라서 전력 요구 사항이 낮은 장거리 통신이 가능합니다.
LoRa 주파수
LoRa는 전 세계적으로 사용 가능한 허가받지 않은 주파수를 사용합니다. 가장 널리 사용되는 주파수는 다음과 같습니다.
- 유럽의 경우 868MHz
- 북미의 경우 915MHz
- 아시아의 경우 433MHz 대역
이 대역은 라이선스가 없으므로 누구나 비용을 지불하거나 라이선스를 받을 필요 없이 자유롭게 사용할 수 있습니다. 귀하의 국가에서 사용되는 주파수를 확인하세요.
LoRa 애플리케이션
LoRa는 장거리 및 저전력 기능을 갖추고 있어 배터리로 작동하는 센서와 저전력 애플리케이션에 적합합니다.
- 사물 인터넷(IoT)
- 스마트 홈
- 기계 간 통신
- 그리고 훨씬 더 많은 것...
따라서 LoRa는 소량의 데이터를 전송하는 코일 셀 또는 태양열로 작동하는 센서 노드에 적합한 선택입니다.
LoRa는 다음과 같은 프로젝트에 적합하지 않다는 점에 유의하세요.
- 고속 데이터 전송이 필요한 경우;
- 매우 빈번한 전송이 필요한 경우;
- 또는 인구가 많은 네트워크에 있는 경우
LoRa 토폴로지
LoRa를 다음에서 사용할 수 있습니다.
- 지점 간 통신
- 또는 LoRa 네트워크 구축(예: LoRaWAN 사용)
지점 간 통신
지점 간 통신에서 두 LoRa 지원 기기는 RF 신호를 사용하여 서로 통신합니다.
예를 들어, 이는 서로 비교적 멀리 떨어져 있거나 Wi-Fi 범위가 없는 환경에서 LoRa 트랜시버 칩이 장착된 두 ESP32 보드 간에 데이터를 교환하는 데 유용합니다.
단거리 통신만 지원하는 Wi-Fi 또는 Bluetooth와 달리 적절한 안테나가 있는 두 LoRa 기기는 장거리에서 데이터를 교환할 수 있습니다.
LoRa 칩으로 ESP32를 쉽게 구성하여 200m 이상 거리에서도 안정적으로 데이터를 송수신할 수 있습니다(환경 및 LoRa 설정에 따라 더 나은 결과를 얻을 수 있음). 30Km 이상의 범위를 쉽게 갖는 다른 LoRa 솔루션도 있습니다.
LoRaWAN
LoRaWAN을 사용하여 LoRa 네트워크를 구축할 수도 있습니다.
LoRaWAN 프로토콜은 LoRa Alliance에서 표준화한 LoRa 기술에서 파생된 저전력 광역 네트워크(LPWAN) 사양입니다. 이 튜토리얼에서는 LoRaWAN을 살펴보지 않지만 자세한 내용은 LoRa Alliance 및 The Things Network 웹사이트를 참조하세요.
LoRa는 홈 오토메이션 프로젝트에 어떻게 유용할 수 있을까요?
실제 적용 사례를 살펴보겠습니다.
들판의 습도를 측정하고 싶다고 가정해 보겠습니다. 집에서 그리 멀지 않지만 Wi-Fi가 제공되지 않을 가능성이 큽니다. 따라서 ESP32와 습도 센서가 있는 센서 노드를 빌드하여 LoRa를 사용하여 하루에 한두 번 다른 ESP32로 습도 판독값을 보낼 수 있습니다.
이후 ESP32는 Wi-Fi에 액세스할 수 있으며 습도 판독값을 표시하는 웹 서버를 실행할 수 있습니다.
이는 ESP32 프로젝트에서 LoRa 기술을 사용하는 방법을 보여주는 예일 뿐입니다.
참고: "Arduino IDE로 ESP32 배우기" 과정에서 이 프로젝트를 빌드하는 방법을 설명합니다. 목차의 프로젝트 4입니다: LoRa 장거리 센서 모니터링 - 외부에서 센서 판독값 보고: 토양 수분 및 온도. 자세한 내용은 과정 페이지를 확인하세요.
LoRa를 사용한 ESP32
이 섹션에서는 Arduino IDE를 사용하여 ESP32로 LoRa를 시작하는 방법을 보여드리겠습니다. 예를 들어 간단한 LoRa 송신기와 LoRa 수신기를 빌드합니다.
LoRa 송신기는 테스트 목적으로 "hello" 메시지와 카운터를 보냅니다. 이 메시지는 센서 판독값이나 알림과 같은 유용한 데이터로 쉽게 대체할 수 있습니다.
이 부분을 따르려면 다음 구성 요소가 필요합니다.
- 2x ESP32 DOIT DEVKIT V1 보드
- 2x LoRa 트랜시버 모듈(RFM95)
- RFM95 LoRa 브레이크아웃 보드(선택 사항)
- 점퍼 와이어
- 브레드보드 또는 스트립보드
대안:
2x TTGO LoRa32 SX1276 OLED
ESP32와 분리된 LoRa 트랜시버 모듈을 사용하는 대신, LoRa 칩과 OLED가 내장된 ESP32 개발 보드가 있어 배선이 훨씬 간단합니다. 이러한 보드 중 하나가 있는 경우 다음을 따를 수 있습니다. TTGO LoRa32 SX1276 OLED 보드: Arduino IDE 시작하기.
ESP32 내장 LoRa 및 OLED
Arduino IDE 준비
Arduino IDE용 애드온이 있어서 Arduino IDE와 해당 프로그래밍 언어를 사용하여 ESP32를 프로그래밍할 수 있습니다. 다음 튜토리얼 중 하나를 따라 ESP32에서 작동하도록 Arduino IDE를 준비하세요(아직 준비하지 않았다면).
Windows 지침 - Arduino IDE의 ESP32 보드
Mac 및 Linux 지침 - Arduino IDE의 ESP32 보드
LoRa 라이브러리 설치
ESP32로 LoRa 패킷을 쉽게 송수신할 수 있는 여러 라이브러리가 있습니다. 이 예에서는 sandeep mistry의 arduino-LoRa 라이브러리를 사용합니다.
Arduino IDE를 열고 Sketch > Include Library > Manage Libraries로 이동하여 "LoRa"를 검색합니다. 아래 그림에서 강조 표시된 LoRa 라이브러리를 선택하여 설치합니다.
LoRa 트랜시버 모듈 가져오기
ESP32로 LoRa 메시지를 송수신하려면 RFM95 트랜시버 모듈을 사용합니다. 모든 LoRa 모듈은 트랜시버로, 정보를 송수신할 수 있습니다. 2개가 필요합니다.
Semtech SX1276/77/78/79 기반 보드와 같은 다른 호환 모듈을 사용할 수도 있습니다. 여기에는 RFM96W, RFM98W 등이 포함됩니다.
또는 ESP32 Heltec Wifi 모듈이나 TTGO LoRa32 보드와 같이 LoRa와 OLED 디스플레이가 내장된 ESP32 보드도 있습니다.
LoRa 트랜시버 모듈을 구매하기 전에 해당 위치에 맞는 올바른 주파수를 확인하세요. 다음 웹 페이지를 방문하여 각 국가의 RF 신호와 규정에 대해 자세히 알아볼 수 있습니다. 예를 들어 포르투갈에서는 863~870MHz 사이의 주파수를 사용하거나 433MHz를 사용할 수 있습니다. 이 프로젝트에서는 868MHz에서 작동하는 RFM95를 사용합니다.
RFM95 트랜시버 모듈 준비
LoRa가 내장된 ESP32 개발 보드가 있는 경우 이 단계를 건너뛸 수 있습니다.
RFM95 트랜시버는 브레드보드에 적합하지 않습니다. 2.54mm 헤더 핀의 일반적인 행은 트랜시버 핀에 맞지 않습니다. 연결 사이의 간격이 평소보다 짧습니다.
트랜시버 핀에 액세스하는 데 사용할 수 있는 몇 가지 옵션이 있습니다.
- 일부 와이어를 트랜시버에 직접 납땜할 수 있습니다.
- 헤더 핀을 끊고 각각 따로 납땜합니다.
- 또는 핀을 브레드보드에 친화적으로 만드는 브레이크아웃 보드를 구입할 수 있습니다.
아래 그림과 같이 모듈에 헤더를 납땜했습니다.
이렇게 하면 일반 점퍼 와이어로 모듈의 핀에 액세스하거나 헤더 핀을 넣어 스트립보드나 브레드보드에 직접 연결할 수도 있습니다.
안테나
RFM95 트랜시버 칩에는 ANA 핀에 연결된 외부 안테나가 필요합니다.
"실제" 안테나를 연결하거나 아래 그림과 같이 전도성 와이어를 사용하여 직접 만들 수 있습니다. 일부 브레이크아웃 보드에는 적절한 안테나를 추가하기 위한 특수 커넥터가 함께 제공됩니다.
와이어 길이는 주파수에 따라 다릅니다.
- 868MHz: 86.3mm(3.4인치)
- 915MHz: 81.9mm(3.22인치)
- 433MHz: 173.1mm(6.8인치)
모듈의 경우 트랜시버의 ANA 핀에 직접 납땜된 86.3mm 와이어를 사용해야 합니다. 적절한 안테나를 사용하면 통신 범위가 확장됩니다.
중요: 모듈에 안테나를 반드시 부착해야 합니다.
RFM95 LoRa 트랜시버 모듈 배선
RFM95 LoRa 트랜시버 모듈은 SPI 통신 프로토콜을 사용하여 ESP32와 통신합니다. 따라서 ESP32 기본 SPI 핀을 사용하겠습니다. 다음 회로도에 표시된 대로 두 ESP32 보드를 해당 트랜시버 모듈에 연결합니다.
RFM95 LoRa 트랜시버 모듈과 ESP32 간의 연결은 다음과 같습니다.
ANA: Antenna
GND:
GND
DIO3: don’t connect
DIO4: don’t connect
3.3V:
3.3V
DIO0:
GPIO 2
DIO1: don’t connect
DIO2: don’t connect
GND: don’t connect
DIO5: don’t connect
RESET: GPIO 14
NSS: GPIO 5
SCK: GPIO 18
MOSI: GPIO 23
MISO: GPIO 19
GND: don’t connect
참고: RFM95 트랜시버 모듈에는 GND 핀이 3개 있습니다. 어떤 것을 사용하든 최소한 하나는 연결해야 합니다.
실용적인 이유로 이 회로는 스트립보드에 만들었습니다. 다루기가 더 쉽고 전선이 분리되지 않습니다. 원한다면 브레드보드를 사용할 수도 있습니다.
LoRa Sender 스케치
Arduino IDE를 열고 다음 코드를 복사합니다. 이 스케치는 LoRa 라이브러리의 예를 기반으로 합니다. LoRa를 사용하여 10초마다 메시지를 전송합니다. 모든 메시지에서 증가하는 숫자 뒤에 "hello"를 보냅니다.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Modified from the examples of the Arduino LoRa library
More resources: https://RandomNerdTutorials.com/esp32-lora-rfm95-transceiver-arduino-ide/
*********/
#include <SPI.h>
#include <LoRa.h>
//define the pins used by the transceiver module
#define ss 5
#define rst 14
#define dio0 2
int counter = 0;
void setup() {
//initialize Serial Monitor
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa Sender");
//setup LoRa transceiver module
LoRa.setPins(ss, rst, dio0);
//replace the LoRa.begin(---E-) argument with your location's frequency
//433E6 for Asia
//868E6 for Europe
//915E6 for North America
while (!LoRa.begin(868E6)) {
Serial.println(".");
delay(500);
}
// Change sync word (0xF3) to match the receiver
// The sync word assures you don't get LoRa messages from other LoRa transceivers
// ranges from 0-0xFF
LoRa.setSyncWord(0xF3);
Serial.println("LoRa Initializing OK!");
}
void loop() {
Serial.print("Sending packet: ");
Serial.println(counter);
//Send LoRa packet to receiver
LoRa.beginPacket();
LoRa.print("hello ");
LoRa.print(counter);
LoRa.endPacket();
counter++;
delay(10000);
}
코드를 잠깐 살펴보겠습니다.
필요한 라이브러리를 포함하는 것으로 시작합니다.
#include <SPI.h>
#include <LoRa.h>
그런 다음 LoRa 모듈에서 사용하는 핀을 정의합니다. 이전 회로도를 따랐다면 코드에서 사용한 핀 정의를 사용할 수 있습니다. LoRa가 내장된 ESP32 보드를 사용하는 경우 보드에서 LoRa 모듈에서 사용하는 핀을 확인하고 올바른 핀 할당을 합니다.
#define ss 5
#define rst 14
#define dio0 2
0에서 시작하는 카운터 변수를 초기화합니다.
int counter = 0;
setup()에서 직렬 통신을 초기화합니다.
Serial.begin(115200);
while (!Serial);
LoRa 모듈의 핀을 설정합니다.
LoRa.setPins(ss, rst, dio0);
그리고 지정된 주파수로 트랜시버 모듈을 초기화합니다.
while (!LoRa.begin(868E6)) {
Serial.println(".");
delay(500);
}
위치에서 사용되는 주파수와 일치하도록 주파수를 변경해야 할 수도 있습니다. 다음 옵션 중 하나를 선택하세요.
- 433E6
- 868E6
- 915E6
LoRa 트랜시버 모듈은 범위 내에서 패킷을 수신합니다. 패킷이 어디에서 오는지는 중요하지 않습니다. 발신자로부터만 패킷을 수신하도록 하려면 동기화 단어(0~0xFF)를 설정할 수 있습니다.
LoRa.setSyncWord(0xF3);
수신자와 발신자 모두 동일한 동기화 단어를 사용해야 합니다. 이렇게 하면 수신자는 동기화 단어가 포함되지 않은 LoRa 패킷을 무시합니다.
다음으로, loop()에서 LoRa 패킷을 보냅니다. beginPacket() 메서드로 패킷을 초기화합니다.
LoRa.beginPacket();
print() 메서드를 사용하여 패킷에 데이터를 씁니다. 다음 두 줄에서 볼 수 있듯이, hello 메시지를 보낸 다음 counter를 보냅니다.
LoRa.print("hello ");
LoRa.print(counter);
그런 다음 endPacket() 메서드로 패킷을 닫습니다.
LoRa.endPacket();
그 후, counter 메시지는 10초마다 발생하는 모든 루프에서 1씩 증가합니다.
counter++;
delay(10000);
발신자 스케치 테스트
ESP32 보드에 코드를 업로드합니다. 올바른 보드와 COM 포트를 선택했는지 확인합니다.
그런 다음 직렬 모니터를 열고 ESP32 활성화 버튼을 누릅니다. 아래 그림과 같이 성공 메시지가 표시됩니다. 카운터는 10초마다 증가합니다.
LoRa 수신기 스케치
이제 다른 ESP32를 가져와 다음 스케치(LoRa 수신기 스케치)를 업로드합니다. 이 스케치는 정의한 동기화 단어가 있는 LoRa 패킷을 수신하고 직렬 모니터에 패킷의 내용과 RSSI를 인쇄합니다. RSSI는 수신 신호 강도를 측정합니다.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Modified from the examples of the Arduino LoRa library
More resources: https://RandomNerdTutorials.com/esp32-lora-rfm95-transceiver-arduino-ide/
*********/
#include <SPI.h>
#include <LoRa.h>
//define the pins used by the transceiver module
#define ss 5
#define rst 14
#define dio0 2
void setup() {
//initialize Serial Monitor
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa Receiver");
//setup LoRa transceiver module
LoRa.setPins(ss, rst, dio0);
//replace the LoRa.begin(---E-) argument with your location's frequency
//433E6 for Asia
//868E6 for Europe
//915E6 for North America
while (!LoRa.begin(868E6)) {
Serial.println(".");
delay(500);
}
// Change sync word (0xF3) to match the receiver
// The sync word assures you don't get LoRa messages from other LoRa transceivers
// ranges from 0-0xFF
LoRa.setSyncWord(0xF3);
Serial.println("LoRa Initializing OK!");
}
void loop() {
// try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize) {
// received a packet
Serial.print("Received packet '");
// read packet
while (LoRa.available()) {
String LoRaData = LoRa.readString();
Serial.print(LoRaData);
}
// print RSSI of packet
Serial.print("' with RSSI ");
Serial.println(LoRa.packetRssi());
}
}
이 스케치는 이전 스케치와 매우 유사합니다. loop()만 다릅니다.
발신자 스케치에서 사용된 것과 일치하도록 주파수와 동기화 단어를 변경해야 할 수도 있습니다.
loop()에서 코드는 parsePacket() 메서드를 사용하여 새 패킷이 수신되었는지 확인합니다.
int packetSize = LoRa.parsePacket();
새 패킷이 있으면 사용 가능한 동안 해당 내용을 읽습니다.
수신 데이터를 읽으려면 readString() 메서드를 사용합니다.
while (LoRa.available()) {
String LoRaData = LoRa.readString();
Serial.print(LoRaData);
}
수신 데이터는 LoRaData 변수에 저장되고 직렬 모니터에 인쇄됩니다.
마지막으로 다음 두 줄의 코드는 수신된 패킷의 RSSI를 dB로 인쇄합니다.
Serial.print("' with RSSI ");
Serial.println(LoRa.packetRssi());
LoRa 수신기 스케치 테스트
이 코드를 ESP32에 업로드합니다. 이 시점에서 서로 다른 스케치가 있는 두 개의 ESP32 보드가 있어야 합니다. 송신기와 수신기입니다.
LoRa 수신기의 직렬 모니터를 열고 LoRa 송신기 활성화 버튼을 누릅니다. 수신기에서 LoRa 패킷을 받기 시작해야 합니다.
축하합니다! ESP32를 사용하여 LoRa 송신기와 LoRa 수신기를 만들었습니다.
더 나아가기
이제 해당 지역에서 송신기와 수신기 간의 통신 범위를 테스트해야 합니다. 통신 범위는 환경에 따라 크게 다릅니다(높은 빌딩이 많은 시골이나 도시 지역에 사는 경우). 통신 범위를 테스트하려면 LoRa 수신기에 OLED 디스플레이를 추가하고 걸어가서 얼마나 멀리 통신할 수 있는지 확인할 수 있습니다(이는 향후 튜토리얼의 주제입니다).
이 예에서는 hello 메시지만 보내지만, 아이디어는 해당 텍스트를 유용한 정보로 바꾸는 것입니다.
마무리
요약하면, 이 튜토리얼에서는 LoRa 기술의 기본 사항을 보여주었습니다.
- LoRa는 무선 변조 기술입니다.
- LoRa는 소량의 데이터를 장거리 통신할 수 있으며 저전력이 필요합니다.
- LoRa는 지점 간 통신이나 네트워크에서 사용할 수 있습니다.
- LoRa는 Wi-Fi 네트워크의 적용을 받지 않고 몇 미터 떨어져 있는 센서를 모니터링하려는 경우 특히 유용할 수 있습니다.
또한 간단한 LoRa 송신기와 LoRa 수신기를 만드는 방법도 보여드렸습니다. 이것들은 LoRa를 시작하기 위한 간단한 예일 뿐입니다. 이 주제에 대한 더 많은 프로젝트를 곧 추가할 예정이니 기대해 주세요!
다음도 읽어보시면 좋을 듯합니다.
[리뷰] TTGO LoRa32 SX1276 OLED: 핀아웃, 사양 등
[가이드] TTGO LoRa32 SX1276 OLED 보드: Arduino IDE 시작하기
이것은 Arduino IDE로 ESP32 배우기 과정에서 발췌한 것입니다. ESP32를 좋아하고 더 자세히 알고 싶다면 Arduino IDE로 ESP32 배우기 과정에 등록하는 것이 좋습니다.
읽어주셔서 감사합니다. 배움을 멈추지 마세요.
하지 않은 일에 대한 후회는 도전과 실패로 인한 고통보다 훨씬 큽니다.
'ESP32' 카테고리의 다른 글
ESP32 ESP-NOW 시작하기 (0) | 2025.01.08 |
---|---|
ESP32 MQTT 메시지를 게시하고 토픽을 구독하는 방법 (0) | 2025.01.08 |
ESP32 BLE 서버 및 클라이언트(Bluetooth Low Energy) (1) | 2025.01.08 |
ESP32 Bluetooth Low Energy(BLE) 시작하기 (1) | 2025.01.06 |
ESP32 웨이크업 소스를 사용한 Deep Sleep (1) | 2025.01.03 |
ESP32 인터럽트와 타이머를 사용한 PIR 모션 센서 (3) | 2025.01.03 |
ESP32 DHT22 센서 및 OLED 디스플레이를 사용한 온도 및 습도 모니터링 (1) | 2024.12.27 |
ESP32 ADC 읽기 Arduino IDE (2) | 2024.12.24 |
더욱 좋은 정보를 제공하겠습니다.~ ^^