Chris Choi's Blog

기계치도 즐기는 IoT, Arduino

leave a comment »

저는 어릴 적부터 ‘기계치’였습니다. 새로운 기기를 구입해 사용하는 것은 좋아하지만, 직접 만드는 것은 영 소질이 없습니다. 과학상자, 라디오 조립 Kit 등 여러 기기들을 조립해 봤지만, 번번이 실패하거나 선생님의 도움을 받아 가까스로 완성했습니다. 요즘 대세인 IoT로 인해 Raspberry Pi, Arduino 등의 기기들이 인기입니다. 한 번 도전해 보고 싶었지만 무모한 도전이 될 것 같아 망설이고 있던 차에, 사내 교육을 통해 Arduino에 도전해 봤습니다.

Arduino

Arduino는 이태리어로 ‘절친’이라는 의미입니다. 2005년 Italy의 Ivrea에서 Arduino Project가 시작되었습니다. Massimo Banzi와 david Cuatilles는 돈이 넉넉하지 않은 학생들이 낮은 가격으로 손쉽고 간편하게 사용할 수 있는 Open Source 기반의 Microcontroller Board를 만드는 것을 목표로 삼았습니다.

Arduino와 Raspberry Pi 중 어떤 것을 택할까요? 각각의 특성을 먼저 이해해야 합니다. Arduino는 기계 제어에 적합합니다. 대신 OS를 설치할 수 없습니다. Rasbperry Pi는 Linux와 같은 OS와 Web Server를 설치할 수 있습니다. 그래서 Home Automation에 적합합니다. 대신 기계를 제어하기 위해서는 Arduino가 필요합니다.

Arduino Board

Arduino를 시작할 때 첫 번째 걸림돌은 기기입니다. 초보자들에게 어떤 종류의 기기들을 구입해야 Arduino를 본격적으로 시작할 수 있는가는 어려운 질문입니다. 하나의 답이 있는 것이 아니기 때문입니다. 필수 기기인 Arduino Board만 해도 UNO, Mega 등 그 종류가 다양합니다. 다행히 사내 교육 과정에서 필요한 기기들로 구성된 Development Kit을 제공해 주어서 고민을 덜 수 있었습니다. 최근에 Board와 Sensor, Cable 등을 세트로 구성한 Arduino Kit를 판매하는 업체들이 많이 생겼습니다.[1] 이런 Kit를 구입해서 Arduino를 시작해 보시는 것도 좋을 것 같습니다.  아직 국내에서 제조되거나 해외에서 수입되지 않는 부품은 Amazon에서 구입해야 할 수도 있습니다.

기계치도 즐기는 IoT, Arduino_Image 1

[Image 1. Arduino Development Kit]

학습용으로 적절한 Arduino Board는 ‘UNO’입니다.[2]

UNO Board는 다음의 부품들로 구성되어 있습니다.

  • ATmega328 Microcontroller
  • USB Plug
  • External Power Supply
  • Reset Button
  • Digital Input / Output Pins (14개)
  • Analog Input Pins (6개)
  • Flash Memory (32KB): 32KB의 용량이 작아 보이지만, 실제로 기동해 보면 결코 작은 용량이 아닙니다.
  • SRMA (2KB)

기계치도 즐기는 IoT, Arduino_Image 2

[Image 2. UNO Board]

Arduino Board는 기본 Board 위에 또 다른 Board를 쌓는 적층형 구조입니다. 확장을 위한 Board를 ‘Shield’라 부릅니다. 따라서 확장이 쉽습니다. Shield 종류는 Wifi Motor, Ethernet, USB Host 등이 있습니다. 단, 계속적으로 쌓으면 지나치게 커질 수 있으므로 필요한 기능이 기본으로 탑재되어 있는 Arduino Board를 구입하는 것도 방법입니다. 예를 들어 Bluetooth 기능이 기본으로 탑재되어 있는 Arduino Board를 Bluno라 합니다.

Arduino IDE

