본문 바로가기
대한상공회의소 스마트팩토리 교육/IoT 디바이스 개발

[IoT 디바이스 개발] AVR(ATmega128A)«수업-23» :블루투스(Bluetooth) / HC-06 모듈

by 나는영하 2022. 3. 4.

※ 주의사항 

본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!

감사합니다😁

 

안녕하세요!!

오늘은 아래와 같은 내용을 확인해보겠습니다.

 

블루투스(bluetooth)

HC-06 모듈

블루투스 모듈 설정

블루투스 스마트폰 설정


1. 블루투스(Bluetooth) 설정

1-1. 블루투스란?

블루투스(HC-06) 2.0 슬레이브 모듈

- 1994년 에릭슨이 개발한 개인 근거리 무선 통신(PAN : Personal Area Network) 표준

- 저전력 무선 기술, 10m 이내 근거리 통신용

- 전파 사용 허가가 필요하지 않은 2.4Ghz 대역인 ISM(Industrial, Scientific, Medcal) 사용

(WIFI, ZIGBEE 등도 ISM 대역 사용)

- 마이크로컨트롤러는 블루투스 2.0인 HC-06 모듈을 주로 사용

(블루투스 4.0까지 지원하는 제품이 있으나 본 실습에선 가장 기초적인 2.0 사용)

 

1-2. 블루투스 모듈 설정

- 블루투스 2.0 모듈인 'HC-06 슬레이브 모듈'을 사용해서 마스터인 스마트폰과 슬레이브인 ATmega128A와 시리얼 통신을 수행하게 된다.

- 따라서, 블루투스 모듈의 TXD와 RXD의 핀은 ATmega128A의 핀에 연결하게 되는데, 데이터를 주고받을때와는 다르게 초기 설정할때는 모듈의 TX는 ATmega128A의 TX로 결선을 해주어야 한다.(위의 사진 참고)

- ATmega128A의 UART 통신으로 SPP 시리얼 무선 통신을 수행 하게 된다.

※ HC-06 모델은 반드시 ATmega128A의 UART 통신으로 초기화작업을 수행해야 한다.

 

1) Terminal for Atmel Studio 설치

- 그동안 UART 통신은 PuTTy를 통해 사용해왔지만 PuTTy를 사용할 경우 개행 문자없이는 문자열 데이터를 전달하기 힘들어서 블루투스 모듈의 설정하는데있어 적합하지 않다.

(※ 컴퓨터에서 줄바꿈을 나타내는 제어 문자)

- 따라서 블루투스 모듈의 설정을 위해 아트멜 스튜디오의 확장 프로그램인 "Terminal for Atmel Studio"를 설치해야 한다.

※ 설치 순서

(1) Microchip Studio 실행

(2) 상단의 tools 메뉴바 → extensions and updates → online → terminal for atmel studio 클릭 후 설치

(3) 설치 후 상단의 view 메뉴바 → terminal window 실행

 

2) 초기화 설정

- terminal window 창을 켜고 Atmega128A가 연결되어 있는 COM을 선택 후 connect 클릭

 

(1) Test Communication 

- terminal window 창에 AT를 입력해주고 OK가 수신되는지 확인

 

(2) Reset the Bluetooth name

- AT+NAMEYoungHaYOU

- 위의 명령어에서 밑줄친 부분은 실제로 설정 될 블루투스의 이름에 해당된다.

- 정상적으로 이름이 변경되면 "OKsetname"을 수신단에서 출력한다.

(3) change the Bluetooth pair password

- AT+PIN1284

- 위의 명령어에서 밑줄친 부분은 실제로 설정 될 블루투스의 비밀번호에 해당된다.

- 정상적으로 비밀번호가 적용되면 "OKsetPIN"을 수신단에서 출력한다.

(4) Reset the Bluetooth serial baud rate

- AT+BAUD4

- 위의 명령어에서 밑줄친 부분의 값에 따라서 블루투스의 통신속도가 결정된다.

- 정상적으로 통신속도가 적용되면 "OK'(적용된통신속도)'" 를 수신단에서 출력한다.

※ 숫자에 따른 전송속도

숫자 전송 속도(Baud) 숫자 전송 속도(Baud)
1 1,200 5 19,200
2 2,400 6 38,400
3 4,800 7 57,600
4 9,600 8 115,200

 

1-3. 블루투스 스마트폰 설정

1) 블루투스 검색 및 페어링

- 상기의 블루투스 모듈 초기화 작업을 완료하였으면 위의 사진처럼 스마트폰에 등록한 블루투스가 검색이 된다.

