※ 주의사항 ※
본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!
감사합니다😁
안녕하세요!!
오늘은 아래와 같은 내용을 확인해보겠습니다.
블루투스(bluetooth)
HC-06 모듈
블루투스 모듈 설정
블루투스 스마트폰 설정
1. 블루투스(Bluetooth) 설정
1-1. 블루투스란?
- 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까지 각각 한번씩 동작을 수행한 후 사진
- 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;
}
댓글