[아두이노 기초] 전체 글 목록

2017/07/27 - [분류 전체보기] - [아두이노 기초] 전 과정 목록

우리는 저번에 디지털입출력을 통해 아두이노가 동작을 할수 있도록 해 보았습니다. 장치를 on 하거나 off 하는일은 세밀한 정보가 필요하지 않았죠. 0이거나 1이거나 둘중하나만 있으면 충분했습니다.

하지만 이런경우는 어떨까요?

단지 led가 켜지고 꺼지는 것이 아니라 led의 밝기를 조절해야 한다면 디지털입출력을 사용해서는 쉽지않을 것입니다.

이럴때 사용해야하는 것이 바로 아날로그 입출력입니다.

그럼 입출력중에서 아날로그 출력에 대해 알아보도록 하겠습니다.

우선 알아야 할것이 아두이노 자체에서 전압을 조절하는 능력은 없습니다. 그렇기 때문에 PWM(Pulse Width Modulation) 펄스폭변조 이란 방법을 사용하는 것이죠.

PWM은 펄스폭을 조절해서 전류를 조정하는 것으로 간단한 무드등을 제어하거나 부저의 음계 제어, 스마트 폰등에서 화면의 밝기를 조정하는 것 등등 많은 곳에서 사용됩니다.


이 그림을 보시면PWM이 어떤 식으로 전류를 조정하는지 알수 있습니다.

5v출력의 on/off반복을 통해서 평균전압을 낮추는 방법입니다. 간단하게 생각해서 100번 동안 5v출력이 100번 = 5v, 100번 동안 5v출력이 50번 = 2.5v가 되는것이죠. 이과정을 빠르게 반복하므로 아날로그 출력이 가능해 지는 것입니다.


아두이노 UNO에서 PWM기능을 가진 핀은 핀번호 앞에 (~)표시가 써져있습니다.  3,5,6,9,10,11번 핀이 PWM핀입니다.

그럼이제 PWM을 이용하여 LED밝기를 조절해보도록 하겠습니다.

1. PWM을 이용한 LED의 밝기 조절

간단한 회로를 구성해 봅시다. 빨간선은 신경쓰지 않으셔도 됩니다.

회로구성후 아래의 코드를 작성하고 실행시켜 보도록 하죠.

int led = 9; // the pin that the LED is attached to

int brightness = 0; // how bright the LED is

int fadeAmount = 5; // how many points to fade the LED by

 

void setup()

{

    pinMode(led, OUTPUT);

}

 

void loop()

{

analogWrite(led, brightness);

brightness = brightness + fadeAmount;

if (brightness == 0 || brightness == 255)

{

    fadeAmount = -fadeAmount ;

}

delay(30);

}

brightness라는 변수를 정해주어 0에서 255가 될때까지는 5씩 brightness값이 증가하고 255가 되면 반대로 5씩 brightness값을 감소시켜 LED가 천천히 켜지고 천천히 꺼지는 동작을 구현 할수 있습니다.

이번에는 펄스(PWM)을 이용하여 부저를 연주해보도록 하겠습니다.

2. 펄스(PWM)으로 부저 연주하기

회로를 보시면 새로운 부품이 보일겁니다. 아날로그회로에서 증폭기 역할을 해주는 npn트랜지스터입니다. 

int speakerPin = 8;

int numTones = 10;

int tones[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440};

// mid C C# D D# E F F# G G# A

void setup()

{

}

 

void loop()

{

    for (int i = 0; i < numTones; i++)

{

tone(speakerPin, tones[i]);

delay(500);

}

noTone(speakerPin);

delay(1000);

}

 

새로운 함수가 보입니다. tone(pin,frequency)함수입니다.

tone(pin,frequency)는 pin번호에  frequncey값에 맞는 주파수를 출력하여 소리를 내게해주는 함수입니다. 이때 tone(pin,frequency,duration)으로 시간(ms)까지 설정이 가능 합니다. 또한 tone함수는 아두이노3번핀과 11번핀에서는  사용이 불가능 하며 31~65545의 주파수를 재생 가능합니다.

소리를 끄고 싶을때는 notone()함수를 사용하시면 됩니다.

소스코드 설명 : tones배열의 각각의 음계에 맞는 주파수를 저장한뒤 for문을 통해서 해당음계를 하나씩 소리냄


이것을 응용하면 녹음이 가능한 간단한 연주기계를 만드는 것도 가능합니다.

녹음기능 피아노에 대한 내용한 후에 포스팅 하도록 하겠습니다. 

[아두이노 기초] 전체 글 목록

우리는 디지털 입출력방법에 대해 배웠으므로 이번시간에는 부저를 사용하여 소리를 내어보도록 하겠습니다.

그렇다면 부저는 무엇일까요?

부저는 TV, 세탁기, 에어컨 등에서 Alarm음으로 사용되기도 하고 도난 경보기, 디지털 도어 록등에서 사용되는 작은 스피커라고 생각하면 됩니다.


디지털 출력으로 부저 울리기

1초에 한번씩 부저를 켰다 껐다 반복하도록 제작

디지털핀 8번으로 출력을 주어 부저를 동작하게하는 구조입니다.

int buzzer = 8;

void setup()

{

pinMode(buzzer, OUTPUT);

}

 

void loop()

{

digitalWrite(buzzer, HIGH); // Buzzer on

delay(1000);

digitalWrite(buzzer, LOW); // Buzzer off

delay(1000);

}

pinMode로 8번핀을 출력으로 설정하였습니다.

digitalWrite를 사용하여 부저를 on한뒤 1초뒤에 off하는것을 반복합니다.


코드를 업로드한뒤 동작을 확인하여보면 1초에 한번씩 부저가 켜졌다 꺼졌다 하는것을 볼수 있습니다.


실습예제

1. 버튼으로 디지털입력을 받아서 부저를 울리도록 구현

회로구성 - 버튼에 5v연결후 반대쪽을 입력핀으로 연결, 부저는 출력핀에 연결

int buzzer = 8;

int button =9;

void setup()

{

pinMode(buzzer, OUTPUT);

pinMode(button, INPUT);

}

 

void loop()

{

if(digitalRead(button)==HIGH)

digitalWrite(buzzer,HIGH);

else

digitalWrite(buzzer,LOW);

}

2. 버튼으로 디지털입력을 받으면 LED는 켜져있고 부저는 ON/OFF반복 구현 

회로구성 - 버튼에 5v연결후 반대쪽을 입력핀으로 연결, 부저, led는 출력핀에 연결

int led=7;

int buzzer = 8;

int button =9;

int buzzer_count=0;

int buzzer_flag=0;

void setup()

{

pinMode(led, OUTPUT);

pinMode(buzzer, OUTPUT);

pinMode(button, INPUT);

}

 

void loop()

{

if(digitalRead(button)==HIGH)

digitalWrite(led,HIGH);

else

digitalWrite(led,LOW);


if(buzzer_count<200)

{

buzzer_count++;

}

else

{

buzzer_count=0;

if(buzzer_flag==0)

buzzer_flag=1;

else

buzzer_flag=0;

}

if(buzzer_flag)

digitalWrite(buzzer.HIGH);

else

digitalWrite(buzzer,LOW);

}

코드를 꼭 이해하시고 더좋은 방향을 바꾸어 보시길 바랍니다.

다음시간에는 시리얼 통신에 대해 알아보도록 하겠습니다.

+ Recent posts