HC-11: Serial UART RF Module (433MHz)

1. HC-11

HC-11 은 433MHz 주파수 대역을 사용하는 RF 통신용 모듈로 시리얼 인터페이스를 지원합니다. 따라서 아두이노 하드웨어 시리얼 포트인 0번, 1번 핀에 연결해서 Serial.xxx() 함수로 사용하거나 Digital 핀에 2개에 연결해서 SoftwareSerial 라이브러리로 사용이 가능합니다.

블루투스가 주로 1:1 통신에 사용되는 반면 HC-11 과 같은 RF 모듈은 1:N, N:1, N:N 통신에 유용합니다. 아두이노 2대 이상이 무선으로 통신해야 하는 상황에 적합한 제품 중 하나입니다. 전송 거리도 블루투스가 10m 급이라면 HC-11 은 100~200m 입니다.(실외 열린 공간에서) FU1 ~FU4 모드 설정에 따라서 전력 소비량을 조절할 수도 있습니다.

RF 통신용 모듈은 사용하는 주파수 대역별로 다양한 제품이 있지만 이 제품은 한글 정보를 비교적 쉽게 찾을 수 있어서 여러모로 사용이 편리할 것 같습니다.

HC-11 모듈이 서로 통신하기 위해서는 동일한 전송 속도(baud rate)와 채널(channel)을 사용해야 합니다.  제품은 기본으로 9600 bps와 001 채널을 사용하고 있습니다.

