아두이노프로세싱 프로그래밍

아두이노 RF(Radio requency)모듈에 의한 문자 캐릭터 통신

coding art 2016. 12. 27. 19:08
728x90



433MHz 아두이노 무선 통신은 와이파이나 블루투스 대비 프로그래밍이 대단히 간단하다.


이 rf 통신 모듈을 이용한 데이터 전송은 간단하게 두 가지이다. 첫째는 문자 전송이며 둘째로는 정수화된 아날로그 데이터 숫자 전송이다. 물론 송수신 모듈이므로 일
방향 전송만이 가능하다.
드론을 사용하여 비행 중에 측정 작업을 수행과 아울러 데이터 전송을 가정하면 일차적으로 숫자화된 데이터 전송 이전에 측정 실험 제목과 같은 문자 캐릭터 전송이 필요할 것이다.


송신 모듈 배선은 전원 5V 및 접지 GND를 연결한다. VirtualWire.h 라이브러리를 사용하는 송신 프로그램에서 별도로 디지털 핀 위치에 대한 지정이 없기 때문에 송신 모듈의 DATA 또는 거꾸로 ATAD는 반드시 디지털 핀 12번에 연결하도록 한다. 아울러 수신 모듈 배선에서는 DATA핀을 반드시 디지털 핀 11번에 연결하도록 한다.

이 프로그램에서는 VirtualWire.h 라이브러리 사용을 전제로 하기 때문에 아래에 제시된 내용을 반드시 따라야 할 것이다. 참고로 VirtualWire.h를 사용하지 않는 배선 및 프로그램도 있으므로 이는 별도로 실험해봄이 좋을듯하다.




특히 사진에 의하면 가설된 안테나가 있는데 이 안테나가 없을 경우 송수신 도달 거리는 5cm 이하로 제한될 수 있음에 유의한다. 반드시 주파수로부터 파장의 길이를 계산하여 그 길이 값의 (1/n) 배한 길이를 납때하여 설치할 필요가 있다. 이러한 단순 안테나 설치를 통해 간단하게 통신 도달 거리가 5m 이상으로 고무줄처럼 늘어남을 쉽게 확인할 수 있다.
더 나은 방법은 사진과 같이 스프링 안테나를 설치하는 것일 것이다. 이 사진은 인터넷 판매 사이트에 볼 수 있는 사진인데 하부에 부착된 모듈이 ESP8266 와이파이 모듈로서 이는 사용 주파수가  2.4GHz로 rf모듈의 433MHz와 완전히 다르므로 반드시 사용 주파수에 맞는 제품을 구매하여 부착해야 한다.


만약에 안테나가 길이 문제로 인해 매치가 되지 않으면 통신거리는 수cm에 불과할 수 있음에 반드시 유의하자.


데이터 전송 시험을 위해서는 두 개의 아두이노 보드가 필요하다. 그 두 개가 꼭 동일한 보드일 필요는 없다. 단지 보드 종류와 포트 넘버를 정확하게 지정해 주기만 하면 된다.
데스크 탑 컴퓨터에 여러 개의 USB 포트가 있으므로 서로 다른 포트에 송신측과 수신측 USB를 연결하고 각각에 송신 프로그램과 수신 프로그램을 컴파일하여 업로딩한다.

그렇게 되면 송신 측 아두이노 보드로부터 수신 측 아두이노 보드로 데이터 전송이 이루어 진다.
참고로 본 실험에서는 송신 측은 우노 수신 측은 Duemilanove 보드를 사용하였다.

또 한 가지 지적해야 할 중요한 점은 소형 드론 중에 3.7V 리튬폴리머 배터리를 흔하게 사용한다. 특히 송신 모듈을 드론에 설치하게 될 경우 저전압 핀인 3.3V 핀 즉 3V3에 연결할 경우에 작동 여부를 확인해 볼 필요가 있다. 본 프로그램의 경우 3V3 조건에서 잘 작동됨을 확인할 수 있었다. 반면에 수신부에서는 5V 전압이 공급되는 Vcc 대신에 3V3을 연결할 경우 프로그램 작동이 안된다는 점을 확인할 수 있었다.

이러한 사실은 드론을 사용하여 측정된 데이터를 지상에서 전송 받고자 하는 경우 송신 측은 드론의 3.7V 전압을 따서 사용하면 되지만 수신측은 5V USB 전원 이용이 가능한 노트북이나 데스크 탑이라야 할 필요가 있다.


데이터 전송을 위한 라이브러리로서는 VirtualWire.h 가 있다. 야후 사이트에서 virtualwire.h를 검색하면 이를 다운 받을 수 있는 사이트들이 흔하다. VirtualWire.zip을 다운받아 압축을 풀어서 아두이노 하부 디렉토리 중 library나 예제를 모아둔 디렉토리에 저장 후 라이브러리 설치 시 정확하게 경로를 지정한다.


다음은 송신 측의 아두이노 프로그램이다.


Virtual_rf_transmit_01


/* 
 SimpleSend
 connect the Transmitter data pin to Arduino pin 12
 */ 
 #include <VirtualWire.h>
 void setup()
 {
 // Initialize the IO and ISR
 vw_setup(2000); // Bits per sec
 } 
 void loop()
 {
 send("Hello there");
// delay(10);
 }
 void send (char *message)
 { 
 vw_send((uint8_t *)message, strlen(message));
 vw_wait_tx(); // Wait until the whole message is gone
 }  //프로그램 끝


수신 측의 프로그램은 다음과 같다. 중간의 index=index+1 명령은 전송되어 오는 정보 개수를 셈하기 위한 방편으로 넣었다. 실제로 송신측에서 정수 화된 숫자 정보와 캐릭터 정보를 전송하는 것이 불가능하지는 않으나 프로그램이 두 배 이상 복잡해지는 문제점이 있다.
시리얼 모니터 화면 상에서 숫자 “1,2,3,... 과 Received:” 는 프로그램 중에서 인위적으로 인쇄한 것이며 실제 수신한 데이터는 “Hello there” 이다. 상기 숫자는 데이터 전송 속도와 끓김 현상을 관찰하는데 도움을 준다.





Virtual_rf_receive_01
/* 
 SimpleReceive
 This sketch displays text strings received using VirtualWire
 Connect the Receiver data pin to Arduino pin 11
 */ 
 #include <VirtualWire.h>
 byte message[VW_MAX_MESSAGE_LEN]; // a buffer to store the incoming messages
 byte messageLength = VW_MAX_MESSAGE_LEN; // the size of the message
 int index=0;
 void setup()
 { 
 Serial.begin(9600);
 Serial.println("Device is ready");
 // Initialize the IO and ISR
 vw_setup(2000); // Bits per sec
 vw_rx_start(); // Start the receiver
 }
 void loop() 
 {
 if (vw_get_message(message, &messageLength)) // Non-blocking
 { 
 index=index+1;
 Serial.print(index);
 Serial.print("   ");
 Serial.print("  Received: ");
 for (int i = 0; i < messageLength; i++)
 { 
 Serial.write( message[i]);
 }
 Serial.println();
 }
 } //프로그램 끝