상세 컨텐츠

본문 제목

how to, 아두이노 드론 #2 Test test testing...

how to, 아두이노 드론/hardware

by 퍼블리셔환 2020. 8. 31. 14:40

본문

Potentiometer Test

우리가 갖고 있는 빵판(Bread Board)로 통신 실험을 진행하였다. nrf24는 라디오 통신모듈로 값이 저렴하고 블루투스보다 먼 거리에서 통신이 가능하다는 점에서 선택하였다. 실험은 nrf24를 아두이노 우노에 연결을 해주고 potentiometer의 값을 변경해줌에 따라 우노가 값을 읽는지를 실험해보았다.

 nrf24는 라디오 통신 모듈로 3.3V를 작동전압으로 이용한다. 그래서 AMS1117 모듈을 구매하여 3.3V의 전압을 공급해주었다.

 

NRF24 PIN

Nrf24는 각각의 핀을 갖고 있고 VCC 3.3V CSN D10 CE D9 MOSI D11 MISO D12에 연결해 주었다. 참고로 MOSI MISO SCK(CLK)는 각각의 아두이노 기종마다 정해져 있는 핀들이다. CE CSN은 나중에 code로 결정해줘도 괜찮은 핀들이다.

 아래의 Schematic 과 같이 만들어 주었다.

 

아래의 코드를 아두이노 나노(Transmitter 역할)에 넣어 주었다.

/* Tranmsitter code for the Arduino Radio control with PWM output

 * Install the NRF24 library to your IDE

 * Upload this code to the Arduino UNO, NANO, Pro mini (5V,16MHz)

 * Connect a NRF24 module to it:

 

    Module // Arduino UNO,NANO

    

    GND    ->   GND

    Vcc    ->   3.3V

    CE     ->   D9

    CSN    ->   D10

    CLK    ->   D13

    MOSI   ->   D11

    MISO   ->   D12



This code transmits 1 channels with data from pins A0 POTENTIOMETER
내운연 주식회사 Ver.



*/



#include <SPI.h>

#include <nRF24L01.h>

#include <RF24.h>



const uint64_t my_radio_pipe = 0xE8E8F0F0E1LL; //Reciver 코드에서 같아야 됨.



RF24 radio(9, 10);



// The sizeof this struct should not exceed 32 bytes

struct Data_to_be_sent {

  byte ch1; 

};



Data_to_be_sent sent_data;







void setup()

{

  radio.begin();

  radio.setAutoAck(false);

  radio.setDataRate(RF24_250KBPS);

  radio.openWritingPipe(my_radio_pipe);  

  sent_data.ch1 = 127;

  

}



/**************************************************/





void loop()

{

  /*If your channel is reversed, just swap 0 to 255 by 255 to 0 below

  EXAMPLE:

  Normal:    data.ch1 = map( analogRead(A0), 0, 1024, 0, 255);

  Reversed:  data.ch1 = map( analogRead(A0), 0, 1024, 255, 0);  */

  

  sent_data.ch1 = map( analogRead(A0), 0, 1024, 0, 255);



  radio.write(&sent_data, sizeof(Data_to_be_sent));

}

아래의 코드는 Reciver 역할의 아두이노 우노에 코드를 업로드 해주었다.

/* Receiver code for the Arduino Radio control with PWM output

 * Install the NRF24 library to your IDE

 * Upload this code to the Arduino UNO, NANO, Pro mini (5V,16MHz)

 * Connect a NRF24 module to it:

 

    Module // Arduino UNO,NANO

    

    GND    ->   GND

    Vcc    ->   3.3V

    CE     ->   D9

    CSN    ->   D10

    CLK    ->   D13

    MOSI   ->   D11

    MISO   ->   D12



This code receive 1 channels and prints the value on the serial monitor

내운연 주식회사 Ver.

*/





#include <SPI.h>

#include <nRF24L01.h>

#include <RF24.h>



const uint64_t pipeIn = 0xE8E8F0F0E1LL;     //Transmitter와 같아야됨.

RF24 radio(9, 10);  //CSN and CE pins



// The sizeof this struct should not exceed 32 bytes

struct Received_data {

  byte ch1;

};



int ch1_value = 0;

Received_data received_data;





/**************************************************/



void setup()

{

  Serial.begin(9600);

  //We reset the received values

  received_data.ch1 = 127;



  //Once again, begin and radio configuration

  radio.begin();

  radio.setAutoAck(false);

  radio.setDataRate(RF24_250KBPS);  

  radio.openReadingPipe(1,pipeIn);

  

  //We start the radio comunication

  radio.startListening();



}



/**************************************************/



unsigned long last_Time = 0;



//We create the function that will read the data each certain time

void receive_the_data()

{

  while ( radio.available() ) {

  radio.read(&received_data, sizeof(Received_data));

  last_Time = millis(); //Here we receive the data

}

}



/**************************************************/



void loop()

{

  //Receive the radio data

  receive_the_data();



  

  ch1_value = map(received_data.ch1,0,255,1000,2000);

  Serial.println(ch1_value);

  

  

}

