아두이노를 위한 프로그래밍 기초 3 – setup, loop
이 문서는 아두이노 보드를 사용하기 위해 필요한 프로그래밍 기초 지식이 없는 분들을 위한 가이드 문서입니다. 따라서 이미 프로그래밍에 대한 경험이 있다면 이 강좌 시리즈는 넘어가셔도 좋습니다.
=============================================================
지난 강좌-1 에서 아두이노가 동작하기 위해서는 아래와 같은 과정을 거쳐야 한다고 했습니다.
- 설계서 작성, 수정 -> 기계어로 번역 -> 아두이노에 전달 -> 아두이노 동작
- 소스코드(스케치) 작성, 수정 -> 컴파일 -> 업로딩 -> 아두이노 동작
여기서 마지막 과정 ‘아두이노 동작’에 대해서 살펴보겠습니다. 지난 강좌-2 에서 아두이노에 기본으로 포함된 LED를 점멸하는 코드를 예로 들었는데 그 코드(Blink 예제)를 다시 사용하도록 하겠습니다.
int led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
이 소스(=계획서)가 동작하는 것을 확인하기 위해서는 아두이노에 전달해 줘야겠죠. 아두이노 개발환경에서 컴파일 – 업로드 버튼을 차례대로 누르는 것으로 이 과정은 완료가 됩니다. (상세한 과정은 아두이노 기초 강좌에서 다룰테니 여기서는 그냥 넘어갑니다.) 이제 아두이노가 위 소스대로 LED를 점멸 할 것입니다. LED 점멸은 전원이 꺼질 때 까지 반복됩니다.
아두이노는 마치 창업센터와 같다고 했고, 우리가 사업계획서(=소스코드)를 넘겨주면 거기에 맞게 사무실과 사람을 투입해 운영해 준다고 했습니다. 물리적인 표현으로 바꾸면 아두이노의 플래시 램에 번역된 코드가 저장되고, 마이크로 프로세서에서 명령어 라인을 하나씩 하나씩 실행하는 겁니다.
여기서 중요한 점은 아두이노에서 사람을 투입하기 전에 먼저 여러가지 필요한 자원들을 준비해두고 투입된 사람에게 어디서부터 시작해서 어떻게 반복해야 할지를 알려줘야 한다는겁니다.
int led = 13;
위 라인은 파일(=사무실) 전체에서 사용 가능한 전역변수(=메모지)를 표현한 부분이라고 했습니다. 파일 전체에 영향을 미치는 이런 중요한 변수(=메모지)는 사람을 투입하기 전에 미리 준비해 둬야 합니다. 따라서 이런 부분들을 아두이노 창업센터가 먼저 준비해 둡니다. 파일 전체에서 전역변수는 led 변수 하나 뿐이므로 이 것만 준비하면 이제 사람을 투입해도 됩니다.
# 지역 변수의 경우… : 변수를 선언하는 위 라인이 setup, loop 블럭(=중괄호, 파티션) 안으로 들어가면 해당 블럭 안에서만 사용되는 변수(지역변수)입니다. 이 경우는 해당 블럭에 적어놓은 업무를 사람이 처리하는 시점에 임시로 만들어서 사용합니다. 그리고 해당 블럭의 업무를 다 하고나면 싹 정리해 버립니다. 전역변수의 경우에는 아두이노에 전원이 공급되어 동작하는 동안 계속 유지됩니다.
void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
이제 아두이노는 사람을 어디에 투입해서 계획을 하나하나 실행해 나갈지 판단해야 합니다. 이런 역할을 하는 특별한 함수가 setup, loop 함수입니다. 이건 아두이노가 작업의 시작과 반복 부분을 인식하기 위해 만든 특별한 함수 이름입니다.
즉, 아두이노에 전원을 넣으면 setup 블록에 사람을 먼저 투입해서 계획대로 1회 실행합니다. 이게 끝이나면 이제 loop 블록에 사람을 이동해서 무한반복 시키는 것이죠. 따라서 setup 함수에는 각종 초기화 관련된 작업들을 추가하고, loop 함수에는 반복되면서 수행해야 할 메인 작업들을 적어두는 것이 일반적입니다.
이제 setup과 loop 함수에서 작업이 어떻게 진행되는지 한 라인씩 보겠습니다.
void setup() { pinMode(led, OUTPUT); }
먼저 함수를 호출하는 방법부터 알아봐야 겠습니다. setup, loop는 함수이고 이건 아두이노가 필수로 요구하는 함수들입니다. 이 외에도 우리가 직접 함수를 정의하고 호출할 수 있습니다. 호출할 때는 아래와 같은 형식으로 호출합니다.
함수이름(전달할 값)
아두이노가 투입한 사람이 위와 같은 함수 호출 부분을 만나면 그 함수의 블럭으로 이동해서 적혀있는 작업들을 합니다. 이 때 전달할 값으로 지정해 둔 값을 가지고 갑니다.
아두이노는 setup 함수에 사람을 가장 먼저 투입했는데 setup 함수 안에서 만남 첫 작업은 pinMode() 함수를 호출하는 것입니다. 그럼 pinMode() 함수에 정의된 작업을 하러 다시 가겠죠. 그리고 함수를 호출할 때(작업을 하러 갈 때) led 와 OUTPUT 값을 같이 가지고 가라고 했습니다.
그런데 소스코드 어디에도 pinMode()란 함수는 보이지 않죠? 이건 아두이노가 기본으로 가지고 있는 함수라서 그렇습니다. 아두이노에서는 아두이노 보드를 제어하기 위해서 필요한 기본함수와 변수들을 미리 정의해두고 가지고 있습니다. 아래 링크로 가시면 아두이노가 가진 기본 함수와 변수들을 보실 수 있습니다.
http://arduino.cc/en/Reference/HomePage
링크에서 pinMode 설명을 찾아 읽어보시면 알겠지만 이 함수는 아두이노가 가진 구멍숭숭 핀들을 어떻게 사용하겠다고 아두이노에 알려주는 역할을 하는 함수입니다. 그리고 핀을 어떻게 사용할 것인지 알려주기 위해 2개의 값을 같이 가지고 갑니다. led는 파일에서 정의한 전역변수로 13이란 값이 할당된 메모지인건 눈치 채셨을겁니다. 아두이노의 13번 핀에 대한 설정을 하겠다는 뜻입니다. 근데 OUTPUT 이란 값은? 이것도 아두이노가 자체적으로 정의해 둔 값입니다. 출력용으로 사용하겠다는 뜻을 가지고 있습니다.
종합하면 setup 함수를 실행하면서 pinMode() 작업을 하고, 이때 led, OUTPUT 값을 같이 가지고 갑니다. 즉 13번 핀을 출력용으로 쓸테니 준비하라는 명령을 아두이노에 전달하는 작업을 setup 함수 안에서 한겁니다. 13번 핀에는 아두이노가 자체적으로 가진 LED가 연결되어 있기 때문에 이 핀을 통해서 아두이노의 LED를 제어할 수 있습니다
void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
이제 loop 함수 안을 보죠.
여기서는 2개의 새로운 함수가 보입니다. digitalWrite 함수와 delay 함수입니다. digitalWrite 함수는 특정 핀에 on/off 명령을 내릴 때 사용합니다. 그리고 delay 함수는 열심히 일하고 있는 사람을 잠시 쉬게 해주는 함수입니다.
digitalWrite(led, HIGH) 작업을 가장 먼저 수행하죠? led는 우리가 13 으로 미리 정의해 둔 변수(=메모지)입니다. LED가 연결된 13번 핀을 의미합니다. 그리고 HIGH는 특정 핀을 on 시킨 상태를 나타내는 변수입니다. 전등 스위치의 on 상태와 비슷한겁니다.
따라서 이 명령어는 13번 핀을 HIGH(=on) 상태로 만들라는 것입니다. 실제로 이 라인이 실행되면 13번 핀으로 아두이노의 동작전압에 해당하는 5V 전류가 흐르게되고 LED에 불이 들어옵니다.
그리고 delay(1000)을 실행하겠죠. 이건 1000 milli-second (=1초) 동안 작업을 중단하고 쉬라는 뜻입니다. 그럼 현재 LED가 on 인 상태로 1초 동안 유지됩니다.
나머지 2줄의 코드는 앞선 작업과 정 반대의 일을 합니다.
digitalWrite(led, LOW); delay(1000);
13번 핀을 LOW(=off) 상태로 만들어서 LED로 공급되던 전원을 차단합니다. 그럼 LED가 꺼지겠죠. 그리고 그 상태로 다시 1초동안 쉽니다.
void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
이제 loop 함수안의 4개의 라인을 연결해서 생각해봅시다. 그럼 아래와 같은 작업이 순서대로 실행됩니다.
- 13번 핀에 연결된 LED를 on
- 1초 쉼
- 13번 핀에 연결된 LED를 off
- 1초 쉼
앞서 loop 안의 작업들은 사람을 투입해서 무한반복 시키는거라 했습니다. 따라서 아두이노에 전원이 들어오는 한, LED가 1초 단위로 점멸하는 작업을 무한반복합니다.
이번 강좌에서 아두이노 핀을 어떻게 제어하는지에 대해서는 자세히 다루지 않았습니다. 그런 내용은 아두이노 초급강좌에서 자세히 다룰겁니다. 여기서는 단지 코드의 흐름을 어떻게 파악하는지와 문법을 눈에 익히는데에 집중하시면 됩니다.
다음 강좌에서는 조금 더 복잡한 예제를 가지고 새로운 내용들을 다뤄보겠습니다.
=============================================================
이 문서는 작성자의 동의없이 개인적인 목적 외의 상업적인 목적으로 활용되어서는 안됩니다.
이 문서의 일부 혹은 전체를 수정, 삭제, 재배포 하여서는 안됩니다.
작성자 : GodsTale (godstale@hotmail.com)