2. < 목 차 >
들어가기. 블루투스 세탕하기
① 개요
② 회로도
③ 스케치
④ 결과화면
Case1. smartphone application으로 부터 숫자(R,G,B)를 입력시켜서
RGB LED을 이용하여 색상을 디자인하기
① 개요
② 동작원리
③ 스케치
④ 결과화면
⑤ 결론
Case2. R:0-49, G:50-99, B:100-149을 만족하도록 App Inventor을 이
용하여 3개의 slide을 만들어서 색상을 디자인하기
① 개요
② App 디자인과 동작원리
③ 스케치
④ 결과화면
⑤ 결론
Case3. R:0-255, G:0-255, B:0-255을 만족하도록 App Inventor을 이용
하여 3개의 slide을 만들어서 색상을 디자인하기
① 개요
② App 디자인과 동작원리
③ 스케치
④ 결과화면
⑤ 결론
2
3. 0-1. Introduction(개요)
3
①. Background(배경)
Bluetooth를 사용하기 전에 Bluetooth모듈에 대한 Setting
이 반드시 필요하다.
Setting은 통신상에서 어디로 통신할 것인지를 판별 할 수
있는 ‘이름’을 식별할 수 있어야 하고, 그 ‘이름’이 같은 Bit-
rate로 호환되어야 하며, Pin번호를 설정하여 다른 통신으
로 인해 간섭 받지 못하게끔 해야 된다.
이 방법은 Arduino에서 소스적으로 해결이 가능한 방법이
므로, 간략하게 소개를 하고 넘어가도록 하겠다.
1. 우선 SoftwareSerial.h라는 헤더파일을 추가하고, 그에
해당하는 Bluetooth용 객체를 생성한다.
2. 객체를 선언할 때, TX, RX의 핀 번호를 설정한다.
3. Serial과 bluetooth를 보드레이트 9600속도로 맞춘다.
4. 시리얼 포트의 수신 버퍼에 값이 들어왔을 경우, 그것을
그대로 Bluetooth에 쓴다. Serial Port에서 AT+(*설정할
것)(설정한다.)을 입력한다.
(*설정할 것 : NAME(이름), PIN(비밀번호), BAUD(통신속도))
5. 블루투스 포트의 수신 버퍼에 값이 들어왔을 경우, 시리
얼모니터에 값을 반환한다. (Oksetname, OKsetPIN,
OK9600)
5. 0-3. Sketch
/* 블루투스 Setting */
#include <SoftwareSerial.h> //시리얼통신 라이브러리 호출
SoftwareSerial BT(12, 13); //블루투스모듈에 연결하고 Tx를 12번 pin, Rx를 13번 pin으로 설정한다
void setup()
{
Serial.begin(9600); //시리얼 통신을 9600속도로 시작
BT.begin(9600); //블루투스 통신을 9600속도로 시작
}
void loop()
{
if (BT.available()) //블루투스 포트의 수신 버퍼에 저장된 데이터 개수를 반환
{
Serial.write(BT.read()); //블루투스에서 전송된 문자를 읽어 시리얼모니터 출력
}
if (Serial.available()) //시리얼 포트의 수신 버퍼에 저장된 데이터 개수를 반환
{
BT.write(Serial.read()); //시리얼모니터에서 전송된 문자를 읽어 블루투스에 출력
}
}
5
①. Sketch edit(작성, optimized code)
0-4. Output (결과)
Output file from serial monitor:
6. 1-1. Introduction(개요)
Arduino에서 Digital I/O와 Analog Input 을 이용하여
RGB LED를 컨트롤했다면, 이번에는 원격으로 Bluetooth와
스마트 폰의 application을 이용하여 컨트롤하려고 한다.
스마트 폰으로 Input을 하려면, 어떻게 해야 될까?
예를 들어, 멀리 있는 상대에게 연락을 하려면 무엇이 필
요한지 생각해보자. 연락을 하기 위해서는 서로 간에 통신
을 할 수 있는 휴대폰이 필요하고, 그 휴대폰에 맞는 전화
번호가 필요하다. 그리고 그 전화번호가 어디에 연결되는
지 확인하기 위해 연락처 이름도 필요하다. 준비가 모두 되
었다면, 한쪽이 다른 한쪽에게 전화를 걸 것이고, 전화를
받는 쪽에서 수신을 허용해야만 연락이 이루어진다. 이렇
게 해서야 연락이 완료되는 것이다.
마찬가지로, 멀리 있는 기기 사이에 통신을 하려면, 서로
간의 주소를 알아야하고, 연동되어져야 한다. 휴대폰의
Application은 인터페이스를 제공하고 통신규격으로
Bluetooth를 사용한다. Arduino의 Bluetooth모듈인 HC-06
로 스마트폰과 통신을 함으로서, RGB LED를 컨트롤할 수
있는 것이다.
6
①. Background(배경)
7. 1-1. Introduction(개요)
1. RGB LED를 컨트롤 할 수 있는 Application을 설정한다.
2. Application을 휴대폰에 다운로드받는다.
3. 휴대폰과 Arduino를 Bluetooth로 연결한다.
4. Application에서 숫자를 입력한다.
5. 결과를 확인한다.
7
②. Purpose(목적)
1-2. Configuration(동작원리)
How to operate(동작원리)
1. Arduino에서 블루투스를 연결하고 통신을 할 수 있게 설
정한다.
2. Byte stream으로 Arduino에 0~255값을 3개 전송한다
3. Arduino는 블루투스 버퍼에 값이 전송되었을 경우, 각각
R,G,B의 값으로 인식하고 함수를 호출한다.
4. RGB LED가 값에 맞게 출력된다.
8. 1-3. Sketch
/* Case 1. smartphone application으로 부터 숫자(R,G,B)를 입력시켜서 RGB LED을 이용하여 색상을 디자인하기 */
#include <SoftwareSerial.h> //시리얼통신 라이브러리 호출
SoftwareSerial BT(12, 13); //블루투스모듈에 연결하고 Tx를 12번 pin, Rx를 13번 pin으로 설정한다
const int led[3]={9,10,11}; //(pin) 11=RedLed, 10=GreenLed, 9=BlueLed
int value[3]={0}; //(index) 0=Red, 1=Green, 2=Blue
void setup()
{
BT.begin(9600); //블루투스 통신을 9600속도로 시작
Serial.begin(9600); //시리얼 통신을 9600속도로 시작
for(int i=0;i<3;i++)
{
pinMode(led[i],OUTPUT); //led 3개를 출력으로 지정
}
Serial.println("");
Serial.println("Case 1.");
Serial.println("<<< RGB LED: Smartphone application can make all the colors >>>");
Serial.println("Input the RGB value through bluetooth");
}
void loop()
{
if(BT.available()>0) //블루투스 포트의 수신 버퍼에 저장된 데이터 개수를 반환
{
for(int i=0;i<3;i++)
{
value[i]=BT.parseInt(); //블루투스 버퍼에 있는 데이터 중 다음에 사용할 것을 Int형으로 형변환하여 반환
value[i]=constrain(value[i], 0, 255); //value값을 0~255으로 제한
}
setColor(value[0], value[1], value[2]); //함수호출
}
}
/*
(pin) 11=RedLed, 10=GreenLed, 9=BlueLed
(index) 0=BlueLed, 1=GreenLed, 2=RedLed
setColor함수는 매개변수 값에 따라 PWM으로 RGB LED를 출력합니다.
*/
void setColor(int red, int green, int blue)
{
analogWrite(led[2],red);
Serial.print("red: ");
Serial.print(red);
analogWrite(led[1],green);
Serial.print("tgreen: ");
Serial.print(green);
analogWrite(led[0],blue);
Serial.print("tblue: ");
Serial.print(blue);
Serial.println("");
}
8
①. Sketch edit(작성, optimized code)
9. 1-3. Sketch
9
② Using flowchart and block diagram, Sketch analysis (분석)
start
SoftwareSerial BT(12, 13)
Led[3]={9, 10, 11}
BT 수신버퍼 입력체크
BT.available()>0
수신문자 저장
value[0..2]=BT.parseInt()
함수호출
setColor(value[0], value[1],
value[2])
yes
no
10. 1-4. Output (결과)
2016-05-30 21:17:52 Case 1.
2016-05-30 21:17:52 <<< RGB LED: Smartphone application can make all the colors >>>
2016-05-30 21:18:11 Input the RGB value through bluetooth
2016-05-30 21:18:22 red: 255 green: 0 blue: 0
2016-05-30 21:18:29 red: 255 green: 94 blue: 0
2016-05-30 21:18:36 red: 127 green: 127 blue: 0
2016-05-30 21:18:40 red: 0 green: 255 blue: 0
2016-05-30 21:18:47 red: 0 green: 0 blue: 255
2016-05-30 21:18:53 red: 127 green: 0 blue: 127
2016-05-30 21:19:00 red: 255 green: 255 blue: 255
2016-05-30 21:19:07 red: 0 green: 0 blue: 0
10
①. Output file from serial monitor:
12. 1-5. Conclusion (결론)
• Bluetooth와 스마트 폰에서의 Application으로 Arduino
에 연동시키는 방법을 기본적으로 배웠습니다.
• 추가적으로는 어떻게 Application을 만들어 내는지를
배웠고, 그에 관한 동작 원리를 이해할 수 있었습니다.
• application에도 여러 가지 Tool이 있는 것을 보고 다음
에는 좀 더 다양한 도구들을 이용할 수 있었으면 좋겠
습니다.
12
①. 배운점
②. 느낀점
• 수많은 Application을 이미 휴대폰에서 사용하고 있으
나, 스스로 만들어서 사용한 Application은 매우 초보적
인 단계로 생각됩니다. 앞으로 더 심도 있게 배워서 다
양한 Application을 만들 수 있으면 좋겠습니다. 왜냐하
면, Application디자인 개발 방면은 굉장히 인기가 있고,
사람들이 필요로 하는 작업이며, 장래가 유망한 업무이
기 때문입니다.
13. 2-1. Introduction(개요)
스마트 폰에서 숫자로 직접 Input하여 RGB LED를 컨트롤
하는 것에 성공했다면, 다음에는 Slide bar를 이용하려고
한다.
Slide bar를 이용하는 이유는, Arduino에서 가변저항기의
제어와 가장 유사한 방식이기 때문이다. 여기서 유의할 점
은, Arduino에서 가변저항기의 범위를 Mapping하고 설정
해야 되는 것처럼, Slide bar또한 범위를 Mapping해줘야
된 다는 것이다. 또한 Application에서 몇 Byte를 쓸 것인지
도 중요한 점이다.
만약 1Byte만으로 만들 것 이라면 App Inventor에서 3개
의 Slide bar는 0~255의 숫자를 각 슬라이드마다 나눠서 3
등분 해야만 된다. 그래야 값에 따라 Slide bar를 인식하고
작동하기 때문이다.
13
①. Background(배경)
14. 2-1. Introduction(개요)
1. Application으로 3개의 Slide bar를 만든다.
2. 3개의 Slide bar는 각 색깔 (Red, Green, Blue)과 호환되
게 한다.
3. 스마트 폰으로 Application을 연동한다.
4. Bluetooth를 이용하여 Application을 Arduino에 연결,
작동하게 한다.
14
②. Purpose(목적)
16. 1. app inventor에서 1Byte로 Slide Bar Block을 3개 만든다.
2. 1Byte이므로 범위는 0~255이다.
3. 3개의 슬라이드에 RGB LED를 적당하게 3등분하여 범위
를 지정한다. (R: 0~49, G: 50~99, B: 100~149)
4. 각 슬라이드를 움직여서 RGB LED가 작동하는지 확인한
다.
16
②. How to operate(동작원리)
2-2. Configuration(App디자인/동작원리)
17. 2-3. Sketch
/* Case2. R:0-49, G:50-99, B:100-149을 만족하도록 App Inventor을 이용하여 3개의 slide을 만들어서 색상을 디자인
하기 */
#include <SoftwareSerial.h> //시리얼통신 라이브러리 호출
SoftwareSerial BT(12, 13); //블루투스모듈에 연결하고 Tx를 12번 pin, Rx를 13번 pin으로 설정한다
const int led[3]={9,10,11}; //(pin) 11=RedLed, 10=GreenLed, 9=BlueLed
int data=0; //블루투스로 입력받은 1byte 값을 저장하는 변수 선언
int value[3]={0}; //(index) 0=Red, 1=Green, 2=Blue
void setup()
{
BT.begin(9600); //블루투스 통신을 9600속도로 시작
Serial.begin(9600); //시리얼 통신을 9600속도로 시작
for(int i=0;i<3;i++)
{
pinMode(led[i],OUTPUT); //led 3개를 출력으로 지정
}
Serial.println("");
Serial.println("Case 2.");
Serial.println("<<< RGB LED: App slider can make all the colors >>>");
Serial.println("Control the RGB slider");
}
void loop()
{
if(BT.available()>0) //블루투스 포트의 수신 버퍼에 저장된 데이터 개수를 반환
{ //반환갯수가 1개이상일때만 문장실행
data=BT.read(); //블루투스로 부터 값을 입력받아 저장
if(data<50) //data에 0~49값이 들어오면 Red Slider로 인식
{
value[0]=map(data, 0, 49, 0, 255); //0~49를 0~255로 맵핑
}
else if(data<100) //data에 0~99값이 들어오면 Red Slider로 인식
{
value[1]=map(data, 50, 99, 0, 255); //50~99를 0~255로 맵핑
}
else //data에 100~149값이 들어오면 Red Slider로 인식
{
value[2]=map(data, 100, 149, 0, 255); //100~149를 0~255로 맵핑
}
setColor(value[0], value[1], value[2]); //함수호출
}
}
/*
(pin) 11=RedLed, 10=GreenLed, 9=BlueLed
(index) 0=BlueLed, 1=GreenLed, 2=RedLed
setColor함수는 매개변수 값에 따라 PWM으로 RGB LED를 출력합니다.
*/
void setColor(int red, int green, int blue) //9=blue, 10=green, 11=red
{
analogWrite(led[2],red);
Serial.print("red: ");
Serial.print(red);
analogWrite(led[1],green);
Serial.print("tgreen: ");
Serial.print(green);
analogWrite(led[0],blue);
Serial.print("tblue: ");
Serial.print(blue);
Serial.println("");
}
17
①. Sketch edit(작성, optimized code)
18. 2-3. Sketch
18
② Using flowchart and block diagram, Sketch analysis (분석)
start
SoftwareSerial BT(12, 13)
Led[3]={9, 10, 11}
BT 수신버퍼 입력체크
BT.available()>0
수신문자 저장
data=BT.read()
함수호출
setColor(value[0], value[1],
value[2])
yes
no
data<50 data<100 data<150
no no
yes yes yes
Red 값에 맵핑
value[0]=map(data,
0, 49, 0, 255)
Green 값에 맵핑
value[1]=map(data,
50, 99, 0, 255)
Blue 값에 맵핑
value[2]=map(data,
100, 149, 0, 255)
23. 2-4. Output (결과)
23
②. 사진 첨부(arduino board + bread board)
초기상태 약한 빨강 강한 빨강
주황 노랑 약한 초록
강한 초록 파랑 보라
흰색 OFF
24. 2-5. Conclusion (결론)
• RGB LED 값을 3등분 하는 이유를 깨달았는데, 각 Slide
Bar를 0~255으로 3개를 설정하면, Arduino는 각각의
Slide Bar를 인식하지 못한다. 다 같은 0~255로 인식하
기 때문이다. 따라서 3등분을 하고 값의 범위에 따라
Slide Bar를 인식하도록 하는 것이다.
• 비록 mapping을 하여서 밝기가 약하진 않지만, 이 방
법의 문제점은 0~255보다 밀도가 떨어진다는 것이다.
시리얼 모니터를보면 조금만 움직여도 값이 확확 바뀐
다.
24
①. 배운점
②. 느낀점
• 밀도를 좀더 올릴수 있는 방법이 없을까 고민하게 되었
다. Slide Bar를 조금 움직일때마다 약 10씩이동하였는
데 좀더 세밀하게 움직여서 내가 원하는 색을 출력하고
싶어졌다.
25. 3-1. Introduction(개요)
Case2에서 우리는 3개의 Slide Bar를 이용하여 RGB LED
의 컨트롤에 성공했다. 하지만 RGB LED의 밝기가 밀도가
낮게 되는 것에 대해 불편을 느낄 수 있었을 것이다.
Case2방식을 개선하고자 하려면 어떻게 해야 되는지를 고
민해 볼 필요가 있다. 문제점은 각 Slide Bar의 App Block
에 있다. 3개의 각 Slide bar마다 0~255의 숫자를 Input하
려면 결국은 서로 다른 숫자가 Input되어야 한다. 각
0~255의 숫자들 앞에 번호표가 붙는다면 어떨까??
1번 Slide Bar : <1> 0~255
2번 Slide Bar : <2> 0~255
3번 Slide Bar : <3> 0~255
위의 각 번호가 표현하고자 하는 방법이다. 255를 넘어서
므로 위와 같이 표현하기 위해서는 1Byte가 아닌 2Byte가
필요함을 알 수있다.
25
①. Background(배경)
26. 3-1. Introduction(개요)
1. Application으로 3개의 Slide Bar를 만든다.
2. 3개의 Slide Bar는 최소값과 최대값을 각각 0~255,
256~511, 512~767 으로 설정한다.
3. 스마트 폰으로 Application을 다운로드받아서
Bluetooth를 연결하고 RGB LED를 컨트롤한다.
26
②. Purpose(목적)
28. 3-2. Configuration(App디자인/동작원리)
1. App Inventor에서 각 Slide Bar Block를 2Byte로 설정
한다. 2Byte로 설정하면,
1번 Slide Bar는 2진수로 앞Byte가 00000000이고 뒷Byte
가 00000000~11111111까지의 범위를 갖는다.
2번 Slide Bar는 앞Byte가 00000001이고 뒷Byte가
00000000~11111111까지의 범위를 갖는다.
3번 Slide Bar에서는 앞Byte가 00000010이고 뒷Byte가
00000000~11111111까지의 범위를 갖는다.
위 2진수 값들의 범위차이는 굉장히 중요하다. 앞Byte가
Slide Bar를 인식하는 역할을 하기 때문이다.
2. 각 Slide Bar를 RGB LED에 호환되게끔 한다.
3. Application을 QR코드로 업로드 한다.
4. 업로드 된 QR코드를 스마트 폰으로 다운로드받는다.
5. Application을 실행하여 잘 작동하는지 확인한다.
28
②. How to operate(동작원리)
29. 3-3. Sketch
/* Case 3. R:0-255, G:0-255, B:0-255을 만족하도록 App Inventor을 이용하여 3개의 slide을 만들어서 색상을 디자인하기 */
#include <SoftwareSerial.h> //시리얼통신 라이브러리 호출
SoftwareSerial BT(12, 13); //블루투스모듈에 연결하고 Tx를 12번 pin, Rx를 13번 pin으로 설정한다
const int led[3]={9,10,11}; //(pin) 11=RedLed, 10=GreenLed, 9=BlueLed
int data[2]={0}; //블루투스로 입력받은 2byte 값을 저장하는 배열 선언
int value[3]={0}; //(index) 0=Red, 1=Green, 2=Blue
void setup()
{
BT.begin(9600); //블루투스 통신을 9600속도로 시작
Serial.begin(9600); //시리얼 통신을 9600속도로 시작
for(int i=0;i<3;i++)
{
pinMode(led[i],OUTPUT); //led 3개를 출력으로 지정
}
Serial.println("");
Serial.println("Case 3.");
Serial.println("<<< RGB LED: App slider can make all the colors >>>");
Serial.println("Control the RGB slider");
}
void loop()
{
if(BT.available()>=2) //블루투스 포트의 수신 버퍼에 저장된 데이터 개수(byte단위)가 2개이상일때만 문장실행
{
data[0]=BT.read(); //2byte중 뒤의 8비트를 수신해서 저장, 슬라이더 값을 인식함
data[1]=BT.read(); //2byte중 앞의 8비트를 수신해서 저장, 각 슬라이더(R,G,B)를 인식함
Serial.print("data[0]: ");
Serial.print(data[0]);
Serial.print("tdata[1]: ");
Serial.print(data[1]);
Serial.println("");
if(data[1]==0) //Red 슬라이더
{
value[0]=map(data[0], 0, 255, 0, 255);
value[0]=constrain(data[0], 0, 255);
}
else if(data[1]==1) //Green 슬라이더
{
value[1]=map(data[0], 0, 255, 0, 255);
value[1]=constrain(data[0], 0, 255);
}
else if(data[1]==2) //Blue 슬라이더
{
value[2]=map(data[0], 0, 255, 0, 255);
value[2]=constrain(data[0], 0, 255);
}
setColor(value[0], value[1], value[2]); //함수호출
}
}
/*
(pin) 11=RedLed, 10=GreenLed, 9=BlueLed
(index) 0=BlueLed, 1=GreenLed, 2=RedLed
setColor함수는 매개변수 값에 따라 PWM으로 RGB LED를 출력합니다.
*/
void setColor(int red, int green, int blue) //9=blue, 10=green, 11=red
{
analogWrite(led[2],red);
Serial.print("red: ");
Serial.print(red);
analogWrite(led[1],green);
Serial.print("tgreen: ");
Serial.print(green);
analogWrite(led[0],blue);
Serial.print("tblue: ");
Serial.print(blue);
Serial.println("");
} 29
①. Sketch edit(작성, optimized code)
30. 3-3. Sketch
30
② Using flowchart and block diagram, Sketch analysis (분석)
start
SoftwareSerial BT(12, 13)
Led[3]={9, 10, 11}
BT 수신버퍼 입력체크
BT.available()>=2
수신문자 저장
data[0]=BT.read()
data[1]=BT.read()
함수호출
setColor(value[0], value[1],
value[2])
yes
no
data[1]==0 data[1]==1 data[1]==2
no no
yes yes yes
Red 값에 맵핑
value[0]=map(data[
0], 0, 255, 0, 255)
Green 값에 맵핑
value[1]=map(data[
0], 0, 255, 0, 255)
Blue 값에 맵핑
value[2]=map(data[
0], 0, 255, 0, 255)
36. 3-4. Output (결과)
36
②. 사진 첨부(arduino board + bread board)
초기상태 약한 빨강 강한 빨강
주황 노랑 초록
하늘 파랑 보라
흰색 OFF
37. 3-5. Conclusion (결론)
• Case3을 통하여 Byte로 지원하는 범위를 다르게 할 수
있는 방법을 배웠다. 원리를 이해함으로서 깨닫고 와닿
는 점이 굉장히 많았다. 매번 소스로만 해결하려고 하
는 방식에 있어서의 한계를 느꼈고, 이를 해결하기 위
해서는 기초적인 원리자체가 굉장히 중요하다는 것을
깨닫기도 했습니다. 결국에는 동작원리를 이해함으로서
스스로가 더 심도있게 된 것 같아서 뿌듯하다.
37
①. 배운점
②. 느낀점
• 계속 언급하듯이 기초의 중요성을 우선적으로 느꼈다.
기초를 이해하는 것뿐만 아니라 이를 활용할 줄도 알아
야 한다고 느끼게 되었다.