사물인터넷(IoT) 프로그래밍 기초 5. 시리얼통신
목차 직렬통신 vs 병렬통신 아두이노가 외부와 통신하는 방법 Hardware Serial (UART), Software Serial Serial 객체를 이용한 시리얼 통신 실습 1: Hardware Serial 기본 사용법 실습 2: 스위치 동작 횟수 전달하기 (Pull-UP 복습 포함) 응용 1: PC에서 스위칭 횟수 초기화 하기 실습 3: PC에서 LED 3개 점멸 제어 실습 4: 아두이노를 이용한 PC간 채팅
직렬 통신 vs. 병렬 통신 직렬통신 병렬통신 통신거리 원거리 통신 유리 단거리 전송 데이터 전송량 적다 많다 구현 기술 단순 복잡 구현 비용 저렴 고가 대표적 예 PC의 RS-232C HDD IDE 케이블
아두이노가 외부와 통신하는 방법 Hardware Serial Software Serial I2C (Inter-Integrated Circuit: Inter IC) SPI (Serial Peripheral Interface)
Hardware Serial Serial 객체를 이용 아두이노가 외부와 통신하는 방법 Hardware Serial UART(Universal asynchronous receiver/transmitter) (범용 비동기화 송수신기) 아두이노 보드의 시리얼 통신 전용 핀 사용 0번: (RX: Receiver 수신) 1번: (TX: Transmitter 송신) USB 포트와 하드웨어적으로 공유 USB와 전용핀 동시 사용 불가능 USB로 PC와 연결할 때는 0, 1번 핀 연결 분리해야 함 (PC에서 아두이노로 스케치 업로드 불가능) Serial 객체를 이용 별도의 라이브러리 설치가 필요 없음
UART 통신 개념
Software Serial 0, 1번 외에 다른 디지털 핀으로 Serial 통신을 원할 때 사용 아두이노가 외부와 통신하는 방법 Software Serial 0, 1번 외에 다른 디지털 핀으로 Serial 통신을 원할 때 사용 SoftwareSerial 라이브러리 사용 #include <SoftwareSerial.h> SoftwareSerial 객체를 생성하여 사용 객체 생성 시, 통신에 사용할 핀 번호 지정 예: SoftwareSerial softSerial(7, 8); // 7, 8번 사용
Serial 아두이노가 PC, 다른 장치와 통신할 때 사용하는 객체 UART 기반의 통신에 필요한 다양한 함수들을 제공 아두이노 하드웨어 시리얼 통신 함수 Serial 아두이노가 PC, 다른 장치와 통신할 때 사용하는 객체 UART 기반의 통신에 필요한 다양한 함수들을 제공 Serial 객체 함수: Serial.begin(속도값); //시리얼 통신을 속도값으로 초기화 Serial.available( ); //시리얼 포트로 수신된 바이트 수 반환 Serial.read( ); // 수신 버퍼에서 1바이트 읽음 (없으면 -1) Serial.write(byte); //1byte 송신 Serial.print(value [,format]); // 값(value)을 송신 Serial.println(value [,format]); //값(value)을 송신 후 줄바꿈 …….. https://www.arduino.cc/reference/ko/
실습 1: Hardware Serial 기본 사용법 주제: 수신한 문자의 코드값 송신하기 시리얼 모니터: 송신창, 수신창 사용법 준비물 : 아두이노보드, PC, USB Cable 연결 PC와 아두이노보드 USB 케이블로 연결 COM 포트 설정 IDE화면 우측 상단의 시리얼 모니터 열기
Serial.available() 시리얼 포트로부터 읽을 수 있는 바이트의 수를 가져옴 시리얼 포트로부터 읽을 수 있는 바이트의 수를 가져옴 반환값은 읽어온 바이트의 수로, 0일 경우 받은 데이터가 없음 int inByte; void loop() { if(Serial.available()>0){ //아두이노가 받은 데이터가 있으면 inByte = Serial.read(); //읽어서 변수에 저장한다. }
Serial.read() 시리얼 포트로부터 데이터를 읽음 반환값은 읽어온 바이트의 수로, 0일 경우 받은 데이터가 없음 반환값은 읽어온 바이트의 수로, 0일 경우 받은 데이터가 없음 int inByte; void loop() { if(Serial.available()>0){ //아두이노가 받은 데이터가 있으면 inByte = Serial.read(); //읽어서 변수에 저장한다. Serial.print(“받은 데이터 : “); //10진수 형태로 시리얼모니터에 출력 Serial.println(inByte, DEC); }
시리얼 모니터 열기 실습 1: Hardware Serial 기본 사용법 Sketch
시리얼 모니터 송신창 PC → 아두이노 수신창 PC ← 아두이노 통신속도 서로 일치해야 함 실습 1: Hardware Serial 기본 사용법 송신창 PC → 아두이노 시리얼 모니터 수신창 PC ← 아두이노 통신속도 서로 일치해야 함
시리얼 모니터 실습 1: Hardware Serial 기본 사용법 송신: A[ENTER] 수신: 65 <- 문자 ‘A’의 ASCII Code 값 65 10 <- ENTER key ASCII Code값 10
실습 1: Hardware Serial 기본 사용법 :Rx :Tx Tx: Rx: [ENTER] A 수신 데이터: 65 / 수신 데이터: 10
아두이노 시리얼 통신 코딩의 핵심 문자 단위로 수신한 데이터를 아두이노 쪽에서 어떻게 읽고 처리할 것인가를 결정하는 것 문자 단위로 수신한 데이터를 아두이노 쪽에서 어떻게 읽고 처리할 것인가를 결정하는 것 아두이노에서 외부로 송신하는 것은 수신 처리에 비해 비교적 간단함
실습 2: 스위치 동작 횟수 전달하기 주제: Pull-Down 스위치 누른 횟수 송신하기 준비물 : 회로구성: 동작 스위치 1개, 저항(10kΩ) 1개 회로구성: Pull-Down 저항 스위치를 7번 핀에 연결 동작 스위치를 누를 때마다 1씩 증가하는 값을 PC로 전송
풀업(PULL UP), 풀다운(PULL DOWN) 저항 VCC에 저항 연결 GND에 저항 연결 A : 회로의 전압을 읽어 냄
실습 2: 스위치 동작 횟수 전달하기 회로 구성
실습 2: 스위치 동작 횟수 전달하기 회로도
Sketch 실습 2: 스위치 동작 횟수 전달하기 Serial 객체의 통신 속도 설정 후, Serial.begin(9600); PC와의 COM 포트 연결이 될 때까지 모니터링 하며 대기 while ( ! Serial ) ;
동작화면 실습 2: 스위치 동작 횟수 전달하기 스위치 누를 때마다 송신 PC와의 COM 포트 연결이 될 때까지 모니터링 하며 대기, 완료되면 while 종료 while ( ! Serial ) ; 연결된 후에 완료 메시지 송신 Serial.pintln(“시리얼 통신 준비 완료“); 동작화면 스위치 누를 때마다 송신
응용 1: PC에서 스위칭 횟수 초기화 하기 주제: 시리얼 모니터에서 ‘C’를 전송하여 누적된 스위칭 누적 횟수 0으로 초기화 하기 준비물 : 실습 2 회로 구성 유지 Sketch 수정 수신 데이터에서 문자 ‘C’가 전송되면 swCount 값을 0으로 초기화 한다. if (Serial.available() > 0) { if(Serial.read() == ‘C’) { swCount = 0; //스위칭 횟수 값을 0으로 초기화 Serial.println(“스위치 누른 회수: 0으로 초기화“); }
serialEvent() 전달된 데이터가 사용가능해지면 호출됨 Serial 객체의 함수 void serialEvent() { //여기에 실행되어야 하는 명령어 작성 }
Sketch 응용 1: PC에서 스위칭 횟수 초기화 하기 void serialEvent() { } //시리얼 통신으로 데이터가 //수신될 때마다 자동으로 실행 } if (Serial.available() > 0) { //이 코드를 loop()에 포함시키는 //는 것보다 편리함. }
응용 1: PC에서 스위칭 횟수 초기화 하기 동작화면 스위치 누름
실습 3: PC에서 LED 3개 점멸 제어 주제: PC에서 시리얼 통신으로 LED 3개 (Red, Green, Blue) 점멸 제어하기 준비물 : - 실습 2 회로 유지 - LED (Red) 1개 - LED (Green) 1개 - LED (Blue) 1개 - 저항 220 Ω 3개 회로구성: LED(Red): 8번, LED(Green): 9번, LED(Blue): 10번 동작 PC에서 ‘R’, ‘G’, ‘B’ 문자로 점멸 제어
실습 3: PC에서 LED 3개 점멸 제어 회로 구성
실습 3: PC에서 LED 3개 점멸 제어 회로도
Sketch 실습 3: PC에서 LED 3개 점멸 제어 세 부분의 내용이 LED 색을 제외하면 동일 재사용이 가능한 사용자 함수로 작성 ToggleLED(ledPin)
toggleLED(ledPin) 지정한 핀(ledPin)에 연결된 LED의 상태를 반전시킴 사용 예) 사용자 정의 함수 toggleLED(ledPin) 지정한 핀(ledPin)에 연결된 LED의 상태를 반전시킴 사용 예) toggleLED(4); //4번 핀 연결 LED의 점멸 상태를 반대로 설정 void toggleLED(int ldePin) { if(digitalRead(ledPin) == HIGH) //켜져 있으면 digitalWrite(ledPin, LOW); // LED를 끔 else //꺼져 있으면 digitalWrite(ledPin, HIGH); // LED를 켬 }
실습 3: PC에서 LED 3개 점멸 제어 Sketch
LED 점멸 제어 연습 (순서대로) Red, Green, Blue 순서대로 켜기 Red, Green, Blue 순서대로 끄기 실습 3: PC에서 LED 3개 점멸 제어 LED 점멸 제어 연습 (순서대로) Red, Green, Blue 순서대로 켜기 “R G B” 송신 // R과 G, G와 B 사이에 빈칸 Red, Green, Blue 순서대로 끄기 Red, Green, Blue 동시에 켜기 “RGB” 송신 // 빈 칸 없음 Red, Green, Blue 동시에 끄기 응용1: 다양한 점멸 시나리오를 구성해보기 응용2: 추가 제어 기능 구현해 보기
Software Serial 0, 1번 외에 다른 디지털 핀으로 Serial 통신을 원할 때 사용 아두이노가 외부와 통신하는 방법 Software Serial 0, 1번 외에 다른 디지털 핀으로 Serial 통신을 원할 때 사용 SoftwareSerial 라이브러리 사용 #include <SoftwareSerial.h> SoftwareSerial 객체를 생성하여 사용 소프트웨어 시리얼 통신에 사용할 핀 번호 지정하여 객체 생성 예: SoftwareSerial swSerial(7, 8); // 7, 8번 사용하는 객체 생성 //이후로는 생성된 swSerial 객체를 Serial과 같은 방법으로 이용 swSerial.begin(9600); swSerial.available(); swSerial.read(); swSerial.println(…);
실습 4: 아두이노를 이용한 PC간 채팅 주제: 아두이노 2개를 이용한 PC간 채팅하기 Software Serial과 Hardware Serial 모두 이용 준비물 : - 아두이노 2개 - PC 2대 회로구성: PC와 아두이노는 USB 케이블로 연결 (Hardware Serial 이용) 두 개의 아두이노는 Software Serial 설정 디지털 핀 연결 Tx와 Rx를 서로 연결, GND간의 연결 동작 각 PC의 시리얼 모니터를 이용하여 채팅
회로 구성 User Chatting 실습 4: 아두이노를 이용한 PC간 채팅 Hardware Serial PC A Software Serial Hardware Serial PC A 회로 구성 Software Serial User Chatting PC B Hardware Serial
Sketch 실습 4: 아두이노를 이용한 PC간 채팅 #include <SoftwareSerial.h> SoftwareSerial swSerial(7, 8); //7,8번 핀을 사용하는 SW 시리얼 통신 객체 생성 void setup() { Serial.begin(9600); // PC와 통신은 HW시리얼 사용 swSerial.begin(9600); // 아두이노 간의 통신은 SW 시리얼 사용 } void loop() { if (swSerial.available() > 0) //아두이노에서 수신된 데이터는 Serial.write(swSerial.read()); //PC로 전송 if (Serial.available() > 0) //PC에서 수신된 데이터는 swSerial.write(Serial.read()); //아두이노로 전송
시리얼 모니터에 한글이 깨질 경우 아두이노 폴더에서 아래 두개의 파일에 다음과 같이 추가한다. 메모장을 사용자권한으로 실행해야 변경되 내용 저장이 가능하다. arduino.l4j.ini arduino._debug.l4j.ini