소프트웨어
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 라이브러리를 사용하는 예제를 보겠다
위 처럼 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 모드 같은게 있다는데 아직 자세히는 안알아보았고, 앞으로 쓰다가 사용하게 되면 차차 추가해보도록 하겠다.
'Software Development > IoT, Arduino, RasberryPi' 카테고리의 다른 글
아두이노 송수신기 만들기 #조이스틱 연결 (1) | 2015.11.07 |
---|---|
아두이노 송수신기 만들기 #통신모듈 테스트 (3) | 2015.10.31 |
nRF24L01 모듈 #1 - 소개 및 하드웨어 (5) | 2015.10.29 |
Visual Studio 로 Arduino 개발환경 만들기 (0) | 2015.10.28 |
아두이노 송수신기 만들기 #시작 (0) | 2015.10.23 |