- 초기화 단계에서 설정한 비밀번호를 입력하고 본인의 스마트폰에 HC-06 슬레이브 모듈을 페어링 한다.

 

2) Bluetooth Terminal 어플 다운로드 및 장치 연결

- 구글스토어에서 "Serial Bluetooth Terminal" 이라는 어플 다운로드

- 어플내의 devices에서 페어링한 블루투스 선택후 메인 화면 상단의 connect 클릭

- connect 클릭 후 실제로 연결이 이루어지면 블루투스 모듈의 LED가 깜빡거리지 않고 점등되게 된다.

- 그후 메인창에서 데이터를 송신하고 수신하면서 ATmega128A와 통신을 하면 된다.


 

2. 블루투스 관련 실습 : 블루투스를 통해 LED 제어 및 LCD 출력

2-1. 동작 순서

- 스마트폰의 Bluetooth Terminal 앱을 통해 a ~ f 사이의 알파뱃을 송신하면 그에 맞는 동작을 수행한다.

- a : LED 모두 점등 / b : LED 모두 소등 / c : LED 10초간 0.5초 간격으로 Blink / d : LED 1개씩 순차적으로 점등 및 소등 반복 / e : LCD에 "Nice to meet you" 출력 / f : LCD에 "Good bye" 출력

 

2-2. 동작 화면

초기 동작 사진

- B포트의 0~3번핀에 4개의 LED 연결

- I2C 통신을 사용해서 PE0번, PE1번(SCL, SDA)과 LCD 결선

- PD0번, PD1번은 Bluetooth 모듈의 TX와 RX로 사용 됨 (Cross 결선)

 

a ~ f 까지 한번씩 수행한 후 마지막 사진

- a부터 f까지 각각 한번씩 동작을 수행한 후 사진

- LCD에는 마지막 'f'의 수행동작인 "Good bye"를 출력하고 있다.

 

2-3. 코드

#define F_CPU 16000000UL

#include "UART0.h"
#include "clcd.h"
#include "i2c.h"
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>


FILE OUTPUT \
= FDEV_SETUP_STREAM(UART0_transmit, NULL, _FDEV_SETUP_WRITE);
FILE INPUT \
= FDEV_SETUP_STREAM(NULL, UART0_receive, _FDEV_SETUP_READ);

int main(void)
{
	unsigned char data;
	uint8_t pattern;
	
	stdout = &OUTPUT;
	stdin = &INPUT;
	
	UART0_init();
	i2c_lcd_init();
	i2c_lcd_write_string("Bluetooth Test");
	DDRB = 0X0F;
	printf("A : ALL LED ON / B : ALL LED OFF / C : LED BLINK / D : LED Sequence On \n\r");
	printf("E : nice to meet you(LCD) / F : good bye(LCD) \n\r");
	while (1){
		

		scanf("%c", &data);
		
		switch(data){
			case 'A':
			case 'a':
			PORTB = 0X0F;
			printf("입력하신 값은 %c 입니다.\n\r", data);
			break;
			
			case 'B':
			case 'b':
			PORTB = 0X00;
			printf("입력하신 값은 %c 입니다.\n\r", data);
			break;
			
			case 'C':
			case 'c':
			for(int i =0; i<5; i++){
				PORTB = 0X0F;
				_delay_ms(500);
				PORTB = 0X00;
				_delay_ms(500);
			}
			printf("입력하신 값은 %c 입니다.\n\r", data);
			break;
			
			case 'D':
			case 'd':
			pattern = 0x01;
			for(int i =0; i<4; i++){
				PORTB = pattern;
				pattern = (pattern << 1);
				_delay_ms(500);
			}
			printf("입력하신 값은 %c 입니다.\n\r", data);
			break;
			
			case 'E':
			case 'e':			
			i2c_lcd_command(0x01);
			i2c_lcd_goto_XY(0,0);
			i2c_lcd_write_string("YOU YOUNG HA!!!");
			i2c_lcd_goto_XY(1,0);
			i2c_lcd_write_string("nice to meet you");
			printf("입력하신 값은 %c 입니다.\n\r", data);
			break;
			
			case 'F':
			case 'f':
			i2c_lcd_command(0x01);
			i2c_lcd_goto_XY(0,0);
			i2c_lcd_write_string("YOU YOUNG HA!!!");
			i2c_lcd_goto_XY(1,0);
			i2c_lcd_write_string("Good bye");
			printf("입력하신 값은 %c 입니다.\n\r", data);
			break;
			
			default: break;
		}
	}	
	return 0;
}

댓글