프로그래밍/Arduino

4장. LED와 버튼

길냥이 2024. 5. 5. 22:41
728x90

※목표

LED와 버튼을 통해 입력값을 받고 연산할 수 있습니다.

 

 

 

※준비물

아두이노 우노 R3 : 1개

USB 케이블 : 1개

400홀 브레드보드 : 1개

점퍼 케이블(수수) : 6개

220Ω 저항 : 2개

LED : 1개

누름 버튼 : 1개

 

이번에는 LED와 버튼을 이용해서 버튼의 입력에 따라 LED를 조절하는 예제를 만들어 보도록 하겠습니다.

 

 

※더 좋?은 방법

일단 아두이노는 일반적으로 5V선에서 전력을 내보내기 때문에, 별다른 프로그래밍이 필요 없이 다음과 같이 만들 수 있습니다. 

 

하지만 우리가 원하는 건 이런 게 아니죠. 사실 이런게 더 좋긴 한데.. 

 

우리가 본질적으로 원하는 것은 스위치의 상태에 따라 정보를 받아오는 것이니까요. 

 

그러기 위해서는 대략 3번의 과정을 거쳐야 합니다.

 

 

※우리가 원하는 방법

1. 핀 할당 

2. 핀 모드 설정 

3. 진위 판별 

 

일단 1번부터 시작해 봅시다. 

int led=8;

int button=2; 

명령어를 입력합시다. 이 명령어는 할당 명령어이기 때문에 void setup() 위에 위치해야 합니다. 

 

그러면 이제 2번입니다. 각 핀의 모드를 설정해야 합니다. 

 

버튼은 우리가 5V에서 내보내는 전력을 스위치의 상태에 따라 다르게 출력할 것이므로 스위치랑 연결되는 선은 GND와 비슷한 역할을 하게 될 것입니다. 

이럴 때는 INPUT을 사용하도록 합시다. 

 

그리고 LED는 버튼 상황에 따라 상태가 달라질 것이므로 OUTPUT을 이용하도록 해야겠습니다. 

그러면 다음과 같은 명령어가 나옵니다. 

 

void setup()

{

pinMode(led, OUTPUT);

pinMode(button, INPUT);

}

 

이 명령어가 void setup() 안에 들어갈 것입니다. 

 

이제 마지막으로 3번이 남았네요, button에서 받은 값에 따라 led의 출력을 변경할 것입니다. 

이때 조건문을 사용할 수 있습니다. if (digitalRead (button) == HIGH) 를 사용합시다. 

해석하면, 만약 button값이 HIGH라면(5V), 다음 명령어를 실행하라는 것입니다. 

HIGH가 아니라면? 실행하지 않고 if문 내의 명령어는 무시되겠죠. 

만약 HIGH라면 실행될 것이므로, if문 내에 led를 HIGH로 바꾸는 명령어를 넣도록 합시다. 

 

if (digitalRead (button) == HIGH)

{

  digitalWrite(led,HIGH);

  delay(100);

}

 

그럼 다음과 같은 명령어를 입력하게 됩니다. digitalWrite(led,HIGH);를 해석하면,

led를 HIGH로 출력해라! 가 되겠습니다. 

 

delay만큼 기다리고, 만약 button값이 그 사이 LOW가 되었다면 이제 led를 꺼야겠죠?

 

if문 밖에 digitalWrite(led,LOW);를 추가하도록 합시다. 

 

이제 이 모든 코드를 모아서 정리하면..

 

int led=8;
int button=2;

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(button, INPUT);
}

void loop()
{
  if (digitalRead (button) == HIGH)
  {
    digitalWrite(led,HIGH);
    delay(100);
  }
  digitalWrite(led,LOW);
}

가 되겠습니다.

 

이제 그럼 아두이노를 만들어봅시다.

 

 

회로도

 

 

 

※플로팅 현상

잠깐, 그런데 이해되지 않는 것이 있네요.

왜 스위치의 한쪽 부분이랑 저항, GND가 연결되어 있나요?

 

이유는 간단합니다. 

아두이노에서 디지털 핀을 입력으로 설정하면 전압이 LOW(0V)~HIGH(5V)를 오가는 상태가 됩니다.

이런 상태를 플로팅 상태라고 합니다.

 

그렇다면, 플로팅 상태는 왜 일어날까요?

간단하게 말하자면 아두이노 자체에서 전류가 흐르고 있고, 이로 인해 디지털 핀의 전압이 LOW(0V)~HIGH(5V) 를 오가는 상태가 됩니다.

 

 

※플로팅 현상 해결하기

이런 현상이 있으면 뭔가 되는 게 없죠, 이런 상태를 해결하기 위해 입력 핀의 전압을 고정해 봅시다.

전류는 출력에서 입력으로 흐릅니다, 플로팅 현상에도 이와 같습니다.

전류는 강과 같기 때문에, 강에서 이런 현상을 해결하기 위한 아이디어를 얻어 봅시다.

 

강 같은 경우, 중간이 막혀 있으면 다른 곳으로 흐르게 됩니다. 

아두이노에도 이런 식으로 적용해보는건 어떨까요?

 

실제로도 이와 같은 방법으로 해결하는데, 바로 폴업 저항과 폴다운 저항 방식입니다.

 

 

 

※폴업 저항과 폴다운 저항

 

폴업 저항

 

폴다운 저항

둘 다 원리는 똑같습니다. 길을 2개로 나누고, 한쪽에는 스위치를, 한쪽에는 스위치보다 가기 어려운 길을 배치합니다.

그리고 스위치가 꺼져 있을 경우에는 저항이 있는 길로 가도록 하는 것이고, 

스위치가 켜져 있을 경우에는 스위치가 있는 길로 가도록 하는 것입니다.

 

 

조금 이해를 쉽게 하자면, 이런 것입니다. 

길을 나누고, 한쪽에는 저항을, 한쪽에는 스위치를 배치하는 것이죠.

 

9V 배터리는 아두이노처럼 플로팅 현상이 일어나지 않아서 비교하기엔 부적절하지만, 저항을 통해 전류의 방향을 바꾼다! 라는 핵심만 알아주시면 될 것 같습니다.

 

 

 

그럼 다시 본론으로 돌아가죠.

회로도

이제 이 회로도가 어떻게 동작하는지 알 수 있습니다. 

 

2번 핀에 플로팅 현상이 일어나는데, 저항과 GND를 연결한 폴다운 저항으로 이를 막아 줍니다.

그리고 스위치가 켜져서 5V 전류가 들어올 때, 이 전류는 저항이 있는 길을 이용하지 않고 저항이 없는 2번 핀으로 가는 길을 이용합니다.

 

그리고 2번 핀이 신호를 전달받아 아두이노 내에 if문이 동작, LED에 전류가 흐르게 됩니다.

728x90