[아두이노] [강좌] 4. Blink 예제 해부하기(3) - pinMode()
지난 시간, 함수에 대해 설명하면서 setup() 함수와 loop() 함수에 대해 설명했었다. 이번 시간에는 setup() 함수 안에 있는 “pinMode”라는 함수에 대해 알아보자.
“pinMode” 함수의 반환 값과 매개 변수는 다음과 같다.
void pinMode(pin, mode)
매개 변수는 미리 정의된 키워드 중 하나가 들어가야 하기 때문에 타입을 따로 표시하지 않았다.
매개 변수
pin : 아두이노 보드의 핀 번호
mode : ‘INPUT’ 또는 ‘OUTPUT’, 또는 ‘INPUT_PULLUP’ |
“pinMode” 함수는 함수명 그대로 아두이노 핀의 모드를 설정하는 기능을 한다. 함수명을 잘 짓는 것은 참 좋은 것이야.
아두이노 보드 중 우노(Uno)는 20개의 핀을 가지고 있다. 메가(Mega 2560/ADK)는 훨씬 많은 70개의 핀을 가지고 있다. 핀에는 각각 번호가 매겨져 있는데, 이 번호는 보드의 핀 꽂는 자리 옆에 표시되어 있다.
이 중에서 내가 사용할 핀의 번호를 pin 값에 넣어주면 된다. “pinMode” 함수는 핀의 기능이 ‘디지털’ 기능일 경우에 사용하면 되는데, 이 ‘디지털’ 기능이란 단순히 핀에 전기가 흐르는가 흐르지 않는가 중에 고르는 기능이다. 나중에 설명할 ‘아날로그’ 기능이라든지, 통신 기능 등을 사용할 경우에는 아두이노 내부 소스에서 자동으로 설정되므로 설정해주지 않아도 된다.
그럼 ‘디지털’ 기능으로 사용할 수 있는 핀은 어떤 핀일까? 아두이노 보드에 번호가 표시된 부분을 보면 “Digital”이라고 표시된 부분이 있다. 이 핀들을 ‘디지털’ 기능으로 사용할 수 있다는 말인가?
‘디지털’ 기능은 아두이노 보드의 모든 핀에서 사용할 수 있다.
그럼 왜 “Digital”이라고 따로 표시해 둔거지? 글쎄. 아마도 “Digital”만 사용 가능한 핀이라는 뜻이 아닐까 싶네.
‘디지털’ 기능에는 입력(INPUT) 모드와 출력(OUTPUT) 모드가 있는데, “pinMode” 함수는 바로 이 모드를 설정하는 기능을 한다.
pinMode() 함수의 매개 변수로 핀 번호와 모드를 나타내는 키워드 값을 넣어주는데, 핀 번호는 아두이노에 표시된 번호를 그대로 넣어주면 되고, 모드는 “OUTPUT”, “INPUT”, “INPUT_PULLUP” 중 하나를 선택해서 넣어줘야 한다. 하나씩 살펴보자.
OUTPUT
‘디지털’ 기능 중 ‘출력’ 기능을 설정한다. ‘출력’ 기능이란 설정한 핀으로 HIGH 또는 LOW의 신호를 내보내는 기능이다. ‘HIGH’란 전기를 흘려 보내서 ‘1’의 신호를 만드는 것, ‘LOW’란 전기를 흘려 보내지 않아서 ‘0’의 신호를 만드는 것.
컴퓨터나 반도체 등 복잡한 기능을 하는 전자 제품들을 자세히 뜯어보면 사실은 모든 동작이 ‘0’ 또는 ‘1’로 이루어 진다,는 건 이미 알고 있는 사실. 아두이노로 만들어질 무언가도 마찬가지. 모든 기능은 ‘0’ 또는 ‘1’로 이루어진다. 그리고 ‘0’이냐, ‘1’이냐를 구분하기 위한 기준이 되는 것이 바로 '전압'이다.
전압.. 기억나나? 초등학교 때 직렬 연결, 병렬 연결 하면서 꼬마 전구 여러 개 터뜨렸었지. ㅋㅋㅋ
아두이노 보드 중 우노(Uno)와 메가(Mega 2560/ADK)의 경우 기본 출력 전압이 5V이며, 듀에(Due)의 경우에는 3.3V가 기본 출력이다. 기본 출력이 뭐냐하면, ‘1’의 신호를 만들어내는 전압의 크기가 5V, 또는 3.3V 라는 말. ‘0’의 신호를 만드는 전압 크기는 당연히 0V.
즉, 5V 또는 3.3V를 흘려보내면 '1', 전기를 내보내지 않고 0V를 만들면 '0'.
pinMode() 함수를 사용하여 핀을 OUTPUT 모드로 설정하면 그 핀으로 ‘1(HIGH)’ 또는 ‘0(LOW)’ 값을 내보낼 수 있다는 말. 어떻게 내보내는가에 대해서는 다음 강좌 “digitalWrite()” 함수에서 설명하도록 하자.
INPUT
‘입력’ 모드.
‘출력’ 모드와 반대로 설정한 핀에 ‘0(LOW)’의 값이 들어오는가, ‘1(HIGH)’의 값이 들어오는가를 읽어오기 위한 모드이다. 아두이노 보드 단독으로 있을 때 사용하는 것은 의미가 없고, 설정한 핀에 다른 센서 또는 모듈 등이 연결되어 있을 때 그 센서(또는 모듈)에서 어떤 값을 출력하고 있는가(센서 입장에선 출력, 아두이노 입장에선 입력)를 알기 위해 사용된다.
아까 OUTPUT 모드에서는 기본 출력 전압으로 ‘0’ 또는 ‘1’을 만들었었는데, INPUT 모드에서는 ‘0’ 또는 ‘1’을 판단해야 하므로 그 판단을 위한 입력 기준 전압(내가 만든 말임-_- 실제 단어가 뭔지는 모르겠음)이 존재한다. 예를 들어, 내가 11번 핀을 INPUT 모드로 설정했는데, 11번 핀으로 2.5V의 전압이 입력되고 있다. 그럼 이건 ‘0’일까, ‘1’일까? 두둥.
2.5V라도 전압이 들어오고 있으니 ‘1’로 봐야 할까? 아니면 기본 출력 전압인 5V나 3.3V보다 작은 전압이 들어오고 있으니 ‘0’으로 봐야 할까? 이것을 판단하기 위해 기준 전압이 사용되며, 이 기준 전압은 기본 출력 전압에 따라 달라진다.
아두이노 우노(Uno)나 메가(Mega 2560/ADK) 등 기본 출력 전압이 5V인 보드에서는 0과 1을 판단하는 기준 전압이 3V이며, 듀에(Due)처럼 기본 출력 전압이 3.3V인 보드에서는 기준 전압이 2V이다.
즉, 똑같이 2.5V가 입력된다고 할 때, 우노나 메가에서는 이 값을 기준 전압인 3V보다 낮으므로 ‘0’으로 판단하고, 듀에에서는 2V보다 높으므로 ‘1’로 판단한다는 말.
아무튼 INPUT 모드로 설정하면 설정한 핀으로 들어오는 입력 값이 ‘0(LOW)’인지 ‘1(HIGH)’인지를 읽어 올 수 있다. 어떻게 읽어 오느냐는 역시 다음 강좌 “digitalRead()” 함수에서 설명.
INPUT_PULLUP
이 모드는 INPUT 모드와 동일한 역할을 하도록 설정한다. 단, 해당 핀에 장착된 내부 풀업 저항을 동작시켜 기본 입력 값이 ‘1(HIGH)’이 되도록 한다. 풀업 저항에 대해서는 “digitalRead()” 함수에서 역시 자세히 설명하도록 하자.
그럼 Blink 예제의 setup() 함수를 다시 살펴볼까?
void setup() { pinMode(13, OUTPUT); } |
pinMode() 함수를 사용해서 '13'번 핀을 'OUTPUT' 모드로 사용하겠다고 설정하고 있다. 램프를 켜기 위해서는 전기를 읽는 기능이 아니라 내보내는 '출력' 기능이 필요하므로. 쉽다.
이번 강좌에서 기억해야 할 것은 pinMode() 함수는 사용할 핀의 모드를 ‘입력’ 또는 ‘출력’으로 설정하는 기능을 한다,는 것.
pinMode() 함수는 주로 setup() 함수 내에서 사용되지만, 아두이노 동작 중에 사용하여 모드를 변경하는 것도 가능하기 때문에 loop() 함수 안에서 사용되기도 한다. 예를 들면, 초음파 센서 같은. 음, 다음에 초음파 센서 예제도 하나 추가해야겠다,고 생각한 순간 뭔가 숙제가 생긴거 같고 기분이 좋네..
그럼 이번 강좌는 짧게 끝냈다는 의미의 만세를 부르며, 여기서 끝. 바바이.