실험 결과는 성공적이었다. 아두이노 우노가 transmitter에서 potentiometer의 변화하는 값을 인식하여 string으로 보여주었다.

 

 

판교 멀티칩 방문기

용산에서 산 재료들을 이용해 납땜을 하기전에 빵판(Bread Borad)를 이용해 실험을 하기로 했다. 막상 실험을 하려고 하니 우리가 갖고 있는 빵판으로는 Drone의 메인보드를 실험해보기에는 너무 작아서 판교 멀티칩에서 추가로 빵판을 구매하였다.

 현재 용산에서 산 재료들 중에서 메인보드에서 스위치 기능을 하는 MOSFET SI2302를 구매하지 못하였다. 그래서 우선 컨트롤러를 만들고 이를 바탕으로 통신 테스트를 하기로 결정했다. 실험을 하려고 하니 실험용으로 조이스틱을 구매하지 않아서 예전에 샀던 드론(FQS1)의 컨트롤러에 있는 조이스틱을 다시 쓰기로 결정했다. 근데 납땜을 통해 조이스틱을 뜯어내려고 했는데 납땜기 거치대가 없어서 직접 만들었고 인스타그램 투표로 뭘 사용할지 결정했다. ㅋㅋㅋ

하지만 막상 납땜을 할 때는 두가지 방법 모두 불안해서 신발에 납땜기를 잠시 두었다. ㅋㅋㅋㅋㅋ

이렇게 납땜기를 사용해서 조이스틱을 얻어낼 수 있었다….

컨트롤러 테스트

위와 같은 과정으로 얻은 조이스틱으로 아래의 Schematic을 참고하여 만들었다.

Controller Schematic

 

 각각의 Toggle switchD2D3를 통해 연결을 해주었고 Potentiometer(가변저항)A4에 연결했다.

 위의 +라인은 5V로 아래의 +라인은 외부전원으로 만들어서 외부전원을 Vin 핀으로 연결했다.

아래와 같은 코드를 아두이노 나노에 업로드 후 실험을 진행하였다.

RF24-master (1).zip
0.31MB

/* Tranmsitter code for the Arduino Radio control with PWM or PPM output

 * Install the NRF24 library to your IDE

 * Upload this code to the Arduino UNO, NANO, Pro mini (5V,16MHz)

 * Connect a NRF24 module to it:

 

    Module // Arduino UNO,NANO

    

    GND    ->   GND

    Vcc    ->   3.3V

    CE     ->   D9

    CSN    ->   D10

    CLK    ->   D13

    MOSI   ->   D11

    MISO   ->   D12



This code transmits 7 channels with data from pins A0, A1, A2, A3, A4, D2 and D3



*/



#include <SPI.h>

#include <nRF24L01.h> // 첨부파일 다운 받을것!!!

#include <RF24.h>



const uint64_t my_radio_pipe = 0xE8E8F0F0E1LL; //Remember that this code should be the same for the receiver



RF24 radio(9, 10);  //Set CE and CSN pins 마음대로 해줘도 괜찮습니다.



// The sizeof this struct should not exceed 32 bytes

struct Data_to_be_sent {

  byte ch1;

  byte ch2;

  byte ch3;

  byte ch4;

  byte ch5;

  byte ch6;

  byte ch7;

};



//Create a variable with the structure above and name it sent_data

Data_to_be_sent sent_data;







void setup()

{

  radio.begin();

  radio.setAutoAck(false);

  radio.setDataRate(RF24_250KBPS);

  radio.openWritingPipe(my_radio_pipe);



  //Reset each channel value

  sent_data.ch1 = 127;

  sent_data.ch2 = 127;

  sent_data.ch3 = 127;

  sent_data.ch4 = 127;

  sent_data.ch5 = 0;

  sent_data.ch6 = 0;

  sent_data.ch7 = 0;

}



/**************************************************/





void loop()

{

  /*If your channel is reversed, just swap 0 to 255 by 255 to 0 below

  EXAMPLE:

  Normal:    data.ch1 = map( analogRead(A0), 0, 1024, 0, 255);

  Reversed:  data.ch1 = map( analogRead(A0), 0, 1024, 255, 0);  */

  

  sent_data.ch1 = map( analogRead(A0), 0, 1024, 0, 255);

  sent_data.ch2 = map( analogRead(A1), 0, 1024, 0, 255);

  sent_data.ch3 = map( analogRead(A2), 0, 1024, 0, 255);

  sent_data.ch4 = map( analogRead(A3), 0, 1024, 0, 255);

  sent_data.ch5 = digitalRead(2);

  sent_data.ch6 = digitalRead(3);

  sent_data.ch7 = map( analogRead(A4), 0, 1024, 0, 255);



  radio.write(&sent_data, sizeof(Data_to_be_sent));

}

이제 컨트롤러를 완성했고 이를 아두이노 우노에 연결된 nrf24와 통신하는 실험을 진행하였다.

실험 결과 통신이 매우 불안정하여 애초에 컨트롤러를 제대로 설계한 것인지 확인하기 어려웠다. 일단 연결을 안정적으로 하는 것을 좀 더 알아봐야 될 것 같다.

 

V/R

 

윤.

관련글 더보기

댓글 영역