본문으로 바로가기

ATmega128 블루투스 제어(HC-06)

category MCU/AVR 2019. 11. 24. 22:57
반응형

오늘은 ATmeaga128의 UART 통신을 이용해서 Bluetooth 제어하는 방법에 대해서 알아보려고 합니다. 사용할 모듈은 HC06으로 BT 버전은 2.0입니다. SSP(Simple Secure Pairing)을 지원하지 않기 때문에 PINCODE 방식의 Pairing을 지원하며 PINCODE의 초기 번호는 1234입니다.


HC-06


이 모듈은 Power Level Class2를 지원한다고 합니다. 여기서 Class란 TX Power라고 생각하시면 됩니다. Class가 낮을수록 출력이 더 높으며 도달 거리도 더 길게 됩니다. Class1 ~ Class4까지 있는데 Class1은 최대 100m, Class3은 1m입니다. Class 스펙을 제대로 사용하기 위해선 두 기기가 모두 동일한 Class를 지원해야 합니다. 예를 들어 Class1과 Class2가 통신을 하게 되면 Class2만큼의 거리만큼 통신이 가능합니다. 


Bluetooth는 마스터(Master)슬레이브(Slave)라는 용어가 있는데 간단합니다. 통신의 주체가 되면 마스터입니다. 예를 들어 핸드폰으로 블루투스 스피커를 연결하면 핸드폰은 마스터가 되고 스피커는 슬레이브가 됩니다. 서로 통신은 하면서 통신의 주체가 되면 마스터가 되는 것입니다. 마스터를 Remote Device 혹은 Host라고 생각하시면 편할 것 같습니다.





요약 



BT Ver : 2.0 EDR

Power Level : Class2

Baud Rate : 9600(Default)

PINCODE : 1234(Default)

동작 전압 : TTL Level




ATmeag128 핀맵



UART 관련 레지스터를 알아보기 전에 ATmega128의 핀맵을 살펴보겠습니다. 보시면 RX0/TX0, RX1/TX1이 보이실 겁니다. UART 통신을 할 수 있는 포트가 UART0, UART1으로 최대 2개 사용 가능합니다. 저는 UART1 사용해서 제어를 해보도록 하겠습니다. 







회로 배치



UART 통신을 할 때 반드시 RX 라인과 TX 라인을 위에 와 같이 TX-RX, RX-TX로 엇갈리게 배치를 해야 합니다. 




레지스터 



프레임 포맷

한 프레임의 데이터 포맷의 Data는 최소 5Bit, 최대 9Bit입니다. 



Baud Rate 계산 공식

여기서 비동기(Asynchronous)동기(Synchronous) 두 가지 Operating Mode가 보이는데, 비동기인 경우 UART라 하고 동기인 경우는 USART라고 합니다. 비동기의 경우 Start Bit와 Stop Bit를 이용해 데이터를 동기화하고 동기의 경우엔 별도의 클럭을 이용하기 때문에 Start Bit와 Stop Bit가 필요가 없습니다.



UDR 레지스터는 데이터 송수신 관련 버퍼입니다. 수신을 하게 되면 Data를 읽고 송신을 하게 되는 경우 Data를 쓰면 됩니다.



송수신 동작이나 상태를 저장하는 기능의 레지스터입니다.


RXC : 안 읽은 데이터가 존재하면 1, 존재하지 않으면 0이 됩니다.

TXC : 새로운 데이터가 UDR에 없으면 1이 됩니다.

UDRE : UDR 레지스터가 새로운 데이터를 수신할 준비가 되었다면 1이 됩니다.

FE : 프레임 에러 여부를 알려주는 Flag입니다.

UPE : 패리티 에러 발생 여부를 알려주는 Flag입니다.



송수신 동작이나 상태를 저장하는 기능의 레지스터입니다.


RXENn : Receiver Enable이라고 하며, 수신 여부를 설정하는 Flag로 1이면 Enable이다.

TXENn : Transmitter Enable이라고 하며, 송신 여부를 설정하는 Flag로 1이면 Enable이다.



송수신 동작이나 상태를 저장하는 기능의 레지스터입니다.


UMSELn : 동기 모드와 비동기 모드를 선택하는 Flag로 1이면 동기 모드입니다.

UPMn1/0 : Parity Mode를 설정하는 Flag입니다.



UART의 통신 속도(BAUD RATE)를 설정하는 레지스터입니다. 총 12bit의 조합으로 설정이 가능합니다. Baud Rate 계산 공식으로도 계산 가능하지만 일반적으로 쓰는 Baud Rate는 아래의 표를 보고 UBRR 값을 설정해도 됩니다.



예를 들어 Baud Rate가 9600이 되기 위해서 UBRR이 103이 되어야 합니다. UBRR이 103이 되기 위해서 UBRR1H 값은 0, UBRR1L은 103이 되어야 합니다.




소스 코드 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#define F_CPU 16000000UL // 외부 크리스탈 16MHz
#include <avr/io.h>
#include <util/delay.h>
 
char rx_char(void)
{
    while(!(UCSR1A & 0x80));
    return UDR1;
}
 
void tx_char(uint8_t bData)
{
    while((UCSR1A&0x20== 0)
    UDR1 = bData;    
}
 
 int main(void)
 {
    uint8_t bData = 'A';
    
    UCSR1A=0x00//flag 레지스터를 사용하지 않음
    UCSR1B=0x18//수신 enable, 송신 enable, 전송비트 8bit
    UCSR1C=0x06//비동기식 통신
    UBRR1H=0;
    UBRR1L=103//9600bps
     
    /* Replace with your application code */
    while (1)
    {
        tx_char(bData);
        _delay_ms(2000);
    }
     
     return 0;
 }


tx_char는 Data를 송신하는 함수, rx_char는 Data를 수신하는 함수입니다. 9600bps로 비동기 통신을 하고 있고 2초마다 'A'라는 문자를 보내는 코드입니다. Tera Term을 이용한 간단한 테스트를 보여드리고 싶었는데 블루투스가 깜빡임이 없는 것을 보니 고장이 난 것 같네요. 여기서 마치도록 하겠습니다. 



2019/04/05 - [MCU/AVR] - [atmel studio7]ATmega128 프로젝트 생성

2019/04/22 - [MCU/AVR] - ATmega128 입출력 제어

2019/05/11 - [MCU/AVR] - ATmega128 Delay함수 사용 방법

2019/06/06 - [프로그래밍] - UTF8 구조 및 유니코드 변환 소스 코드

2019/06/09 - [프로그래밍] - 소스 코드 주석 다는 법

2019/06/20 - [프로그래밍] - Arabic 프로그래밍 규칙

반응형

'MCU > AVR' 카테고리의 다른 글

ATmega128 타이머를 이용한 DC모터 제어  (0) 2019.08.13
ATmega128 Delay함수 사용 방법  (3) 2019.05.11
ATmega128 입출력 제어  (2) 2019.04.22
[atmel studio7]ATmega128 프로젝트 생성  (6) 2019.04.05