Arduino는 ‘Sketch’ 라는 통합 개발 환경, 즉 IDE Integrated Development Environment 를 제공합니다. Sketch를 이용해 Compile과 Upload, Debugging 등을 수행할 수 있습니다. Sketch는 Windows, Mac OS X (10.7 Lion 이상), Linux 운영 체제를 지원합니다.

Sketch를 실행하면 아래 그림과 같이 표시됩니다. 화면 상단에 Compile, Upload , Serial Monitor 등의 버튼이 있으며, 그 아래로 Coding과 상태 표시를 위한 창이 있습니다.

기계치도 즐기는 IoT, Arduino_Image 3

[Image 3. Arduino의 IDE인 Sketch]

Sketch를 사용하기 전에 기본 설정을 확인해야 합니다. Tools > Board / Port를 확인합니다. Board는 ‘Arduino Uno’를 선택하고, Port는 ‘(Arduino Uno)’가 붙어 있는 Port를 선택합니다.

기계치도 즐기는 IoT, Arduino_Image 4 기계치도 즐기는 IoT, Arduino_Image 5

[Image 4, 5. Board와 Port 설정 확인하기]

Arduino Program 구조

C Programming을 해 보신 분이라면 어렵지 않게 Arduino Programming을 하실 수 있습니다. Arduino Code는 setup()과 loop() Function으로 구성됩니다. setup()은 초기 변수나 Pin 설정, Library 설정 등에 사용되며, 전원이 연결되거나 Reset 할 때 한 번 실행됩니다. loop()는 Arduino에 전원이 연결되어 있는 동안 연속적으로 실행됩니다.

==============

void setup () {

}

void loop () {

}

==============

File을 저장하면 확장자가 ‘ino’ (Arduino Source Code) 인 File이 생성됩니다.

Hello Arduino!

어떤 Programming language를 배워도 첫 예제는 ‘Hello World!’를 화면이나 Console에 출력하는 것입니다. Arduino도 마찬가지입니다. 간단한 Code를 이용해 ‘Hello Arduino!’를 출력해 보겠습니다.

===============================

void setup () {

Serial.begin (9600); — (1)

}

void loop () {

Serial.println (“Hello Arduino!”); — (2)

delay (1000); — (3)

}

===============================

(1) Serial은 Arduino가 PC 등과 Serial 통신을 필요로 할 때 사용됩니다. Serial.begin()은 Serial 통신을 시작한다는 의미입니다. Serial. Begin()의 인자는 baud – data rate in bits per second – 를 의미하며, Serial Monitor를 실행할 때 동일한 baud를 설정해야 통신이 가능합니다.[3]

(2) serial.println은 문자를 출력하는 것입니다.

(3) delay()는 다음 명령어를 실행하기 전에 정해진 시간을 대기하라는 의미입니다. ‘delay()’의 인자는 1000분의 1초입니다. delay (1000)은 1초 간 대기하라는 것입니다.

Compile을 해 봅니다. 화면 상단 좌측의 체크 버튼을 누르면 Compile이 됩니다. 정상적으로 되면.. 아니면 에러 메시지가 표시됩니다.  Compile은 Arduino에 Upload 할 Program을 준비하는 과정이므로, Arduino를 연결하지 않고 수행해도 됩니다.

체크 버튼 오른쪽에 있는 화살표를 누르면 Upload가 실행됩니다. 이 때 Arduino와 PC가 잘 연결되어 있고, Board와 Port 설정이 잘 되어 있다면 TX/RX LED가 깜빡입니다. 깜빡임이 없다면 연결이나 설정을 다시 확인해 보도록 합니다.

기계치도 즐기는 IoT, Arduino_Image 6

[Image 6. Serial Monitor를 이용한 Debugging]

LED 제어해 보기

LED Light Emitting Diode 는 화합물에 전류를 흘려 발광하는 Diode로서, 낮은 전압으로 밝은 빛을 내는 장점을 갖고 있습니다. Arduino로 LED를 제어해 보겠습니다. Arduino의 13번 Digital Pin은 Board 위의 조그만 내장 LED와 연결되어 있습니다. 이 LED를 이용해 보겠습니다. Sketch의 File > Examples에 보면 다양한 예제들을 선택하실 수 있습니다. 01. Basics > Blink를 선택합니다.

