반응형

 

※ 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

(카카오로 보기)

 

 

반응형