2018년 12월 18일 화요일

LoRa를 활용하자 - #3 (S/W 제작편)

이 내용은
[ LoRa를 활용하자 - #1 ] [ LoRa를 활용하자 - #2 ] 와 연결된 내용입니다.

1. LoRa Library

 LoRa관련된 하드웨어를 Heltec 제품으로 구하고 나니 납땜도 쉽게 끝났다. (사실 거의 한것이 없을 정도 이다. )  통신 모듈인 STX1276에 관련해서는 이미 라이브러리가 제공된다.  제조사에서 제공하는 링크는 아래와 같다.
 [ Heltec ESP32-LoRa Library 링크 ]
위의 링크는 가끔식 업데이트가 되니 아두이노 IDE에 라이브러리로 설치하는 것을 추천한다. 내가 5개월 전에 LoRa를 처음 연구하기 시작하였을 때는 Heltec의 LoRa 모듈은 생각보다 통신거리가 짧은 편이어서 출력을 20dBm으로 바꾸는 코드를 추가하였는데,  3개월전 업데이트된 라이브러리의 코드를 보니 내가 수정한 것처럼 변경되어 있었다.

아래의 코드가 최근 라이브러리에서 업데이트 되었다.
// set output power to 20 dBm
setTxPowerMax(20);  //PA_BOOST
 // set Spreading Factor to 7 (6~12)
 setSpreadingFactor(11);
 // put in standby mode
 setSignalBandwidth(125E3);

 setSyncWord(0x34);

2. 보내기와 받기 모드로 동작 

 당연한 이야기겠지만 하나의 LoRa 칩으로 보내기와 받기를 동시에 수행할 수 없다. 한 순간을 기준으로 한다면 받거나 또는 보내기만 가능한 상태인 것이다.  따라서 테스트 하기 위해서는 보내는 쪽과 받는 쪽이 각각 존재하여야 한다.

3. 테스트를 위한  Sender

테스트를 위하여 고정된 것을 제작하는 Sender는 일정 주기마다 신호를 보내는 것으로 작성하였다.  코드는 정말 간단하다.
먼저 LoRa.h 파일을 include한다. 그리고 Heltec의 모듈과 관련된 PIN들을 정의해준다.
이 PIN들은 변경 불가능 하다.
#include <LoRa.h>
// Pin definetion of WIFI LoRa 32
// HelTec AutoMation 2017 support@heltec.cn
#define SCK 5 // GPIO5 -- SX127x's SCK
#define MISO 19 // GPIO19 -- SX127x's MISO
#define MOSI 27 // GPIO27 -- SX127x's MOSI
#define SS 18 // GPIO18 -- SX127x's CS
#define RST 14 // GPIO14 -- SX127x's RESET
#define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request)

setup 함수도 간단하다.  SPI통신을 시작하고 LoRa의 핀을 정의하고, 역시 LoRa의 begin 함수를 호출 하면 끝이다.
void setup() {
Serial.begin(115200);
SPI.begin(SCK, MISO, MOSI, SS);
LoRa.setPins(SS, RST, DI00);

if (!LoRa.begin(915E6, true)) { // 915MHz
Serial.println("Starting LoRa failed!");
while (1); // restart
}
delay(100);
}

loop 함수에서는 1초 마다 ID01이라는 문자열과 지금까지 보낸 횟수를 출력하도록 하였다.
void loop() {
// send packet
LoRa.beginPacket();
LoRa.print("ID01 ");
LoRa.print(counter);
LoRa.endPacket();
counter++;
delay(1000); // wait for a second
}

통신이 정상적으로 이루어진다면 Sender가 1초마다 보내는 Reciver을 클라이언트가 받게 될 것이다.


4. 테스트를 위한 Reciver 

Reciver는 선언하는 부분은 동일하며 setup 함수에서 아래의 2행을 추가하면 된다.
 // register the receive callback
 LoRa.onReceive(onReceive);

 LoRa.receive();

 loopp 함수에서는 아무것도 안하며, 데이터 수신이 되면 불려지는 callback 함수는 아래와 같다.  문자열을 받아서 그대로 출력하는 단순기능이라 역시 코드가 짧다.
void onReceive(int packetSize) {
String packet = "";
for (int i = 0; i < packetSize; i++) {
packet += (char) LoRa.read();
}
Serial.println(packet);
//rssi = "RSSI " + String(LoRa.packetRssi(), DEC) ;
}


5. 응용 분야

- 원격 온도/습도 측정 : WiFi 통신이 불가능한 거리의 외부 온도를 측정하여 정보를 전달할 수 있다. 저비용 Smart Farm을 고려하는 내 입장에서는 비닐하우스의 온도/습도 측정이 딱 맞을듯하다.
- 원격 제어 : 역시 통시 거리가 어느 정도 자유로워지기 때문에 여러  분야에 적용 가능하다.
- 위치 추적 : 아직 초등학생인 아들의 위치가 걱정된다. 아파트 베란다에 수신기를 설치하고, GPS 모듈과 결합하여 아들 책가방에 넣어 둔다면 어디쯤 있는지 쉽게 알수 있을듯 하다. 사실 키즈폰을 쓰고 있어서 추적이 가능하지만 생각보다 정확하지 않다.

* 원격검침 분야에서는 전력 사용량, 상수도 검침등의 분야에서 많이 활용된다.

테스트 내용이 정리되면, 다음에는  LoRa  테스트편을 올릴 예정이다.


댓글 없음:

댓글 쓰기

3단 6핀 스위치로 DC 모터의 회전 방향을 바꾸어 보자

1. 필요는 연구의 어머니 항상 느끼는 부분이다. 필요하지 않으면 연구하지 않으며, 필요하면 연구한다. DC 모터를 조건에 따라서 정방향 또는 역방향으로 회전시켜야 하는 필요가 생겼다. 처음에는 MCU 및 Relay Switch를 이용하는 방법을 생각...