[Arduino] 3.버튼


Serial 클래스



Serial 클래스는 Serial 통신을 위한 기능을 정의하고 있습니다.


Serial (시리얼) 통신은 말그대로 Serial (직렬) 통신으로 1:1통신이 기본이며 여러 통신방법 중 하나입니다. 직렬 통신이란 한번에 한 비트씩 통신하는 방법이고, 병렬 통신은 여러 비트를 동시에 보내는 통신 방법입니

Serial 클래스를 사용하면 아두이노와 로컬 pc가 서로 데이터를 주고 받을 수 있습니다!

Serial 클래스에는 다음과 같은 메서드가 있습니다!


image



그럼 Serial 클래스를 사용해서 LED 전구를 키고 꺼보겠습니다.


int ledPin = 2;

void setup() {
  Serial.begin(9600);  
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int sw;
  if(Serial.available() > 0){
     sw = Serial.read();
     Serial.println(sw);
     if(sw == 49){
       digitalWrite(ledPin,HIGH);
       delay(1000);
     }else{
       digitalWrite(ledPin,LOW);
       delay(1000);
     }
  }
}




image




컴파일 후 업로드해줍니다!





제대로 동작하는 것을 볼 수 있습니다!


버튼과 저항



이번에는 버튼을 이용해보겠습니다~!


image




그 전에 버튼과 같은 스위치를 사용할 때는 저항을 사용하는데 왜 저항을 사용하는지 알아야합니다.


image



일반적으로 위의 연결은 아무런 문제가 없어보입니다.

스위치가 열려있으면 전류가 4번핀으로 흐르지 않기에 0을 출력할 것이고,

스위치가 닫히면 전류가 흘러 1을 출력할 것으로 예상할 수 있습니다.

그러나, 스위치가 열려있는 경우는 칩 자체에서는 5V를 입력하였는지 0V를 입력하였는지 알 수 없어 오작동이 발생할 수 있습니다.

이런 상태를 플로팅되었다라고 합니다. 플로팅 상태는 잡음에 매우 취약해지므로 시스템이 불안정해집니다. 이를 해결 하기 위해서 풀업 / 풀다운 저항을 사용하게 됩니다~!


풀업 저항




image



풀업 저항은 위의 처럼 저항을 VCC 단자에 달아주어 스위치가 열려있을 때 1을 출력해 플로팅 현상을 없애줍니다


image




스위치가 열려있을 때는 전류는 GND가 아닌 입출력 핀으로 흐르게 되고, 따라서 입출력 핀에는 1(HIGH) 값을 읽을 수 있습니다.


image




스위치가 닫히면 GND는 모든 전류가 도착하는 전압이 가장 낮은 지역이기 때문에 모든 전류는 GND로 흐릅니다.

따라서 입출력 핀으로 흐르는 전류는 없기에 0(LOW) 값을 가집니다.


풀다운 저항




image



풀다운은 풀업과 반대로 저항이 VCC 가 아닌 GND 쪽에 달려있습니다~!


image



스위치가 열려있게 되면 VCC와 회로는 단절되기 때문에 입출력에서 흐르는 전류는 GND로 향하게됩니다~ 따라서 입출력 핀은 0(LOW)


image




스위치가 닫히게 되면, 단절되었던 VCC부분이 회로와 연결됩니다.

GND 부분에는 저항이 설치되었기 때문에 전류는 GND 로 흐르지 못하고 입출력핀으로 흐르게 됩니다! 따리서 입출력 핀은 1(HIGH)


버튼으로 LED 전구 켜기



풀업 저항을 사용해서 버튼으로 LED 전구를 켜보겠습니다!


int ledPin = 2;
int btn = 4;
int value = 0; //입력받은 값(HIGH 1, LOW 0)
int oldVal = 0; //이전의 값(HIGH 1, LOW 0)
int state = 0; //현재 상태(HIGH 1, LOW 0)
void setup() {
 Serial.begin(9600);
 pinMode(ledPin, OUTPUT);
 pinMode(btn, INPUT);
}

void loop() {
 value = digitalRead(btn); //버튼으로 부터 값을 읽어들임 (풀업저항이므로 버튼 누르면 0 안누르면 1)
 Serial.println(value);
 if(value == HIGH && oldVal == LOW){ //버튼이 눌러졌으면 상태를 바꿈
   state = !state;
 }
 oldVal = value;
 if(state ==1){
   digitalWrite(ledPin ,HIGH);
 }else{
   digitalWrite(ledPin, LOW);
 }
}




image






버튼을 누르지 않았을 때는 입력 값으로 1이 들어오고 누르면 0이 들어오는 것을 확인할 수 있습니다~! (풀업 저항)