손에 잡히는 아두이노

지은이 / 마지모 밴지 | 옮긴이 / 이호민

by Joong

손에 잡히는 아두이노
(원제 : 아두이노 시작하기)
Getting Started With Arduino
초판 1쇄 발행 2010년 6월 15일
지은이 마지모 밴지
옮긴이 이호민
펴낸곳 인사이트(서울시 마포구 서교동 469-9번지 석우빌딩 3층)


- 서킷 벤딩(circuit bending)은 매우 흥미로운 팅커링 방식 가운데 하나다. 이것은 전자 기타의 이펙트 페달 같은 음악 장비, 어린이 장난감, 작은 신디사이저 등 낮은 전압이나 배터리로 작동하는 전자 장치의 회로를 위해 창조적으로 쇼트(접점들을 연결하는 것)시켜서 새로운 악기나 소리 생성기를 만드는 일이다. 이 과정의 근원에는 ‘우연히 얻게 되는 예술’이 있다. [28p]
- 앞서 서킷 벤딩에서 증명한 것처럼 장난감은 해킹과 재사용을 위한 값싼 기술의 보고다. 요즘에는 첨단 기술로 만든 매우 싼 중국산 장난감이 넘쳐나기 때문에, 갑자기 떠오른 아이디어대로 소리 나는 고양이 인형과 광선검 장난감을 조합해 볼 수도 있다.
나는 학생들에게 기술이 무섭거나 접근하기 어려운 것이 아니라는 사실을 이해시키기 위해 이 방법을 몇 년간 사용해 왔다. 참고하는 자료 가운데 마음에 드는 것은 우스만 해크(Usman Haque)와 애덤 솜라아-피셔(Adam Somlai-Fischer)가 쓴 『저수준 센서와 액추에이터(Low Tech Sensors and Actuators)』이며, http://lowtech.propositions.org.uk에서 구할 수 있다. 이 책은 장난감 해킹 기술을 완벽하게 설명하고 있으며, 나 역시 계속 사용하고 있다. [34p]


- 아두이노 공식 홈페이지 : http://www.arduino.cc
또한, ‘놀이터(Playground)'라는 위키(www.arduino.cc/playground)를 구성해 두었는데, 사용자들이 자신이 발견한 내용을 이곳에 문서화할 수 있다.
(옮긴이) 소스코드와 회로도는 만국 공통어이므로, 커뮤니티의 내용이 외국어로 작성되어 있다고 해서 겁먹을 필요는 없다. 구글 번역기(http://translate.google.com)같은 웹 번역 서비스의 도움을 받아 보라. 물론 아두이노와 관련된 국내 커뮤니티도 있다. 가장 활발한 곳인 네이버 카페 ‘아두이노 스토리’의 주소는 다음과 같다.
http://cafe.naver.com/arduinostory.cafe [35p]


- 아두이노 보드는 작은 마이크로컨트롤러 보드다. 마이크로컨트롤러 보드란, 작은 칩(마이크로컨트롤러) 안에 컴퓨터 전체를 구현한 부품을 포함하는 자극 회로 기판(보드)이다. 이 컴퓨터는 내가 이책을 쓰는 데 사용하는 맥북보다 적어도 천 배는 성능이 낮다. 그렇지 만 훨씬 싸고, 또한 재미있는 장치들을 만드는 데 매우 유용한다. -중략-
보드를 구성하는 모든 부분을 하나씩 설명한다.
디지털 입출력 핀 14개 (핀 0~13)
입력 또는 출력으로 사용할 수 있으며, IDE를 사용해 만든 스케치를 통해 어떻게 사용할지 결정한다.
아날로그 입력 핀 6개 (핀 0~5)
아날로그 입력으로만 쓰이며, 아날로그 값(이를테면, 센서를 통해 읽은 전압 값)을 받아 )과 1023 사이의 숫자로 변환한다.
아날로그 출련 핀 6개 (핀 3, 5, 6, 9, 10, 11)
디지털 핀 가운데 여섯 개는 사실 IDE를 사용해 작성한 스케치를 통해 아날로그 출력으로 재프로그램할 수 있다.
보드는 컴퓨터의 USB포트나, 거의 모든 종류의 USB 충전기 또는 AC어댑터(9볼트 권장, 2.1밀리미터 원형 팁, 중앙이 양극)에서 전원을 공급받을 수 있다. 만약 소켓에 전원을 꽂지 않으면 USB에서 전원을 공급받아 사용하지만, 보드에 전원을 넣자마자 외장 전원을 자동으로 사용하게 된다. [38~39p]
- IDE(Intergrated Development Environment, 통합 개발 환경)는 여러분 컴퓨터에서 돌아가는 특별한 프로그램으로, 이 프로그램을 사용하면 프로세싱 언어에 기반을 둔 간단한 프로그래밍 언어로 아두이노 보드에서 사용할 스케치를 작성할 수 있다.
여러분이 보드에 스케치 올리기(Upload to I/O Board) 버튼을 누르면 마법이 일어난다. 작성한 코드는 보통 초보자가 사용하기에 꽤 어려운 C언어로 번역되어, avr-gcc 컴파일러에 전달된다. 컴파일러는 오픈소스 소프트웨어 가운데 중요한 부분으로, 프로그래밍 언어를 마이크로컨트롤러가 이해할 수 있도록 마지막 변환 작업을 수행한다.
이 마지막 단계는 정말 중요하다. 바로 아두이노가 마이크로컨트롤러를 프로그래밍하는 복잡한 작업을 최대한 숨김으로써 여러분의 삶을 단순하게 해주기 때문이다.
아두이노의 프로그래밍 작업 주기는 기본적으로 다음과 같다.
° 아두이노 보드를 컴퓨터의 USB 포트에 꽂는다. ° 보드에 생명을 불어넣을 스케치를 작성한다.
° USB 연결을 통해 보드에 스케치를 올리고, 보드가 재시작하기까지 몇 초를 기다린다.
° 여러분이 작성한 스케치를 보드가 실행한다.
[41p]