이런 HC-11의 설정을 변경하기 위해서는 AT command 모드로 들어가야 합니다. 이 모드는 HC-11에 있는 CON 핀 (Parameter Setting Control Pin) 을 LOW 상태로 유지시켜주면 됩니다. 아두이노 없이 AT command 설정을 하고 싶으시면 HC-11 모듈을 FTDI(USB to UART) 모듈에 연결해서 전용 프로그램을 사용하시면 됩니다.  (http://cafe.naver.com/arduinostory/16144 참고)

AT 모드에서 사용가능한 커맨드 중 주요한 커맨드를 소개합니다.

1. AT
AT 커맨드 모드일 경우 OK 문자를 리턴
Example: send AT return OK
2.AV+T
버전 정보를 리턴
Example:send AT-V return HC-11_v0.0
3. AT + Bxxxx
전송 속도를 지정(Baud rate). 2400,4800,9600,19200,38400,57600,115200 사용가능

Ex 1: hair AT + B4800 return OK-4800
Example 2: hair AT + B115200 return OK-115200
4. AT + Cxxx
통신 채널(channel) 설정. 001 ~ 127 사용 가능
Example: hair AT + C058 return OK-058

지원되는 AT 커맨드 모두를 보고 싶으시면 아래를 참고하세요.

http://cafe.naver.com/mpucafe/5263

Specification:
  • Working frequency: 434Mhz
  • Supply voltage: 3.3V to 5VDC
  • Communication distance: 1m to 40m indoor
  • Serial baud rate: 1.2Kbps to 115.2Kbps (default 9.6Kbps)
  • Receiving sensitivity: -112dBm to -95dBm
  • Transmit power: -30dBm to 10dBm
  • Interface protocol: UART/TTL
  • Operating temperature: -40℃ to +85℃
  • Dimensions: 27.8 x 14.4 x 4mm

2. 연결 방법

hc11_pin_def

먼저 안테나를 ANT2 에 납땜하고 아래 순서로 아두이노와 연결합니다.

1: VCC  –> 아두이노  3.3 V 또는 5 V  (초기 버전은 3.3 V)

2: GND –> GND

3: RXD (TTL)  –> TX (SoftwareSerial 을 사용하는 경우 디지털 핀)

4: TXD (TTL)  –>  RX (SoftwareSerial 을 사용하는 경우 디지털 핀)

5: CON(Key)  –> AT 모드가 필요할 때 GND, 동작 모드일 때는 연결 해제

3. 소스코드 (스케치)

HC-11을 이용해서 홈 오토메이션을 구현한 예제입니다. 아래 링크로 가시면 예제 스케치를 받을 수 있습니다.

https://github.com/godstale/How-to-make-talking-things/tree/master/chap13/Arduino

3 개의 스케치가 있는데 각각 온습도계, 공기질 측정기, 모니터링 장치용 스케치입니다. 온습도계와 공기질 측정기는 센서로 측정한 값을 주기적으로 HC-11을 이용해서 전송합니다. 모니터링 장치는 HC-11으로 들어오는 데이터를 감시하면서 데이터가 들어올 때 저장하고 OLED 디스플레이를 통해 출력하도록 작성되어 있습니다.

13-10

간단한 예제이지만 HC-11 데이터 송수신을 위한 기본 코드가 들어가 있습니다. 먼저 HC-11을 이용한 데이터 전송 부분을 살펴보면 아래처럼 코드를 사용합니다.

  if(millis() - prevReadTime > SENDING_INTERVAL) {
    int i_temp = (int)(temp_sum / count);  // 서버로 전송할 온도, 습도 데이터 생성
    int i_humi = (int)(humi_sum / count);
    hcSerial.write(0x55);    // 첫 2 byte는 고정 (0x55 0x01)
    hcSerial.write(0x01);    
    hcSerial.write(0x01);    // client 장치를 구분하는 id (온습도 장치는 0x01 사용)
    hcSerial.write((byte)(i_temp >> 8));  // int 값을 2개의 byte에 기록 (온도)
    hcSerial.write((byte)i_temp);
    hcSerial.write((byte)(i_humi >> 8));  // int 값을 2개의 byte에 기록 (습도)
    hcSerial.write((byte)i_humi);
    hcSerial.write(0xFE);    // 패킷의 끝을 알리는 byte, 온습도 장치는 0xFE 사용
    
    count = 0;
    temp_sum = 0;
    humi_sum = 0;
    prevReadTime = millis();
  }

코드는 5초에 한번 씩 데이터를 전송할 때 아래 형식에 맞춰 8byte가 전송되도록 작성되어 있습니다.

0x55 0x01 0x010x00 0x00 0x00 0x000xFE

앞선 2 byte 0x55, 0x01 은 고정된 값으로 데이터의 시작을 알리는 역할을 합니다. 세 번째 byte0x01은 장치의 ID 역할을 할 수 있도록 측정 장치마다 다른 값을 사용하도록 했습니다. 온습도 측정 장치는 0x01을 사용하도록 지정했습니다.

이후 이어지는 4개의 byte(0x00 0x00 0x00 0x00)에 온도와 습도 데이터가 기록됩니다. 아두이노에서 정수형(int, integer)2byte 크기를 가집니다. 따라서 정수형의 상위 8bit1byte에 먼저 기록하고 다시 하위 8bit를 다음 byte에 기록합니다.

0xFE는 데이터의 끝을 알리는 byte입니다. 온습도 측정 장치의 경우에는 0xFE를 사용하도록 지정해 뒀습니다.

이렇게 데이터가 전송되면 수신측에서는 아래와 같이 받아 처리합니다.

  if (hcSerial.available()>0)  {  // 수신한 데이터가 있는 경우
    // Get incoming byte
    char in_byte = 0;
    in_byte = hcSerial.read();  // 수신한 1 byte를 가져와서 처리
    
    // 수신한 byte를 버퍼에 기록
    for(int i=0; i<BUFFER_SIZE-1; i++) {
      Buffer[i] = Buffer[i+1];
    }
    Buffer[BUFFER_SIZE-1] = in_byte;  // 수신한 byte를 버퍼 끝에 넣음

    // Check condition
    if(Buffer[0] == CHECK_0 && Buffer[1] == CHECK_1) {  // 0x55 0x01
      if(Buffer[2] == CHECK_2_1) {  // 0x01
        // 온습도 데이터가 확인된 경우
        Serial.println("Parse temp&humi command : ");
        
        if(Buffer[7] == CHECK_END_1) {   // 마지막 byte를 체크 (0xFE)
          Temperature = (Buffer[3] << 8) | Buffer[4];
          Humidity = (Buffer[5] << 8) | Buffer[6];
          Serial.print("Temp=");
          Serial.print(Temperature);
          Serial.print(", Humi=");
          Serial.println(Humidity);
          is_state_changed = true;
        }
        
        Serial.println("Parsing completed.");
      } else if(Buffer[2] == CHECK_2_2) {  // 0x02
        // 공기질 데이터가 확인된 경우
        Serial.println("Parse AirQ command : ");
        
        if(Buffer[7] == CHECK_END_2) {   // 마지막 byte를 체크 (0xFF)
          AirQuality = (Buffer[3] << 8) | Buffer[4];
          Serial.print("AirQ=");
          Serial.println(AirQuality);
          is_state_changed = true;
        }
        
        Serial.println("Parsing completed.");
      }

    }  // End of Check condition
  }  // End of if (hcSerial.available()>0)

모니터링 장치에서는 아래 두 가지 경우의 데이터 형식과 일치 할 때 온습도, 공기질 데이터로 판단해서 값을 추출해 냅니다.

0x55 0x010x010x00 0x00 0x00 0x00 0xFE// 온습도 데이터

0x55 0x010x020x00 0x00 0x00 0x00 0xFF// 공기질 데이터

이 소스가 복잡하신 분은 HC-11으로 프로젝트를 진행한 다른 분의 소스를 참고하셔도 됩니다.

http://cafe.naver.com/arduinostory/16144

참고

You may also like...