주택용 전기 작업인 스위치, 콘센트, 분전반까지 배우고 익히면서 집의 분전반도 작업할 수 있게 전기 기능사를 공부하고 있다. 어차피 전기회로에 대해서도 공부하는김에, 가정용 전기기구나 납땜이 필요한 간단한 회로기판도 고칠 수준까지 익히는게 목표. 그러다보니, 뒤늦게 아두이노에 관심을 갖게됐다. 납땜은 아직 할 여건이 안되는데, 이건 납땜이 필요없고, 가격도 저렴하고, 빵판에 각종 센서와 부속들을 이용해 간단한 회로 구성도 쉽게 해볼 수 있다보니 매력적으로 느껴졌다. 거기다가 간단한 프로그래밍까지 칩의 GPIO같은걸 다루는 연습이랄까?
아두이노 구매
나온지 오래된 만큼, 아주 다양한 제품들이 많은데 초보자인만큼 단순하고 쉬운 아두이노 우노를 사기로 했다. 아두이노 시리즈는 회로가 다 오픈되어 있는거라, 정품이 아니라도 동등한 호환제품을 아주 저렴하게 구할 수 있다. 이런 전자부품 구하는데 알리만큼 좋은데가 없음. 쿠팡이나 이런데는 다 알리에서 파는거 수입해서 마진 남기는 거라 비싸기만 하지. 아두이노 제품 리스트는 https://www.globalwellpcba.com/types-of-arduino-boards/ 여기 설명을 참고. 아두이노의 모든 하드웨어는 공식사이트에 리스트업 되어 있다. https://www.arduino.cc/en/hardware/
가장 기본적이고 간단한게 아두이노 우노인데, R4까지 나왔다. 하지만 내가 구매한건 R3. R4부터는 가격만 올라가고 고급스러워진거 외엔 특별한게 없어 보이더라. 아두이노 붐이 몇년전에 좀 지나간 느낌이라, 자료도 R3에 관한게 제일 많다.
내가 알리에서 구매한 리스트는 다음과 같다.
빵판 및 각종 전자부품 : https://ko.aliexpress.com/item/1005008042607073.html?spm=a2g0o.order_list.order_list_main.40.521d140f9bbWg4&gatewayAdapt=glo2kor
한 묶음으로 된 스타터 키트 같은게 있긴한데, 천원마트 같은데서 3개사면 배송비 공짜같은 거 때문에 따로 구매하는게 더 끌렸음.
아두이노의 기본 모습은 다음과 같다.

정말 단순한데, PC와 USB를 통해 serial 통신으로 내가 짠 프로그램을 다운로드 하게 되며, 프로그램은 루프를 돌면서 인터페이스인 각종 핀들을 통해 센서 입력을 받고, 전압으로 액튜에이터(LED, motor, switch)들을 컨트롤 하게 된다.
하나하나 설명하진 않을거고, 공식 사이트의 문서를 보길 바란다. https://docs.arduino.cc/learn/starting-guide/getting-started-arduino/
여기선 일단, PC와 연결을 설정하고 테스트만 해보자.
linux mint에서 IDE 설치
아두이노 IDE는 1.x 버전과 2.x버전이 있다. 현시점 1.8.19 버전과 2.3.7 버전이 있다. 둘 다 써봤는데, 굳이 1.x를 쓸 이유가 없더라. 그래서 그냥 2.x 버전만 설명하겠다. 일단, 공식 사이트에서 Linux Appimage를 다운 받는다.

위 이미지는 다운로드 사이트의 다운로드 부분만 캡쳐 한 것이다. zip파일로 된걸 선택할 수도 있고, Nightly Builds로 불안정하지만, 최신 빌드를 고를 수도 있다. 우리는 고작 arduino uno라는 간단한 보드를 쓰기 때문에 고민할 필요가 없이 안정적인 버전만 쓰면 된다.
AppImage는 실행권한을 줘야 실행이 된다. 나같은 경우는 일단, AppImage는 따로 applications폴더에 모아둔다. 다운로드된 파일을 옮기고 파일 탐색기에서 권한을 주자.


