반응형

【 아두이노모듈#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과 같은 리튭배터리는 직접적인 합선(쇼트)이나  회로내에서의 합선 등에 의해 불꽃과 소폭발의 가능성이 있는 제품이므로 다루실 때 충분한 주의와 사전지식이 필요하니 주의하시기 바랍니다.

반응형