기계치도 즐기는 IoT, Arduino_Image 7

[Image 7. Blink 실행하기]

[Blink]

================================

Int led = 13;

void setup () {

pinMode (led, OUTPUT); — (1)

}

void loop () {

digitalWrite (led, HIGH); — (2)

delay (1000);

digitalWrite (led, LOW); — (3)

delay (1000);

}

================================

(1) Digital인 13번 Pin을 출력 대상으로 설정합니다.

(2), (3) HIGH는 상수로 1을, LOW는 0을 의미합니다. Digital의 방식으로 HIGH는 LED를 켜는 것을, LOW는 LE를 끄는 것을 지시합니다.

기계치도 즐기는 IoT, Arduino_Image 8

[Image 8. 1초마다 13번 Digital Pin에 연결된 LED가 반짝입니다.]

UNO Board와 Sensor, LED 등을 직접 연결하는 대신, Bread Board, 일명 ‘빵 보드’로 연결할 수도 있습니다. 극성이 (+) (-)는 세로로, 알파벳은 가로로 동일합니다. 가로막 사이는 Jumper cable로 연결할 수 있습니다.

기계치도 즐기는 IoT, Arduino_Image 9

[Image 9 .Bread Board]

LED는 극성이 정해져 있습니다. 다리가 긴 쪽이 (+)극, 다리가 짧은 쪽이 (-)극입니다. 극성을 반대로 연결하면 LED가 파손될 수 있습니다. Jumper cable을 이용해 UNO Board와 Bread board 위에 꽂은 LED의 (+)와 (-)극을 각각 연결했습니다. LED에도 1초에 한 번 불이 깜빡입니다.

기계치도 즐기는 IoT, Arduino_Image 10

[Image 10. Bread Board와 UNO Board 연결하기]

지금까지 살펴 본 것은 Digital 신호였습니다. Digital은 0과 1을 의미합니다. LED가 켜지는 것이 1, 꺼지는 것이 0입니다. 지금까지는 LED를 이용한 Digital 출력을 시험해 봤습니다. Digital 신호는 입력 역시 가능합니다.

Analog

세상에는 Digital 신호로 표시할 수 없는 것들이 많습니다. 온도나 습도, 몸무게는 0과 1이 아닌, 숫자의 범위를 갖는 값들입니다. Analog 신호는 Digital과 달리 입력은 가능하나 출력으로 사용할 수는 없습니다. UNO Board에는 6개의 Analog Pin과 14개의 Digital Pin이 있습니다.[4]

이번에는 LED에 가변 저항기 (Potentiometer)를 연결해 보겠습니다. 가변 저항기는 볼륨을 높이고 줄이듯이 왼쪽과 오른쪽으로 돌려 Analog 신호의 저항을 선택할 수 있습니다. 가변 저항기의 값에 따라 LED가 깜빡이는 속도를 조절해 보겠습니다. 회로도를 참고해 가변 저항기를 UNO Board에 연결합니다.

기계치도 즐기는 IoT, Arduino_Image 11

[Image 11. Analog Input Tutorial 출처: Arduino]

[Analog Input]

========================================================

int sensorPin = A0;

int ledPin = 13;

int sensorValue = 0;

void setup() {

pinMode(ledPin, OUTPUT);

}

void loop() {

sensorValue = analogRead(sensorPin); — (1)

digitalWrite(ledPin, HIGH);

delay(sensorValue); — (2)

digitalWrite(ledPin, LOW);

delay(sensorValue);

}

========================================================

(1) Analog Pin인 A0에 가변 저항기를 연결했습니다. 가변 저항기의 저항 값을 읽어 오는 명령어가 바로 analogRead()입니다. 인자는 Analog Pin 값입니다.

기계치도 즐기는 IoT, Arduino_Image 12

[Image 12. 가변 저항기의 값에 따라 LED가 깜빡이는 속도가 달라집니다.]

