반응형

 

※ 18650과 같은 리튭배터리는 직접적인 합선(쇼트)이나  회로내에서의 합선 등에 의해 불꽃과 소폭발의 가능성이 있는 제품이므로 다루실 때 충분한 주의와 사전지식이 필요하니 주의하시기 바랍니다.

 

【 아두이노모듈#20 nRF24L01  조이스틱으로 서보모터 무선 제어하기! 

지난시간 nRF24L01 모듈을 이용하여 두 대의 아두이노 보드간의 통신 실습을 진행하였다.  간단한 문자를 송신하고 수신측에서는 시리얼모니터를 통해 문자가 잘수신되는지 확인하는 기본적인 실험이었다. 이번엔 "조이스틱을 이용해서 앞뒤로 움직이면 서보모터가 0도~180도 회전하도록 구현해보자.  매우 흥미로울 것이다. 

 Let's get it~!

 

▶ 선수학습 :

    1. [아두이노 모듈#14] 조이스틱 Joystick 사용하기 #1 ☜ (클릭)

    2. [아두이노 모듈#19] 2.4G RF 무선통신 하기! (nRF24L01 기본사용법)  ☜ (클릭)

 

▶ 실습 회로 도면 :

(1. 조이스틱-송신기회로)

(조이스틱-송신쪽 연결도면)

 

(2. 조이스틱-수신기회로)

(서보모터-수신쪽 연결도면)

[ 특이(주의) 사항]

- 아래 실제조립 회로에서는 nRF24L01 어뎁터 소켓을 연결하여 사용하였다. 별다른 큰 차이는 없으며 3.3V 전원을 사용하지 않고 동일하게 5V전원으로 연결시키기 위한 차이 일뿐으로, 소켓을 사용하지 않아도 무방하다.

- "1. 조이스틱송신기"회로의 전원은 9V 베터리를 사용하여도 관계 없으나, "2. 서보모터-수신기"회로쪽은 서보모터 구동에 충분한 전류공급이 필요함으로, AA건전지 x 4개(총합 6V)  혹은 18650 x 2개(총합 7.4V) 를 연결하여야 동작이 원활할 것이다. (참고로, 아두이노 Vin 단자의 입력 전압은 최소6V, 권장7V이상이다.  또한 9V 사각 건전지는 전압은 높으나 출력 전류가 낮기 때문에 모터구동 회로 전원으로는 적합하지 않다.-동작이 잘 되지 않는다.)  

1. AA battery  x 4 개 (총 6V)

2. 18650 battery x 2 개 (총 7.4V)

(18650 베터리는 AA소켓에 들어가지 않으니 별도의 18650소켓이 필요하며, 18650도 충전보호회로가 들어 있는 것과 들어 있지 않은 18650 베터리가 따로 존재한다. 따라서 충전보호회로가 들어 있는 베터리를 사용한다면, 소켓도 거기에 맞는 좀더 큰 소켓이 필요하다.   본 영상에서는 충전보호회로가 들어 있지 않은 베터리와 소켓을 사용하였으며, 충전은 따로 18650 전용충전기로 충전하면 별문제 없다.)

 

▶ 실습목표  :  

    1. nRF24L01 모듈 사용법을 익힐 수 있다.

    2. nRF24L01 모듈을 이용한 RF 무선 통신 모듈에 대해 익힐 수 있다.

    3. 조이스틱을 이용하여 서보모터를 회전(제어) 할 수 있다. 

 

▶  :코딩

코딩에 앞서, 'nRF24' 관련 라이브러리 파일이 필요하다. 이를 깃허브를 통해 다운 받거나 아래 첨부파일로 다운받아서, 아두이노에서 추가해주어야 한다. 

( 스케치IDE : 스케치 》 라이브러리 포함하기 》 .ZIP 라이브러리 추가 》 다운받은 라이브러리 선택.  끝 ) 

RF24-master.zip
0.36MB

깃 허브 직접 다운로드 :  https://github.com/nRF24/RF24

 

《송신기 코드》 아래 코드를 송신용 아두이노에 업로드 시킨다.

#include  <SPI.H>
#include  <nRF24L01.h>
#include  <RF24.h>
RF24 radio(7, 8);    // SPI통신을 위한 (CE, CSN) 핀 선언  
const byte address[6] = "00001";  // 송신기와 수신기를 동일한 값으로 주소 설정함(5자리) 

int x_key = A0;                                               
int y_key = A1;                                               
int x_pos;
int y_pos;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(false); //수신단의 Ack신호를 받을 때까지 계속 송신하는 기능OFF(전력소모줄임)
  radio.openWritingPipe(address);  // 데이터를 보낼 수신 주소를 설정 
  radio.setPALevel(RF24_PA_MIN); // 송신거리에 따른, 전원공급 파워레벨 설정 
//(최소)RF24_PA_MIN → RF24_PA_LOW  RF24_PA_HIGH  RF24_PA_MAX (최대)설정가능 
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장 
  radio.stopListening();      // 모듈을 송신기로 설정 
}

void loop() {
  x_pos = analogRead (x_key) ;   // 조이스틱의 상하 움직입값 저장
  y_pos = analogRead (y_key) ;   // 조이스틱의 좌우 움직임값 저장 
  radio.write(&x_pos, sizeof(x_pos));  // 조이스틱의 값을 RF모듈을 통해 데이터 길이만큼 전송 
  Serial.println(x_pos);
  Serial.println(y_pos);
  delay(100);

 

 

 

《수신기 코드》 아래 코드를 수신용 아두이노에 업로드 시킨다.

#include  <SPI.H>
#include  <nRF24L01.h>
#include  <RF24.h>

#include  <Servo.h>
Servo servo;
RF24 radio(7, 8);     // SPI통신을 위한 (CE, CSN) 핀 선언  
const byte address[6] = "00001";  // 송신기와 수신기를 동일한 값으로 주소 설정함(5자리) 
int servo_pin = 6;   // 서보모터가 연결된 핀 설정

void setup() {
  Serial.begin(9600); 
  radio.begin(); 
  servo.attach (servo_pin ) ; 
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN); // 송신거리에 따른, 전원공급 파워레벨 설정 
//(최소)RF24_PA_MIN → RF24_PA_LOW  RF24_PA_HIGH  RF24_PA_MAX (최대)설정가능 
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장 
  radio.startListening();   // 모듈을 수신기로 설정함
}

 

void loop() {
  if (radio.available()) {   
    int x_pos ;
    radio.read(&x_pos, sizeof(x_pos));  // 조이스틱의 값을 RF모듈을 통해 데이터 길이만큼 읽음 
    Serial.println(x_pos);
    x_pos = map(x_pos, 0, 1023, 0, 179); // 수신 데이터 값을 서보모터가 움직일 수 있는 값으로 맵핑(180도)
    if (x_pos>400 && x_pos<600)  {      // 오류가 날 수 있는 값에 대한 처리 
    }
    else{
      servo.write (x_pos) ;
    }
  }
}

▶ 코드 다운로드 : 

02 nRF24_Joy_Servo.zip
0.00MB

 

▶ 회로 동작(설명) 영상 :

(YouTube : 1080P 고화질로 보기)

https://youtu.be/dCoZAOlSVRM

(카카오로 보기)

 

 

반응형
반응형

【 아두이노모듈#19 nRF24L01 :  2.4G RF 무선통신 하기! ( Arduino 통신 ) 

 nRF24L01 모듈을 이용하여 RF 무선 통신을 해보자.  블루투스통신의 경우 통신거리가 10m 내외로 짧지만, nRF24 모듈은 2.4GHz 대 주파수를 사용한 통신으로 보통 100m 까지도 통신이 가능하다. 안테나가 달린 모듈을 사용할 경우 800까지도 가능하다. 


(기본 모듈의 경우 통신거리 스펙 : 250kbps의 속도로 ~250m까지,  실제 : 100m 정도,
 외장 안테나 달린 모듈 스펙 :  250kbps의 속도로 ~1.1km까지,  실제 : 800m 정도)   

 오늘은 기본적인 연결방법과 간단한 데이터(문자)를 송수신 하는 것을 다루고, 차후에는 무선 RC기기를 컨트롤 해보려고 한다. 

 Let's get it~!

 

▶ nRF24L01 에 대해 :

 nRF24L01모듈은 기본적으로 2.4GHz 대역을 사용하는 RF(Radio Frequency)통신 모듈이다. 

이 모듈의 장점은 Bluetooth, ZigBee, NFC 모듈에 비해 가격이 매우 저렴하고 통신 가능 거리가 긴 것이 장점이다. 

 단점은, RF통신의 특성상 중간에 벽과같은 장애물이 있을 경우 수신율이 많이 떨어질 수 있다.

Image from. howtomechatronics.com

- NRF24L01 모듈은 기본적으로 다대 다 통신이 가능하며, 1MHz 간격으로 125개의 주파수 채널을 운영할 수 있고, 1대 다 통신도 가능하다.   선택적 통신을 위해 5자리의 Address(주소)를 사용한다. 

 

기본적으로 위 모듈의 VCC 단자에는 1.9V~3.6V 입력만 가능하다, 따라서 아두이노 우노에 직접연결하고자 할 경우 반드시 3.3V 출력단자에 연결해야하니 주의가 필요하다.  만약 5V단자에 연결할 경우 nRF24L01 모듈의 손상을 피할 수 없다. 

 그런데, 아래 이미지의 nRF24L01 어뎁터 소켓을 사용하면,  3.3V 레귤레이터가 내장 되어 있어 아두이노의 5V 전원단자에 연결 할 수 있다. 

 소켓을 사용하면 좋은 다른 이유는, 복제(클론) 아두이노 보드나 다른 메이커의 아두이노 보드들 중 3.3V 출력에 사용되는 레귤레이터를 용량이 작은 것으로 사용하고 있는 것들이 더러 있어서 nRF24L01 모듈을 소켓없이 3.3V 단자에 연결하여 사용할 경우 동작이 잘 안 되는 경우가 더러 있기 때문인데, 소켓을 사용하여 5V 단자에 연결하면 이런 경우를 예방할 수 있다. 

이유는 메이커 업체들이 5V 단자를 주로 사용하게 되는 아두이노 보드에서 3.3V단자는 잘 사용하지 않기 때문에 비용절감을 위해 좀더 저용량?의 저렴한 3.3V 레귤레이터를 사용하려 하기 때문일 것이다. 

 그런데, 당장 소켓을 구할 수 없을 때는 어떻게 할 것인가? 그럴때는 아래 소켓의 설명처럼, nRF24L01 모듈의 +,- 단자 사이에 10uF 이상의 전해콘덴서를 납땜하여 전원보강을 해주면 이런 문제는 해결 될 것이다. 

nRF24L01 Adapter Socket
nRF24L01을 어뎁터 소켓에 장착한 모마

또한 송수신율을 높여주기 위해 필요한 경우 아래와 같은 커패시터(전해콘덴서-약 10uF이상) 를 VCC-GND단자 사이에 연결해주면 도움이 될 수 있다. 커패시터는 전기를 모아서 내보낼 수 있는 충방전 기능이 있어 출력을 보완해주어 전원을 안정시켜줄 수 있으며, 노이즈를 제거를 위해 바이패스용으로 세라믹 콘덴서를 함께 달 수도 있다.

위 모듈은 일반적으로 탁트인 공간에서 100m 정도 송수신이 가능하다.  그런데 그 이상의 통신거리가 필요하다면, 아래와 같은 안테나가 달린 모듈을 사용하면, 이론상 800m까지도 가능하다.

 

근본적으로 원거리 통신이 필요하다면, 아래 《nRF20L01 PA-LNA 외장 안테나 모듈》을 사용하면 된다.

 

▶ 실습 회로 도면 :

(송신기 아두이노 회로와 수신기 아두이노 회로를 동일하게 구성한다)

▶ 실습목표  :  

    1. nRF24L01 모듈 사용법을 익힐 수 있다.

    2. nRF24L01 모듈을 이용한 RF 무선 통신 모듈에 대해 익힐 수 있다.

    3. 아두이노 시리얼 모니터를 통해 간단한 문자를 송수신 할 수 있다 

 

▶ 코딩 :

코딩에 앞서, 'nRF24' 관련 라이브러리 파일이 필요하다. 
이를 깃허브를 통해 다운 받거나 아래 첨부파일로 다운받아서, 아두이노에서 추가해주어야 한다.

( 스케치IDE : 스케치 》 라이브러리 포함하기 》 .ZIP 라이브러리 추가 》 다운받은 라이브러리 선택.  끝 ) 

RF24-master.zip
0.36MB

깃 허브 직접 다운로드 :  https://github.com/nRF24/RF24

 

《송신기 코드》 아래 코드를 송신용 아두이노에 업로드 시킨다.

 

#include  <SPI.h>
#include  <nRF24L01.h>
#include  <RF24.h>
RF24 radio(7, 8); // SPI통신을 위한 (CE, CSN) 핀 선언
const byte address[6] = "00001"; // 송신기와 수신기를 동일한 값으로 주소 설정함(5자리)
void setup() {
  radio.begin();
  radio.openWritingPipe(address); // 데이터를 보낼 수신 주소를 설정
  radio.setPALevel(RF24_PA_MIN); // 송신거리에 따른, 전원공급 파워레벨 설정
//(최소) RF24_PA_MIN → RF24_PA_LOW  RF24_PA_HIGH  RF24_PA_MAX (최대) 설정가능
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장

  radio.stopListening();  // 모듈을 송신기로 설정
}
void loop() {
  const char text[] = "(From) nRF24 Tx : Hello World!"; // 송신할 문자
  radio.write(&text, sizeof(text));   // 위 문자를 문자 길이 만큼 송출함
  delay(1000);
}

 

《수신기 코드》 아래 코드를 수신용 아두이노에 업로드 시킨다.

#include  <SPI.h>
#include  <nRF24L01.h>
#include  <RF24.h>
RF24 radio(7, 8);     // SPI통신을 위한 (CE, CSN) 핀 선언
const byte address[6] = "00001"; // 송신기와 수신기가 동일한 값으로 주소 설정함(5자리)
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);  // 데이터를 받을 송신기 주소를 설정
  radio.setPALevel(RF24_PA_MIN);   // 송신거리에 따른, 전원공급 파워레벨 설정
//(최소) RF24_PA_MIN → RF24_PA_LOW  RF24_PA_HIGH  RF24_PA_MAX (최대) 설정가능 
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장 
  radio.startListening();   // 모듈을 수신기(상태)로 설정
}
void loop() {
  if (radio.available()) {
    char text[32] = "";   // 데이터를 수신 받을 변수 설정
    radio.read(&text, sizeof(text));  // 수신되는 데이터 길이만큼 읽어 저장
    Serial.println(text);
  }
}

▶ 코드 다운로드 : 

nRF24 송신-수신 코드.zip
0.00MB

 

▶ 회로 동작(설명) 영상 :

(YouTube : 1080P 고화질로 보기)

https://youtu.be/5Q_yJY5bj4w

 

(카카오로 보기)

 

반응형