본문 바로가기

Hardware

CC1101 RF 무선 아두이노 Arduino

728x90

CC1101 무선 트랜시버 모듈을 활용하여 아두이노 환경에서 단거리 무선통신을 구현합니다

 

CC1101은 TI(Texas Instruments)사의 초저전력 무선 어플리케이션을 위해 디자인된 무선 트랜시버 모듈로
387-464 MHz 과 779-928 MHz 대역의 주파수에서 동작 합니다
알리에서 개당 3달러선에서 판매되고 있습니다 (송수신으로 2개에 배송비 포함하면 8~9달러선)

 

CC1101의 간략한 스펙으로는
1.2K baudrate 전송속도를 갖고 있으며 
50~100 미터정도의 송수신 거리를 가지고 있습니다 (지형 지물에 따라 상이)

 

RF의 특성상 저전력을 사용하여 소량의 데이터를 단거리 전송하고자 할 때 적용을 고려해 볼 수 있습니다

 

사용에 참조 해볼만한 사이트로는 하기 사이트를 추천드려 봅니다

결선부터 샘플코드 까지 잘 설명이 되어 있습니다

electronoobs.com/eng_arduino_tut98.php

 

Arduino CC1101 radio example 2019 library range

See how to use this CC1101 radio module with the Arduino. You have the schematic, code, library and all that you need here for download. See more...

electronoobs.com

 

참고로 한국에서 정식사용을 위한 비면허 ISM 주파수 대역은 920-923MHz로

해당 범위의 주파수 대역을 사용하려면 CC1101 데이터시트를 참조하여 레지스터 변경을 해야합니다

위 사이트 지원된 라이브러리를 헤더코드를 보면 기본적으로 433MHz / 868MHz / 915MHz 에 대한 레지스터 설정만 포함되어 있습니다

 

CC1101의 경우 SPI 통신 방식을 사용하며 이에 따라 SCK MOSI MISO 핀이 사용되며 더불어 CSn(칩 셀렉트)와 GDO0(전송 동기화 사용) 핀도 사용됩니다

여기에 VCC, GND 가 포함하여 총 7핀에 대해서 아두이노 보드와 연결이 필요합니다

 

위 사이트 예시와 더불어 테스트시에는 아래 핀 매칭을 적용합니다

CC1101 (송수신 모듈 동일) Arduino
VCC 3.3V
GND GND
GDO0 (GO0) D2
CSn D10
SI (MOSI) D11
SO (MISO) D12
SCK D13
NeoPixel LED Arduino
VCC 5V
GND GND
I (Input) D5

제 테스트에서는 간단하게 송신측에서는 1, 2, 3 값을 2초 간격으로 순차 반복적으로 송신하도록 하였으며

수신측에서는 1, 2, 3의 수신값에 따라 네오픽셀 LED를 사용하여 Red, Green, Blue 로 LED 색을 전환하는 것으로 데이터 전송 여부를 테스트 하였습니다 

 

CC1101 라이브러리는 위 첨부된 사이트에서 라이브러리를 다운받아 아두이노 IDE (스케치 - 라이브러리 포함하기 - .ZIP 라이브러리 추가하기)에 추가하여 사용합니다

네오픽셀 라이브러리는 아두이노 IDE 스케치 - 라이브러리 추가에서 "Adafruit NeoPixel" 이름으로 검색하여 라이브러리를 추가하여 사용합니다

 

송신 코드

#include <ELECHOUSE_CC1101.h>
#define size 1
int pot = A2;

byte TX_buffer[size]={0};
byte i;

int val = 1;

void setup()
{
  pinMode(pot,INPUT);
  Serial.begin(9600);
  ELECHOUSE_cc1101.Init();
  for(i=0;i<size;i++)
  {
     TX_buffer[i]=i;
  }
}

void loop()
{
  if (val > 3)
  {
    val = 1;
  }
  TX_buffer[0] = val;
  ELECHOUSE_cc1101.SendData(TX_buffer,size);
  val = val + 1;
  delay(2000);
}

 

수신 코드

#include <Adafruit_NeoPixel.h> // NeoPixel LED
#include <ELECHOUSE_CC1101.h>
int received_number = 0;

#define PIN 5    // LED Pin
#define LEDNUM 1 // Number of LEDs connected

Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDNUM, PIN, NEO_GRB + NEO_KHZ800);

 void setup()
{
  Serial.begin(9600);
  strip.begin();                     
  ELECHOUSE_cc1101.Init();
  ELECHOUSE_cc1101.SetReceive();
}

byte RX_buffer[11]={0};
byte size,i,flag;

void loop()
{
  if(ELECHOUSE_cc1101.CheckReceiveFlag())
  {
    size=ELECHOUSE_cc1101.ReceiveData(RX_buffer);
    for(i=0;i<size;i++)
    {
      received_number = RX_buffer[i];     
    }
    if (received_number == 1)
    {
      Serial.println("red");
      strip.setPixelColor(0, 100, 0, 0);  
    } else if (received_number == 2)
    {
      Serial.println("green");
      strip.setPixelColor(0, 0, 100, 0);  
    } else if (received_number == 3)
    {
      Serial.println("blue");
      strip.setPixelColor(0, 0, 0, 100);  
    } else {
      strip.setPixelColor(0, 0, 0, 0);  
    }
    strip.show();    
    ELECHOUSE_cc1101.SetReceive();
  }
}

 

결과물

위와 같은 형태로 구성하여 2초마다 LED 색상의 변화로 데이터 송수신 여부를 체크합니다

주택가에서 통신 거리를 실측하였을 때에는 약 49 미터 정도까지 데이터 수신이 되었으며 그 이상 거리에서는 통신이 되지 않았습니다. 개활지라면 주택가 보다는 좀 더 장거리 통신이 가능해 보였습니다

728x90