728x90
반응형
2-1. 아두이노 실습
UART 시리얼 통신의 이해
1-1. UART 개념
- UART (Universal Asynchronous Receiver/Transmitter): 직렬 통신을 담당하는 하드웨어 프로토콜. 아두이노에서 Serial 클래스가 이 역할을 담당한다.
- 전압 레벨
- 일반적인 아두이노 UNO: 5V 기준 전압
- 다른 컨트롤러(예: 3.3V) 또는 RS-232C(\u00b1전압)와 통신 시 별도의 레벨 변환 필요
- USB 연결
- 아두이노 UNO 내부의 ATmega16u2 칩이 USB ↔ UART 변환을 처리해, PC와 직렬 통신 가능
- UNO 보드의 0번 UART 채널이 Serial 객체와 연결됨
1-2. 실습 1: 시리얼 포트 선택 및 연결 확인
- 아두이노 UNO 보드와 USB 케이블 준비
- USB 케이블로 아두이노를 컴퓨터에 연결
- 아두이노 IDE에서 도구(Tools) → 포트(Port)에서 연결된 시리얼 포트를 선택
- 올바른 포트가 연결되었는지 확인
- 문제가 없으면 보드(Board) 종류가 ‘Arduino UNO’ 등으로 지정되어 있어야 함
💡 결과: UART 시리얼 통신이 가능한 환경이 구성된다.
2. 시리얼 모니터 사용법
2-1. 시리얼 모니터 개요
- 송신 문자열 입력 창: 아두이노 쪽으로 메시지를 보낼 때 텍스트를 입력하는 곳
- 송신 버튼: 입력한 텍스트를 실제로 전송
- 수신 문자열 출력 창: 아두이노가 보낸 데이터를 확인
- 추가 문자 선택 콤보 박스: 엔터(Enter)나 캐리지 리턴(CR) 등을 추가로 보낼지 설정
- 변조 속도(보드레이트) 선택 콤보 박스: 통신 속도 설정 (예: 9600bps, 115200bps 등)
2-2. 실습 2: 시리얼 모니터 기본 테스트
- 새 스케치 파일을 열고 기본 시리얼 통신 설정 코드를 작성:
- void setup() { Serial.begin(9600); // 보드레이트 설정 } void loop() { // 아무 동작 없음 }
- 업로드 후, 아두이노 IDE의 오른쪽 상단에 있는 시리얼 모니터 열기
- 보드레이트를 9600으로 설정
- 송신 창에 텍스트를 입력 후 전송 → 별도의 코드를 작성하지 않았으므로 아두이노가 수신한 값을 출력하지 않음
- 연결 상태 확인
Questions:
- 시리얼 통신이란?
- 아두이노에서 시리얼 통신 과정이 필요한 이유?
3. Serial 클래스 – 데이터 전송
3-1. print(), write() 함수
- Serial.print(value, format)
- value: 전송할 값(문자, 정수, 실수, 문자열 등)
- format: 진법(DEC, HEX, OCT, BIN 등)이나 소수점 자리수
- 반환값: 실제로 전송된 바이트 수
- Serial.write(ch)
- ch: 바이트 단위의 데이터(문자 1개 등)
- 반환값: 실제로 전송된 바이트 수
실습 3-1: print()와 write() 차이 확인
- 스케치 코드 작성:
- 업로드 후 시리얼 모니터로 확인
- Serial.print("Hello")는 문자열 "Hello"를 ASCII 코드로 변환해 전송
- Serial.write('\n')는 실제 한 바이트(개행 문자)를 전송
- 결과: 1초 간격으로 "Hello"가 줄바꿈 되어 출력됨
void setup() {
Serial.begin(9600);
}
//자리수 지정 등 옵션
void loop() {
Serial.print("Hello"); // 사람이 보기 편한 문자열 출력
Serial.write('\n'); // 개행 바이트 전송
delay(1000); // 1초마다 반복
}
3-2. 다양한 진법과 소수점 자리수 설정
- 진법 변환: Serial.print(value, BASE)
- BASE 자리에 BIN, OCT, DEC, HEX 등을 넣으면 해당 진법으로 출력
- 소수점 자리수: Serial.print(3.1415, 2) → 3.14 출력
실습 3-2: 진법 변환과 소수점 출력
- 스케치 코드 작성:
- 업로드 후 시리얼 모니터로 확인
- 결과: 2초 간격으로 10진수, 16진수, 소수점 이하 2자리의 π 값 출력
- Serial 클래스 – 데이터 수신
void setup() {
Serial.begin(9600);
}
void loop() {
int number = 123;
Serial.print("Decimal: ");
Serial.println(number, DEC); // 10진수 출력
Serial.print("Hex: ");
Serial.println(number, HEX); // 16진수 출력
float pi = 3.141592;
Serial.print("PI (2 decimal places): ");
Serial.println(pi, 2); // 소수점 둘째 자리까지만 출력
delay(2000);
}
4-1. available(), read(), readString(), readStringUntil() 등
- Serial.available(): 수신 버퍼에 저장된 바이트 개수 반환
- Serial.read(): 수신 버퍼에서 가장 먼저 들어온 바이트 하나 반환 (없으면 -1)
- Serial.readString(): 버퍼에 있는 문자열 전체 반환 (없으면 빈 문자열)
- Serial.readStringUntil(종료문자): 특정 종료 문자를 만나기 전까지 문자열 반환
실습 4-1: 간단한 에코 프로그램
- 스케치 코드 작성:
- 업로드 후 시리얼 모니터에서 문자를 입력 → 아두이노가 같은 문자를 "I received: x" 형태로 돌려줌 (에코)
- 결과: 입력하는 즉시 결과가 수신되고, 한 번에 한 글자씩 처리됨
- String 클래스
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
// 수신 데이터가 있다면
char incomingByte = Serial.read();
Serial.print("I received: ");
Serial.println(incomingByte);
}
}
5-1. String 클래스와 문자열 처리
- String("abc") + 123 → 결과: "abc123"
- 문자열 배열과 정수는 직접 덧셈 불가
실습 5-1: 문자열 생성 및 비교
- 스케치 코드 작성:
- 업로드 후 시리얼 모니터로 확인:
- 결과: "Hello World 2024" 출력 및 s1 비교 결과 확인
- 종합 실습: ‘에코 + 문자열 처리’ 확장 예제
void setup() {
Serial.begin(9600);
String s1 = "Hello";
String s2 = "World";
int num = 2024;
// 문자열 + 정수
String combined = s1 + " " + s2 + " " + num;
Serial.println(combined);
// 문자열 비교
if (s1 == "Hello") {
Serial.println("s1 is Hello");
}
// 정렬(사전 순)
if (s1.compareTo(s2) < 0) {
Serial.println("Hello comes before World");
} else {
Serial.println("World comes before Hello");
}
}
void loop() {
// 본 실습에서는 loop 내에서 처리 없음
}
6-1. 실습 코드 예시
1. 스케치 코드 작성:
void setup() {
Serial.begin(9600);
Serial.println("Ready to echo and manipulate strings!");
}
void loop() {
if (Serial.available() > 0) {
// 전체 문자열을 한 번에 받아오기
String inputString = Serial.readStringUntil('\n'); // 에코 출력
Serial.print("You typed: ");
Serial.println(inputString); // 간단한 조건 분기 예시
if (inputString == "Hello") { Serial.println("Nice to meet you!"); }
else if (inputString.startsWith("count")) {
// ex) "count123"라면 숫자만 떼어내 보기
String numbers = inputString.substring(5);
Serial.print("Extracted number: ");
Serial.println(numbers);
}
else { Serial.println("I just echo whatever you type..."); }
}
}
2. 업로드 후 시리얼 모니터로 확인:
- 결과:
- "Hello" 입력 → "Nice to meet you!"
- "count123" 입력 → "Extracted number: 123"
- 그 외 문자열 입력 → "I just echo whatever you type..." 출력
728x90
반응형