아두이노

아두이노 코딩 기초 Blink 예제 분석

콘파냐 2018. 1. 2. 20:39

아두이노 코딩을 위해서 프로그래밍 언어(예를들어 C언어)를 처음부터 공부하려고 할 필요는 없다. 프로그래밍의 문법적인 기초를 익히는 것보다 아두이노의 예제를 따라서 코딩해가면서 전자회로가 동작하는 모습에 흥미를 갖게 되면 자연스럽게 코딩의 기초를 익힐 수 있기 때문이다. 전자회로가 동작하는 모습이 바로 눈에 보이기 때문에 단순히 컴퓨터로 코딩 공부를 하는 것 보다 더 효과적으로 프로그래밍에 대한 감각을 익힐 수 있다고 생각한다.

그래도 우선 아두이노 코딩을 위한 기본적인 구조(structure)는 알아두어야 한다. 이 구조는 아두이노 코딩을 쉽게하기 위해서 만들어진 구조로 우리는 규칙에 맞게 이전에 설치해 놓은 IDE에 코딩을 하면 된다.

또한 api라는 것이 있는데 일종의 함수(function)라고 생각하면 쉽다. 함수는 어떤 기능을 하는 코드집합이라고 볼 수 있다. 예를들어 가장 흔히 볼 수 있는 digitalWrite 라는 함수는 특정 디지털 핀에 출력(5V)의 전압을 준도록 명령하는 기능을 가지고 있다. 어떻게 해서 이 함수가 그런 기능을 하는지에 대해서는 관심가질 필요가 없고 필요한 기능에 맞는 함수를 그냥 갖다 쓰기만 하면 된다.

digitalWrite 함수 외에도 다양한 함수들이 마련되어 있고 우리는 이 함수들을 reference 문서에서 찾을 수 있다.

우선 하나씩 차근차근 설명해 보도록 하겠다.

아두이노 프로그래밍 구조(structure)

IDE를 실행해서 Blink 예제(파일 -> 예제 -> 01. Basics -> Blink)를 분석해보도록 하겠다. 위에 보이는 /*와 */사이에 있는 텍스트의 내용은 Blink 프로그램(스케치)에 대한 설명이다. 코딩은 컴퓨터(기계)에게 명령을 내리기 위한 것이지만 동시에 소스코드의 목적, 또는 특정한 코드에 대한 설명 등을 적어둘 수 있다. 이를 주석이라고 하는데 주석은 컴퓨터가 아닌 사람에게 설명을 하기 위한 것이므로 컴퓨터가 소스코드의 명령을 해석할 때는 주석을 모두 무시하여 읽지 않는다. 주석을 만드는 방법은 /* 주석 /* 으로 한 줄 이상의 주석을 만들 수 있고 // 주석 형태로 한 줄 짜리 주석도 만들 수 있다.

// 주석 

다음에 void setup() {  ...생략... } 의 형태가 있고 그 다음에 //주석 그리고 void loop() { ...생략...} 형태의 구조가 있다.

이 형식은 함수를 정의하는 형식인데 setup과 loop는 미리 약속된 함수이름으로 위 소스코드를 아두이노에 올리면 아두이노가 이 두 함수들을 적절히 호출하게 되어있다. 즉 우리가 이 함수 내부에 명령들을 코딩하면 아두이노가 이 함수를 실행하여 명령을 실행하게 되는 것이다.

좀 더 구체적으로 setup 함수는 아두이노가 구동될 때 단 한번만 실행하는 함수로 초기화를 위한 코드를 작성하면 된다. 

loop 함수는 말 그대로 반복되는 코드를 나타내는데 위에서 아래로 순차적으로 실행되며 끝에 다다르면 다시 처음으로 돌아가 똑같은 명령을 반복해서 수행한다.

그러면 위 코드를 분석해보자.

다음은 setup 함수의 내용이다.

pinMode(LED_BUILTIN, OUTPUT);

pinMode라는 함수를 호출하였는데 이 함수는 아두이노의 pin의 입출력 형식을 설정할 수 있다.(레퍼런스 문서를 참고하면 더 자세한 내용을 알 수 있다.)

함수의 ( ) 괄호 내부에는 정해진 개수의 인자를 받을 수 있다. 함수가 정의 될 때 여기에서 받은 인자를 가지고 내부적으로 어떤 처리를 하도록 정의된다. pinMode 함수는 2개의 인자를 ,(콤마)로 구분하여 받도록 정의된 함수다. 첫 번째로 전달된 인자 LED_BUILTIN은 내장 변수로 숫자 13과 동일한 값으로 정의되어 있다. 역시 레퍼런스를 참조하면 다 나와있는 내용이다.

두 번째 인자 OUTPUT은 첫 번째 인자로 전달된 번호의 핀을 어떻게 사용할지 설정하는 인자다. OUTPUT이 전달되어 있으므로 13번 핀을 출력용으로 사용한다는 뜻이다. 만약 INPUT이라면 입력용으로 사용한다는 뜻이 될 것이다. OUTPUT, INPUT 역시 레퍼런스 문서에 나와 있으므로 직접 찾아서 확인해보도록 하자.

만약 4번 핀에 출력을 주고 싶다면 pinMode(4, OUTPUT); 이라고 코딩하면 되겠다. 그리고 이런 설정은 반복될 필요없이 아두이노가 구동될 때 한번만 저정하면 될 것이므로 setup 함수 내부에 작성한 것이다.

다음은 loop 함수의 내용이다.

digitalWrite(LED_BUILTIN, HIGH);

delay(1000);

digitalWrite(LED_BUILTIN, LOW);

delay(1000);

4개의 명령이 있는데 앞에 2개의 명령과 뒤에 2개의 명령은 비슷한 구조다. 우선 앞에 2개의 명령을 살펴보도록 하자.

digitailWrite함수는 2개의 인자를 받는다. 첫 번째 인자는 핀 번호, 두 번째 인자는 HIGH다. 이 함수의 기능은 첫 번째 인자로 전달된 숫자에 해당하는 핀에 디지털 출력을 하는 함수다. 출력의 크기는 두 번째 인자로 결정지으며 HIGH는 5V를 의미한다.(*참고 : 3.3V를 출력으로 하는 보드는 3.3V일 수 있다.) 만약 LOW가 두 번째 인자로 전달되면 출력이 0이된다.

두 번째 함수 delay는 코드의 실행을 지연시킨다. 인자로 1000이 전달되었는데 1000은 1초다.

따라서 위 코드를 해석하면 다음과 같다.

13번 핀에 5V 출력!

1초간 코드 실행 지연

13번 핀에 0V 출력!

1초간 코드 실행 지연

이 네 개의 명령이 loop 함수 내부에서 계속적으로 반복된다.
따라서 1초간격으로 내장 LED의 불이 켜졌다 꺼졌다 하며, 만약 13번 핀에 연결된 LED가 있다면 그 LED도 동일하게 깜박일 것이다.(13번 핀과 내장 LED는 연결되어 있음.)

이제 아두이노 코드의 구조를 파악할 수 있을 것이고 또한 다른 코드에 사용된 함수들의 기능을 레퍼런스를 참조하여 알아내고 코드를 분석할 수 있을 것이다.

반응형