2016년 6월 30일 목요일

아두이노 회로도

구글 등에서 아두이노를 검색해보면 많은 회로들을 찾을 수 있습니다.
음악의 기본이 악보를 보는 것처럼 하드웨어의 기본은 회로도를 보는 것입니다.
본래, 회로도는 OrCAD와 같은 전용 회로도 작성 프로그램으로 만들어집니다.

이와 같은 형식의 회로도는 비 전문가가 보기 힘들기 때문에 그림 형식의 아두이노 회로도가 널리 사용됩니다.

이런 회로도를 실제 부품을 이용해서 구현할 수 있어야 아두이노를 해볼 수 있습니다.
전자 회로를 전공하지 않은 사람의 경우 무작정 따라하다가 실수를 할 수 있기에 기본 상식을 갖추는 것이 좋습니다.
소프트웨어는 실수를 해도 프로그램이 멈추는 정도로 끝나지만, 하드웨어는 실수로 망가뜨려서 재산 상의 손실이 발생할 수 있으므로 주의하는 것이 좋습니다.


VCC와 GND
모든 회로는 (+)극에서 시작하여 (-)극으로 끝납니다. 전자 회로에서는 (+)극을 VCC라 부르고 (-)극을 GND라 부릅니다.
VCC는 항상 전압 크기를 같이 표기하는데, 예를 들어 VCC(5V) 등으로 표기합니다. VCC를 생략하고 5V로만 표기하는 경우도 있는데 모두 (+)극을 의미합니다.
GND는 Ground라고 발음하며 전압의 크기와 상관 없이 모두 공통으로 사용합니다.
이 말은 회로 상에서 GND1, GND2등의 구별 없이 1개의 GND로만 불리기에 GND라 표기되어있는 것은 모두 연결해야 합니다. 이것을 공통 그라운드(Common Ground)라 말합니다.


5V와 3.3V
디지털 전자 회로는 5V 혹은 3.3V 방식 2가지 중 하나로만 사용됩니다. 아두이노로 사용할 수 있는 대부분의 회로는 5V로 작동하지만, 간혹 3.3V로 작동하는 장치들도 있으니 잘 구분하여 사용해야 합니다.
아두이노는 5V로 작동하며 USB가 5V로 전원을 공급하므로 USB를 전원 장치로 사용하고 있습니다.


외부 전원
간혹, 외부 전원으로 작동해야 하는 경우가 있는데, 여기서 말하는 외부 전원이란 배터리나 어댑터 등을 통해 전원을 공급받는 것을 말합니다. 외부 전원을 사용한다면 USB연결 없이도 아두이노 보드는 독립적으로 작동할 수 있습니다.
아두이노 보드는 외부 전원을 연결하기 위한 커넥터가 존재하며 회로 내부에 안정적인 5V를 공급할 수 있는 레귤레이터란 부품이 있기때문에 5V를 맞춰서 전원을 연결할 필요가 없습니다.
7V ~ 15V까지의 어떤 전압이라도 외부 전원으로 연결 가능합니다.


쇼트(Short)
전자 회로에서 쇼트는 (+)극과 (-)극이 직접 연결되는 것을 말하며 이런 일이 발생하면 회로에 엄청난 전류가 흘러 부품이 타버리는 불상사가 일어납니다.
이런 일이 주로 발생하는 경우는 다음과 같습니다.
  • 전원을 연결한 채로 회로를 구성하다가 실수로 VCC에 연결된 전선과 GND에 연결된 전선이 닿음.
  • 전선의 납땜 부위를 제대로 막아놓지 않아서 서로 붙어버림.
  • 회로 구성을 잘못하여 VCC와 GND가 서로 연결됨.
위 경우의 공통점은 모두 실수와 부 주의라는 것입니다. 하드웨어는 실수가 곧 재산 상의 피해로 이어질 수 있으니 매우 주의해야 합니다.
아두이노 보드는 이런 실수에 대한 피해를 막기 위해 쇼트가 일어나면 자동으로 전원이 차단되는 기능이 들어가있습니다. 이것은 일종의 퓨즈(Fuse)와 같은 것으로 저가형 아두이노 보드는 이런 기능이 제대로 갖춰지지 않아서 실수가 곧 보드가 망가지는 피해로 발생할 수 있습니다.


브레드 보드(Breadboard)
브레드 보드는 납땜없이 아두이노 회로를 꾸밀 수 있는 기판입니다.


브레드 보드에 나와있는 수 많은 구멍들은 서로 연결되어 있기 때문에 연결 배선을 잘 기억해야 올바른 회로를 구현할 수 있습니다.

