[WinForms / 아두이노] (디지털 입력) LED 제어

00·2025년 2월 14일

프로젝트

목록 보기
9/14

디지털 입력 장치

  1. 푸시 버튼(Push Button)
  2. 슬라이드 스위치(Slide Switch)

푸시 버튼(Push Button)

  • 대표적인 디지털 입력 장치. 주로 사용자로부터 입력을 받을 때 사용한다.
  • 버튼을 누르면 상태가 변경되고 누르지 않으면 원래 상태로 되돌아온다.
  • 일반적으로 네 개의 단자로 구성되어 있으며, 두 단자씩 서로 연결되어 있다. 따라서 하나의 단자가 끊어지거나 고장 나더라도 다른 단자로 작동할 수 있다.

아두이노의 회로 구성 및 스케치 코드

  • 아두이노 회로 구성
    • 푸시 버튼에 10kΩ 저항 연결한다.
      • 그 이유는 첫째, 저항 없이 푸시 버튼을 아두이노에 직접 연결할 경우, 푸시 버튼을 눌렀을 때 과전류로 인해 아두이노가 고장 날 수 있기 때문이다. 따라사 최소한의 전류만 흐르도록 저항을 추가했다(일반적으로 1kΩ~10kΩ 저항 연결함).
      • 둘째, 플로팅(floating) 현상 때문이다. 푸시 버튼을 누를 때 HIGH 신호를 읽고 누르지 않을 때 LOW 신호를 읽고 싶은 상황에서 푸시 버튼에 저항을 연결하지 않으면, 푸시 버튼을 누르지도 않았는데 디지털 입력 핀에서 읽은 값이 HIGH 또는 LOW의 값이 일정하지 않고 무작위로 변하는 플로팅 현상이 발생한다. 따라서 값이 HIGH나 LOW 한 쪽에 정착할 수 있도록 핀을 접지 또는 저항에 연결해 줘야 하는데, 디지털 핀과 직접 연결하면 핀에 보낼 신호를 원하는 대로 조절할 수 없으므로 저항과 함께 연결해야 한다.
        이때 저항을 어디에 연결하느냐에 따라 종류가 나뉜다. 저항을 전원 선에 연결하면 풀업(pull-up) 저항, 저항을 접지 선에 연결하면 풀다운(pull-down) 저항이다. 풀업 또는 풀다운 저항을 연결하는 이유플로팅 현상을 제거하기 위함이다. 풀다운 저항을 연결하면 브레드보드를 건드리더라도 LED 불빛에 변화가 없다.
    • 플로팅(floating) 현상
      HIGH 값 또는 LOW 값 중 명확하게 한 쪽에 정착하지 못해 값이 계속 바뀌는 현상이다. 바다에 떠 있는 배는 수편을 유지하지 못하고 파도에 출렁인다. 이런 현상을 아두이노의 디지털 입력에 적용하면, 푸시 버튼이 눌릴 때 HIGH 신호를 읽고, 누르지 않을 때 LOW 신호를 읽으려고 할 때, 바다에 떠있는 배가 출렁이듯이 푸시 버튼을 누르지 않았는데도 디지털 입력 핀에서 읽은 값이 HIGH와 LOW를 반복하는 모습을 볼 수 있다. 즉, 푸시 버튼을 누르고 있어도 시리얼 모니터에 '0'(LOW) 만 출력되는 것을 확인할 수 있는데, 이런 결과가 나오는 이유는 디지털 입력 핀과 접지가 직접 연결되어 있기 때문이다. 아두이노는 디지털 입력 핀에 접지를 직접 연결하면 LOW(0) 값만 읽으며, 반대로 디지털 입력 핀을 전원에 직접 연결하면 HIGH(1) 값만 읽는다.
    • 풀다운(pull-down) 저항
      풀다운 저항을 사용하면 아두이노의 7번 디지털 핀은 푸시 버튼을 누르지 않을 때 저항을 거쳐 접지로 연결된 선을 통해 LOW 값을 읽는다. 푸시 버튼을 누르면 전류가 전원(5V)에서 푸시 버튼, 저항을 거쳐 접지로 흐르는데, 이때 7번 디지털 핀과 전원의 전압 차를 감지해 입력값이 HIGH로 바뀐다. 따라서 풀다운 저항은 푸시 버튼의 기능을 수행하여, 푸시 버튼을 눌렀을 때는 7번 디지털 핀의 입력값이 HIGH, 누르지 않알을 때는 7번 디지털 핀의 입력값이 LOW다.
    • 풀업(pull-up) 저항
      풀업 저항을 사용하면 7번 디지털 핀은 푸시 버튼을 누르지 않아도 저항을 거쳐 전원에 연결된 선을 통해 HIGH 값을 읽는다. 푸시 버튼을 누르면 푸시 버튼 단자가 연결되고 전류가 흐르는 길은 7번 디지털 핀으로 가는 것과, 푸시 버튼을 거쳐 접지로 가는 경로로 나뉜다. 이때 7번 디지털 핀과 접지가 서로 연결되기 때문에, 전압 차가 0V 이므로 LOW 값을 읽는다.

