아두이노와 Node.js를 이용한 IoT 프로젝트 한국기술교육대학교 전일규
아두이노는 어떤 보드인가? 아두이노는 이탈리어로 ‘강력한 친구'라는 뜻 하드웨어나 소프트웨어를 잘 모르는 디자이너나 예술가들이 사용할 수 있을 만큼 단순하고 어떤 용도로든 사용이 가능하도록 기능을 자유롭게 확장할 수 있는 저렴한 가격의 보드 MPU(Micro Processor Unit)로 아트멜의 칩을 사용 USB를 통해 프로그래밍이 가능하며 여러 센서와 액츄에이터들을 연동할 수 있는 싱글 마이크로컨트롤러 보드
아두이노는 어떤 보드인가? 아두이노를 다루기 위해 특별한 장비가 필요하지 않다 프로세싱이라는 IDE를 사용해 C/C++를 프로그램 할 수 있다 기존의 AVR 소스도 그대로 가져와 사용 가능 아두이노의 핀과 연결한 뒤 프로그램을 작성하면 그대로 동작
아두이노 스펙
아두이노의 특징(장점) 저렴한 가격 오픈소스 하드웨어 간단한 개발 환경 아두이노를 쉽게 접할 수 있는 여지를 제공 = 대중화 보드의 회로도를 Creative Common 라이선스로 공개 아두이노가 보편화돼 관련 자료들도 쉽게 구할 수 있게 되었다 간단한 개발 환경 아두이노는 AVR을 기반으로 한 보드이다 프로세싱 기반의 IDE를 적용해 프로세싱만큼이나 간단하게 개발을 진행
아두이노의 특징(단점) 성능과 기능의 한계 테스트의 어려움 이러한 단점들을 Node.js를 통해 보완하려는 것이 이 글의 목적 아두이노는 MPU을 사용하고 있는데, 아두이노 우노는 고작 16MHz의 속도로 동작 스토리지가 작아 조금만 복잡한 코드를 작성해도 업로드조차 되지 않는 경우가 발생 테스트의 어려움 IDE를 이용해 쉽게 작성이 됐다고 해도 컴파일이나 업로드, 테스트 과정이 쉽지는 않다 애플리케이션을 작성할 때 요구되는 테스트 코드 역시 존재하지 않는다 테스트 코드를 작성하고 실행하는 것이 어렵다 이러한 단점들을 Node.js를 통해 보완하려는 것이 이 글의 목적
아두이노의 인터페이스와 API
아두이노의 인터페이스와 API 디지털 I/O 아두이노의 핀 레이아웃 중 가장 많은 핀이 배정 디지털 신호들, 소위 0, 1로 대변되는 신호를 감지하거나 반대로 신호를 외부로 보낼 때 사용 표적으로 버튼, LED, LCD 등과 같이 디지털 신호를 주고 받을 때 사용 디지털 핀은 입력과 출력이 같은 핀에서 이뤄지기 때문에 사용 전에 pinMode로 입출력 여부를 지정해야 한다. pinMode() : 디지털 핀의 입력 혹은 출력을 설정함. digitaIRead() : 외부의 신호를 읽음. 5V이면 HIGH(1), 0V이면 LOW(0)을 반환함. digitalWrite() : 외부에 신호를 보냄.
아두이노의 인터페이스와 API 아날로드 I/O 외부의 아날로그 값들을 읽기 위한 핀 이 핀은 외부의 아날로그 신호를 감지해 0~1023 사이의 값으로 변환 아두이노 우노는 아날로그 출력을 하지 못한다 디지털 보드로 아날로그를 표현하기 위해 PWM을 사용한다. analogRead() : 외부의 아날로그 신호(전압)를 받아 디지털 값으로 읽음 analogWrite() : PWM을 이용해 아날로그 신호를 외부로 보냄. 입력 값으로 0~255 사이의 값을 파라미터로 받음
아두이노의 인터페이스와 API SPI(Serail Peripheral Interface) 이를 위해서 4개의 선이 필요하며, ICSP(In Circuit Serial Programming)로 지원된 핀을 사용하거나 디지털 핀 가운데 10, 11, 12, 13 핀을 사용 SPI library : SPI 통신을 위한 라이브러리
아두이노의 인터페이스와 API I2C(Inter-Integrated Circuit) SPI와 마찬가지로 2개 이상의 아두이노 보드를 연결할 때 사용되며, 칩 간의 데이터를 전송하기 위해 사용 2개의 선만으로 간단히 구성할 수 있어 많이 사용 SPI 방식에 비해 속도가 느려 빠른 데이터 교환이 필요치 않은 경우에 사용 I2C 역시 SPI와 마찬가지로 별로의 라이브러리가 제공 Wire library : I2C를 위한 통신용 라이브러리
아두이노의 인터페이스와 API 시리얼 통신 USB와 같은 직렬 통신 방법 중 하나로 아두이노 보드와 PC 간의 데이터 통신에 사용 개발보드에서 디버깅용으로 많이 사용되는 기본 인터페이스 이 방식은 표준 자체가 오래돼 보편적이면서 TX, RX와 같이 2개의 선만 있으면 되기 때문에 구성도 간단 아두이노는 디지털 핀 0과 1을 시리얼 포트에 사용하고 있다. 따라서 시리얼 통신을 하게 된다면 디지털 핀 0과 1은 사용할 수 없다. Serial library : 시리얼 통신용 라이브러리
시리얼 통신을 이용해 아두이노와 Node.js 연결하기 따라서 2개의 별도 시스템을 구성해야 한다. 하나는 Node.js가 실행될 마스터이고 하나는 마스터의 명령을 수행할 슬레이브다. 이 두 시스템은 시리얼 케이블로 연결돼 시리얼 통신을 하게 된다. PC가 마스터 노드가 되도록 아두이노를 USB로 연결했다. 운영체제 Node.js 아두이노 시리얼 통신
아두이노 라이브러리-firmata Node.js와 아두이노 간의 명령이나 데이터를 교환하는 프로토콜을 구현 MIDI 프로토콜을 기초로 만들어진 프로토콜 이 방식을 지원하는 언어에서 다양한 라이브러리로 제공 프로토콜을 표준화하고 있어 Node.js 외에 다양한 언어로 구현된 라이브러리들이 존재 디지털 I/O, 아날로그 I/O뿐 아니라 I2C와 SPI통신 API도 지원
아두이노 라이브러리-duino Node.js와 아두이노 간의 명령이나 데이터를 교환하는 프로토콜을 구현 프로토콜 구조가 간단하고 쉬움 프로토콜의 지원 범위가 한정돼 있어 기능을 확장하기 위해 코드를 수정 자체 프로토콜을 사용하고 있어 Node.js 외에 언어를 사용하려면 라이브러리를 작성 디지털 I/O와 아날로그 I/O, 서보모터 등 기본적인 API만 지원
아두이노에 duino 코드 업로드 하기 duino를 사용하기 위해서 아두이노에 duino 프로토콜을 해석할 수 있는 프로그램을 설치 아두이노 프로그램을 아두이노 IDE에 업로드 du.ino가 아두이노 보드에 올라가면 아두이노 IDE가 필요 없게 된다.
예제1 - 버튼을 눌러 LED에 불 켜기
예제2 - 버튼을 눌러 LED에 불 켜기
시리얼 연결 방식의 문제와 해결 방법 Node.js가 실행되는 OS는 실시간 OS가 아니기 때문에 정밀도가 요구되는 상황에서 적용하기 어렵다. 첫 번째 해결 방법은 아두이노가 실행할 명령을 한 번에 주고 실행시키는 방식이다. 명령마다 매번 통신해서 명령을 전달하고 실행하는 것이 아니라 명령을 하나의 단위로 묶어 전달한 뒤 실행시키는 방법이다. 두 번째 해결 방법은 실시간성이 필요한 코드를 미리 아두이노에 개발해 놓는 방식이다. 명령을 너무 세부적으로 하지 말고, 하나의 명령으로 만든다. 예를 들면 LED를 제어하기 위해 핀 번호를 설정하면 불이 켜지는 명령을 따로 하는 것이 아니라 이를 하나의 명령으로 만들어 문제를 해결한다.
정리 Node.js의 장점은 기능의 확장성에 있다. NPM을 통해 수만 개의 모듈이 제공되고 있다. Node.js는 기본적인 file I/O 기능, 바이너리 데이터를 위한 Buffer 클래스 등 최소한의 기능을 제공하면서 시스템의 안정성에 무게를 두었다. 이외에도 고급 기능들은 NPM으로 관리되는 모듈이 제공된다.