위 그림과 같이 주로 VCC와 GND의 분배 용으로 사용되는 제일 위와 아래 블럭은 가로로 연결되어 있고, 주로 부품 연결용으로 사용되는 중간 블럭은 세로로 연결되어 있습니다.
이 말은 서로 연결된 구멍에 전선을 꽂으면 회로적으로 연결된 것과 같다는 뜻입니다.


핀 맵(Pin out)
회로에 사용되는 모든 부품은 핀(Pin)이라 부르는 전선을 연결하기 위한 부분이 존재합니다. 소프트웨어적으로 본다면 일종의 인터페이스라 생각할 수 있습니다.

각 핀은 명칭이 있으며 용도가 정해져 있습니다. 현재 사용 중인 부품의 핀에 대한 정보를 알기 위해서는 데이터 시트(Datasheet)라 부르는 문서를 봐야 합니다. 칩이 아닌 LED와 같은 부품들도 핀 맵이 있습니다.

아두이노 보드도 이 핀 맵이 있기에 사용자는 반드시 숙지해야 합니다. 이 핀 맵에 맞게 회로를 연결해야 문제 없이 잘 작동할 수 있습니다.


아두니티(ARDUnity) 시리얼 통신

아두니티의 시리얼 통신에 대해 좀 더 깊게 다루겠습니다.

시리얼(Serial) 통신
시리얼 통신은 하나의 선으로 데이터를 전송하는 방식으로 기기간 통신에 있어서 가장 간단하면서 기초적인 기술입니다.

1 비트(bit)는 2가지 상태로 표현이 가능하므로 이를 순서대로 나열하면 1 바이트(Byte)의 경우 8번의 상태 변화로 데이터를 전송할 수 있습니다.
통신이 더 안정적으로 이루어지기 위해 전송 시작과 끝을 알려주는  Start Bit와 Stop Bit가 존재합니다. Parity Bit은 전송된 데이터에 오류가 있는지 판정 용으로 사용됩니다.
실제 기기간 연결은 송신용 선(TX)과 수신용 선(RX)의 2개 선을 사용하여 서로 꼬임 형태로 연결합니다.


보레이트(Baudrate)
시리얼 통신의 관건은 Bit 판정의 주기입니다. 즉, 두 기기가 같은 속도록 Bit를 판정해야 올바른 데이터를 주고받을 수 있습니다. 보레이트는 이 판정 주기를 의미합니다.
보레이트의 단위는 bps(Bit per Seconds)이며 값이 클수록 데이터 전송 속도가 높아집니다.
사실, 보레이트는 두 기기간에 같은 속도만 가지면 되지만 보다 범용적으로 사용될 수 있도록 국제 규격이 존재합니다.
가장 많이 사용되는 보레이트는 다음과 같습니다.
  • 9600 bps
  • 19200 bps
  • 38400 bps
  • 57600 bps
  • 115200 bps
예전 모뎀을 사용하셨던 분들은 위의 숫자가 익숙할 텐데, 그때는 모뎀의 성능을 위의 전송 속도로 표현했습니다.

UART(Universal Asynchronous Receiver/Transmitter)
시리얼 통신은 아주 기초적이면서 광범위하게 사용되는 통신 방식이기에 대부분의 하드웨어는 이를 지원합니다.
대부분의 마이크로 컨트롤러는 UART라 부르는 장치를 내장하고 있는데, UART의 역할은 시리얼 통신을 하드웨어적으로 처리해줍니다.
아두이노에도 마찬가지로 이 UART가 있습니다.
아두이노 보드 시리즈의 사양을 확인하면 UART의 개수를 알 수 있는데, UART의 개수가 곧 아두이노 보드에 연결될 수 있는 통신 장치의 수라고 생각할 수 있습니다.
가장 많이 사용되는 아두이노 Uno의 경우 UART는 1개이고, 아두이노 Mega의 경우는 UART가 3개 있습니다.


USB2Serial
PC에서는 UART를 사용할 수 없고 USB를 UART로 변환해주는 컨버터를 사용해야 하는데, 이것을 USB2Serial이라 부릅니다.
아두이노에는 USB2Serial 장치가 내장되어 있고, 이것때문에 아두이노 보드가 USB로 PC에 연결되는 것입니다.