즉, 버튼을 누를 때에만 전원을 공급하고 싶다(예를 들어, 선풍기, 전등)면 풀다운 저항이 필요하다. 평상시에는 전원을 공급하다가 버튼을 눌렀을 때전원 공급을 멈추고 싶다(예를 들어, 에스컬레이터 긴급 제동 버튼, 컴퓨터 파워 리셋 버튼)면 풀업 저항이 필요하다.
또한 하드웨어적 특성으로 인해 풀다운 저항을 사용할 때보,다 풀업 저항을 사용할 때 에너지를 절감할 수 있으므로 풀업 저항을 사용하는 경우도 있다.

  • 스케치 코드
// c# code
//
void setup()
{
  Serial.begin(9600); // 시리얼 통신 초기화
  				      // 1초에 9600비트로 데이터 전송
  pinMode(8, OUTPUT); // 8번 디지털 핀을 출력 모드로 설정
  pinMode(7, INPUT); // 7번 디지털 핀을 입력 모드로 설정

}


// loop() 함수 : 
// 컴퓨터에서 실행 중인 C# 프로그램에서 전달된 명령에 따라 LED를 켜고 끄는 코드
void loop()
{
  int readValue = digitalRead(7); // 입력 핀의 값(HIGH 혹은 LOW)을 읽어 변수에 저장
  Serial.println(readValue); // 변수값(1 혹은 0)을 직렬 모니터에 출력
  
  if(readValue == HIGH) // 만약 읽은 값이 HIGH면 
  {
    digitalWrite(8, HIGH); // digitalWrite() 메서드로 8번 핀에 HIGH 값을 써서 5V가 걸리게 하여 LED를 켜고,
  }
  
  else // 만약 읽은 값이 HIGH가 아니면 
  {
    digitalWrite(8,LOW); // digitalWrite() 메서드로 8번 핀에 LOW 신호를 전달해 0V 전압이 걸리게 하여 LED를 끕니다. 
  }
}

코드 설명

  • 아두이노에서 7번 디지털 핀의 입력 값에 따라 8번 디지털 핀에 연결된 LED를 제어하는 코드입니다.

  • 푸시 버튼이 눌렸는지를 판단하는 핀은 INPUT(입력) 모드로, LED를 켜고 끄기 위해 전압 차이를 발생시키는 핀은 OUTPUT(출력)로 선언합니다.

  • Serial.begin(speed): 시리얼 통신을 초기화합니다. speed는 통신 속도를 지정합니다.

  • pinMode(pin, mode): 디지털 핀의 모드를 설정합니다. pin은 핀 번호를, mode는 INPUT 또는 OUTPUT을 지정합니다. INPUT(입력)은 외부에서 아두이노 보드로 신호가 들어올 때 사용하며, OUTPUT(출력)은 아두이노 보트에서 외부로 신호를 내보낼 때 사용합니다. 따라서 푸시 버튼이 눌렸는지를 판단하는 핀은 INPUT(입력) 모드로, LED를 켜고 끄기 위해 전압 차이를 발생시키는 핀은 OUTPUT(출력)로 선언합니다.

  • digitalRead(pin): 디지털 핀의 값을 읽어옵니다. 매개변수 pin은 디지털 핀 번호를 지정합니다. 즉, 해당 디지털 핀에 들어오는 신호를 읽어 디지털값 HIGH 또는 LOW로 반환합니다.

  • digitalWrite(pin, value): 디지털 핀(pin)에 디지털 값(value)를 씁니다(Write). pin은 핀 번호를, value는 HIGH 또는 LOW를 지정합니다. 해당 디지털 핀에 HIGH 값을 쓰면 5V 전압이 걸리고, LOW 값을 쓰면 0V의 전압이 걸립니다.

  • Serial.println(data): 데이터를 시리얼 모니터에 출력하고 줄 바꿈을 합니다. data는 출력할 데이터를 지정합니다.

