1. 기초 이론
오늘 다룰 내용은 아두이노에서 제공하는 DigitalRead() 함수에 대한 것입니다.
아두이노는 특정 전압 이상의 값을 받았을때, 이를 0 또는 1로 읽어올 수 있습니다. 여기서 특정 전압이라 하면, Microcontroller마다 기준이 다를 것입니다. 사람으로 예를 들면 '맵다'라는 기준이 다르듯이 말이에요. 아래 가져온 자료는 ATMEGA2560의 Vcc(Voltage Source)에 따른 Input voltage 기준 전압 자료입니다.
쉽게 말해서 사람(MicroController)도 식사량(Vcc)과 그 날 몸 컨디션(Chip의 온도)에 따라서 '맵다'(입력 전압이 0인지 1인지)의 기준이 달라지는 것입니다.
하지만 애초에 Digital로 값을 읽어오는 경우에는 이러한 모호한 상황이 생겨서는 안 됩니다. 같은 전압을 입력하더라도, 제어기(MicroController)에 상태에 따라 달라질 테니까요. 이러한 문제를 해결하기 위해서 Pull-Up Pull-Down 회로가 존재하는 겁니다. 애초에 모호한 상황을 만들지 않는 것이죠. 보통은 스위치가 들어간 회로에 쓰이게 됩니다.
Pull-Up / Pull-Down 회로는 말 그대로 위로 끌어 올리거나 밑으로 끌어내린다는 뜻입니다. 사진으로 보면 조금 이해가 쉬울 것입니다.
이게 순간순간 헷갈릴 수도 있는데, 말 그대로 왼쪽과 같이 저항 기준으로 전압을 끌어올리면 Pull-Up 회로입니다. 반대로 오른쪽과 같이 저항이 GND로 전압을 끌어내리고 있으면 Pull-Down입니다. 이제 왜 이런 회로가 필요한지 알아봅시다. 해당 그림에서 Pull-Up 또는 Pull-Down 저항이 없다고 생각했을 때, Switch가 Open 되어 있는 상황은 어떤 전압 값을 가질지 아무도 모릅니다. 그렇기 때문에 우리는 이게 0 일지 1 일지 모르고 MCU도 확신을 할 수가 없습니다. 그렇기 때문에 오동작으로 이어질 수 있는 것이죠. 내가 의도한 것은 Switch가 Open일 경우 0으로 읽히고 싶게 했지만 특정 환경에 의해서 MCU가 값을 1로 읽어버린다면, 내 예상과 다르게 동작을 할 것입니다. 그러한 이유로 특정 입력이 들어오기 전에, 0 또는 1로 못을 박아두는 것입니다. Input이 들어오기 전에 1의 값을 유지했으면 좋겠다면 Pull-Up 회로를 0의 값을 유지했으면 좋겠다면 Pull-Down회로를 구성하면 됩니다.
아두이노에서는 친절하게 내부 Pull-Up 저항이 구성되어 있습니다.
덕분에 별도의 Pull-Up 회로를 구성하지 않고 pinMode 함수 사용 시, INPUT_PULLUP으로 설정하면 됩니다. 그럼 위와 같은 회로로 동작하기 때문에 Switch가 열려있을 경우 HIGH의 값을 가지게 되며, Switch를 닫게 되면 0으로 떨어지게 될 것입니다.
이제 이론 빠삭하게 박았으니까, 예제 코드 보고 가시죠!
2. 실습 예제
2번 Pin의 입력을 받아 13번 내장 LED를 끄고 켜는 Code를 짜 봅시다.
2번은 내장 Pull-Up 회로를 이용하여 Input 설정을 해주고 13번 내장 LED는 출력으로 설정합니다. 이제 동작을 설계해야겠죠?
* 동작 특성
- Switch를 누르지 않았을 때는 LED는 Off
- Switch를 눌렀을 때는 LED On
이제 IDEA를 기반으로 Code를 작성해 봅시다.
void setup() {
// put your setup code here, to run once:
pinMode(2, INPUT_PULLUP);
pinMode(13, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(2) == HIGH){
// Switch Open
digitalWrite(13, LOW);
}
else{
// Switch Close
digitalWrite(13, HIGH);
}
}
위와 같이 설계를 하면 원하는 대로 동작을 하게 됩니다. 하지만 이 Code에는 치명적인 문제가 있습니다. 현재는 Switch의 입력을 받아 LED만 제어하는 단순한 Logic이기 때문에 별 문제가 없을 것입니다. 하지만 여러 다른 제어 Logic이 들어갈 경우 Switch의 신호를 읽어오는 타이밍이 아닐 때 Switch 입력을 줄 경우 신호가 제 때 전달되지 않을 수도 있습니다. 이러한 문제 때문에 Switch 입력과 같은 Digital Input 신호는 Interrupt를 활용하여, 설계를 하게 됩니다.
Interrupt 이야기까지 하게 되면 글이 길어질 것 같으니 Interrupt는 다음 글에서 다루도록 하겠습니다! 그럼 안녕~
'임베디드 일지 > 아두이노 기초' 카테고리의 다른 글
[아두이노 기초] Serial 통신 (0) | 2023.03.30 |
---|---|
[아두이노 기초] ADC (0) | 2022.09.14 |
[아두이노 기초] Interrupt (0) | 2022.04.22 |
[아두이노 기초] Arduino Mega 2560 - 2 (0) | 2021.12.17 |
[아두이노 기초] Arduino Mega 2560 - 1 (0) | 2021.12.16 |