PC에서 USB2Serial이 인식되기 위해서는 드라이버가 필요한데, Arduino IDE를 설치하면 대부분 자동 설치되고 FTDI Chip사의 USB2Serial은 대부분의 OS에 기본 내장되어 있어서 별도의 드라이버 설치 없이 자동 인식됩니다.
다만, 별로 유명하지 않은 제조사의 USB2Serial의 경우는 사용자가 직접 드라이버를 구해서 설치해야 하는 번거로움이 있습니다.
저가형 아두이노 보드의 경우 대부분 유명하지 않은 USB2Serial을 사용하는 경우가 많습니다.

Arduino Stream Class
아두이노에서 외부와 통신하기 위해 사용되는 라이브러리를 Stream Class라 부릅니다.
가장 기본적인 시리얼 통신은 UART를 사용하게 되고, 이것을 위해 Serial Class를 제공합니다.
UART가 여러개 있는 아두이노 보드는 Serial0, Serial1, Serial2와 같이 각각 구별하여 사용할 수 있습니다.
아두니티는 아두이노에서 유니티와 통신하기 위해 사용하는 Stream Class를 선택할 수 있는 옵션을 제공합니다.

아두니티에서 제공하는 선택 가능한 Stream Class 종류는 다음과 같습니다.
  • Serial: UART0
  • Serial1: UART1
  • Serial2: UART2
  • Serial3: UART3
  • SoftwareSerial: UART가 아닌 직접 TX, RX 핀을 사용하는 경우
  • AltSoftSerial: AltSoftSerial Library를 사용하는 경우
  • Bridge: Arduino Yun 보드의 경우

CommSerial Baudrate
유니티에서 시리얼 통신을 사용하려면 아두니티 CommSocket인 CommSerial을 추가하면 됩니다.
CommSerial의 Inspector View에서 메뉴를 보면 Baudrate가 있는데, 이것은 바로 PC의 Baudrate 설정입니다.

ArdunityApp에서 Sketch Option에 Baudrate가 있는데, 이것은 아두이노 보드의 Baudrate이므로 PC와 상관없습니다.
앞에서 두 기기간 시리얼 통신이 이루어지려면 Bit 판정 주기인 보레이트가 같아야 한다고 말했듯이 ArdunityApp의 보레이트와 CommSerial의 보레이트가 서로 같아야 통신을 할 수 있습니다.


2016년 6월 29일 수요일

아두니티(ARDUnity) 시작하기

아두니티 에셋이 유니티 프로젝트에 임포트(Import)되면 상단 메뉴에 ARDUnity 관련 메뉴가 나타납니다. 또한, Project View에 ARDUnity 폴더가 생긴 것을 확인할 수 있습니다.
(만약, 임포트 에러가 해결되지 않는다면 메뉴가 나타나지 않습니다. <해결 방법 보기>)

아두니티의 메뉴는 다음과 같습니다.
  • Wire Editor: 아두니티 전용 편집기
  • Add Utility: 유용한 기능들
  • PlayMaker Add-on: PlayMaker 사용자를 위한 Add-on
  • View User Guide: 사용자 설명서 보기
  • Online Document: 온라인 문서 사이트 가기
  • About ARDUnity: 버전 정보 확인

아두니티 에셋 폴더 구성은 다음과 같습니다.
  • Arduino: 아두이노 라이브러리
  • Examples: 아두니티 예제
  • Plugins: 멀티 플랫폼 빌드를 위한 플러그인
  • Resource: 예제에 사용된 리소스
  • Scripts: 아두니티 C# 소스

유니티 씬(Scene)에서 아두니티를 사용하려면 아두니티 컴포넌트를 GameObject에 추가해야 합니다. 아두니티 컴포넌트를 추가하는 방법은 2가지가 있습니다.
  1. Wire Editor의 메뉴를 이용하는 방법
  2. 유니티 Add Component 메뉴를 이용하는 방법

Wire Editor 메뉴를 이용하는 방법
Wire Editor Window를 띄운 후 적당한 위치에 Docking시키고, 마우스 오른쪽 버튼을 누르면 메뉴가 나타납니다.

유니티 Add Component 메뉴를 이용하는 방법
유니티 상단 메뉴 혹은 GameObject의 Inspector View의 Add Component를 이용해서도 아두니티 컴포넌트를 추가할 수 있습니다.

아두니티 컴포넌트를 추가할 때 메뉴가 비활성화 된 경우가 있는데, 이런 경우는 다음과 같습니다.
  1. GameObject가 선택되지 않은 경우
  2. 해당 아두니티 컴포넌트가 필요로하는 컴포넌트가 없는 경우

