Presentation is loading. Please wait.

Presentation is loading. Please wait.

6. 시리얼 통신 제어 - 스마트 폰으로 제어하는 아두이노 -.

Similar presentations


Presentation on theme: "6. 시리얼 통신 제어 - 스마트 폰으로 제어하는 아두이노 -."— Presentation transcript:

1 6. 시리얼 통신 제어 - 스마트 폰으로 제어하는 아두이노 -

2 강의 개요 아두이노 보드는 개발용 PC 등과 같이 외부의 다른 시스템과 데이터를 주고받기 위하여 시리얼 통신을 일반적으로 이용
이장에서는 시리얼 통신을 활용한 방법을 공부해 보자.

3 6.1 시리얼 통신 직렬통신(Serial Communication) 시리얼 통신의 일반적인 특징과 아두이노 보드의 적용
시리얼 통신은 송신(TX), 수신(RX)의 2개 데이터 선을 이용하여 통신을 하기 때문에 비교적 간단하게 통신 연결이 가능 바이트(8비트)의 데이터를 비트 단위로 나누어 차례대로 전송하므로 통신시간이 느림 아두이노 보드와 개발용 PC사이의 시리얼 통신은 USB 포트 통해 가능 시리얼 통신을 하기 위해서는 속도(bps), 패리티(Parity), 스탑비트(Stop bit), 데이터 비트(Data bits) 설정이 필요 일반적으로 속도는 9,600bps, 패리티는 No parity, 1 스탑비트, 8데이터 비트를 사용

4 아두이노 UNO보드의 시리얼 통신 아두이노 UNO보드는 디지털입출력 핀 0번과 1번을 시리얼 통신을 위한 RX와 TX 신호로 사용

5 6.2 아두이노 시리얼 모니터 사용법 아두이노 개발환경에서는 개발용 PC의 시리얼 통신을 모니터할 수 있는 툴을 제공
아두이노 개발환경의 시리얼 모니터 기능과 사용법 아두이노 개발환경 실행창에서 기본으로 제공하는 "ASCIITable" 예제 활용 예제 위치 : "파일→예제→04.Communication→ASCIITable"

6 예제 실행 USB 케이블을 이용하여 개발용 PC와 아두이노 보드를 연결하고, "ASCIITable"를 안드로이드 보드에 업로드
스케치 창의 툴바 오른쪽 끝의 클릭을 하면 시리얼 모니터 창이 나타나며 아두이노 보드에서 보낸 ASCII Table ~ Character Map이 출력

7 시리얼 통신 설정 "Serial.begin(9600);" USART0를 사용하고 통신 속도는 "9600bps“ 의미
현재 아드이노 보드가 연결된 개발용 PC의 시리얼 포트를 확인 만일 시리얼 모니터에서 출력되는 문자가 깨져서 나온다면 통신속도가 "2400" 등으로 "ASCIITable"의 통신속도가 맞기 않기 때문 "Arduino UNO on COM10" 메시지를 확인 USART0는 통신 포트임과 동시에 아두이노 보드에 업로드를 하는 포트로도 사용. USART0를 시리얼 모니터 프로그램으로 사용하면, 아두이노 보드에 다시 업로드가 되지 않음, 이미 개발용 PC에서 USART0를 시리얼 포트로 사용 중이기 때문. 이 경우 아두이노 보드에 업로드를 하기 위해서는 반드시 시리얼 모니터 프로그램을 종료해야 함.

8 6.3 아두이노 시리얼 모니터를 사용한 제어 아두이노의 시리얼 모니터를 이용하여 개발용 PC와 통신하며 제어 하는 방법을 살펴보자.

