반응형
SMALL

안녕하세요! Choi GPT 입니다.

이번 시간에는 아두이노 기초과정 중 디지털 입력에 대해 설명드리고자 합니다.

아두이노에서 디지털 입력(Digital Input)이라 함은,

아두이노 보드의 디지털 핀을 통해
외부 신호의 디지털 값(HIGH or LOW)을 읽어들이는 것을 말합니다.

주로 스위치, 센서와 같은 입력 장치의 신호를 읽어오는 데 사용합니다.


다음 예제파일을 테스트 해보도록 하겠습니다.

먼저 하드웨어 연결에 대한 정보 입니다.

장치 아두이노 핀맵
스위치 D7
LED D13
(내장 LED 사용-따로 연결하지 않음)


다음으로 동작 소스 입니다.

const int switchPin = 7; // 스위치 연결핀 
const int ledPin = 13; // LED 연결핀

void setup() {
  pinMode(switchPin, INPUT); // 스위치핀을 입력으로 
  pinMode(ledPin, OUTPUT); // LED핀을 출력으로
  Serial.begin(9600);
}

void loop() {
  int switchState = digitalRead(switchPin); // 스위치핀 읽기
  Serial.println(switchState);
  if (switchState == HIGH) {  
    digitalWrite(ledPin, HIGH); // 스위치 ON시 LED 켜기 
  }
  else {
    digitalWrite(ledPin, LOW); // 스위치 OFF시 LED 끄기
  }
}

 

digitalRead() 명령어의 정의
https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/
 

digitalRead() - Arduino Reference

Description Reads the value from a specified digital pin, either HIGH or LOW. Syntax Parameters pin: the Arduino pin number you want to read Returns

www.arduino.cc

 

위의 함수는 아두이노에서 디지털 핀의 입력값을 설정하는 함수입니다.

val = digitalRead(핀번호);
  • val: 읽어온 입력값이 저장되는 변수
  • 핀번호: 입력값을 읽어올 디지털 입력핀 번호

보통의 아두이노의 입력 카테고리(디지털, 아날로그)는 변수를 생성해 읽어드린 값을 저장해 줍니다. 

또한, digitalRead() 함수는 지정한 디지털 입력핀의 값을 읽어옵니다.
읽어온 입력값은 HIGH(1) 또는 LOW(0) 두 가지 중 하나의 값입니다.
입력핀은 앞서 pinMode() 함수를 사용하여 입력모드로 설정되어 있어야합니다.


위에 제공한 예시 소스를 구성하고 업로드 후에 동작사항을 확인해 보세요.

내장 LED (LED_BUILTIN) 에 불이 들어오나요?

정상동작이 되지 않습니다. 이유는 바로 스위치의 특성 때문인데요.

채터링 [chattering] 특성 파형

채터링 [chattering]

스위치의 하드웨어 특성 중 하나인 채터링은 스위치를 눌렀을 때 스위치 연결 핀에
불안정한 신호가 발생하는 현상을 의미합니다.
이 채터링 현상은 스위치의 접촉이 닫히는 과정에서 발생할 수 있으며,
짧은 시간 동안 스위치 연결 핀이 빠르게 ON과 OFF를 반복하여 신호를 보낼 수 있습니다.


그럼 이러한 현상을 해결할 수 있는 방법은 무엇이 있을까요?

크게 2가지가 있습니다.

1. 디바운스[debounce] : 짧은 시간에 여러번 스위치의 상태를 확인하는 방법을 의미합니다.
2. 하드웨어 혹은 소프트웨어의 풀업[PULLUP] & 풀다운[PULLDOWN] 셋팅


우선 디바운스 설정 방법 입니다.

아두이노 스케치 프로그램에서
파일 -> 예제 -> 02.Digital -> Debounce 선택하시면 됩니다.

const int buttonPin = 2;      // 버튼 핀 번호
const int ledPin = 13;        // LED 핀 번호

boolean ledState = HIGH;      // 현재 LED 상태를 초기 설정합니다. (켜진 상태)
boolean buttonState;          // 현재 버튼 상태를 저장합니다. (기본적으로 LOW)
boolean lastButtonState = LOW;// 이전 버튼 상태를 저장합니다.

unsigned long lastDebounceTime = 0; // 버튼 디바운스를 위한 시간 변수
unsigned long debounceDelay = 50;   // 디바운스 지연 시간 (50ms)

void setup() {
  pinMode(buttonPin, INPUT);   // 버튼 핀을 입력으로 설정합니다.
  pinMode(ledPin, OUTPUT);     // LED 핀을 출력으로 설정합니다.

  digitalWrite(ledPin, ledState);  // 초기 LED 상태를 설정합니다. (켜진 상태)
}

void loop() {
  int reading = digitalRead(buttonPin);  // 버튼 핀의 상태를 읽어옵니다.

  if (reading != lastButtonState) {  // 버튼 상태가 이전 상태와 다를 경우
    lastDebounceTime = millis();     // 현재 시간을 기록합니다.
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {  // 디바운스 지연 시간이 경과한 경우
    if (reading != buttonState) {   // 버튼 상태가 이전 상태와 다를 경우
      buttonState = reading;        // 버튼 상태를 업데이트합니다.

      if (buttonState == HIGH) {    // 버튼이 눌린 상태일 경우
        ledState = !ledState;       // LED 상태를 반전시킵니다. (ON <-> OFF)
      }
    }
  }

  digitalWrite(ledPin, ledState);  // LED 상태를 출력합니다.

  lastButtonState = reading;  // 이전 버튼 상태를 업데이트합니다.
}

다음으로 풀업 저항 설정 방법 입니다.

풀업 저항 설정 방법은 크게 2가지가 있습니다.

1. 하드웨어 셋팅

1. 스위치 입력단자(D7)번에 저항(10K ohm) 연결 후
2. 저항의 반대쪽은 5V 전압을 연결해주면 됩니다.

시연영상

 

2. 소프트웨어 셋팅

 

const int switchPin = 7; // 스위치 연결핀 
const int ledPin = 13; // LED 연결핀

void setup() {
  pinMode(switchPin, INPUT_PULLUP); // 스위치핀을 입력으로 
  pinMode(ledPin, OUTPUT); // LED핀을 출력으로
  Serial.begin(9600);
}

void loop() {
  int switchState = digitalRead(switchPin); // 스위치핀 읽기
  Serial.println(switchState);
  if (switchState == HIGH) {  
    digitalWrite(ledPin, HIGH); // 스위치 ON시 LED 켜기 
  }
  else {
    digitalWrite(ledPin, LOW); // 스위치 OFF시 LED 끄기
  }
}

 

감사합니다.

 

반응형
LIST

+ Recent posts