그럼, 아두니티를 Scene에서 사용하기 위해 시작해보겠습니다.
먼저, Empty GameObject를 하나 만든 후 이름을 Ardunity라 변경합니다.
그 다음 Ardunity GameObject를 선택한 후, Wire Editor에서 메뉴를 띄워 ARDUINO/Add ArdunityApp을 선택합니다.
그러면 Ardunity GameObject에 ArdunityApp이란, 컴포넌트가 추가된 것을 확인할 수 있으며 Wire Editor상에도 ArdunityApp Block이 나타납니다.




ArdunityApp은 연결할 아두이노 보드를 의미하고 Scene에 반드시 1개 이상 있어야 합니다. 아두이노 보드 당 1개 씩인데 만약, 여러 개의 아두이노 보드를 연결하려 하면 보드 개수만큼 ArdunityApp이 Scene에 존재해야 합니다.
다음으로 할 일은 아두이노 보드와 통신할 CommSocket을 추가하는 것입니다.
아두니티가 지원하는 통신 방식은 다음과 같습니다.
  • USB2Serial: CommSerial (Windows/OSX)
  • Bluetooth: CommBluetooth (Android) <Deluxe 버전만 가능>
  • BLE: CommBLE (OSX/Android/iOS) <Ardunity Brain 보드만 가능>
  • TCP/IP: CommWiFi (Windows/OSX/Android/iOS) <Deluxe 버전만 가능>
가장 기본적인 연결은 USB 케이블을 통한 USB2Serial 통신이기에 CommSerial을 추가하면 됩니다.

CommSocket을 추가하려면 반드시 ArdunityApp이 추가되어 있어야 메뉴가 활성화되며, Wire Editor 메뉴에서 Unity/Add CommSocket/CommSerial을 선택합니다.




이제 ArdunityApp이 CommSocket을 사용할 수 있도록 서로 연결시킵니다.
ArdunityApp의 붉은색으로 표시된 CommSocket을 클릭한 후 드래그하여 CommSerial의 CommSocket에 드롭하면 서로 연결됩니다.

다음으로 할 일은 아두이노 보드에 스케치를 업로드하는 것입니다. (스케치가 업로드에 대해 궁금하면 관련글 보기)
ArdunityApp 컴포넌트 메뉴를 보면 Export Sketch가 있습니다. 이 메뉴는 바로 Wire Editor상의 편집 내용을 아두이노 스케치로 자동 생성해주는 기능입니다.
이 메뉴를 선택하여 PC의 적당한 위치에 아두이노 스케치 코드를 만듭니다.
(주의: 스케치 코드 생성 시 이름은 함수나 변수 이름 명명 규칙과 같이 숫자가 먼저오거나 띄어쓰기를 하면 안되고 영어로 작성해야 합니다.)
만들어진 아두이노 스케치를 Arduino IDE를 이용해서 열어보면 코드가 이미 작성되어 있는 것을 확인할 수 있습니다.

이것을 아두이노 보드에 업로드시키면 유니티와 아두이노를 연결할 준비는 끝납니다.

이제 아두이노 보드와 유니티를 연결해봅시다.
먼저, 유니티의 Play버튼을 눌러 Scene을 실행합니다.
ArdunityApp의 컴포넌트 메뉴를 보면 Connect 버튼이 나타난 것을 확인할 수 있습니다.

이 Connect버튼을 누르기 전에 CommSerial의 포트를 선택해야 합니다.

Search버튼을 눌러 포트 자동 검색을 시킨 후, Dropdown 버튼을 눌러 포트를 선택하면 됩니다.
포트 선택을 했다면 이제 ArdunityApp의 Connect버튼을 눌러 아두이노 보드와 연결되는 지 확인합니다.
연결이 된다면 fps부분에 현재, 통신 주기가 표시됨을 확인할 수 있습니다.

매번 포트 선택과 Connect버튼 누르는 것이 귀찮다면 ArdunityApp의 AutoConnect 옵션을 이용해서 유니티가 실행되면 자동으로 연결되는 기능을 사용해도 좋습니다. (자동 연결이 되려면 포트 선택은 미리 해두어야 하며, 보드는 연결되어 있어야 합니다.)

또한, 유니티 Build이후 통신 상태를 점검할 수 있도록 Debug기능을 제공합니다. 이것은 Game View화면에 ArdunityApp의 상태가 출력되는 기능입니다.

현재, 아두니티는 그냥 보드와 연결만 될 뿐 아무 동작도 하지 않습니다. 그 이유는 아직 아무 기능도 붙이지 않았기 때문입니다.
이제 하나씩 활용하는 방법을 포스트하겠습니다.


2016년 6월 28일 화요일

아두니티(ARDUnity) 아키텍처

아두니티는 다음과 같은 아키텍처를 갖고 있습니다.