9 예제 6.1 아두이노 보드에서 시리얼 통신으로 메시지 보내기
주요개념 개발용 PC를 사용하여 스케치를 작성하고 아두이노 보드에 업로드하기 위하여 2장에서 개발환경을 구축하면서, 개발용 PC에는 시리얼 통신을 위한 설정을 해 놓은 상태 필요 아두이노 보드에서 PC로 시리얼 통신 속도 설정 아두이노의 스케치의 setup( ) 함수에서 Serial.begin( ) 함수 사용 개발용 PC의 모니터로 문자열 전송 Serial.println( )나 Serial.print( ) 사용 void setup() { Serial.begin(9600); } 시리얼 통신을 위한 전송속도 9600 설정 void loop() { Serial.println("Hello world!"); delay(1000); 개발용 PC의 모니터로 문자열 전송

10 예제 6.1의 실행 스케치 창의 툴바 오른쪽 끝의 클릭 시리얼 모니터 창이 띠워지며 아두이노 보드에서 보낸 "Hello world!"라는 문자가 출력

11 예제 6.2 한 개의 문자를 받아서 시리얼 모니터에 출력하기
개발용 PC의 시리얼 모니터 창의 "send"로부터 1개의 문자를 입력 받아 시리얼 모니터에 다시 출력 주요개념 Serial.available( ) 사용 시리얼 통신을 통하여 아두이노 보드로 입력이 있을 때만 실행이 가능하도록 입력이 있는지 검사하는 함수 Serial.read( ) 사용 시리얼 통신을 통하여 입력을 받아드리는 함수 void setup() { Serial.begin(9600); } 시리얼 통신을 위한 전송속도 9600 설정 void loop() { if( Serial.available() ){ 입력된 문자가 하나 이상 있는지 검사 char ch = Serial.read(); PC로부터 1개의 문자를 받아 저장 Serial.println(ch); 저장된 문자를 PC의 시리얼 모니터에 출력

12 예제 6.2의 실행 스케치 업로드 후 개발용 PC의 시리얼 모니터 창을 열면 입력 대기 상태
1개 이상의 문자를 키보드를 통하여 입력한 후 "Send"를 클릭 하면 입력한 문자가 시리얼 모니터에 출력 "HELLO"라 문자열을 입력하고 "Send"를 클릭 하면 한 줄에 한 자씩 연속하여 HELLO 표시

13 예제 6.3 시리얼 통신 제어 시리얼 통신을 통하여 개발용 PC의 키보드로 부터 "1, 2, 3"을 입력 받아, 아두이노 보드로 전송하여 LED 제어 입력 값이 "1"이면 LED를 1초 간격으로 1번 깜빡임 입력 값이 "2"이면 LED를 1초간 간격으로 2번 깜빡임 입력 값이 "3"이면 LED를 1초간 간격으로 3번 깜빡임 주요개념 시리얼 통신을 통하여 개발용 PC의 키보드로 부터 "1, 2, 3"을 입력 받아들이고, switch( )함수의 case 조건으로 사용

14 예제 6.3의 스케치1 int LED=13; int i; 디지털입출력 핀 13에 연결된 uno 보드의 LED 사용
void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); } 시리얼 전송 속도 9600bps void blink(){ digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); LED를 깜박이는 부분을 blink()함수로 정의

15 예제 6.3의 스케치2 void loop() { loop()의 시작 Serial.println("Enter 1,2,3 !");
if( Serial.available() ){ 입력된 문자가 하나 이상 있는지 검사 char select = Serial.read(); PC로부터 1개의 문자를 받아 저장 Serial.print("Selcet Number ="); Serial.println(select); 선택된 숫자를 표시 switch(select) { 시리얼통신으로 받은 문자를 case조건으로 사용 case '1': for (i=0; i<1; i++) blink(); break; case '2': for (i=0; i<2; i++) blink(); case '3': for (i=0; i<3; i++) blink(); blink() 함수 1번 호출 blink() 함수 2번 호출 blink() 함수 3번 호출 } switch()의 끝 Serial.available()의 끝 loop()의 끝

16 예제 6.3의 실행 스케치 업로드 후 개발용 PC의 시리얼 모니터 창을 열면, 시리얼 모니터에 "Enter 1,2,3 !" 을 출력하며 입력 대기 상태 "1, 2, 3" 가운데 하나의 문자를 키보드를 통하여 입력한 후 "Send"를 클릭 하면 "Selcet Number = (입력한 숫자)"가 시리얼 모니터에 출력 되고, 지정된 LED 제어 지정된 LED 제어가 완료되면 다시 시리얼 모니터에 "Enter 1,2,3 !" 을 출력하며 입력 대기 상태

17 6.4 아두이노 Mega 보드의 COMMUNICATION 핀
ATmega2560은 직렬 통신포트 USART 4개 내장 USART0, USART1, USART2, USART3 USART는 3가지의 인터럽트 제공 송신 완료(TX Complete) 송신 데이터 레지스터 준비완료(TX Data Register Empty) 수신완료(RX Complete)

18 아두이노 Mega보드의 통신 핀 시리얼 통신을 위하여 디지털입출력 핀 0번, 1번과 14~21번을 COMMUNICATION 핀으로 사용 COMMUNICATION 핀은 비동기식 시리얼 통신을 위한 4개의 하드웨어 UART와 동기식 시리얼 통신을 위한 TWI로 구분 MEGA 2560 R3 pin COMMUNICATION UART0 RX0 TX0 1 UART3 TX3 14 RX3 15 UART2 TX2 16 RX2 17 UART1 TX1 18 RX1 19 TWI/SPI SDA 20 SCL 21

19 6.5 HBE-MCU-Multi의 스위치 모듈 HBE-MCU-Multi의 UART 모듈
PC나 다른 임베디드 시스템과의 UART 통신을 위하여 RS232와 USB를 통한 가상 UART 2가지 제공

20 예제 6.4 UART로 Hello 보내기 개발용 PC와 아두이노 Mega 보드의 연결
개발용 PC와 Mega 보드를 USB 케이블로 연결하지 않고, Mega 보드와 UART 모듈을 2핀 커넥터를 사용하여 연결 UART 모듈과 개발용 PC는 USB 케이블을 이용하여 연결 개발용 PC의 장치관리자에서 UART 모듈을 통해 연결된 USB 포트 설정 UART 모듈 : 스케치의 작성된 문장을 개발용 PC의 시리얼 모니터에 뿌려주는 역할 담당

21 HBE-MCU-Multi의 UART 모듈의 통신 포트설정
HBE-MCU-Multi의 UART 모듈은 통신 속도가 115,200bps로 되어 있으므로 통신을 위하여 개발용 PC의 통신 포트를 ⓒ와 같이 다시 설정 HBE-MCU-Multi의 UART 모듈과 개발용 PC를 연결하면 ⓐ와 같이 새로운 통신 포트가 할당

22 아두이노 개발환경의 시리얼포트 변경 아두이노 개발환경에서 시리얼 통신을 위하여 도구의 시리얼 포트를 새로운 통신포트로 선택

23 예제 6.4의 주요개념 아두이노 Mega 보드의 COMMUNICATION 핀 중 USART1인 TX1(핀 18번)와 RX1(핀 19번)을 각각 UART 모듈의 TXD0와 RXD0 포트에 연결 UART 모듈의 USB 포트와 개발용 PC의 USB 포트를 연결 아두이노 보드 사용 모듈 COMMUNICATION 핀 19번(RX1) 출력 모드 UART 모듈 RXD0 18번(TX1) TXD0 [주의] - 작성된 스케치는 기존의 전송 UART0를 통하여 아두이노 Mega 보드에 전송 (아두이노 보드에 내장된 시리얼 포트를 통하여 기존의 방법으로 스캐치를 전송) - 스케치 업로드가 완료되면, UART0가 연결된 UBS 케이블을 제거하고, URAT 모듈을 통해 연결된 USB 케이블을 연결한 후 Mega 보드의 리셋 스위치를 눌러 보드를 초기화

24 예제 6.4의 스케치 byte text[ ] = "Hello! World!!\r\n";
배열 text에 UART로 출력할 문자열 저장 void setup() { byte i; Serial1.begin(115200); 원하는 baud rate로 UART1을 초기화 while( text [ i ] ! = ‘ \ 0 ‘ ){ Serial1.write ( text [ i++ ] ); } delay(500); 배열 text의 문자열을 한 문자(1byte)씩 UART1으로 전송 Serial1.print("Hello! World!!\r\n"); 문자열을 UART1으로 전송 Serial1.println("Hello! World!!"); 입력 문자열에 0x0d(CR) 0x0a(LF)를 포함하여 setup()의 끝 void loop() { 전원 OFF까지 무한히 반복 실행

25 예제 6.4의 실행 앞에서는 USART0를 사용하였기 때문에 시리얼 포트가 "COM3"였지만, 이번 실습예제에서는 UART 모듈을 사용하기 때문에 시리얼 포트가 "COM4"이다.

26 예제 6.5 UART로 PC와 데이터 주고받기 아두이노 Mega 보드와 개발용 PC를 UART 통신을 연결하고, 개발용 PC에서 받은 문자열을 그대로 되돌려 전송해주는 프로그램 주요개념 아두이노 Mega 보드의 USART1 핀들을 UART 모듈에 연결 COMMUNICATION 핀들 중 "RX1"인 19번 핀을 UART 모듈의 RXD0에, TX1"인 18번 핀을 UART 모듈의 TXD0에 연결 UART 모듈의 USB 포트를 통해 개발용 PC의 USB 포트와 연결 setup()에서 USART1의 통신 속도인 115,200bps로 설정 if(Serial1.available()) 구문 사용 Serial1.available( )함수는 USART1으로 수신된 데이터가 수신 버퍼에 몇 개 있는가를 반환하는 함수이므로 구문은 문자가 수신되어야 조건이 "참"이 되어 Serial1.write(Serial1.read()); 명령을 수행 Serial1.read()함수로 수신 버퍼로부터 데이터를 읽어온 뒤 그 값을 다시 Serial1.write() 함수를 통해 전송 즉, PC로부터 수신된 데이터를 그대로 다시 PC로 전송하는 역할

27 예제 6.5의 스케치 void setup() { Serial1.begin(115200);
Serial1.println("\r\nWelcome! \r\nUSART 1 Test Program"); Serial1.print("ECHO >> "); } void loop() { if(Serial1.available()) Serial1.write(Serial1.read());

28 연습과제 개발용 PC에서 문자를 입력하면 그 문자에 해당하는 아스키 코드(ASCII) 를 10진수로 PC에 다시 전송하여 표시하는 스케치를 작성하시오. (예: 시리얼 모니터 창에 'a'를 입력하고 <Send> 버튼을 누르면 'I received : 97'이표시 되도록 한다.) 개발용 PC에서 0에서 9사이의 숫자를 입력하면 그 값을 FND에 표시하고, 그 외 값을 입력하면 FND를 끄는 스케치를 작성하시오. 개발용 PC에서 문자열(2개 이상의 문자)을 입력하여 화면에 다시 표시하는 프로그램을 작성하시오. 개발용 PC에서 2개의 숫자열(A, B 값)을 입력 받아 두 수를 더하고, 빼는 계산 결과를 출력하는 프로그램을 작성하시오.

29 함수정리 아두이노 보드와 개발용 PC사이의 전송속도를 value로 설정
Serial.begin(value); 아두이노 보드와 개발용 PC사이의 전송속도를 value로 설정 -value : 4,800bps, 9,600bps, 14,400bps, 19,200bps, (예) Serial.begin(9600); 시리얼 통신 전송속도를 9,600bps로 설정 Serial.available( ) { A } 시리얼 모니터를 통하여 입력된 문자가 하나 이상 있는지 검사하여 입력이 있으면 A를 실행 Serial.print("text"); 시리얼 통신을 통하여 아두이노 보드에서 개발용 PC의 모니터로 text전송(줄 바꿈 하지 않음) -text : 문자열 (예) Serial.print("a = "); 개발용 PC의 모니터에 "a = "표시하고 줄 바꿈하지 않음

30 함수정리 Serial.println("text");
시리얼 통신을 통하여 아두이노 보드에서 개발용 PC의 모니터로 text전송하고 줄바꿈 -text : 문자열 (예) Serial.println("Hello world!"); 개발용 PC의 모니터에 "Hello world!" Serial.println(rx, type); 시리얼 통신을 통하여 아두이노 보드에서 개발용 PC의 모니터로 데이터 rx를 type형식으로 전송 -rx : 1바이트 데이터 -type : DEC(ASCII코드), (예) Serial.println(rx, DEC); 1바이트 데이터에 해당하는 ASCII코드 출력 Serial.read( ); 시리얼 통신을 통하여 입력된 -value : a1~a2사이의 정수형 값 (예) rx = Serial.read( ); 시리얼 통신을 통하여 입력된 데이터를 변수 rx에 저장

31 Serial.print(val, format)의 사용 예
함수정리 Serial.print(val, format)의 사용 예 Serial.print(78) "78" 이 전송 Serial.print('N') "N" 이 전송 Serial.print("Hello world.") "Hello world." 전송 Serial.print(78, BIN) 2진수 ASCII로 " " 전송 Serial.print(78, OCT) 8진수 ASCII로 "116" 전송 Serial.print(78, DEC) 10진수 ASCII로 "78" 전송 Serial.print(78, HEX) 16진수 ASCII로 "4E" 전송 Serial.print( , 0) "1" 전송, 실수 출력의 경우 소수점 이하 자릿수 지정 가능 Serial.print( , 2) "1.23" 전송, 소수점 둘째 자리까지 출력 Serial.print( , 4) "1.2346" 전송, 소수점 넷째 자리까지 출력 Serial.print( ) "1.23" 전송, 두번째 인자가 없는 경우 소수점 둘째 자리 출력


Download ppt "6. 시리얼 통신 제어 - 스마트 폰으로 제어하는 아두이노 -."

Similar presentations


Ads by Google