본문 바로가기
임베디드 시스템

3. 아두이노 기본 클래스

by 보름달빵 2024. 6. 4.

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