티스토리 뷰

프로젝트/nRF24L01

nRF24L01 - Transmitter

Just4Fun 2018. 3. 31. 16:06

nRF24L01을 이용한 무선 통신

nRF24L01 register 읽어보기


nRF24L01의 내부 레지스터들을 정상적으로 읽어 오는 것을 확인하였으면 다음 과정으로 송신 기능을 구현해 보도록 하겠다.

위의 코드는 송신기로 동작 시키기 위한 초기화 코드이다.

nRF24L01은 모두 6개의 data pipe가 있는데 8번 줄은 모든 pipe를 close 시키는 코드이다.

9번줄에서 pipe0만 open하여 하나의 pipe에서만 수신하도록 하는것이다.

nRF24L01은 내부에서 packet 전송을 할때 CRC 검사를 수행할 수 있는 옵션을 제공하는데 8bit CRC와 16bit CRC를 선택할 수 있다. 10번줄에서는 16bit CRC를 사용하도록 설정하는 코드이다.

nRF24L01은 Enhanced ShockBurst라는 기능을 제공하는데, 이 기능은 쉽게 말해서 MCU의 제어 없이 송신측에서 보낸 패킷을 수신측에서 정상적으로 수신했다는 사실을 다시 송신측으로 알려주는 기능이다.  그러므로 송신측에서는 데이터 패킷을 송신한 후 Ack 신호가 오기를 기다리는데 무한정 기다리는 것이 아니고 주어진 시간만큼만 기다렸다가 수신측으로부터 Ack신호를 못받으면 마지막으로 송신했던 데이터를 재송신한 후 다시 일정 시간 Ack 신호를 기다리게 된다.  Ack 신호를 또 못 받으면 다시 재송신하는데 이 때에도 무한히 반복해서 재송신 하는것이 아니고 주어진 회수만큼만 재송신 되도록 미리 설정해 놓게 된다.  11번 줄이 바로 재송신 회수와 패킷 송신후 ack 신호를 얼마동안 기다릴것인지 설정하는 코드이다.  이 프로젝트에서는 15번까지 재송신 할 수 있게 하고, ack 신호를 기다리는 시간은 500us가 되도록 설정 하였다.

13~15번 줄은 송신측과 수신측이 구별될 수 있는 주소를 설정하는 코드이다.  주소는 5바이트 크기로 설정하였다.

17번 줄에서 송신모드로 동작 되도록 설정하였다.

18번 줄은 RF 주파수를 설정하는 코드인데 반드시 송수신측이 동일한 RF 주파수를 사용하여야 한다.

19번 줄은 송신 속도를 설정하는 코드인데 이 속도는 1Mbps와 2Mbps 둘 중에 하나를 선택하면 된다.  각각의 속도는 장단점이 있는데 속도가 낮으면 수신 감도가 향상되므로 도달 거리가 좀 더 멀어지게 되는 이점이 있다.

21,22번줄은 Tx와 Rx FIFO에 쓰레기 값들이 들어있으면 모두 제거하도록 하는 코드이다.

24번 줄은 모든 초기 설정이 완료 되었으면 Power Up 상태로 만들어 Standby 모드가 되도록 하는 것이다.

초기화 이후 데이터를 보내기 위해서 nrf24_send() 함수를 사용하면 된다.  이때 주의할 점은 한번에 보내는 데이터의 크기가 최대 32바이트까지라는 것을 알고 있어야 한다.  nRF24L01은 송수신 측에서 몇 바이트 크기의 데이터를 주고 받을것인지 미리 고정시킬수도 있고, 32바이트 크기 이내에서 가변적인 크기의 패킷을 주고 받을수도 있다.  이 프로젝트에서는 최대 데이터 크기인 32바이트로 고정하여 패킷을 주고 받는것으로 설정할 것이다.

보내고자하는 데이터를 Tx FIFO에 써 주도록 하는 nrf24_write_payload() 함수 안을 자세히 보면 실제 보내는 데이터의 크기가 32바이트보다 작을 경우 나머지 부분은 0으로 채워서 32바이트 크기의 payload가 되도록 하는것을 볼 수 있다.

데이터를 Tx FIFO에 넣고 난 다음에 CE 신호를 low에서 high 상태로 만들었다가 최소 10us를 유지 시킨 후 다시 low로 만들어 주면 FIFO에 있던 데이터가 차례로 RF신호로 변환되어 공중으로 나가게 된다.  21~23번줄이 CE신호를 펄스 형태로 만들어 주는 코드인데 여유있게 20us 동안 high 상태를 유지 시키도록 하였다.

CE 펄스 신호 이후에는 수신측에서 데이터를 제대로 받았는 지, 아니면 주어진 재전송 회수가 될때가지 ack 신호를 수신하지 못하였는지 검사를 하여야 한다.

10번 줄은 Tx 모드로 설정한 후 레지스터 값을 덤프하여 제대로 설정되었는지 확인해 보는 코드이다.

loop() 함수에서는 16비트 카운트 값을 매 200ms마다 내 보내도록 한다.

위의 그림은 Tx 모드 설정후 nnRF24L01 내부 레지스터를 덤프한 결과이다.  코드에서 설정시킨 값들이 제대로 들어가 있음을 볼 수 있다.


transmitter.zip


'프로젝트 > nRF24L01' 카테고리의 다른 글

nRF24L01 - Receiver  (16) 2018.03.31
nRF24L01 register 읽어보기  (13) 2017.02.04
nRF24L01을 이용한 무선 통신  (2) 2017.02.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함