아두니티는 아두이노 스케치와 유니티 컴포넌트가 상호작용할 수 있도록 ArdunityApp과 ArdunityController라는 공통 코드 체계를 갖고 있습니다.
따라서, 아두니티 어플리케이션을 만들기 위해서는 이 공통 체계를 반드시 사용해야 합니다.
사용자는 이 구조를 확장하기 위해서 상속(Inheritance) 개념을 통해 파생된(Derived) 코드를 만들어 사용할 수 있습니다.
아두니티에는 기본적으로 가장 잘 사용될 수 있는 기능들을 이미 파생된 코드로 내장하고 있습니다. 만약, 제공된 기능만으로 만족할 수 없는 경우 오픈 소스로 공개된 파생된 코드를 참고하여 자기만의 파생된 코드를 만들어 추가할 수 있습니다.

아두이노 스케치에 필요한 Class들은 아두니티 에셋의 Arduino 폴더에 있습니다.
아두이노 Class들은 C++로 작성되어 있으며 스케치 자동 생성 시 사용 여부에 따라 외부로 Export됩니다.
아두이노 Class들은 실제로 하드웨어를 제어할 때 아두이노 라이브러리를 사용합니다.
따라서, 아두이노 호환 보드에서는 이 코드들이 하드웨어 의존적이지 않게 잘 동작할 수 있는 것입니다.

아두이노 스케치는 외부와 통신할 때 아두이노 라이브러리 중 Stream이라 불리는 라이브러리를 사용합니다. 아두니티 또한 이 Stream 라이브러리를 통해 외부와 통신합니다.

유니티는 외부와 통신하기 위해 Serial, Bluetooth, WiFi등 다양한 방법을 사용할 수 있는데, 이것들을 손쉽게 사용하기 위해 아두니티에서는 CommSocket이라는 컴포넌트를 제공합니다.
통신 방식과 프로토콜은 완벽하게 분리되어 있기 때문에, CommSocket만 바꾸면 쉽게 통신 방식을 바꿀 수 있습니다.
이 말은 통신 방식이 바뀌었다고 어플리케이션을 다시 만드는 것이 아니라 그냥 CommSocket만 바꿈으로써 쉽게 변경할 수 있다는 뜻입니다.

아두니티를 사용하려면 반드시 ArdunityApp과 ArdunityController를 사용해야 합니다. ArdunityController는 파생될 수 있으며, 실제로 Controller란 이름으로 많이 사용되는 기능들이 파생 Class로 구현되어 제공됩니다.

아두니티에서는 아두이노 보드와 주고받을 데이터를 보다 사용하기 쉽게 가공할 수 있는 유용한 기능들을 제공합니다.
이것의 종류는 다음과 같습니다.
  • Bridge: 주로 Controller와 직접 연결되어 사용하기 쉽게 데이터를 가공하는 역할
  • Reactor: 별도의 프로그래밍없이 바로 유니티 컴포넌트를 제어할 수 있는 역할
  • Utility: 유용하게 사용될 수 있는 기능들을 제공

아두니티는 프로그래밍에 익숙치 않은 아티스트들도 사용할 수 있도록 PlayMaker를 지원합니다.


아두니티를 PlayMaker로 제어하려면 PlayMaker Add-on을 추가 설치해야 합니다.
이를 위해 아두니티는 PlayMaker Add-on 설치를 할 수 있는 메뉴를 제공합니다.
PlayMaker Add-on이 설치되면 다음과 같은 PlayMaker용 기능을 볼 수 있습니다.

  • Proxy: 아두이노 보드의 입력을 Event로 전달해주는 대리자
  • Action: PlayMaker FSM의 State에서 Controller제어에 사용할 수 있는 기능

또한, 아두니티의 모든 기능은 추가 컴포넌트 개발을 최소화하기 위해 일어나는 모든 이벤트를 UnityEvent로 만들었기 때문에 Editor상에서 컴포넌트 연결을 손쉽게 할 수 있습니다.

아두니티(ARDUnity) 임포트 에러 해결

아두니티 에셋을 프로젝트에 임포트시키면 다음과 같은 에러가 대부분 나타나게 됩니다.

이 에러의 의미는 유니티에서 하드웨어 통신에 필요한 .Net SerialPort Class를 찾을 수 없다는 뜻입니다.

아두이노 보드와 PC를 연결하는 가장 기본적인 방법은 USB로 연결하는 것입니다.
Arduino IDE에서도 설정했었던 Serial Port는 아주 오래전부터 사용해온 PC와 외부 하드웨어 사이의 통신 방식입니다.
오래전 PC를 보면 RS-232 혹은 직렬(시리얼) 포트라는 커넥터가 있었습니다.

