반응형

【 아두이노모듈#21 nRF24L01  조이스틱으로 서보모터 2대 제어하기!  

 지난시간 nRF24L01 모듈을 이용하여 조이스틱(Joystick)으로 서보모터 1대를 제어해보았다. 이번엔 조이스틱의 상하 뿐아니라 좌우움직임을 함께 이용하여 서보모터 2대를 제어해볼 것이다.  여기서 중요한 것은 코딩영역이다. 한가지 데이터를 수신하여 모터 한 대를 제어하는 것은 어렵지 않았다. 하지만, 2가지의 제어값인, 조이스틱의 상하 값과 좌우 값을 수신단에서 분리처리해야 두개의 모터를 각각 제어 할 수 있을 텐데,  이 문제를 해결하는 것이 중요하다.   해결책은 C언어의 구조체 형식을 이용하면 아주 간단히 해결되니, 아래 내용을 자세히 살펴보면 쉽게 이해할 수 있을 것이다.

 Let's get it~!

 

▶ 선수학습 :

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

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

    3. [아두이노 모듈#20] 조이스틱으로 서보모터제어하기(조이스틱&서보사용법)  ☜ (클릭)

 

(모듈 기본 정보-상세내용은 위 선수학습 참조)

 

▶ 실습 회로 도면 :

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

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

서보모터 2대 제어부분(nRF24L01)

[ 특이(주의) 사항]

- 아래 실제조립 회로에서는 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. 조이스틱을 이용하여 서보모터 2대를 회전(제어) 할 수 있다. 

    4. 구조체(코딩)의 기본 개념을 이해하고 데이터를 분리 처리할 수 있다.

 

▶ : 코딩

코딩에 앞서, '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;
struct Data {    // 구조체 영역(조이스틱의 상하값joyX와 좌우값joyY 구조화)
  byte joyX;
  byte joyY;
};
Data data;  // 구조체 선언

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

void loop() {
  data.joyX = map(analogRead(x_key),0,1023,0,179);  
  data.joyY = map(analogRead(y_key),0,1023,0,179);
  Serial.println(data.joyX);
  Serial.println(data.joyY);
  radio.write(&data, sizeof(Data));
  delay(100);
}

 

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

#include  <SPI.H>
#include  <nRF24L01.h>
#include  <RF24.h>
#include  <Servo.h>
Servo servo1,servo2;
RF24 radio(7, 8);  // SPI통신을 위한 (CE, CSN) 핀 선언 
const byte address[6] = "00001"; // 송신기와 수신기를 동일한 값으로 주소 설정함(5자리)
int servo1_pin = 6;       // 서보모터 1, 연결 핀
int servo2_pin = 5;       // 서보모터 2, 연결 핀
struct Data {        // 구조체 영역(조이스틱의 상하값joyX와 좌우값joyY 구조화)
  byte joyX;
  byte joyY;
};
Data data;    

void setup() {
  Serial.begin(9600); 
  radio.begin(); 
  radio.setAutoAck(false);
  servo1.attach (servo1_pin);
  servo2.attach (servo2_pin); 
  radio.openReadingPipe(0, address);   
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening();               // 모듈을 수신기로 설정함
}

void loop() {
  while (radio.available()) {
    radio.read(&data, sizeof(Data));    
      servo1.write (data.joyX);         // 구조체 변수 데이터 구분하여 출력
      servo2.write (data.joyY); 
      Serial.println(data.joyX);         // 시리얼 모니터로 확인   
      Serial.println(data.joyY);
      delay(50);
  }  
}

 

▶ 코드 다운로드 : 

03 nRF24Joy2Servo.zip
0.00MB

 

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

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

https://youtu.be/XwUVahAWue4

 

(카카오로 보기)

 

 

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

반응형
반응형

 

※ 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

 

(카카오로 보기)

 

반응형