소프트웨어

nRF24L01 은 기본적으로 SPI 방식으로 통신을 하고, 스펙에 정의된 프로토콜로 상호 통신을 한다. (스펙은 아래 링크로 다운로드)

nRF24L01_Product_Specification_v2_0.pdf


일일이 레지스터 비트놀이를 할 수도 있겠지만, 역시나 쉽게 사용할 수 있도록 만들어놓은 라이브러리들이 있다.

몇가지 라이브러리와 대표적인 양대 라이브러리가 있는데

  • RF24 - RadioHead 라는 이름의 통신 라이브러리가 나오는데, 그 개발자가 nRF24L01+를 위해 최적화 해서 만든 라이브러리이다. 아두이노, Raspberry Pi, Attiny 등에서 모두 동작하고 많은 기능을 지원한다. nRF24L01 도 이 드라이버를 통해 지원된다.
  • RF24Network - 위 RF24 라이브러리 기반으로 OSI7 레이어 (SW 개발하시는 분들은 아시쥬?)를 구현해놓은 네트워크 라이브러리이다. 
  • RF24Mesh - 이 또한 RF24 기반으로 센서들의 Mesh Network 을 구현하는 목적으로 만들어놓은 라이브러리이다. 자동 어드레싱과 동적 설정 등이 추가된 버전이다
  • MySensors - Mesh Network 을 목표로 nRF24L01 을 중심으로 한 라이브러리를 만들어 배포하는 곳이다. 센서 데이터를 전달하는데 좀더 적합한 라이브러리 모양이다.
  • Mirf - 양대 라이브러리 중 하나의 라이브러리이다. 코드와 API 모두 심플하여 많은 사람들이 활용한다.AVRLib 의 Arduino 버전을 포팅해놓은것이다.
  • RadioHead - RF24 뿐 아니라 여러가지 통신방식을 "드라이버"개념으로 지원한다. 위 RF24 라이브러리 만든 개발자가 만들었다. 드라이버 중 RH_NRF24 드라이버가 있다.
위 라이브러리들 중 RF24 와 Mirf 라이브러리가 양대 드라이버 정도 되겠다. 가장 유명하다.혹은 위 RadioHead 라이브러리 내의 RH_NRF24 드라이버를 사용해보는것도 좋겠다


여기에서는 RF24 라이브러리를 사용하는 예제를 보겠다


위 처럼 nRF24L01 모듈의 CE, CSN 핀을 결정해주면 된다.

중요한 개념중 하나가 Channel 과 Pipe Address 이다.

Channel 은 nRF24L01 이 사용하는 2.4 ~ 2.525GHz 주파수 대역을 동시에 사용할 수 있는 통로를 말한다. nRF24L01 은 125개의 채널을 사용할 수 있다. 그런데 이건 256Kbps 아 1Mbps 의 Data Rate 를 사용할때의 이야기이고, D/R를 2Mbps 를 사용할 수 있는데 이때에는 62채널로 줄어든다. 그만큼 대역폭이 더 많이 필요하기 때문이다.

Pipe Address 는 채널 내에서의 가상의 송/수신 주소이다. Ethernet 의 IP 주소와 유사하다고 보면 된다. 이 Pipe Address 는 5바이트 이내의 값을 사용하면 되며, 예제에서는 1Node 2Node 라고 임의로 주었다.

Pipe 를 Open 할 때에는 Sender 의 Write 대상 주소는 Receiver 의 Reader 주소와 같아야 한다. 

또한 이 주소는 총 6개 까지 만들어서 Listen 할 수 있는데, 


이렇게 하나의 RX 가 총 6개의 TX 들과 1채널 내에서 통신할 수 있다. 

단, 하나 주의할 점은, 여러개의 주소(총 6개까지가능한) 중 0번 주소는 5바이트 주소값 전체를 원하는대로 만들어주면 되지만, 1번 ~ 5번 주소는 가장 마지막 LSByte 값을 제외한 나머지 4바이트 값들이 동일해야 한다. (아마도 성능때문에 요런 꼼수를 쓴 듯 하다)

위 설명을 그림으로 나타낸것이다. 

Data Pipe 0 의 주소는 뭘 해도 상관 없고, pipe1 ~ 5 까지는 앞의 4바이트 주소값이 같아야 한다는 이야기이다. 그리고 제일 마지막 1바이트는 같으면 안된다는 이야기이다.

또하나 주의할 점은 nRF24L01 모듈은 Half Duplex 모듈이다. 그래서, Write 를 하기 전에는 Listening 을 멈춰야 한다. 무전기 같은것이다. 그래서 코드에서도 radio.write() 하기 전에 radio.stopListening() 을 호출해주는 것이다.

그러면 stopListening --- startListening 과의 시간차가 발생할텐데 이 간격이 어느정도냐면

 

그림 처럼 130uS 가량 된다. 즉시 Switching 되는게 아니므로 주의해야 하겠다. 

마지막으로 Payload 의 사이즈는 최대 32 byte 까지 가능하다. 한 패킷에 데이터가 32바이트를 넘지 않아야 한다. 

그림처럼, preamble 1 바이트, 주소 3~5바이트, CRC 1~2 바이트가 붙고, 데이터는 1~32 바이트 까지 가게된다. 더 보내려면 잘라서 보내야 한다.


이정도로 기본적인 nRF24L01+ 모듈 사용에 대해 정리해본다. 더 많은 기능들과 Shock Burst 모드 같은게 있다는데 아직 자세히는 안알아보았고, 앞으로 쓰다가 사용하게 되면 차차 추가해보도록 하겠다.


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,