- 아두이노 보드를 프로그래밍하기 위해서는 우선 반드시 다음 주소에서 개발 환경(IDE)을 내려받아야 한다.(http://www.arduino.cc/en/Main/Software) 사용하는 운영체제에 맞는 버전을 선택하라. [42p]
- 드라이버 설치 : 윈도
아두이노 보드를 컴퓨터에 연결한다. 그러면 새 하드웨어 검색 마법사 -중략-
‘목록 또는 특정 위치에서 설치’ -중략-
찾아보기를 클릭해 아두이노 폴더를 찾은 뒤, drivers\FTDI USB Drivers 폴더를 선택한다. -중략- 다음으로, 어떤 시리얼 포트가 아두이노에 할당되어 있는지 찾아야 한다. [44p]


- 포트 지정 : 윈도
시작 메뉴를 클릭한 다음 컴퓨터에서 오른클릭한 후, 속성을 선택하여 시스템 등록 정보 창을 연다. 창의 왼쪽에 있는 작업 목록에서 장치관리자를 클릭한다. 윈도 XP에서는 내 컴퓨터에서 오른클릭한 후, 속성을 선택하여 시스템 등록 정보 창을 열고 하드웨어 탭을 클릭하여 장치관리자를 선택한다.
할당된 COM 포트를 알아낸 다음에, 이 포트를 아두이노 IDE의 Tools>Serial Port 매뉴에서 선택한다.[46p]


- 전자 장치는 센서와 액추에이터를 통해 실제 세상과 교감한다.
마이크로컨트롤러는 아주 간단한 컴퓨터이기 때문에 오직 전기 신호(이를테면, 우리 뇌신경에서 오가는 전기 신호 같은 것)만 처리할 수 있다. 마이크로컨트롤러가 빛이나 온도, 물체의 양 등을 감지하기 위해서는 무언가 이것을 전기 신호로 변화해 주어야 한다. 예를 들어, 우리 몸의 눈에서는, 빛을 뇌가 받아들일 수 있는 신호로 변환한다. 전자 분야에서는 수광 센서(LDR 또는 감광 저항)를 사용해 센서 표면에 비친 빛의 양을 측정하고, 마이크로컨트롤러가 이해할 수 있는 신호로 변환한다.
센서에서 신호를 읽어 온 후에는, 장치가 어떻게 반응할지 결정하기 위한 정보가 필요하다. 이 의사 결정 과정은 마이크로컨트롤러에서 이루어지며, 액추에이터를 사용해 반응을 수행한다. 예를 들어 우리 몸에서는, 뇌가 보낸 전기 신호를 받은 근육이 움직임(반응)을 만들어 낸다. 전자분야에서는 실제 세상으로 반응을 내보내기 위해 빛이나 전기 모터를 사용한다.[50~51p]


- LED를 연결했으면, 아두이노에 무엇을 할지 알려줘야 한다. 코드가 바로 이런 일을 한다. 코드는 마이크로컨트롤러를 우리가 원하는 대로 작동시키기 위한 일련의 명령어다. [52p]


- 아두이노에서는 setup()과 loop()라는 두 함수가 꼭 존재해야 한다.
setup()에는 보드가 작동하기 시작할 때 한 번만 실행되길 원하는 코드들을 모두 두고, loop()에는 반복 실행될 코드들을 둔다. 아두이노는 컴퓨터처럼 여러 프로그램을 동시에 실행하지 못하며, 하나의 프로그램이 끝나지 않고 계속 실행된다. 보드에 전원을 넣으면 코드가 실행되고, 코드를 멈추려면 그냥 전원을 끄면 된다. [57p]


- 아두이노는 //로 시작하는 줄을 무시한다. 이런 줄은 주석(설명문)으로, 여러분이 스스로를 위해 프로그램에 작성하는 메모다. 나중에 이 주석을보고, 프로그램을 작성하면서 어떤 일을 했는지 기억해 낼 수 있으며, 다른 사람들이 코드를 이해하는 데 도움을 줄 수도 있다.[57p]


- 어쨰서 HIGH와 LOW 같은 단어를 사용할까? 사실 이는 디지털 전자공학의 오래된 관습이다. HIGH는 핀이 켜짐을 의미하며, 아두이노의 경우 핀은 5V로 설정된다. LOW는 0V다. 머릿속에서 이 인자들을 ON과 OFF로 바꾸어 생각해도 된다. [60p]


- 배터리를 펌프와 저수조, 스위치를 수도꼭지, 모터를 물레바퀴라고 상상해 보자. 수도꼭지를 틀면 물이 펌프에서 흘러나와 물레바퀴가 돌아간다.
여기서 중요한 두 가지 요소는 수압과, 관을 따라 흐르는 물의 양이다. 수압은 펌프의 힘에 따라 달라진다. 흐르는 물의 양은 파이프의 굵기와 흘러나온 물이 물레바퀴에 부딪혀 발생하는 저항력에 따라 달라진다. 물레바퀴를 더 빨리 돌게 하려면 위쪽에 더 굵은 관을 사용하고 펌프의 압력을 높여야 한다는 사실을 쉽게 알아챌 수 있다. 더 큰 관을 사용할수록 흐르는 물의 양은 많아진다. 이렇게 큰 관을 사용해서, 관에서 더 많은 물이 흐르지 못하게 하는 저항력을 효율적으로 줄일 수 있다. 하지만 이 방법은 어느 정도까지만 효과가 있고, 이후로는 더 큰 관을 사용해도 물레바퀴의 속도가 빨라지지 않는다. 이는 수압이 충분하지 않기 때문으로 이제부터는 속도를 높이기 위해 더 강력한 펌프를 사용해야 한다. 이 방법으로 계속 속도를 높이다 보면 수압이 너무 강해져서 물레바퀴가 수압을 견디지 못하고 부서져 버릴 것이다.
또 하나 주목해야 할 것은 물레바퀴가 회전함에 따라 회전축이 어느 정도 가열된다는 점이다. 아무리 물레바퀴를 잘 설치했다고 하더라도, 축과 축이 고정된 구멍 간에 존재하는 마찰력에서 열이 발생한다. 이런 종류의 시스템에서는 투입된 모든 에너지가 모두 움직임으로 변환되지 않는다는 사실을 이해해야 한다. 에너지 가운데 일부는 몇 가지 비효율성 때문에 잃게 되고, 이렇게 잃어버린 에너지는 대개 시스템의 몇몇 부분에서 열이 되어 나타난다.
그럼, 이 시스템에서 중요한 부분이 어디일까? 펌프에서 발생하는 압력, 관과 물레바퀴가 물의 흐름을 방해하는 저항력 그리고 실제로 흐르는 물의 양(일 초에 몇 리터의 물이 흐르는지로 표시할 수 있다)이 중요한 부분이다. 전기는 다소 물과 비슷하게 동작한다. 펌프 역할을 하는 부분(배터리나, 가정용 전원 플러그 같은 전기가 발생하는 곳)은 충전된 전기를 전선으로 표현되는 관을 따라 내려 보낸다(이를 전기가 물처럼 떨어져 내린다고 상상하자). 이런 에너지는 열을 만들어 내는 장치(할머니가 쓰시는 전기장판)를 비롯해 빛(침실 수면등), 소리(오디오), 움직임(팬)등 여러 형태로 변형된다.
배터리 전압이 9V로 표시될 때, 이 전원 값을 이 작은 ‘펌프’(배터리)가 만들어 낼 수 있는 물의 압력 같은 것이라고 생각하자. 전압은 볼트(V) 단위로 측정한다. 볼트라는 명칭은 전지를 처음 발명한 알렉산드로 볼타의 이름에서 유래했다.
물의 압력 역할을 하는 부분이 전기에 있는 것처럼, 물이 흐르는 비율에 해당하는 부분 또한 존재한다. 전류가 바로 그것이다. 전류는 암페어(A)단위로 측정할 수 있다. 전압과 전류의 상관관계는 물레바퀴가 동작하는 결과로 표현할 수 있다. 더 높은 전압(수압)은 물레바퀴를 더 빠르게 회전시키며, 더 많은 유량(전류)으로 더 큰 물레바퀴를 돌릴 수 있다.
마지막으로, 연결된 길을 따라 흐를 수 있는 전류의 흐름을 방해하는 저항력이 있다. (알아차렸겠지만) 바로 저항으로, 옴(Ω) 단위로 측정한다. 옴은 회로에서 전압과 전류, 저항이 모두 서로 연관이 있다는 사실과, 회로의 특정 부분에서 전압이 정해져 있으면 저항은 전류가 흘러갈 수 있는 양을 결정한다는 사실을 입증했다.
생각해 보면 다음의 내용은 매우 직관적이다. 9V인 건전지를 가져와 간단한 회로에 연결하자. 전류를 측정할 때, 더 큰 저항을 회로에 붙이면 더 적은 전류가 흐르게 된다. 물에 대한 비유로 돌아가 보면, 펌프와 압력이 변하지 않은 채 관에 밸브(전기에서는 ‘가변저항’으로 표현할 수 있다)를 설치해 두면 밸브를 잠글수록 (즉, 물이 흐르지 못하게 저항력을 높일수록) 물은 더 적게 흐른다. 옴은 세 가지 수식으로 법칙을 요약했다.
R(저항) = V(전압) / I(전류)
V= R×I
I= V/R
[63~66p]
- 스위치의 상태를 알아오려면 새 아두이노 명령어를 배워야 한다. 바로 digitalRead() 함수가 그것이다.
digitalRead()는 특정 핀에 인가된 전압이 있는지를 검사해서, HIGH 또는 LOW 값을 반환해 준다. 지금까지 살펴본 다른 명령어들은 정보를 알려 주지 않았다(그 함수들은 우리가 요청한 일을 수행하기만 했다). 하지만 이런 종류의 함수는 다소 한계가 있는데, 세상에서 들어오는 입력 없이는 어떻게 작동할지가 아주 뻔한 순차 명령만 내릴 수 있기 때문이다. digitalRead()를 사용하면, 아두이노에 ‘질문을 하고’ 받은 대답을 어딘가에 기억해 두었다가, 당장이나 나중에 의사결정을 하는 데 사용할 수 있다. [66~67p]


- 조건문은 프로그래밍 언어에서 가장 중요한 명령어라고 할 수도 있다. 컴퓨터에게 의사결정을 하게 하는 명령어이기 때문이다(지난 기억을 떠올려 보면, 아두이노는 작은 컴퓨터다). if 키워드 뒤에는 괄호 안에 ‘질문’을 작성해야 한다. 그러면 올바른 ‘답’ 또는 질문의 결과가 참일 때 바로 밑에 따르는 코드 블록이 실행된다. 조건에 맞지 않으면 else 뒤의 코드 블록이 실행된다. 조건문에서는 = 기호 대신 ==를 사용했음을 주목하기 바란다. 전자는 변수에 값을 대입하지만, 후자는 두 항목을 비교하며 결과고 TRUE(참) 또는 FALSE(거짓)을 반환한다. 올바른 연산자를 쓰도록 주의하기 바란다. 왜냐하면, 조건문에 == 대신 =를 사용하는 실수는 정말 범하기 쉽기 때문이다. 이 경우 프로그램은 전혀 작동하지 않게 된다. [70p]


- 변수는 아두이노에서 여러분의 데이터를 저장할 수 있는 곳인 메모리에 존재한다. 이는 접착 메모지와 같은 것이다. 보통 메모지는 한 장 뽑아서 ‘호민 02 555 1212’라고 쓴 뒤 모니터나 냉장고에 붙여 둔다. 아두이노 언어에서도 이와 동일하게 간단하다. 저장하고 싶은 데이터의 종류, 예를 들면 숫자인지 문자열인지를 결정하고, 이름을 붙인 뒤, 언제든 그곳에 데이터를 저장하거나 불러올 수 있다. 다음 코드를 보자.
int val = 0;
int는 정수(integer)를 저장하는 데 이 변수를 사용한다는 뜻이다. val은 변수 이름이고, =0은 이 변수에 초기 값으로 0을 대입한다는 의미다.
변수라는 이름에서 알 수 있듯이, 변수는 코드 어디에서나 그 값이 바뀔수 있다. 여러분이 앞의 코드 뒤에 다음과 같이 작성한다면
val = 112;
이는 변수 val에 새로운 값 112를 다시 대입한다는 의미다.
다음 프로그램에서 변수 val은 핀의 상태를 읽는 digitalRead()l;의 결과를 저장하기 위해서 사용된다. 아두이노가 입력 핀에서 얻은 값들은 변수에 기록되며, 코드의 다른 줄에서 바꾸기 전까지 유지된다. 변수가 램(RAM)이라 불리는 기억장치에 저장됨을 주의하자. 램은 속도가 꽤 빠르지만 보드의 전원을 끄면, 램에 저장된 데이터는 사라져 버린다(따라서 보드에 전원이 다시 들어오면, 변수는 초기 값으로 리셋된다). 여러분의 프로그램은 플래시 메모리(핸드폰에서 전화번호가 저장되는 것과 같은 종류의 메모리)에 저장되기 때문에 보드 전원이 꺼져도 사라지지 않고 유지된다.
[72p]


- 아두이노에서 하나의 명령문(#define)을 제외한 모든 명령이 세미콜론(;)으로 끝난다는 것을 알아차렸는가? 이것은 컴파일러(아두이노에서 스케치를 마이크로컨트롤러가 실행할 수 있는 프로그램으로 변경하는 부분)에 현재 명령이 끝나고 새 명령이 시작함을 알려 주기 위해서 사용된다. #define으로 시작되는 줄을 제외하면, 항상 세미콜론으로 마쳐야 함을 기억하자. 컴파일러가 #define을 처리(정의된 값으로 변경)하는 때는, 아두이노 실행 파일로 변경하는 일을 수행하기 전이다. [72p]

keyword
매거진의 이전글단순함의 법칙