1. 수업 내용
▶ Serial과 String 클래스
아두이노는 흔히 사용되는 시리얼 통신과 문자열을 다루기 위해 Serial과 String 클래스를 기본 클래스로 포함하고 있다.
기본 클래스는 클래스를 사용하기 위한 별도의 헤더파일을 선언 할 필요가 없다.
통신을 하기 위해 직접 연결될 기기와 핀을 꽂아 하드웨어적으로 통신하는 방법도 있지만, 미리 생성된 객체를 통해 통신하는 것이 더욱 좋다. ( 간결성, 편리성, 등등.. )
우노의 경우 하드웨어에 기반한 통신을 위한 포트를 하나만 제공한다. (우노에 보면 핀 번호 0번은 RX, 1번은 TX를 위한 핀이다.)
즉, 우노의 경우 시리얼 통신을 위해 생성 될 수 있는 객체는 하나뿐인 것이다.
메가의 경우에는 시리얼 통신을 위한 포트가 4개 존재한다. 즉, 우노와 달리 시리얼 통신을 위해 생성 할 수 있는 객체가 4개인 것이다.
Serial 클래스에서 생성한 객체는 Serial_ 로 이름이 붙여지게 된다. 우노의 경우에는 Serial 통신을 위한 객체가 하나뿐이므로 Serial은 클래스이면서 객체로 사용된다. 하지만 메가의 경우 Serial , Serial 1~3 의 객체가 정의되어 있다.

▶ UART 시리얼 통신
RX와 TX는 서로 교차되어 연결 되야 한다.
아두이노 보드와 컴퓨터간의 통신은 usb로 이루어지는데 , 컴퓨터에서 보낸 데이터를 직접 받아들일 수 없기 때문에 UART데이터로 변환해서 받아야한다.
USB-UART 변환을 위해 우노와 메가2560에서는 ATmega16u2를 이용한다.

컴퓨터와 아두이노의 통신을 위해 스케치에서 통신을 위한 포트를 설정해줘야한다.
송신측에서 데이터를 보내는 속도와 수신측에서 데이터를 받는 속도를 맞추기 위해 baud rate 가 사용된다.
void setup() {
Serial.begin(9600); // 괄호 안에 baud rate값 설정
}
▶ Serial 클래스에서 제공하는 함수
- print() , println()
- write() : 문자나 문자열 출력에 사용됨
- int available( ) : 시리얼 통신 수신 버퍼에 저장된 데이터의 바이트 수
- int peek ( ) : 시리얼 통신수신 버퍼의 첫번째 바이트 데이터 또는 -1, 읽어온 데이터를 수신 버퍼에서 제거하지 않음
- int read ( ) : 시리얼 통신의 첫번째 문자 데이터 또는 -1 , 읽어온 데이터를 수신 버퍼에서 제거함
2. 실습 과제
▶ 수동 부저

수동 부저란 능동 부저와 달리 신호 단자(S)에 특정 주파수의 펄스가 인가 되면 해당 음높이의 소리를 출력한다.
능동 부저와 달리 0,1에 따라 소리가 나고 안나고하는 것이 아니라 원하는 음 높이를 설정하여 소리를 출력할 수 있다는 것이다.
그런데 아날로그 신호는 음의 높낮이를 결정할 수 있지만, 전기적인 값을 어떻게 음낮이를 결정할 수 있을까?
이때 이용되는것이 PWM 신호이다. 이는 마치 디지털 신호를 아날로그 신호처럼 변환해주는 것이다.
아두이노의 tone함수가 그러한 예 중의 하나이다. tone 함수는 PWM 신호를 이용하여 원하는 음 높이의 소리를 출력할 수 있도록 해준다.
- tone ( 핀번호, 출력할 주파수, 출력 지속 시간(ms) )
출력 지속 시간을 지정하지 않으면 noTone이 호출 될 때까지 지속된다.
- noTone(핀번호)
✅ 실습 과제
1~8의 번호를 입력 받아 도~한 옥타브 도의 음을 출력해주는 코드 작성하기

#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_B4 494
#define NOTE_C5 523
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(10,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
if(Serial.available()>0){ // 데이터의 입력이 있을때만 동작
byte data= Serial.read(); // 수신 버퍼에서 한 바이트씩 읽어오기
switch(data){
case '1': tone(10, NOTE_C4); delay(1000); break;
case '2': tone(10, NOTE_D4); delay(1000); break;
case '3': tone(10, NOTE_E4); delay(1000); break;
case '4': tone(10, NOTE_F4); delay(1000); break;
case '5': tone(10, NOTE_G4); delay(1000); break;
case '6': tone(10, NOTE_A4); delay(1000); break;
case '7': tone(10, NOTE_B4); delay(1000); break;
case '8': tone(10, NOTE_C5); delay(1000); break;
}
noTone(10);
}
}
'임베디드 시스템' 카테고리의 다른 글
4장 디지털 입 출력 (2) | 2024.06.16 |
---|---|
5장 인터럽트와 millis (0) | 2024.06.16 |
2. 아두이노 소개 (2) | 2024.06.04 |