아두이노에서 NRF24L01 무선모듈 사용 예
2개의 아두이노 간에 무선으로 데이터를 송수신할 수 있도록 2개의 무선 모듈을 구입하여 테스트하려고 한다. 동일한 무선모듈을 2개 구입해야만 가능한 일이다. 가격도 저렴하고 송달거리가 장애물이 없는 개활지에서는 100m 까지 이를 수 있다고 한다.
네로마트에서 구입한 NRF24L01 모듈(초록색, LKEMBEDDED사 제조)
아두이노와 위의 NRF2401 모듈의 연결
아두이노 NFR24L01 모듈( 초록색, LK Embeded 제조 )
3.3V VCC
GND GND
D7 CE
D8 CSN
D11 MOSI
D12 MISO
D13 SCK
CE, CSN 에 연결되는 아두이노 핀은 임의로 선택할 수 있고 소스코드에서 해당 핀 번호를 등록하면 된다
그 외의 다른 핀은 고정되어 있는 것이므로 임의로 변경하면 작동하지 않는다
파이프 주소는 송/수신 측에서 동일한 주소를 사용해야 한다
NFR24L01 모듈은 인터넷에서 구매할 때 검정색, 초록색 바탕으로 2가지가 있는데, 검정색 바탕의 모듈을 구매해서 아두이노와 연결하여 테스트해보니 통신이 이루어지지 않았다. 아두이노 보드에서 무선 모듈에 공급하는 전류가 너무 낮아서 잘 작동하지 않는 문제가 있다는 정보를 본 적이 있어서 이번에는 초록색 바탕의 무선모듈을 다시 구해서 테스트했는데 송수신에 성공했다
NFR24L01 모듈은 송/수신 기능으로 모두 사용할 수 있지만 모듈 한개로 동시에 송수신할 수는 없고 송신할 때는 수신할 수 없고, 수신할 때는 동시에 송신할 수는 없다. 그러므로 송/수신 테스트를 위해서는 반드시 2개의 모듈을 구입해야 한다
테스트해본 결과 가까운 거리일지라도 집안의 벽 뒤에서는 수신되지 않았다. 툭 트인 공간에서는 100m까지 가능하다고 적혀 있었는데 아직 테스트해보지는 않았다
아래의 코드가 컴파일에 성공하기 위해서는 NFR24L01을 지원하는 RF24라는 라이브러리를 먼저 설치해야 한다
RF24 라이브러리 다운로드 https://github.com/maniacbug/RF24
송신측 코드
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #define CE_PIN 7 #define CSN_PIN 8 int joystick[2]; RF24 radio(CE_PIN, CSN_PIN); const uint64_t pipe = 0xE8E8F0F0E1LL; int x; int y; void setup(void) { Serial.begin(9600); radio.begin(); radio.setPALevel(RF24_PA_MIN); // LOW, MAX radio.openWritingPipe(pipe); x = 0; y = 0; } void loop(void) { joystick[0] = x++; joystick[1] = y++; radio.write( joystick, sizeof(joystick) ); Serial.println("Sent"); delay(1000); }
수신측 코드
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #define CE_PIN 7 #define CSN_PIN 8 int joystick[2]; RF24 radio(CE_PIN, CSN_PIN); const uint64_t pipe = 0xE8E8F0F0E1LL; void setup(void) { Serial.begin(9600); radio.begin(); radio.setPALevel(RF24_PA_MIN); // LOW, MAX radio.openReadingPipe(1,pipe); radio.startListening(); } void loop(void) { if ( radio.available() ) { radio.read( joystick, sizeof(joystick) ); Serial.print(joystick[0]); Serial.print(", "); Serial.println(joystick[1]); } }