[아두이노] [강좌] 2. Blink 예제 해부하기(1)
이번 강좌에서는 “Blink” 예제를 가지고 아두이노의 기본을 공부해보자.
우선 스케치 툴을 실행한다. 최신 버전으로 스케치 툴을 설치했다면 스케치 툴을 실행했을 때 다음과 같은 화면을 볼 수 있다.
바로 setup() 함수와 loop() 함수이다. 1.0.5 이전 버전을 설치했다면 그냥 빈 화면이 나타날 것이다. 빈 화면일 경우에는 직접 setup() 함수와 loop() 함수를 입력해줘야 한다. 이 두 함수는 아두이노 소스에서 반드시 있어야 할 함수니까. 없으면 에러 남.
setup() 함수는 말 그대로 아두이노 보드를 설정, 또는 초기화 하는 함수이다. 아두이노에 전원을 켜면 최초에 한 번 실행된다. 주로 핀의 입출력 설정과 객체 초기화가 실행된다. 함수는 ‘{‘로 시작해서 ‘}’로 끝나니까 이 사이에 초기화 해 줄 구문들을 작성하면 된다.
loop() 함수는 setup() 함수가 끝난 후 실행되며, 아두이노 보드에 전원이 꺼지거나 리셋이 발생하기 전까지 무한 반복되어 실행되는 함수이다. 아두이노 보드의 주 기능이 여기에 구현된다.
Blink 예제를 보면서 설명해보자. 스케치 툴의 “파일→예제→01.Basics→Blink”를 열어보자. 버전 업이 되면서 Blink 예제가 다음 그림과 약간 다를 수 있다. 차이는 led 핀 번호를 변수로 썼는가, 아닌가의 차이.
하는 김에 변수 설명까지 하려고 이전 버전의 예제를 올렸다.
변수는 “변경할 수 있는 값을 저장하는 하나의 단위”. 저장되는 값은 숫자, 문자, 참(True) 또는 거짓(False), 또는 다른 변수가 저장된 곳의 주소 등이 될 수 있으며, 변수가 선언될 때 저장되는 값의 종류를 지정해야 한다.
int led = 13; |
여기서 “int”가 변수의 종류 또는 타입을 지정하는 “예약어(용도가 미리 정해진 문구)”이며, 저장되는 값이 ‘정수형 숫자’라는 뜻이다. 아두이노에서 지원하는 변수의 종류는 다음과 같다.
음, 많구만.
“void”는 변수 종류라기보다는 단지 키워드라고 생각하면 되는데, setup() 함수에서 다시 설명하도록 하고.
“boolean"은 ‘참(TRUE)’이냐 ‘거짓(FALSE)’이냐를 저장하는 변수 타입, “char”는 하나의 문자를 저장하고, “byte”는 한 바이트(Byte, 8bit) 크기의 숫자, “int”는 2 바이트 크기의 정수, “word”도 2 바이트 크기의 숫자, “long”은 4 바이트 크기의 정수를 저장하는 변수 타입이다.
앞에 “unsigned”라고 붙은 건 부호(-/+)를 사용하지 않고 양의 정수만을 저장한다는 뜻. “unsigned”가 붙지 않은 “int”, “long”, “char” 타입은 모두 음의 정수, 0, 양의 정수를 저장할 수 있다. 참고로 “word”는 0 또는 양의 정수만을 저장하며, “unsigned int”와 동일하다.
같은 정수를 저장하는 타입이지만 “int”와 “long”은 크기가 다른데, 이는 저장할 수 있는 수의 범위가 다르다는 것을 의미한다. “int”는 2 바이트의 크기로 -32,768부터 32,767까지의 수를 저장할 수 있고, “long”은 4 바이트의 크기로 -2,147,483,648부터 2,147,483,647까지의 수를 저장할 수 있다. “unsigned int”와 “unsigned long”은 음의 정수를 사용하지 않으므로 각각 0부터 65,535, 0부터 4,294,967,295까지의 수를 저장할 수 있다.
“float”과 “double”은 모두 4 바이트의 실수를 저장할 수 있다. 단, 아두이노 보드 중 듀에(Due)의 경우 “double”은 8 바이트의 크기를 가진다. 듀에는 “int”와 “word”의 크기가 4 바이트로 다른 아두이노 보드와는 약간 다른 점이 있다. 듀에에 대해서는 나중에 따로 포스팅하도록 하자. (다짐인가?)
“string”은 실제로 사용되는 예약어가 아니라 ‘문자 배열’을 나타낸다. “char” 형태의 변수가 여러 개 이어져 있는 “char[]” 형이라고 생각하면 된다. “String(첫 문자가 대문자인 것에 유의)” 형태는 문자 배열을 좀 더 효율적이고 사용하기 쉽도록 하기 위해 아두이노에서 제공하는 객체 형태의 변수 타입이다. ‘문자열’을 저장하는 변수라고 생각하고 나중에 다시 자세히 설명하도록 하자. (또 다짐인가?)
“array”는 역시 예약어가 아니라 ‘배열’을 나타내는 말이다. “char” 뿐만이 아니라 모든 변수 타입으로 구성할 수 있다. 변수명 뒤에 “[]”을 붙여 배열 변수임을 나타내며, “[“와 “]” 사이에 배열의 크기를 지정해야 한다. (문자 배열의 경우는 문자열로 초기화하는 경우에 한해 크기를 지정하지 않아도 됨.)
변수의 종류를 지정했다면 다음으로 변수의 이름을 정해야 하고, 이를 “변수명”이라고 한다. 변수명은 소스 내에서 해당 저장 공간을 나타내는 이름으로 사용된다. 위의 예제에서 “led”라는 단어가 변수명으로 사용되고 있다.
변수명을 정하는데는 몇가지 규칙이 있는데, 그 규칙은 다음과 같다. (사실 대부분의 프로그래밍 언어에서 다음 규칙을 따라야 한다.)
1. 알파벳 대문자, 소문자, 숫자,N'_(언더바)'를 사용할 수 있으며, 그 외의 특수 문자는 사용할 수 없다. 2. 첫 글자에 숫자가 올 수 없다. 3. 대, 소문자를 구별한다. 4. '예약어'를 변수명으로 사용할 수 없다. |
4번 항목에서 말하는 ‘예약어’란 위에서 설명한 변수 종류를 정의한 단어들이나 “if”, “for” 등의 미리 정의된 키워드들을 뜻한다.
그리고 마지막으로 변수에 값을 저장하기 위해 ‘=’이라는 문자를 사용하며 ‘=’ 뒤에 저장할 값을 적어주고 ‘;(세미콜론)’ 문자로 끝낸다. 기본적으로 함수 구문의 범위를 결정하는 “{}” 외의 모든 구문은 ‘;’ 문자로 끝나야 한다.
그럼 다시 한번 예제 소스의 변수 선언(변수 타입과 변수명을 처음 정하는 것을 ‘선언하다’ 또는 ‘정의하다’라고 쓴다) 부분을 살펴보자.
int led = 13; |
“int”라고 2 바이트의 정수형을 저장할 변수임을 선언하고, 변수명을 “led”라고 정해준다. 그리고 “led”라는 변수에 ‘13’이라는 값을 저장한다.
변수의 선언은 단 한 번만 쓸 수 있으며, 두 번 이상 같은 변수명이 선언될 경우 컴파일 에러가 발생한다.
변수를 선언할 때 위의 예제처럼 값을 저장할 수도 있고(이를 ‘초기화’라고 한다), 나중에 저장할 수도 있다. 값을 ‘초기화’하지 않을 경우에 변수에 어떤 값이 저장되어 있을지는 알 수 없다. 웬만하면 ‘0’으로라도 초기화를 해주는 것이 좋다.
다음은 여러 형태의 변수를 선언하는 예시이다.
int a; // 정수형 변수 ‘a’, 초기화 하지 않음 byte b=0; // 1 바이트 양수(+)형 변수 ‘b’, 0으로 초기화 long c1=5; // 4 바이트 정수형 변수 ‘c1’, 5로 초기화 float f_d = 0.5; // 실수형 변수 ‘f_d’ char charvalue = ‘c’; // 문자형 변수 ‘charvalue’, 소문자 ‘c’를 저장 char chararray[] = “Hello”; // 문자 배열 변수 ‘chararray’, 문자열 “Hello”를 저장 int intarray[3]; // 정수형 배열 변수 ‘intarray’, int 형 변수 3개를 배열로 선언 float float_array[5] = {0.0, 1.1, 2.2, 3.3, 4.4}; // 실수형 배열 선언, 5개를 각각의 값으로 초기화 boolean bl = FALSE; // 참,거짓형 변수 선언. 'TRUE' 또는 'FALSE' 중 하나를 저장 |
선언 이후로는 변수 타입 없이 변수명만 사용해서 값을 저장하거나 읽어올 수 있다. 값을 저장할 때는 직접 값을 입력하는 방법과, 다른 변수의 값을 '대입'하는 방법이 있다.
int a=1; int b=2; a = 3; // 직접 입력 b = a; // 'a'의 값을 대입 |
변수는 선언하는 위치에 따라 전역 변수와 지역 변수로 나눠지며, 사용할 수 있는 범위가 달라진다. 함수 안에서 선언된 변수를 ‘지역 변수’라고 하며, 이 변수는 선언된 함수 안에서만 사용할 수 있다. 반면에 “Blink” 예제에서처럼 함수와 상관 없이 밖에 선언된 변수를 ‘전역 변수’라고 하며, 전역 변수는 해당 소스 파일 내의 어느 곳에서도 사용할 수 있다.
int a = 13; // 전역 변수 a = 12; // 사용할 수 있음 void setup() { int b = 10; // 지역 변수 b = 11; // 사용할 수 있음 b = a; // 사용할 수 있음 } b = 9; // 사용할 수 없음 a = 0; // 사용할 수 있음 |
음.. 변수 설명이 생각보다 길어졌다. 간단하게 설명하고 넘어갈랬는데, 이 놈의 설명 강박.
힘드니까 오늘은 여기까지. “Blink” 예제의 setup() 함수와 loop() 함수는 다음 강좌에서 만나요, 안녕~
[출처] [아두이노 강좌] 2. Blink 예제 해부하기(1) - 변수|작성자 몽구스