-
아두이노 첫 시작Reference/Arduino Reference 2020. 5. 8. 16:25
아두이노를 처음 사용해 보았을 때는 고등학교 시절이었다. 그 당시 내가 인식하던 아두이노는 초등학생들이나 중학생들이 코딩을 처음 배울 때 재미있게 배우기 위한 "교구"정도로 알고 있었다. 그렇게 접할 기회가 많이 있는 것도 아니었고 무엇보다도 수업도 실습도 너무 재미없었다.
실습도 기껏해야 고작 LED 불 켜기, 소리 내기, 모터 움직이기 정도였고 더 높은 상위의 것을 재현하고 싶었던 나는 뭔가 좀 더 "전문화된" 기기를 사용해 보고 싶었다. 내가 상상했던 것과 비교하면 LED 불 켜기는 정말로 시시해 보였던 것이다.
아두이노 로고 출처: https://ko.wikipedia.org/wiki/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8
어느 날, (유*) 대학으로 대학 탐방을 가게 되어 캠퍼스를 안내하는 대학생에게 물어보았다. 수업으로 코딩을 배우냐고.
돌아온 대답은 "안 배운다"였다. 그러나 대신 아두이노는 해본 적이 있다고 답했다.
나는 조금 혼란스러웠다. 무슨 영향력이 있기에 저런 장난감 같은 걸로 대학에서 까지 배울까? 왜 더 전문화된 기기를 배우지 않는 것일까?라고 말이다.
몇 년이 지나 내가 대학생이 되었을 때, 나도 아두이노를 다시 배우게 되었다.
그리고 또한 나는 왜 아두이노를 배워야 하는가에 대한 해답을 찾게 되었다.
아두이노를 배우는 이유
순전히 내 생각이지만, 아두이노를 배우는 것의 이유는 첫 번째로 "보이는 결과" 때문이다. 사실 이 이유는 내가 코딩을 처음 배울 때 어렵게 생각한 이유이기도 하다. 다른 언어도 물론 콘솔 창을 활용해서 결과를 직접 확인할 수 있지만, 줄이 길어지고, 중간의 코드가 꼬이면 예외인 경우를 찾거나 디버그를 하기가 까다로울 수 있다. 마치 바둑을 두는데 바둑알은 건드리지 않고 상대가 불러준 좌표값만으로 바둑판을 상상해서 두는, 그런 느낌이다.
반면에, 아두이노는 오류가 발생하거나 예외인 구문이 존재하면 LED 패턴이 원하는 대로 안 나온다던지 해서 쉽게 오류를 확인할 수 있다. 또, 짠 대로 결과물이 바로 나오기 때문에 질리기 쉽지 않다.
두 번째 이유로는 코드 문법이 상당히 간결하다. 아두이노의 언어는 C언어와 매우 유사하기 때문에, C언어에 기초적인 지식만 가지고 있다면, 코드를 쉽게 작성할 수 있다.
세 번째 이유로는 아두이노의 라이브러리나 프로젝트들이 인터넷상에 방대하게 나와있기 때문에 자료나 레퍼런스를 찾기 매우 쉽다. 사실 이 이유가 가장 큰 이유인데, 내 프로젝트에서 발생한 오류나 문제점을 인터넷에 검색하면 쉽게 해결할 수 있다. 이는 원인 모를 에러가 뜰 때, 해결책을 찾는데 필요한 시간과 노력이 훨씬 줄어든다는 것을 의미한다.
또한 쉽게 다운로드할 수 있는 점, 다운로드 후 별도의 환경변수 설정 등의 번거로움이 없다는 점들도 있다.
아두이노를 작성할 때 알아야 할 점
당연하게도 아두이노는 마이크로 컨트롤러 기반이기 때문에, 비교적 한정된 양의 메모리만 사용한다. 따라서, 최소한의 변수로 최대한의 효과를 내야 한다는 점을 유의하여야 한다. 물론 다른 프로그램도 그렇게 짤 수 있다면 좋다. 다만, 아두이노의 경우에는 다른 프로그램들 보다도 메모리가 항상 적다는 것을 인지하자는 말이다.
지역 변수, 전역 변수
아마도 이것은 모든 프로그래밍에서 통용되는 말이겠지만, 되도록이면 지역 변수를 전역 변수보다 많이 사용하는 것이 메모리 구조상 유리하다. 그렇다고 전역 변수를 꼭 지역 변수로 바꿀 필요는 없다. 바꿀 수 없는 경우도 있고.
여담으로 예전에 아두이노로 프로그램을 짜다가 지역 변수로 넣어야 하는 변수를 전역 변수에 넣은 적이 있었다. 이 때문에 값이 정상적으로 나오지 않았는데, 이 오류를 해결하지 못해서 3시간을 고민한 적이 있다. 늘 오류는 주위에 있다..
setup() 함수
아두이노를 맨 처음 켜보면, void setup()이라는 글씨가 눈에 띌 것이다. setup() 함수는 말 그대로 프로그램을 세팅하는 함수로, 프로그램을 시작하기 전 초기화나 핀 모드 설정 등을 할 수 있다. setup() 함수는 프로그램 실행 시 한 번만 호출된다.
void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(11, OUTPUT); }
가령, Serial.begin(9600) 이란 의미는 시리얼 통신을 9600의 속도로 통신한다는 의미이며, pinMode(11, OUTPUT) 은 11번 핀을 출력 모드로 설정하겠다는 의미이다.
loop() 함수
setup() 함수 바로 아래에 있는 함수는 loop() 함수이다. 이름에서부터 알 수 있듯이, 이 함수는 주기적으로 loop() 내의 코드를 실행한다. 바로 아래의 예제를 보자.
void loop() { // put your main code here, to run repeatedly: digitalWrite(11, HIGH); delay(1000); digitalWrite(11, LOW); delay(1000); }
아주 유명한 blink 예제이다. 불을 1초마다 켰다가, 끈다. 이 코드를 실행시키면, 주기적으로 불을 깜박이는 것을 확인할 수 있을 것이다.