IDE에서 board 와 port 선택
IDE 자체가 여러 아두이노 제품을 다 지원하기 때문에, 사용하는 보드가 무엇인지 어떤 포트에 연결된건지 선택해줘야 한다. 우선 연결하기전에 다음 명령어를 실행해보자.
$ ls -l /dev/ttyUSB*결과물이 없다. 또는 사용하는 환경에 따라 다른게 뜰 수도 있을 것이다.
아두이노를 연결하고 다시 시도해보자.
$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 1월 4 14:42 /dev/ttyUSB0
나같은 경우, 안보이던 ttyUSB0가 떴다. 기존에 다른 리스트가 있던 사람이라면, 앞의 목록과 비교해서 새로 추가된 포트가 뭔지 확인하여 아두이노의 연결 포트를 확인 할 수 있다.
이제 아두이노 IDE로 가서 tools> Board 와 tools> Port 를 설정하자.

보드는 tools> Board> Arduino AVR Boards> Arduino Uno 를 선택한다. Get Board info로 정보를 가져오는 방법이 있는거 같지만, 호환보드라서 그런지 Unknown이라고 나오므로 직접 선택해야 한다.

tools> Port에서 앞에서 터미널로 확인한 USB 시리얼 포트를 선택해준다. 내 경우는 /dev/ttyUSB0 였다.
업로드를 위한 권한 추가하기
공식 사이트에선 IDE가 시리얼 포트에 업로드를 하기위해 rule을 추가해야 한다고 한다. /etc/udev/rules.d/99-arduino.rules 파일에 다음을 추가하라고 나옴.
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", GROUP="plugdev", MODE="0666"나같은 경우, 이 과정 없이 그냥 USB 시리얼 포트 권한만 부여해서 작동 했었다. USB 시리얼 포트는 보드를 연결해야 보인다. 보드를 연결한 후, 권한 설정없이 업로드를 시도하면 다음과 같은 에러를 볼 수 있다.
can't open device "/dev/ttyUSB0": Permission denied
Failed uploading: uploading error: exit status 1우선 USB 시리얼 디바이스를 확인해보자. 다음과 같이 확인 할 수 있다.
$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 1월 4 14:42 /dev/ttyUSB0
위 내용을 보면, ttyUSB0의 소유자는 root 이며, dialout 그룹에 속한다. rw(read/write) 권한은 이들에게만 있으므로, 현재 사용자인 나를 dialout 그룹에 추가해 해결 할 수 있다.
$ sudo usermod -a -G dialout "$USER"내가 속한 그룹은 groups 또는 id 커맨드로 확인이 가능한데, 바로 확인해보면 추가되지 않는걸 볼 수 있다. 이는 로그아웃하고 재접속해야 적용된다. 재접속하여 명령을 실행해보면 다음과 같다.
$ groups
myid adm dialout cdrom sudo dip plugdev users lpadmin sambashare libvirt kvm
$ id
uid=1000(myid) gid=1000(myid) groups=1000(myid),4(adm),20(dialout),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),105(lpadmin),125(sambashare),131(libvirt),993(kvm)
위 화면에서 dialout 그룹에 속한걸 확인할 수 있다. 이제 업로드가 가능하다.
테스트로 example 실행해보기
IDE에는 제공되는 예제들이 존재한다. 빵판이나 추가 부속품 없이 확인 가능한 간단한 예제로 보드상에 존재하는 led를 깜빡이게 만드는 “Blink”란 예제가 있다. File> 불러와보자.