대부분의 하드웨어는 이 시리얼 포트를 통해 연결되고 PC 어플리케이션과 통신했습니다.
하지만, PC가 점차 슬림해지면서 이 시리얼 포트는 거추장하여 사라져갔고, USB로 병합되었습니다.
USB통신 방식은 시리얼 통신에 비해 프로그래밍이 까다로웠기 때문에 하드웨어 개발자들은 여전히 시리얼 통신을 선호했고, 그 결과 USB2Serial이란 컨버터가 등장하기 시작했습니다.

아두이노 보드에는 바로 이 USB2Serial 컨버터가 내장되어있기에, USB로 연결되었다 하더라도 OS상에서는 시리얼 포트로 잡히게 됩니다.
Windows에서는 시리얼 포트 이름을 COM1, COM2... 방식으로 매기며, Linux나 Mac의 경우는 dev/tty 혹은 dev/usbserial 등으로 매기게 됩니다.

어찌되었건 유니티와 아두이노 보드가 통신하기 위해서는 가장 기본적인 방식인 USB2Serial을 사용해야 하고, 이것은 유니티가 채용한 Mono(.Net)의 Serial Port Class를 통해 접근할 수 있습니다.
문제는 유니티의 기본 설정이 App의 용량을 줄이고자 게임에 필요한 핵심 기능만으로 구성된 .Net Subset이란 Light 버전을 사용하고 있다는 점입니다.
안타깝게도 .Net Subset엔 Serial Port가 빠져있기 때문에 Serial Port를 사용하는 C# 코드가 있는 경우 위와 같이 에러를 내보내는 것입니다.

이 문제를 해결하기 위해서는 .Net Subset이 아닌 .Net을 선택하도록 프로젝트 설정을 바꿔야 합니다.
우선, 이 옵션의 위치는 다음과 같습니다.
  1. 에디터 상단 메뉴 선택 (Edit->Project Settings->Player)
  2. Inspector View에서 'Others Settings' 탭을 찾는다.
  3. 'Optimization/API Compatibility Level' 항목을 찾는다.
  4. '.Net 2.0 Subset'을 '.Net 2.0'으로 바꾼다.


이 설정을 마치면 에러는 없어집니다.




아두니티는 시리얼 통신 뿐 아니라 Bluetooth나 WiFi같은 통신 방식도 지원합니다.
앞으로 이런 방식을 활용할 수 있는 방법을 설명하겠습니다.

2016년 6월 27일 월요일

아두니티(ARDUnity) 소개

아두니티는 아두이노(Arduino)와 유니티(Unity)의 합성어로 유니티에서 아두이노를 할 수 있도록 만든 유니티 에셋입니다.

현재, 아두니티는 유니티 에셋 스토어를 통해 얻을 수 있습니다.
아두니티는 Basic과 Deluxe로 에디션이 나뉘어있는데, 그 목적은 다음과 같습니다.

아두이노 스케치 자동 생성
아두니티의 가장 큰 특징 중 하나는 바로 아두이노 작동에 필요한 스케치를 자동 생성해준다는 것입니다. 유니티는 C#기반 개발 환경입니다. 하지만, 유니티는 C#을 다루는 프로그래머가 아니더라도 결과를 낼 수 있는 여러 기능들을 갖고 있으며 이것이 유니티의 강점이라고 생각합니다.
아두이노는 C/C++기반 개발 환경이기에 반드시 C/C++ 언어를 배워야만 결과를 낼 수 있습니다.
물론, 전통적인 임베디드 개발에 비교해서는 아두이노가 아주 쉬운 것이지만, 유니티를 사용하는 아티스트의 경우 프로그래밍 언어를 배운다는 것은 큰 부담이 아닐 수 없습니다.
또한, 유니티와 아두이노가 서로 유기적으로 작동하기 위한 프로토콜을 만들어야 하므로 프로그래밍을 하는 것은 더 어렵습니다.
이에 아두니티는 유니티에서 아두이노 스케치를 자동 생성할 수 있는 기능을 제공합니다.
또한, 아두니티의 각 컴포넌트들은 아두이노 스케치를 섬세하게 다룰 수 있도록 스케치 옵션을 제공하기에 아두이노 스케치를 다루지 않아도 큰 불편함이 없습니다.

