시작이 반
앞서 아두이노에 대해 알아보았다. 아두이노에 대해 뭔가 알 거 같으면서도 여전히 와 닿지 않을 수 있다. 백번 듣는 것보다 한번 보는 것이 낫다는 말이 있다. 아두이노에 대해 알려면 직접 아두이노를 동작시켜 보는 것이 좋다. 자 이제 아두이노를 동작시켜 볼 차례이다.
이번 장부터는 준비물이 필요하다. 이번장에서 필요한 준비물은 컴퓨터와 아두이노, 그리고 그 둘을 연결할 USB 케이블이 필요하다.
컴퓨터를 사용하면서 게임을 하고 싶으면 게임을 설치하고, 문서 작업이 필요하면 워드프로세서를 설치한다. 아두이노를 동작시키려면 아두이노가 동작할 로직을 구현(프로그래밍 혹은 코딩)할 프로그램을 설치해야 한다. 아두이노 코딩을 할 때 사용하는 개발 소프트웨어(IDE)가 필요 한데 아두이노는 Arduino IDE라는 개발 툴을 제공하고 있다. https://www.arduino.cc 사이트에서 받을 수 있다. 해당 웹사이트에 접속 후 화면 상단의 Software -> Downloads 메뉴로 이동한다. https://www.arduino.cc/en/Main/Software 로 바로 이동 가능하다. 여기서 Arduino IDE를 다운로드할 수 있다.
우측에 여러 OS 명칭이 보이는데 자신의 OS 에 맞는 버전의 Arduino IDE를 받으면 된다. 저자는 맥북을 사용하기 때문에 Mac OS X를 선택해서 받았다. Windows OS를 사용한다면 Windows를 선택하면 된다. 아무거나 선택해도 되지만 잘 모르겠으면 Windows Installer를 선택한다. 선택하고 나면 기부금을 보내는 방법에 대한 설명이 나오는데 일단 "JUST DOWNLOAD"를 선택해서 받도록 한다. Arduino IDE는 무료로 제공되고 있다. 여유가 있다면 기부를 하면 아두이노 생태계의 발전에 큰 도움이 될 것이다.
Arduino 프로그램을 실행시키면 로고가 나타난다. 처음 구동하면 초기 환경을 세팅하느라 시간이 좀 걸린다. 로딩이 완료되고 나면 오른쪽과 같은 Arduino 코드를 입력할 수 있는 창이 나타난다.
Arduino IDE 에는 초보자들이 쉽게 학습할 수 있도록 기본 예제들을 많이 제공하고 있다. 아두이노를 시작할 때 많이 실행해 보는 예제가 바로 blink 예제이다. blink는 깜빡이다라는 의미를 가진 영어 단어이다. blink 예제는 아두이노 보드에 내장되어 있는 LED 의 불을 깜빡거리는 예제이다.
아두이로 로고 좌측에 동그라미로 표시한 부분 가운데에 미세하게 불이 들어온 것을 볼 수 있다. 기본 예제 코드를 아두이노 보드에 올리면 LED 불이 1초 동안 켜졌다가 1초 동안 꺼졌다가 다시 1초 동안 켜졌다가 다시 1초 동안 꺼지는 동작을 무한히 반복하게 된다.
일단 blink 예제 소스코드를 불러오도록 한다. 소스코드는 아두이노가 어떤 동작을 할지를 나타내는 명령들을 적은 내용들이라고 보면 된다. 코딩을 직접 해 보고 싶다면 빈 파일을 만들고 직접 코드를 입력해도 좋다. 일단 예제를 불러오는 방법에 대해 알아보도록 하겠다.
메뉴 이동 순서는 다음과 같다. File (파일) -> Examples (예제) -> 01.Basics -> Blink를 선택하도록 한다.
아래 화면에 보이는 /* 와 */ 사이의 내용은 코드가 아니고 예제에 대한 설명이다. 실제로 동작하는 부분이 아니니 보기 싫다면 지워도 동작에는 지장이 없으면 삭제해도 좋다. 이러한 부분을 소스코드에서 주석(Comment)이라고 한다.
이후에 나오는 코드가 중요하다. 실제로 아두이노를 어떻게 동작시킬지를 알려 줄지 구현한 부분이다.
이 코드에서 "// the setup..." 어쩌고 처럼 // 로 시작하는 부부분이 보이는데 이 부분도 실제로 동작하는 부분이 아닌 주석이다. 주석에는 /* */처럼 여러 줄 주석과 // 와 같은 한 줄 주석이 있다. 실제로 동작하지는 않지만 소스코드에 대한 설명을 적어 두는 부분이다. 그렇기 때문에 삭제해도 괜찮다. 이후 실제 동작하는 코드에 대한 설명은 일단 아두이노에 프로그램을 업로드 한 다음에 자세히 설명하도록 하겠다.
자 이제 컴퓨터와 아두이노를 USB 케이블로 연결하도록 한다. USB 케이블을 통해 컴퓨터에 불러온 blink 예제를 아두이노 보드에서 동작하도록 업로드를 할 것이다. 우리가 컴퓨터나 스마트폰을 사용할 때 애플리케이션을 설치하듯이 아두이노 보드를 동작시킬 프로그램을 설치하는 과정이라고 생각하면 된다.
USB 케이블을 이용해서 컴퓨터와 아두이노를 연결하였다. 컴퓨터에 직접 연결하기 어려운 상황이라 USB 허브를 하나 더 연결했다. "컴퓨터 - USB 허브 - 아두이노"로 연결되어 있는데 컴퓨터와 직접 연결이 가능하다면 USB 허브는 없어도 된다.
컴퓨터와 아두이노를 USB 케이블로 연결하면 아두이노 보드의 LED 들에 불빛이 들어올 것이다. 아두이노가 동작하고 있다는 의미이다.
자, 이제 Blink 예제를 아두이노 보드에 업로드하여 잘 동작하는지 확인해 보도록 하자. Arduino IDE 좌측 상단에 보이는 오른쪽 화살표 모양의 버튼을 누르도록 한다.
혹시 다음과 같은 오류가 날 수도 있다. can't open device는 주로 Arduino IDE 가 아두이노 장치를 감지하지 못했을 때 발생하는 오류이다. 컴퓨터에는 여러 장치들이 동작하고 있는데 어떤 장치에 업로드를 해야 할지 찾지 못한 경우이다.
아두이노를 업로드할 때 사용할 포트를 아두이노 장치로 지정해 주면 되는데 다음과 같이 메뉴를 찾아가 보자. Tools -> Port로 들어가 보면 여러 장치가 보이는 데 이 중에 "Arduino" 가 포함된 항목을 선택한다.
다시 업로드 버튼을 눌러서 프로그램을 업로드해 보자. 다음과 같이 "Done uploading" 이 나타나면 정상적으로 업로드가 된 것이다.
아두이노 보드에 내장된 LED가 깜빡 거리는 것을 볼 수 있다. Blink 예제 코드를 보고 각 코드가 어떤 역할을 하는지 보자.
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
우선 setup(), loop()라는 함수가 보인다. 함수라는 말은 수학 시간에 들어 봤을 수도 있는데 비슷한 의미이다. 수학의 함수에서는 입력값으로 특정한 값을 넣으면 함수 내용에 따라 결괏값이 반환된다. y = f(x)에서 f라는 함수가 f(x) = x + x 이면 f(1)의 결과는 2, f(2)의 결과는 4가 된다. 프로그래밍에서의 함수도 비슷한데 어떠한 입력값을 받으면 함수 내부의 로직이 실행되고 결괏값이 반환된다. 특이한 점은 프로그래밍에서의 함수는 일력 값이나 결괏값이 없는 경우가 있다. 앞서 void setup() 이 그러한 예중 하나인데 괄호 안이 비어 있으면 입력값이 없다는 의미이고 앞수 이름 앞에 적은 void는 반환되는 값이 없다는 의미이다. 수학 이야기를 해서 머리가 아프다면 너무 신경 쓰지 말고 넘어가도록 하자.
간단히 말해서 void setup() { 내용 } 함수는 아두이노 보드가 처음 구동될 때 실행될 코드를 내용이 적는 부분이다. void loop() { 내용 } 함수는 setup() 함수가 실행되고 나서 loop 함수 안에 구현한 내용이 무한 반복하는 부분이라고 보면 된다.
setup() 은 아두이노 보드가 구동될 때 한 번만 실행되는 내용이고 loop()는 무한 반복되는 내용이다. setup() 함수 안에는 pinMode(LED_BUILTIN, OUTPUT);이라는 내용이 보인다. LED_BUILTIN 은 내장 LED를 지칭하는 것이다. LED_BUILTIN를 OUTPUT(출력) 모드로 사용하겠다는 의미이다. LED는 빛을 표시하는 출력장치이다. 그렇기 때문에 OUTPUT 모드로 설정 해 두는 것이다. 만약 OUTPUT으로 지정하지 않게 되면 보드에 내장된 LED 가 제대로 동작하지 않을 수 있기 때문에 꼭 지정해 주어야 한다.
loop()는 setup() 함수 이후에 무한 반복해서 실행되는 부분이다. 아두이노가 동작하는 동안 아두이노는 loop()에 작성한 내용을 전원이 꺼질 때까지 무한히 실행할 것이다. digitalWrite(LED_BUILTIN, HIGH); 는 내장 LED를 켜는 역할을 한다. 디지털 정보는 0과 1로 표현된다. 전기로 디지털 정보를 표현할 때는 전기를 끄면 0, 켜면 1이라는 방식을 사용한다. HIGH는 전원을 켠다는 의미이다. 코드의 마지막에 세미콜론(;)이 있는데 하나의 실행 단위를 구분하는 문법이라고 보면 된다. 프로그램 언어에 따라 안 적는 경우도 있는데 아두이노는 C++라는 언어를 기반으로 하고 있고 C++문법을 따라 실행 단위마다 세미콜론(;)을 붙인다고 알아 두면 된다. 아무튼 LED를 켜고 나면 delay(1000); 코드가 보인다. 1초 동안 가만히 멈춰 있으라는 의미이다. 그래서 LED를 켜고 1초 동안 멈춘 상태로 있는 것이다. digitalWrite(LED_BUILTIN, LOW); 는 LED를 끄라고 명령을 내리는 것이다. HIGH는 켜는 것이고 LOW는 끄는 것이다. 끄고 나서 다시 delay(1000); 코드를 통해서 1초 동안 멈춰 있게 된다.
이대로 넘어가기 아쉽다면 delay(1000); 에서 1000이라는 값을 100으로 바꿔 보자. 그러면 깜박거리는 속도가 10배 빨리는 것을 볼 수 있다. 만약 1000 대신 2000을 입력하면 2배 느려지게 된다. 만약 10으로 입력하게 되면 사람의 눈으로는 구분하기 어려울 정도로 빠르게 깜빡거리기 때문에 깜빡거리는 게 느껴지지 않을 것이다. 일반적으로 사람은 1초에 30번 이상 깜빡거리게 되면 깜빡거림을 잘 느끼지 못하게 된다. 그래서 우리가 주로 사용하는 TV나 모니터는 보통 1초에 30번 정도 깜빡이면서 화면을 바꾸는 방식을 사용하고 있다.
코드를 고치는데 흥미가 생긴다면 원하는 방식으로 고쳐 보아도 좋다. 아래처럼 고친다면 한 번은 천천히 깜빡거리고 한 번은 빠르게 깜빡여서 따닥~ 거리는 느낌이 날 것이다. 생각나는 데로 마음대로 응용해 보도록 하자.
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
}
이번장에서는 아두이노를 직접 구동해 보았다. 아두이노와 좀 더 친해진 느낌이 드는가? 이제 좀 더 본격적으로 아두이노를 다뤄 보도록 하겠다.