setup() 함수

  • Serial.begin(9600): 시리얼 통신을 초기화합니다. 9600은 통신 속도를 의미하며, 1초에 9600비트의 데이터를 전송합니다. 이를 통해 아두이노와 컴퓨터 간에 데이터를 주고받을 수 있습니다.
  • pinMode(8, OUTPUT): 8번 디지털 핀을 출력 모드로 설정합니다. 이 핀에 연결된 LED를 켜거나 끌 수 있습니다.
  • pinMode(7, INPUT): 7번 디지털 핀을 입력 모드로 설정합니다. 이 핀을 통해 외부 센서나 스위치의 값을 읽어올 수 있습니다.

loop() 함수

  • int readValue = digitalRead(7): 7번 디지털 핀의 값을 읽어와 readValue라는 정수형 변수에 저장합니다. digitalRead() 함수는 디지털 핀의 값을 읽어 HIGH 또는 LOW 값을 반환합니다.
  • Serial.println(readValue): readValue 변수의 값을 시리얼 모니터에 출력합니다. Serial.println() 함수는 데이터를 시리얼 모니터에 출력하고 줄 바꿈을 합니다.
  • if (readValue == HIGH): readValue 값이 HIGH이면, 즉 7번 디지털 핀에 HIGH 신호가 입력되면 digitalWrite(8, HIGH)를 실행합니다.
  • digitalWrite(8, HIGH): 8번 디지털 핀에 HIGH 신호를 출력하여 LED를 켭니다. digitalWrite() 함수는 디지털 핀에 HIGH 또는 LOW 신호를 출력합니다.
  • else: readValue 값이 HIGH가 아니면, 즉 7번 디지털 핀에 LOW 신호가 입력되면 digitalWrite(8, LOW)를 실행합니다.
  • digitalWrite(8, LOW): 8번 디지털 핀에 LOW 신호를 출력하여 LED를 끕니다.
  • 실행 결과

내부 풀업 저항 사용

  • 스케치 코드
// c# code
//
void setup()
{
  Serial.begin(9600); // 시리얼 통신 초기화
  				      // 1초에 9600비트로 데이터 전송
  pinMode(8, OUTPUT); // 8번 디지털 핀을 출력 모드로 설정
  pinMode(7, INPUT_PULLUP); // 7번 디지털 핀을 입력 모드로 설정 
  							// 내부 풀업 저항을 사용하도록 설정

}


// loop() 함수 : 
// 컴퓨터에서 실행 중인 C# 프로그램에서 전달된 명령에 따라 LED를 켜고 끄는 코드
void loop()
{
  int readValue = digitalRead(7); // 입력 핀의 값(HIGH 혹은 LOW)을 읽어 변수에 저장
  Serial.println(readValue); // 변수값(1 혹은 0)을 직렬 모니터에 출력
  
  if(readValue == HIGH) // 만약 읽은 값이 HIGH면 
  {
    digitalWrite(8, LOW); 
  }
  
  else // 만약 읽은 값이 HIGH가 아니면 
  {
    digitalWrite(8,HIGH); 
  }
}
  • pinMode(7, INPUT_PULLUP): 함수의 두 번째 매개변수 INPUT을 INPUT_PULLUP으로 수정하면 디지털 7번 핀에서 내부 풀업 저항을 사용할 수 있다.
  • 풀업 저항을 사용 중이므로 푸시 버튼을 누르지 않은 상태가 HIGH다. 따라서 푸시 버튼을 누른 상태에만 LED가 켜지게 하기 위해 if-else 문의 수행문을 변경했다.
  • 풀업 저항을 사용했으므로 푸시 버튼을 누르기 전에는 HIGH값(1)이 출력되고, 푸시 버튼을 누르면 LOW값(0)이 출력된다. 푸시 버튼 입력값이 HIGH일 때는 디지털 8번 핀에 LOW 값을 쓰기 때문에 LED에 불이 들어오지 않게 된다.

