본문 바로가기

카테고리 없음

[사물인터넷응용설계] #1주차

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: 시리얼 포트 선택 및 연결 확인

  1. 아두이노 UNO 보드와 USB 케이블 준비
  2. USB 케이블로 아두이노를 컴퓨터에 연결
  3. 아두이노 IDE에서 도구(Tools) → 포트(Port)에서 연결된 시리얼 포트를 선택
  4. 올바른 포트가 연결되었는지 확인
  5. 문제가 없으면 보드(Board) 종류가 ‘Arduino UNO’ 등으로 지정되어 있어야 함

💡 결과: UART 시리얼 통신이 가능한 환경이 구성된다.

2. 시리얼 모니터 사용법

2-1. 시리얼 모니터 개요

  • 송신 문자열 입력 창: 아두이노 쪽으로 메시지를 보낼 때 텍스트를 입력하는 곳
  • 송신 버튼: 입력한 텍스트를 실제로 전송
  • 수신 문자열 출력 창: 아두이노가 보낸 데이터를 확인
  • 추가 문자 선택 콤보 박스: 엔터(Enter)나 캐리지 리턴(CR) 등을 추가로 보낼지 설정
  • 변조 속도(보드레이트) 선택 콤보 박스: 통신 속도 설정 (예: 9600bps, 115200bps 등)

2-2. 실습 2: 시리얼 모니터 기본 테스트

  1. 새 스케치 파일을 열고 기본 시리얼 통신 설정 코드를 작성:
  2. void setup() { Serial.begin(9600); // 보드레이트 설정 } void loop() { // 아무 동작 없음 }
  3. 업로드 후, 아두이노 IDE의 오른쪽 상단에 있는 시리얼 모니터 열기
  4. 보드레이트를 9600으로 설정
  5. 송신 창에 텍스트를 입력 후 전송 → 별도의 코드를 작성하지 않았으므로 아두이노가 수신한 값을 출력하지 않음
  6. 연결 상태 확인

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() 차이 확인

  1. 스케치 코드 작성:
  2. 업로드 후 시리얼 모니터로 확인
    • 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: 진법 변환과 소수점 출력

  1. 스케치 코드 작성:
  2. 업로드 후 시리얼 모니터로 확인
    • 결과: 2초 간격으로 10진수, 16진수, 소수점 이하 2자리의 π 값 출력
  3. 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: 간단한 에코 프로그램

  1. 스케치 코드 작성:
  2. 업로드 후 시리얼 모니터에서 문자를 입력 → 아두이노가 같은 문자를 "I received: x" 형태로 돌려줌 (에코)
    • 결과: 입력하는 즉시 결과가 수신되고, 한 번에 한 글자씩 처리됨
  3. 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: 문자열 생성 및 비교

  1. 스케치 코드 작성:
  2. 업로드 후 시리얼 모니터로 확인:
    • 결과: "Hello World 2024" 출력 및 s1 비교 결과 확인
  3. 종합 실습: ‘에코 + 문자열 처리’ 확장 예제
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.  업로드 후 시리얼 모니터로 확인:

  • 결과:
    1. "Hello" 입력 → "Nice to meet you!"
    2. "count123" 입력 → "Extracted number: 123"
    3. 그 외 문자열 입력 → "I just echo whatever you type..." 출력
728x90
반응형
댓글