[아두이노] [강좌] 5. Blink 예제 해부하기(4) - digitalWrite()와 delay()
드디어 loop() 함수의 내용을 살펴볼 시간이 되었다. 강좌 4개만에. ㅜㅜ
앞 강좌의 pinMode() 함수 설명에서 “OUTPUT” 모드에 대한 설명을 했으니 이번 강좌도 짧게 끝내고 넘어갈 수 있을 것 같다. 설명 강박증이 도지지 않는 이상.
지난 강좌에서 “OUTPUT” 모드는 아두이노 핀의 ‘디지털’ 기능 중 ‘출력’ 기능을 사용하는 모드라고 설명했었다. 그리고 ‘출력’ 기능이란 핀으로 전기를 흘려 보낼지 흘려 보내지 않을지를 결정하여 ‘0(LOW)’ 또는 ‘1(HIGH)’를 만드는 기능이라고도 설명했었고.
오늘 설명할 ‘digitalWrite()’ 함수가 바로 ‘출력’ 모드에서 ‘0’을 보낼 것이냐, ‘1’을 보낼 것이냐를 결정하는 함수이다. 자세히 살펴보자.
void digitalWrite(pin, value)
매개 변수는 정해진 키워드가 들어가야 하기 때문에 타입을 표시하지 않았다.
매개 변수
pin : 신호를 출력할 아두이노 보드의 핀 번호
value : ‘HIGH’ 또는 ‘LOW’ |
pin 값은 pinMode() 함수와 같이 아두이노 보드에 표시된 번호 중 하나를 사용하면 된다. 아두이노에서 사용할 수 있는 모든 번호를 사용할 수 있다.
value 값에는 위 설명처럼 ‘HIGH’ 또는 ‘LOW’라는 키워드 중 하나가 들어가야 한다. 이 전 강좌를 열심히 정독한 사람이라면, 아니 사실은 누구나 눈치 챘겠지만 ‘LOW’를 넣으면 ‘0’의 값이, ‘HIGH’를 넣으면 ‘1’의 값이 출력된다.
기억하고 있지요? ‘1’의 신호는 기본 출력 전압인 5V 또는 3.3V의 전압을 내보내는 것. ‘0’의 신호는 0V의 전압을 만드는 것.
HIGH
주구장창 설명해온 ‘1’의 신호를 아두이노에서는 ‘HIGH’라는 키워드로 사용하고 있다.
LOW
역시 계속 설명한 ‘0’의 신호를 아두이노에서는 ‘LOW’라는 키워드로 사용하고 있다.
digitalWrite() 함수의 기능은 이게 다다. 'HIGH' 또는 'LOW' 신호를 출력하는 것. 너무 쉽죠?
혹시 digitalWrite() 함수가 어디에 쓰이는가, ‘HIGH’ 또는 ‘LOW’의 신호를 내보내는 것이 무슨 기능을 하는 것인가,가 궁금한 사람이 있다면 Blink 예제를 살펴보면서 설명하자.
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); } |
음? delay() 함수 설명을 빼먹었네;;
delay() 함수는 함수명 그대로 아두이노 보드의 동작을 지연시키는 역할을 한다. ‘잠깐 멈춤’ 기능이랄까?
void delay(unsigned long ms)
매개 변수
ms : 동작을 지연시킬 시간을 밀리초 단위로 설정한다. 타입은 unsigned long 타입이므로 음수가 들어갈 수는 없다. |
즉, Blink 예제에서처럼 “delay(1000);”이라고 사용하면 1초(=1000밀리초)동안 아무 동작도 하지 않은 채 대기하는 상태를 유지하다가 1초가 지나면 다음 동작을 수행한다.
다시 Blink 예제로 돌아와서.
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); } |
스케치 버전이 1.0.5 이전 버전인 사람들은 pinMode() 함수나 digitalWrite() 함수에 사용된 핀 번호가 ‘led’라는 변수로 사용되었을 것이다. ‘led’라는 변수에는 ‘13’이라는 값이 저장되어 있으므로 위 예제와 동작은 동일하다.
setup() 함수에서 13번 핀의 모드를 ‘출력’ 모드로 설정하였다.
그리고 loop() 함수. 첫 번째 줄에서 “digitalWrite(13, HIGH);” 구문으로 13번 핀에 ‘HIGH’ 신호를 내보낸다. 13번 핀에 ‘HIGH’ 신호를 출력하는 것은 ‘L’ 램프(오랜만에 나오는 ‘L’ 램프)를 켜는 동작을 한다.
아두이노 보드에 장착된 ‘L’ 램프는 실제로 아두이노의 13번 핀에 연결되어 있고, 13번 핀에 ‘HIGH’ 신호를 줘서 전기를 흘려 보내면 그 전기가 ‘L’ 램프로 흘러 램프가 켜지게 되는 것. 초등학교 때 실습했던 꼬마 전구와 같이.
그리고 delay() 함수를 사용해 1초(=1000밀리초) 간 대기한다. 즉, 1초 간 ‘HIGH’ 신호를 유지한다는 뜻.
1초가 지나면 다음 구문인 “digitalWrite(13, LOW);” 구문을 실행하게 되고, 13번 핀에 ‘LOW’ 신호를 내보낸다. 'LOW' 신호는 전기를 흘려 보내지 않으므로 ‘L’ 램프는 꺼지게 된다. 역시 delay() 함수로 1초간 이 상태를 유지한다.
loop() 함수는 아두이노 보드에 전원이 들어와 있는 한 계속해서 반복되므로, 1초간 ‘L’ 램프가 켜지고 다시 1초간 ‘L’ 램프가 꺼지는 동작을 무한히 반복하게 된다.
digitalWrite() 함수로 ‘HIGH’ 또는 ‘LOW’ 신호를 출력해서 할 수 있는 기능은 단지 ‘L’ 램프를 켜고 끄는 것만이 ‘당연히’ 아니다.
어떤 센서에는 ‘HIGH’ 또는 ‘LOW’ 신호가 센서를 동작해라, 동작하지 마라,라는 신호가 될 수도 있고, 또 어떤 센서에게는 'HIGH’ 신호가 유지되는 시간에 따라 동작이 달라질 수도 있을 것이다. 또 'HIGH',N'LOW' 신호를 여러 개 연속해서 보내는 것으로 좀더 다양한 값을 표시할 수도 있을 것이다.
아두이노의 모든 동작이 ‘0’과 ‘1’로 만들어진다고 말한 것이 과장이 아닌 만큼 digitalWrite() 함수를 이용해서 신호만 잘 출력해도 아두이노의 반은 할 수 있다고 보면 됨!
그럼 우린 오늘 아두이노의 반을 끝냈다고 생각하자구요. 어차피 시작이 반이니까. ㅋㅋ
이번 시간은 여기서 끝! 드디어 Blink 예제가 끝났..ㅜㅜ
* 참고 : ‘입력’ 모드에서의 ‘digitalWrite()’
digitalWrite() 함수를 사용할 때 pinMode() 함수로 ‘출력’ 기능을 설정하지 않고 사용하면 어떻게 될까?
사실 아두이노 보드의 모든 핀에 대한 기본 모드는 ‘입력’ 기능이다. 즉, pinMode() 함수로 ‘OUTPUT’ 모드를 설정하지 않으면 자동으로 ‘INPUT’ 모드가 설정된다는 뜻. 입력 모드에서의 digitalWrite() 함수는 출력 모드에서의 기능과 전혀 다른 기능을 수행한다.
입력 모드에서 digitalWrite() 함수의 기능은 내부 풀업 저항을 켜고(HIGH), 끄는(LOW) 역할. 13번 핀을 ‘INPUT’으로 설정하고(pinMode(13, INPUT)), ‘HIGH’를 출력하면(digitalWrite(13, HIGH)) 13번 핀을 내부 풀업을 사용하는 입력 모드로 변환한다. ‘INPUT_PULLUP’ 모드를 설정한 것(pinMode(13, INPUT_PULLUP))과 동일한 효과인 것. 다시 ‘LOW’를 출력하면(digitalWrite(13, LOW)) 내부 풀업 저항을 사용하지 않도록 해서 원래의 INPUT 설정으로 되돌아 온다.
내부 풀업 저항에 대해서는 스위치 예제에서 다시 자세히 설명하도록 하고, 지금은 입력 신호의 기본 값을 HIGH로 만드는 것이라는 정도만 알고 넘어가자.
아무튼, digitalWrite() 함수는 입력 모드에서와 출력 모드에서의 기능이 다르다는 것을 꼭 명심하고, 출력 기능으로 사용할 때는 반드시pinMode() 함수로 ‘OUTPUT’ 모드를 설정해주도록 하자.