새로운 창이 뜨는게 좀 불만이지만, 어쨌든, 코드를 로드해 온다. 이 코드를 아두이노에선 sketch라고 부른다. 코드는 C/C++ 을 사용하며, 여기서는 작동 확인을 하기 위함일 뿐이니 코드를 볼 필요가 없지만, 그냥 간단하게만 설명하겠다.
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()는 setup() 이후에 이름 그대로 반복되서 실행된다. 어찌보면 게임엔진을 보는 기분도 들고 그런다.
setup()에서는 pinMode()가 있는데, 위에서 봤던 아두이노 우노 사진에 있는 digital pins와 analog pins에 대한 것이다. 첫번째 인자로 핀 넘버를 주고, 두번째로는 input으로 쓸지 output으로 쓸지 선택해주는 부분이다. 코드에서 “LED_BUILTIN”이라고 되어 있는데, 보드가 선택되어 있다면 매크로 정의 부분으로 가볼 수 있다. 마우스를 해당 스트링 위에 오버랩 해주면 보이기도 하고, 우클릭해서 “Go to Definition”을 선택해도 된다. Ctrl+F12로도 가능하다. 확인해보면, 13번으로 정의 된걸 알 수 있다.
#define LED_BUILTIN 13loop() 함수를 보면, digitalWrite() 가 보인다. 첫번째 인자에 핀 넘버와, 두번째 인자에 쓸 값이 들어간다. 여기서 첫번째 인자는 LED_BUILTIN으로 setup()에서 설정한 핀이 들어가고, 두번째에 HIGH/LOW 가 들어가고 있다. digital pin의경우, on/off 와같이 두 개의 스테이트만 존재한다. 여기서 HIGH가 on에 해당하고 LOW가 off에 해당한다.
익숙한 함수인 delay(1000) 도 보이는데, C에서 쓰이는 동일한 함수로 microsecond 단위로 프로그램을 쉬는 것이다. delay()가 없다면 너무 빠를 것이다.
업로드 전에 일단 코드를 컴파일하며 문제가 없는지 확인해야한다. 왼쪽 상단에 메뉴 밑 툴바에 있는 체크표시 모양의 verify 버튼을 클릭한다. 또는 메뉴에서 Sketch> Verify/Compile (Ctrl+R) 을 해도 된다.

문제가 없다면, 아래 Ouptput 패널에 다음과 같이 찍힐 것이다.

이제 verify버튼 옆의 Upload 버튼을 눌러 프로그램을 보드로 다운로드 한다. 이는 Sketch> Upload (Ctrl + U) 와 동일하다.

문제가 없다면, 다음과 같이 output 화면이 나타날 것이다.

업로드가 완료되자마자, 보드에서 ‘L’이라고 표시된 내장 LED가 1초간격으로 깜빡이는 걸 확인하면 된다. 아두이노에 첫번째 프로그램을 업로드 한 것이다. 야호!
보드에 올라간 코드 지우기
혹시나, 업로드한 프로그램을 지우고 싶을수도 있다. 따로 초기화 기능은 없는거 같고, 그냥 실행시 기본으로 뜨는 빈 껍데기코드를 업로드해주면 된다.
AppImage 를 ‘메뉴’에 추가해 편하게 사용하기
기능적인 문제는 아니고, AppImage로 되어 있는 IDE 프로그램이 그대로는 사용하기가 불편하다. 다른 설치 프로그램들 처럼 메뉴에 뜨게 만들어 쓰기 편하게 만들어 보자.
AppImage의 경우, Menu항목에 보이지 않기 때문에 수동으로 Menu에 추가해준다. 메뉴에 우클릭을 해서 “편집”을 선택한다.

메뉴 편집 창에서 왼쪽에 “개발”메뉴를 선택한다. 개발툴이니까 여기에 위치해야지. 그리고 오른쪽에 “새 항목”을 클릭해 아두이노 IDE를 추가해 보자.

위 이미지에서 왼쪽에 개발항목선택 후에 오른쪽에 “새 항목”을 클릭하면 이미지에 보이는 것과 같이 런처 속성창이 뜬다. 여기에 다운받은 아두이노 IDE를 설정하자.

위 이미지의 번호 순서를 따라 하나씩 채워보자. 우선 1) 런처 이름을 입력해주고, 2)3) 아이콘을 클릭해 표시할 아이콘을 선택해주자. 여기서 arduino-ide 아이콘을 검색해 선택했다. 4)5) 마지막으로 실행할 앱 이미지를 선택해준다. 탐색버튼을 클릭해 다운받은 아두이노 IDE 앱 이미지를 선택해준다.
확인을 누르면, 메뉴에서 arduino ide도 검색되고, 개발 메뉴에 들어간 걸 확인 할 수 있다.