Wire Editor
유니티는 컴포넌트기반 프로그래밍을 지향하기에 아두니티의 모든 기능도 컴포넌트로 제공됩니다.
아두니티 컴포넌트는 마치 하드웨어처럼 서로 연결되어 작동할 수 있도록 설계되었습니다. 이에 유니티 게임 오브젝트에 추가된 각 컴포넌트들을 연결할 수 있는 Wire Editor가 있어서 매우 편리하게 사용할 수 있습니다.

오픈 소스
아두니티의 모든 컴포넌트는 오픈 소스입니다. 이 말은 각 컴포넌트 소스를 참고하여 수정하거나 새로운 것을 만들어낼 수 있다는 뜻입니다.
수정되거나 새로 개발된 컴포넌트는 에셋 스토어를 통해 재 판매될 수도 있습니다.

하드웨어 독립적
아두니티는 아두이노 호환 모든 보드에서 작동될 수 있습니다. 심지어는 아두이노가 아닌 보드에서도 적절히 포팅만 된다면 작동될 수 있도록 모든 코드를 하드웨어 독립적으로 만들었습니다.



아두니티는 아두이노와 유니티를 단순히 연결만 하지 않았습니다. 매우 유연하고 확장성있는 아키텍처를 가지고 수 많은 활용 예를 만들어내는 데 탁월할 것입니다.

2016년 6월 24일 금요일

아두이노 스케치(Arduino Sketch)

아두이노 보드를 가지고 있다면, 다음으로 해야 할 일은 아두이노 개발 환경을 PC에 설치하는 것입니다.
아두이노 개발 환경은 Arduino IDE라 부르며, 공식 사이트(www.arduino.org)에서 무료로 다운로드 받을 수 있습니다.
아두이노 보드는 기본적으로 PC와 USB로 연결되기에 USB 드라이버가 필요합니다. 대부분의 호환 보드는 Arduino IDE 설치 시 같이 설치되는 USB 드라이버로 인식되지만, 저가형 중국산 아두이노 보드의 경우는 별도로 USB 드라이버를 구해야 할 수 있습니다.
어찌되었건 Arduino IDE를 설치하면 다음과 같이 실행됨을 볼 수 있습니다.

아두이노 보드도 컴퓨터이므로 프로그램이 있어야 작동합니다.
Arduino IDE의 역할은 바로 이 프로그램을 작성하고 완성된 프로그램을 보드에 옮겨주는 업로드(Upload)란 작업을 해 주는 것입니다.
Arduino IDE에서 작성되거나 수정할 수 있는 프로그램 소스를 바로 아두이노 스케치(Arduino Sketch)라 부릅니다.

아두이노 스케치는 C/C++ 문법으로 작성됩니다.
즉, 이 말은 C 혹은 C++ 문법으로 프로그래밍해야 한다는 뜻입니다.
안타깝게도 C/C++ 문법을 모른다면 약간의 노력을 들여서 공부해야 합니다.

메뉴를 살펴보면 기본적으로 테스트할 수 있는 예제를 제공합니다.

만약, 스케치를 다 작성했다면, 다음으로 할 일은 보드의 종류를 선택하는 것입니다.
아두이노 공식 사이트에서 확인했듯이 아두이노 보드는 종류가 많습니다. 따라서, 현재 작성된 스케치가 어느 보드에서 작동할 것인지 설정할 필요가 있습니다.

보드 선택을 완료했다면, 작성된 스케치에 오류가 없는 지 검사해야 합니다.
메뉴 바의 제일 앞의 체크 표시 버튼을 누르면 작성된 스케치를 검사하고 하단의 콘솔 창에 결과를 보여줍니다.
오류가 없다면 그 다음 단계인 스케치 업로드를 할 수 있습니다.
스케치 업로드를 위해서는 반드시 보드가 PC에 연결되어 있어야 하며, 올바른 포트가 선택되어야 합니다.
포트란, 시리얼 포트를 말하며 메뉴를 통해 선택할 수 있습니다.

이제 메뉴 바의 화살표 표시 버튼을 누르면 업로드가 진행됩니다.
업로드(Upload)란, 작성된 소스가 컴파일되어 기계어로 바뀌고 통신을 통해 아두이노 보드의 메모리에 쓰여지는 작업을 말합니다.
업로드가 완료되면 보드는 전원이 켜지면서 내장된 프로그램으로 항상 작동하게 됩니다.


왜 유니티(Unity)로 하드웨어를 제어해야 하는가?