가변 저항기를 좌우로 돌리는 것을 ADC Analog Digital Converter 라고 합니다. 저항 값의 크기는 0에서 1023 사이에서 움직입니다.

Python으로 Arduino PC 연결하기

Arduino가 생성한 데이터를 PC에서 사용하거나, PC에서 생성한 데이터를 바탕으로 Arduino를 기동할 수도 있습니다. 저는 초음파 Sensor로 사람이 자리에 앉아 있는지를 측정하고, 앉아 있는 시간을 누적해 LED에 표시하는 기능을 구현해 봤습니다. 자리에 앉는 순간 빨간색 LED가 켜지고, 하루에 세 시간 이상 앉아 있으면 노란색 LED가 켜집니다. 8시간 이상 앉아 있으면 Twitter로 메시지가 전달됩니다.

‘PySerial’이라 불리는 Library를 사용해 Arduino가 생성한 데이터를 Serial 통신을 이용해 Python에서 처리하도록 했습니다. 앉아 있는 상태를 0, 앉아 있지 않는 상태를 1로 정의하고, 그 값을 계속 PC로 전달합니다. PC의 Python은 상태 값이 0에서 1로 바뀌는 시점, 그리고 1에서 0으로 바뀌는 시점을 파악해 그 시간을 누적합니다. 누적이 일정 이상 되면 Serial 통신으로 Arduino에게 LED에 시간을 표시할 것을 명령합니다. 동시에 Tweepy라는 Library를 이용해 Tweet을 날립니다.

===========================================

import serial

ard = serial.Serial (‘/dev/cu.usbmodem1431’, 9600) — (1)

ard.readline() — (2)

===========================================

(1) Serial 연결을 시도합니다. 인자 값으로 Port와 Baud를 확인하고 입력합니다.

(2) 연결된 Serial을 통해 수신한 내용을 읽습니다.

기계치도 즐기는 IoT, Arduino_Image 13

[Image 13. 초음파 센서와 Arduino, PC를 연결하기]

Arduino Reference

Arduino는 Reference가 체계적으로 정리되어 있습니다. 각 예제는 준비물, 회로도, Code, 관련 Function까지 한 눈에 볼 수 있도록 구성되어 있습니다.

기계치도 즐기는 IoT, Arduino_Image 14

[Image 14. Arduino의 Tutorial 출처: Arduino]

쉽고 즐겁게 IoT 즐기기

IoT의 핵심 가치는 누구나 쉽고 즐겁게 자신이 원하는 것을 구현하는 것이라 생각합니다. 누구나 원한다면 저렴한 가격으로 필요한 부품을 구입해 간단하게 조립할 수 있어야 합니다. 이런 측면에서 Arduion는 기계치인 제가 큰 어려움 없이 시작해 볼 수 있었던 것만 봐도 누군 시도해 볼 수 있는 하나의 IoT Platform입니다. 회로도와 Source Code를 읽을 수 있는 능력만 갖춘다면 생활 속에서 Arduino를 통해 IoT의 개념을 실행해 볼 수 있는 기회를 가지실 수 있을 겁니다.

References

[1]  대표적인 업체는 Art RobotMecha Solution입니다.

[2] 본 글은 UNO R3 Board를 MacBook Pro에서 실행하는 환경을 기준으로 작성했습니다.

[3] Serial의 ‘S’는 대문자를 사용해야 합니다. 소문자를 사용하면 Arduino가 ‘serial’을 인식할 수 없으므로 Compile Error가 발생합니다.

[4] Digital Pin 중 0번과 1번은 TX/RX로 사용되므로 다른 용도로 사용해서는 안 됩니다. Digital Pin 중 3, 5, 6, 9, 10, 11번에는 ~ 표시가 붙어 있습니다. 필요 시 해당 Pin을 Analog 출력으로 사용할 수 있음을 의미합니다. 이를 PWM Pulse Width Modulation 이라고 합니다.

Advertisements

Written by Chris Choi

April 9, 2015 at 11:55 pm

Posted in IT

Tagged with , , , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: