- 필요한 재료
- LoRa와 Raspberry Pi 연결
- Arduino와 LoRa 연결
- Raspberry Pi 용 pyLoRa
- LoRa 모듈 용 Raspberry Pi 구성
- LoRa 용 Raspberry Pi 프로그래밍
- LoRa가 Raspberry Pi와 통신하기위한 Arduino 코드
- Raspberry Pi와 Arduino 간의 LoRa 통신 테스트
LoRa 는 IoT, Connected Cars, M2M, Industry 4.0 등의 출현으로 점점 인기를 얻고 있습니다. 매우 적은 전력으로 장거리 통신이 가능하기 때문에 설계자가 배터리로 구동되는 사물에서 데이터를 송수신하는 데 사용하는 것이 바람직합니다. LoRa의 기본 사항과 Arduino에서 LoRa를 사용하는 방법에 대해 이미 논의했습니다. 이 기술은 원래 LoRa 노드가 LoRa 게이트웨이와 통신하기위한 것이지만, LoRa 노드가 장거리 정보를 교환하기 위해 다른 LoRa 노드와 통신해야하는 시나리오가 많이 있습니다. 따라서이 튜토리얼 에서는 Raspberry pi와 함께 LoRa 모듈 SX1278을 사용하는 방법을 배웁니다. Arduino와 같은 마이크로 컨트롤러에 연결된 다른 SX1278과 통신합니다. 이 방법은 Arduino가 센서에서 데이터를 가져와 LoRa를 통해 장거리 Pi로 전송하는 서버 역할을 할 수 있으며 클라이언트 역할을하는 Pi가 이러한 정보를 수신하고이를 서버에 업로드 할 수 있기 때문에 여러 곳에서 유용 할 수 있습니다. 인터넷에 액세스 할 수 있기 때문에 가능합니다. 흥미 롭죠? 자, 시작합시다.
필요한 재료
- SX1278 433MHz LoRa 모듈 – 2 개
- 433MHz LoRa 안테나 – 2Nos
- Arduino UNO- 또는 다른 버전
- 라즈베리 파이 3
Raspberry Pi가 이미 운영 체제와 함께 플래시되고 인터넷에 연결할 수 있다고 가정합니다. 그렇지 않은 경우 계속하기 전에 Raspberry Pi 시작하기 자습서를 따르십시오. 여기에서는 Rasbian Jessie가 설치된 Raspberry Pi 3을 사용하고 있습니다.
경고: 항상 433MHz 안테나와 함께 SX1278 LoRa 모듈을 사용하십시오. 그렇지 않으면 모듈이 손상 될 수 있습니다.
LoRa와 Raspberry Pi 연결
소프트웨어 패키지에 들어가기 전에 하드웨어를 준비합시다. SX1278는 16 핀인 로라 모듈 3.3V 논리 SPI를 사용하여 통신하는. Raspberry pi는 3.3V 로직 레벨에서도 작동하며 내장 SPI 포트와 3.3V 레귤레이터도 있습니다. 따라서 LoRa 모듈을 Raspberry Pi와 직접 연결할 수 있습니다. 연결 테이블은 아래와 같습니다.라즈베리 파이 | Lora – SX1278 모듈 |
3.3V | 3.3V |
바닥 | 바닥 |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / 활성화 |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
아래의 회로도를 참조 용으로 사용할 수도 있습니다. 회로도가 작성된 사용 유의 RFM9x 모듈 받는 매우 유사 SX1278 모듈, 따라서 외관은 아래 이미지 다를 수도있다.
연결은 매우 간단합니다. 직면 할 수있는 유일한 문제는 SX1278이 브레드 보드와 호환되지 않으므로 연결 와이어를 직접 사용하여 연결하거나 아래와 같이 두 개의 작은 브레드 보드를 사용해야합니다. 또한 Pi가 충분한 전류를 공급할 수 없기 때문에 별도의 3.3V 전원 레일로 LoRa 모듈에 전원을 공급할 것을 제안하는 사람은 거의 없습니다. 그러나 저전력 모듈 인 Lora는 Pi의 3.3V 레일에서 작동해야합니다. 동일한 테스트를 수행 한 결과 문제없이 작동하는 것으로 나타났습니다. 그러나 여전히 소금 한 꼬집으로 가져 가십시오. LoRa와 Raspberry pi 의 연결 설정 은 다음과 같습니다.
Arduino와 LoRa 연결
Arduino 모듈의 연결은 이전 튜토리얼에서 사용한 것과 동일하게 유지됩니다. 유일한 차이점은 Sandeep Mistry의 라이브러리를 사용하는 대신 Radio 헤드를 기반으로하는 Rspreal 라이브러리를 사용한다는 것입니다. 회로는 다음과 같습니다.
다시 Arduino Uno에서 3.3V 핀을 사용하거나 별도의 3.3V 레귤레이터를 사용할 수 있습니다. 이 프로젝트에서는 온보드 전압 조정기를 사용했습니다. 쉽게 연결할 수 있도록 아래에 핀 연결 테이블이 나와 있습니다.
LoRa SX1278 모듈 | Arduino UNO 보드 |
3.3V | 3.3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
모듈이 브레드 보드에 맞지 않기 때문에 연결 와이어를 직접 사용하여 연결했습니다. 연결이 완료되면 Arduino LoRa 설정은 다음과 같습니다.
Raspberry Pi 용 pyLoRa
LoRa와 함께 사용할 수있는 많은 파이썬 패키지가 있습니다. 또한 일반적으로 Raspberry Pi는 여러 LoRa 노드에서 데이터를 가져 오기 위해 LoRaWAN으로 사용됩니다. 그러나이 프로젝트에서 우리의 목표는 두 개의 Raspberry Pi 모듈간에 또는 Raspberry Pi와 Arduino간에 피어 투 피어 통신을 수행하는 것입니다. 그래서 pyLoRa 패키지를 사용하기로 결정했습니다. Arduino 및 Raspberry Pi 환경에서 사용할 수있는 rpsreal LoRa Arduino 및 rpsreal LoRa Raspberry pi 모듈이 있습니다. 지금은 Raspberry Pi 환경에 중점을 두겠습니다.
LoRa 모듈 용 Raspberry Pi 구성
앞서 언급했듯이 LoRa 모듈은 SPI 통신과 함께 작동하므로 Pi에서 SPI를 활성화 한 다음 pylora 패키지 를 설치해야합니다. Pi의 터미널 창을 연 후 아래 단계에 따라 동일하게 수행하십시오. 다시 말하지만, 퍼티를 사용하여 파이에 연결하면 편리한 방법을 사용할 수 있습니다.
1 단계: 다음 명령을 사용하여 구성 창 으로 이동합니다. 아래 창을 얻으려면
sudo raspi-config
2 단계: 인터페이스 옵션으로 이동하여 아래 이미지와 같이 SPI를 활성화합니다. LCD와 PI는 SPI 프로토콜을 통해 통신하기 때문에 SPI 인터페이스 를 활성화해야 합니다.
3 단계: 변경 사항을 저장하고 터미널 창으로 돌아갑니다. pip 및 python이 업데이트되었는지 확인한 후 다음 명령을 사용하여 RPi.GPIO 패키지 를 설치합니다 .
pip 설치 RPi.GPIO
이 패키지 클래스는 Pi의 GPIO 핀을 제어하는 데 도움이됩니다. 성공적으로 설치되면 화면이 다음과 같이 보입니다.
4 단계: 마찬가지로 다음 명령을 사용하여 spidev 패키지 설치를 진행합니다. Spidev는 Raspberry Pi에서 SPI 통신을 수행하는 데 사용할 수있는 Linux 용 Python 바인딩입니다.
pip 설치 spidev
설치에 성공하면 터미널이 아래와 같이 보일 것입니다.
5 단계: 다음으로 다음 pip 명령을 사용하여 pyLoRa 패키지 를 설치합니다. 이 패키지는 LoRa와 관련된 라디오 모델을 설치합니다.
pip 설치 pyLoRa
설치에 성공하면 다음 화면이 표시됩니다.
PyLoRa 패키지는 또한 Arduino 및 Raspberry Pi에서 원활하게 사용할 수있는 암호화 된 통신을 지원합니다. 이것은 당신의 커뮤니케이션에서 데이터 보안을 향상시킬 것입니다. 그러나 암호화는이 튜토리얼의 범위에 포함되지 않으므로이 단계 후에는 별도의 패키지를 설치해야합니다. 자세한 내용은 위의 github 링크를 따라갈 수 있습니다.
이 단계 이후에 패키지 경로 정보를 pi에 추가 하고 끝에 제공된 python 프로그램을 사용해 볼 수 있습니다. 하지만 경로를 성공적으로 추가 할 수 없었기 때문에 라이브러리를 수동으로 다운로드하고 내 프로그램에 직접 사용해야했습니다. 그래서 다음 단계를 진행해야했습니다
6 단계: 아래 명령을 사용하여 python-rpi.gpio 패키지 및 spidev 패키지 를 다운로드하고 설치합니다.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
두 설치 후 터미널 창에 다음과 같은 내용이 표시됩니다.
7 단계: 또한 git을 설치 한 다음이를 사용하여 Raspberry Pi의 python 디렉토리를 복제합니다. 다음 명령을 사용하여 수행 할 수 있습니다.
sudo apt-get install git sudo git clone
이 단계가 완료되면 Raspberry Pi 홈 폴더에서 SX127x 하위 디렉토리를 찾을 수 있습니다. 여기에는 라이브러리와 관련된 모든 필수 파일이 있습니다.
LoRa 용 Raspberry Pi 프로그래밍
P2P LoRa 통신에서 정보를 전송하는 모듈을 서버라고하고 정보를 수신하는 모듈을 클라이언트라고합니다. 대부분의 경우 Arduino는 센서와 함께 현장에서 데이터를 측정하고 Pi는 이러한 데이터를 수신하는 데 사용됩니다. 그래서이 튜토리얼 에서는 Raspberry Pi를 클라이언트로 사용 하고 Arduino를 서버 로 사용하기로 결정했습니다. 전체 라즈베리 파이 클라이언트 프로그램이 페이지의 하단에서 찾을 수 있습니다. 여기서는 프로그램의 중요한 내용을 설명하려고합니다.
주의: 프로그램 파일이 SX127x 라이브러리 폴더가있는 동일한 디렉토리에 있는지 확인하십시오. 이 폴더를 복사하여 프로젝트를 이식하려는 경우 어디에서나 사용할 수 있습니다.
이 프로그램은 LoRa 모듈이 433Mhz에서 작동 하도록 설정 한 다음 들어오는 패킷을 수신해야하는 매우 간단 합니다. 우리가 무언가를 받으면 콘솔에 간단히 인쇄합니다. 항상 그렇듯이 필요한 파이썬 라이브러리를 가져 와서 프로그램을 시작합니다.
from time import sleep from SX127x.LoRa import * from SX127x.board_config import BOARD BOARD.setup ()
이 경우 시간 패키지를 사용하여 지연을 만들고 Lora 패키지를 LoRa 통신 에 사용 하고 board_config 를 사용하여 보드 및 LoRa 매개 변수를 설정합니다. 또한 BOARD.setup () 함수를 사용하여 보드를 설정합니다.
다음 으로 세 가지 정의가 있는 python LoRa 클래스 를 만듭니다. 프로그램이 라즈베리 클라이언트로 작동하도록 들여 쓰기 만했기 때문에 클래스에는 init 클래스, start 클래스 및 on_rx_done 클래스 라는 세 가지 기능 만 있습니다. init 클래스는 set_pa_config 메소드에 설정된 125kHz 대역폭으로 433MHz에서 LoRa 모듈을 초기화합니다. 그런 다음 모듈을 절전 모드로 전환하여 전력 소비를 절약합니다.
# 초기화 후 중간 범위 기본값은 434.0MHz, Bw = 125kHz, Cr = 4/5, Sf = 128chips / symbol, 13dBm의 CRC lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (verbose) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
시작 기능은 모듈을 수신기로 구성하고 RSSI (수신 신호 강도 표시기), 상태, 작동 주파수 등을 얻는 곳 입니다. 모듈이 슬립 모드에서 연속 수신기 모드 (RXCONT)로 작동하도록 설정 한 다음 while 루프를 사용하여 RSSI 및 모뎀 상태와 같은 값을 읽습니다. 또한 직렬 버퍼의 데이터를 터미널로 플러시합니다.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) while True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
마지막으로 on_rx_done 함수는 들어오는 패킷을 읽은 후 실행 됩니다. 이 함수에서 수신 된 값은 수신 플래그를 높게 설정 한 후 Rx 버퍼에서 페이로드라는 변수로 이동합니다. 그런 다음 수신 된 값은 utf-8로 디코딩되어 사용자가 읽을 수있는 데이터를 쉘에 인쇄합니다. 또한 다른 값이 수신 될 때까지 모듈을 다시 절전 모드로 전환합니다.
def on_rx_done (self): print ("\ nReceived:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (bytes (payload).decode ("utf-8", 'ignore')) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
프로그램의 나머지 부분은 콘솔에 수신 된 값 을 인쇄하고 키보드 인터럽트를 사용하여 프로그램을 종료하는 것 입니다. 전력을 절약하기 위해 프로그램 종료 후에도 다시 보드를 절전 모드로 설정했습니다.
시도: lora.start () except KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") 마지막으로: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
LoRa가 Raspberry Pi와 통신하기위한 Arduino 코드
앞서 언급했듯이 rpsreal 코드는 Arduino와 Pi를 모두 지원하므로 Arduino와 Pi 간의 통신이 가능합니다. AirSpayce의 Radiohead Library를 기반으로 작동합니다. 따라서 먼저 Arduino IDE에 라디오 헤드 라이브러리 를 설치해야합니다.
이를 위해 Github 페이지를 방문하여 ZIP 폴더에 라이브러리를 다운로드하십시오. 그런 다음 Arduino IDE의 라이브러리 폴더에 넣으십시오. 이제 Arduino IDE를 다시 시작하면 라디오 헤드 라이브러리에 대한 예제 파일을 찾을 수 있습니다. 여기서 우리는 Arduino가 LoRa 서버로 작동하여 0에서 9와 같은 테스트 패킷을 전송하도록 프로그래밍 할 것입니다. 동일한 작업을 수행하는 완전한 코드 는 항상이 페이지 하단에서 찾을 수 있습니다. 여기에서는 프로그램의 몇 가지 중요한 내용을 설명하겠습니다.
SPI 프로토콜을 사용하기 위해 SPI 라이브러리 (기본적으로 설치됨)를 가져온 다음 라디오 헤드에서 RH_RF95 라이브러리를 가져와 LoRa 통신을 수행하여 프로그램을 시작합니다. 그런 다음 Arduino의 칩 선택 (CS), 재설정 (RST) 및 인터럽트 (INT) 핀을 Arduino와 연결 한 Arduino의 핀을 정의합니다. 마지막으로 모듈이 434MHz 주파수에서 작동하고 LoRa 모듈을 초기화해야 함을 정의합니다.
#포함
설정 기능 내에서 재설정 핀을 10 밀리 초 동안 낮게 당겨 LoRa 모듈을 재설정하여 새로 시작합니다. 그런 다음 이전에 Radio 헤드 라이브러리를 사용하여 만든 모듈로 초기화합니다. 그런 다음 LoRa 서버의 주파수와 전송 전력을 설정합니다. 전송 거리가 길수록 패킷이 이동하지만 더 많은 전력을 소비합니다.
void setup () { // 시리얼 모니터 초기화 Serial.begin (9600); // LoRa 모듈 재설정 pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); 지연 (10); digitalWrite (RFM95_RST, HIGH); 지연 (10); // LoRa 모듈 초기화 while (! rf95.init ()) { Serial.println ("LoRa radio init failed"); 동안 (1); } // 기본 주파수 434.0MHz 설정 if (! rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); 동안 (1); } rf95.setTxPower (18); // Lora 모듈의 전송 전력 }
무한 루프 기능 내에서 LoRa 모듈을 통해 데이터 패킷을 전송하기 만하면됩니다. 이 데이터는 사용자 명령의 센서 값과 같을 수 있습니다. 그러나 간단하게하기 위해 1 초 간격마다 char 값 0에서 9를 보낸 다음 9에 도달 한 후 값을 다시 0으로 초기화합니다. 값은 char 배열 형식으로 만 보낼 수 있으며 데이터 유형은 unit8_t 여야합니다. 한 번에 1 바이트입니다. 동일한 작업을 수행하는 코드는 다음과 같습니다.
void loop () { Serial.print ("Send:"); char radiopacket = char (값)}; rf95.send ((uint8_t *) radiopacket, 1); 지연 (1000); value ++; if (value> '9') value = 48; }
Raspberry Pi와 Arduino 간의 LoRa 통신 테스트
이제 하드웨어와 프로그램이 모두 준비되었으므로 Arduino 코드를 UNO 보드에 업로드하기 만하면 파이에서 Python 스케치가 시작됩니다. 두 하드웨어가 연결된 내 테스트 설정은 아래와 같습니다.
Python 클라이언트 스케치가 Pi에서 실행되면 (python 3 만 사용) 모든 것이 제대로 작동하면 셸 창을 통해 pi로 수신 된 Arduino 패킷을 볼 수 있습니다. 아래 이미지와 같이 "수신 됨: 0"에서 9까지를 확인할 수 있습니다.
필요한 모든 라이브러리가 포함 된 전체 Raspberry pi 코드는 여기에서 다운로드 할 수 있습니다.
이제 Arduino 서버를 이동하고 모듈의 범위를 확인할 수 있습니다. 필요한 경우 셸에 RSSI 값을 표시 할 수도 있습니다. 프로젝트 의 전체 작업은 아래 링크 된 비디오에서 찾을 수 있습니다. 이제 Arduino와 Raspberry pi간에 장거리 저전력 LoRa 통신을 설정하는 방법을 알았 으므로 Arduino 측에 센서를 추가하고 Pi 측에 클라우드 플랫폼을 추가하여 완전한 IoT 패키지를 만들 수 있습니다.
당신이 프로젝트를 이해하고 그것을 만드는 것을 즐겼기를 바랍니다. 작동하는 데 문제가있는 경우 아래의 댓글 섹션이나 다른 기술 요구 사항에 대한 포럼을 사용하십시오.