유니티는 게임을 개발하는데 최적화되어 있는 개발 도구입니다.
게임은 미디어 아트의 일종으로 영화나 사진과 달리 사용자와의 상호 작용이 매우 중요합니다.
이 말은 우리가 사는 물리적 세상과 그래픽으로 구성된 가상 세계 사이의 연결 통로가 있어야 한다는 말입니다.
게임이 널리 알려지기 시작한 것은 하드웨어 보급 시점과 일치합니다.
지금은 많이 사라졌지만, 한때는 전자 오락실이 유일한 게임을 접할 수 있는 유일한 장소였습니다.
전자 오락실이 성행할 수 있었던 이유는 바로 디스플레이 장치와 조이스틱으로 이루어진 전자 오락기의 개발 덕분입니다.

이 하드웨어 덕분에 아케이드 게임 장르가 열리고 수 많은 게임들이 개발되었습니다. 사실, 하드웨어를 공용으로 사용했기 때문에 게임 회사들은 하드웨어 개발보다는 컨텐츠로 승부하였습니다.
하지만, 몇몇 게임은 매우 독특한 하드웨어를 개발하고 그에 맞는 게임을 만들어 크게 인기를 끌기도 했습니다.
 

가정용 게임기와 컴퓨터의 보급은 새로운 게임 장르를 만들어내는데 큰 기여를 했습니다.
아케이드 게임은 주로 돈을 내고 짧게 끝내는 게임 위주였다면, 집에서 하는 게임은 시간에 구애받지 않고 매우 장시간 플레이할 수 있는 게임들이 만들어졌다는 것입니다.

개인용 컴퓨터의 경우는 사실 주 목적이 게임이 아니었지만, 키보드와 마우스를 입력 장치로 활용하여 게임기로 활용할 수 있는 게임들이 개발되었습니다. 대표적 전략 시뮬레이션인 스타 크래프트의 경우 키보드와 마우스에 최적화된 게임이라 할 수 있습니다.
이와 더불어 인터넷이 발달하면서 원거리에 있는 사용자와 같이 할 수 있는 네트워크 게임들이 만들어졌습니다.
스마트 폰의 경우 터치 입력과 언제든지 들고 다닐 수 있다는 장점으로 모바일 게임이란 새로운 장르도 만들어진 것입니다.

닌텐도의 Wii와 XBOX의 키넥트(Kinect)는 새로운 사용자 입력 방식을 도입하여 또 다른 장르를 만들어냈습니다.


최근 주목받고 있는 VR 역시 새로운 하드웨어로 VR 게임이란 장르를 만들어내고 있는 중입니다.

이와 같이 게임의 진보는 항상 하드웨어 개발과 함께 해 왔습니다.
물론, 지금까지는 플랫폼의 개념으로 공용 하드웨어를 중심으로 대부분의 게임은 컨텐츠 기획 중심으로 발전되어 왔습니다.
따라서, 대부분의 게임 관련 종사자들은 지금까지의 전례로 하드웨어 개발에 무관심했습니다.

그러나, 지금은 상황이 많이 달라졌습니다.
우선, IoT란 이름으로 그 동안 독립적으로만 작동했던, 전자 장치들이 연결되기 시작하고 있습니다.
이런, 변화는 일반 회사에서도 자사 제품이 여러 소프트웨어와 연동해야 함을 인식하고 관련 개발자들을 찾고 있는 실정입니다.
또한, 사용자 서비스를 단순히 정보 제공하는 것을 넘어 게임과 같이 재미와 새로운 경험을 줄 수 있게 상호 작용이 가능하도록 만들려는 시도를 하고 있습니다.
기존의 완구 회사들도 게임과 연동되는 스마트 토이에 대해 관심이 높습니다.


제가 주로 했었던 로봇 개발도 게임과 직접적인 연관은 없지만, 게임 기술에서 사용되고 있는 3D 엔진, 물리 엔진, 게임 AI 등이 매우 밀접한 관련을 갖고 있습니다.
VR의 경우에도 부가 하드웨어가 없이는 완전할 수 없다는 것이 업계의 결론입니다.
이 때문에 수 많은 업체들이 VR용 부가 하드웨어를 앞 다투어 개발하고 있는 실정입니다.


물론, 하드웨어를 직접 개발한다는 것은 매우 힘든 일입니다. 어쩌면 누군가 잘 만든 하드웨어 플랫폼을 선택한 후, 그것을 기반으로 컨텐츠 위주의 게임을 개발하는 것이 쉬울 수도 있습니다.
그러나, 앞으로 시대는 비슷한 것 보다는 독창적인 것이 더 오래 살아남게 될 것입니다.
한번쯤은 그 동안 상상했었던 아이디어를 실현하여 가능성을 시험해보는 것도 좋을 것이라 생각합니다.