슬라이드 스위치(Slide Switch)

  • 푸시 버튼이 누르는 동안에만 상태를 변경하고 손을 떼면 원상태로 되돌아가는 장치인 반면, 슬라이드 스위치(Slide Switch)는 한 번 상태를 변경하면 그 상태를 계속 유지하는 장치다.
  • 단자가 세 개이다.

아두이노의 회로 구성 및 스케치 코드

  • 아두이노 회로 구성

  • 스케치 코드

// c# code
//
void setup()
{
  Serial.begin(9600); // 시리얼 통신 초기화
  				      // 1초에 9600비트로 데이터 전송
  pinMode(8, OUTPUT); // 8번 디지털 핀을 출력 모드로 설정
  pinMode(7, INPUT); // 7번 디지털 핀을 입력 모드로 설정 
}


// loop() 함수 : 
// 컴퓨터에서 실행 중인 C# 프로그램에서 전달된 명령에 따라 LED를 켜고 끄는 코드
void loop()
{
  int readValue = digitalRead(7); // 입력 핀의 값(HIGH 혹은 LOW)을 읽어 변수에 저장
  Serial.println(readValue); // 변수값(1 혹은 0)을 직렬 모니터에 출력
  
  if(readValue == HIGH) // 만약 읽은 값이 HIGH면 
  {
    digitalWrite(8, HIGH); 
  }
  
  else // 만약 읽은 값이 HIGH가 아니면 
  {
    digitalWrite(8,LOW); 
  }
}
  • 실행 결과

PIR 센서

  • PIR 센서(passive infrared sensor)는 적외선을 통해 열을 발산하는 물체의 움직임을 감지하는 센서로, 적외선 작동 감지 센서라고도 한다. 주로 현관문이나 계단에 부착해 사람의 움직임이 있을 때 조명을 켜 주는 장치에 사용된다.
  • 단자는 세 개로 구성되며 왼쪽부터 신호, 전원, 접지를 담당한다. 여기서 신호는 디지철 입력 핀으로 값을 읽을 수 있으며 움직이는 물체가 감지될 경우 HIGH 값을 반환하고, 아니면 LOW값을 반환한다.

아두이노의 회로 구성 및 스케치 코드

  • 아두이노 회로 구성
  • 스케치 코드
// c# code
//
void setup()
{
  Serial.begin(9600); // 시리얼 통신 초기화
  				      // 1초에 9600비트로 데이터 전송
  pinMode(8, OUTPUT); // 8번 디지털 핀을 출력 모드로 설정
  pinMode(7, INPUT); // 7번 디지털 핀을 입력 모드로 설정 
}


// loop() 함수 : 
// 컴퓨터에서 실행 중인 C# 프로그램에서 전달된 명령에 따라 LED를 켜고 끄는 코드
void loop()
{
  int readValue = digitalRead(7); // 입력 핀의 값(HIGH 혹은 LOW)을 읽어 변수에 저장
  Serial.println(readValue); // 변수값(1 혹은 0)을 직렬 모니터에 출력
  
  if(readValue == HIGH) // 만약 읽은 값이 HIGH면 
  {
    digitalWrite(8, HIGH); 
  }
  
  else // 만약 읽은 값이 HIGH가 아니면 
  {
    digitalWrite(8,LOW); 
  }
}
  • PIR 센서가 움직임을 감지하면 디지털 7번 핀에 HIGH 신호가 전달되어 LED에 불이 켜진다. 그리고 움직임을 멈추고 기다리면 1초 뒤에 LED 불이 꺼진다.

  • 움직임을 감지할 대상인 객체가 PIR 센서 범위 내에 있으면 readValue 값은 HIGH이고, 센서 범위에서 벗어나면 readValue 값이 LOW이다.

  • 실행 결과

푸시 버튼을 슬라이드 스위치처럼 작동하게 수정

# 푸시 버튼을 슬라이드 스위치처럼 작동하게 수정

0개의 댓글