머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제...

32
머리말 3 머리말 이 책은 전자 공학, 마이크로컨트롤러, C 언어 등의 지식이 없는 비전공자부터 기초 지식 을 갖고 Arduino를 처음 접하는 독자 모두를 대상으로 한다. Arduino는 최소한의 공학적 지식으로도 예술작품부터 실생활에 필요한 물건, 산업용 기기, 취미 작품, 학생들의 임베 디드 시스템 실습에까지 활용할 수 있는 매우 매력적인 장치이다. 간단한 프로그램만으로 도 고성능의 임베디드 시스템 못지않은 성능을 낼 수 있고 그 비용 또한 매우 저렴하여 많 은 이들이 쉽게 접근할 수 있다. 이미 수많은 예제를 인터넷에서 쉽게 찾아볼 수 있으며 무 엇보다도 하드웨어 설계의 부담이 매우 적고, 다양한 애플리케이션 프로그램에서도 지원 하며, 표준화된 장치로 자리 잡고 있다. 이 책의 독자들은 책의 예제를 따라 하는 과정에서 자연스럽게 Arduino를 이해하고 활용할 수 있게 될 것이다. 이 책은 기본 개념과 응용 기술을 모두 담고 있다. 어려운 전문 용어와 복잡한 설명을 최소 화하고 다양한 예제를 수행하여 자연스럽게 Arduino와 친해질 수 있도록 구성하였다. 각 예제들은 프로그래밍적 기교를 최소화하고 각 부분별 주석을 첨부하여 이해도를 높였으며, 회로와 스케치 명령어를 각 예제별로 설명하여 각 단원 앞부분에 명령어나 하드웨어 설명 을 나열하는 식의 구성을 피하여 예제를 처음부터 순서대로 실행시켜도 되고 필요한 예제 만 발췌하여 참고하여도 이해될 수 있도록 구성하였다. 각 장의 마지막에는 깊이 있는 공 부를 원하는 독자를 위하여 그 장의 내용에서 한 단계 발전할 수 있는 연습문제를 추가하 였다. 2~9장까지의 예제를 모두 수행하였거나 처음부터 실제 필요한 제품을 만들고 싶은 독자 는 10장 프로젝트부터 접하여도 된다. 10장 프로젝트에서는 2~9장에 있는 내용을 바탕으 로 하여 실제 응용 가능한 몇 가지의 프로젝트를 제시한다. 각 프로젝트에서는 어떠한 예제 를 응용하였는지 표시하여 관련 예제를 접한 후 프로젝트를 수행할 수 있도록 하였다. 예제 에 사용된 키트와 부품에 대하여는 1.9장에 간략히 소개되어 있으므로 참고하여 구매할 수 있다.

Upload: others

Post on 29-Dec-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

머리말 3

머리말

이 책은 전자 공학, 마이크로컨트롤러, C 언어 등의 지식이 없는 비전공자부터 기초 지식

을 갖고 Arduino를 처음 접하는 독자 모두를 대상으로 한다. Arduino는 최소한의 공학적

지식으로도 예술작품부터 실생활에 필요한 물건, 산업용 기기, 취미 작품, 학생들의 임베

디드 시스템 실습에까지 활용할 수 있는 매우 매력적인 장치이다. 간단한 프로그램만으로

도 고성능의 임베디드 시스템 못지않은 성능을 낼 수 있고 그 비용 또한 매우 저렴하여 많

은 이들이 쉽게 접근할 수 있다. 이미 수많은 예제를 인터넷에서 쉽게 찾아볼 수 있으며 무

엇보다도 하드웨어 설계의 부담이 매우 적고, 다양한 애플리케이션 프로그램에서도 지원

하며, 표준화된 장치로 자리 잡고 있다. 이 책의 독자들은 책의 예제를 따라 하는 과정에서

자연스럽게 Arduino를 이해하고 활용할 수 있게 될 것이다.

이 책은 기본 개념과 응용 기술을 모두 담고 있다. 어려운 전문 용어와 복잡한 설명을 최소

화하고 다양한 예제를 수행하여 자연스럽게 Arduino와 친해질 수 있도록 구성하였다. 각

예제들은 프로그래밍적 기교를 최소화하고 각 부분별 주석을 첨부하여 이해도를 높였으며,

회로와 스케치 명령어를 각 예제별로 설명하여 각 단원 앞부분에 명령어나 하드웨어 설명

을 나열하는 식의 구성을 피하여 예제를 처음부터 순서대로 실행시켜도 되고 필요한 예제

만 발췌하여 참고하여도 이해될 수 있도록 구성하였다. 각 장의 마지막에는 깊이 있는 공

부를 원하는 독자를 위하여 그 장의 내용에서 한 단계 발전할 수 있는 연습문제를 추가하

였다.

2~9장까지의 예제를 모두 수행하였거나 처음부터 실제 필요한 제품을 만들고 싶은 독자

는 10장 프로젝트부터 접하여도 된다. 10장 프로젝트에서는 2~9장에 있는 내용을 바탕으

로 하여 실제 응용 가능한 몇 가지의 프로젝트를 제시한다. 각 프로젝트에서는 어떠한 예제

를 응용하였는지 표시하여 관련 예제를 접한 후 프로젝트를 수행할 수 있도록 하였다. 예제

에 사용된 키트와 부품에 대하여는 1.9장에 간략히 소개되어 있으므로 참고하여 구매할 수

있다.

Page 2: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

4 머리말

각 예제는 다음의 순서로 구성되었다.

예제 번호 예제 이름

실습 목표 예제에서 수행하고자 하는 동작에 대하여 설명한다.

Hardware하드웨어 구성을 설명한다.

각 모듈과 Arduino간의 연결하는 회로도나 모듈과 연결된 상태를 보여준다.

Commands 예제에 사용되는 명령어를 설명한다.

Sketch

구성Sketch의 작성 전에 Sketch의 순서와 구성에 대하여 미리 설명한다.

Sketch 실제 입력할 Sketch를 보여준다.

실습 결과 실행 결과를 보여주고 설명한다.

응용 문제 실습한 예제를 참고하여 수행할 수 있는 한 단계 발전된 연습문제를 제시한다.

Page 3: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

머리말 5

이 책으로 강의를 하기 위하여

이 책은 실제 강의 경험을 바탕으로 약 15주 혹은 16주에 강의에 적합하도록 구성하였다.

강의는 예제 실습 후 이를 응용한 응용문제를 해결하는 순서로 진행한다면 실습한 예제를

바로 응용하여 실습할 수 있으므로 이해도를 높일 수 있을 것이다. 강의 주차나 시간, 응용

문제의 실습 여부에 따라서 10장의 내용은 탄력적으로 강의할 수 있도록 하였다. 주당 2시

간 혹은 3시간 강의에 대하여 아래의 강의 계획을 참고하여 진행하면 한 학기 후면 수강자

는 Arduino의 중급자 이상의 실력을 갖출 수 있을 것이다.

16주 강의 계획서

주차 강의 내용

1 1장 Arduino 소개 및 사용법

2 2장 시리얼 통신

3 3장 LCD 출력

4 4장 LED 출력 1

5 4장 LED 출력 2

6 4장 LED 출력 3

7 5장 디지털 신호 입력

8 중간평가

9 6장 아날로그 신호 입력 1

10 6장 아날로그 신호 입력 2

11 7장 모터 구동

12 8장 적외선 리모컨

13 9장 여러가지 부품들

14 10장 프로젝트 1

15 10장 프로젝트 2

16 기말평가

Page 4: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

6 차례

1.1 Arduino란? 10

1.2 Arduino의 하드웨어 11

1.3 Arduino의 소프트웨어 13

1.4 Arduino IDE 준비하기 14

1.5 Arduino IDE 사용하기 17

1.6 스케치의 기본 구성 18

1.7 전압, 전류, 저항 20

1.8 브레드 보드 20

1.9 Arduino UNO Starter kit 21

2.1 Arduino에서 컴퓨터로 데이터 전송하기 27

2.2 변수 유형별로 컴퓨터에 전송하기 28

2.3 Arduino에서 시리얼 통신을 이용하여 데이터 수신하기 33

연습문제 36

3.1 입출력 핀을 이용하여 LCD 모듈에 표시하기 40

3.2 I2C를 이용한 LCD 출력 42

연습문제 47

차례

시작

01

시리얼 통신

02

LCD 통신

03

Page 5: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

차례 7

4.1 LED 점멸 51

4.2 LED 밝기 조절 52

4.3 RGB LED로 색상 표현하기 54

4.4 FND 제어 57

4.5 4-digit FND 제어 65

4.6 Dot matrix 제어 73

4.7 Dot matrix를 이용한 애니메이션 77

연습문제 82

5.1 스위치 입력 86

5.2 안정적인 스위치 입력 88

5.3 디지털 신호 입력 시간 측정하기 94

5.4 키 패드 입력 96

연습문제 101

6.1 포텐쇼미터 입력 105

6.2 빛 입력 108

6.3 온도 측정 112

6.4 수위 측정 115

6.5 아날로그 조이스틱 119

6.6 소리 입력 123

연습문제 127

LED 출력

04

디지털 신호 입력

05

아날로그 신호 입력

06

Page 6: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

8 차례

7.1 스텝모터 구동 130

7.2 서보모터 구동 135

7.3 DC 모터 구동 140

연습문제 146

8.1 적외선 리모컨 코드 읽기 149

8.2 적외선 리모컨을 이용한 LED 제어 152

연습문제 158

9.1 버저 160

9.2 온습도 센서 164

9.3 실시간 클럭 모듈 168

9.4 RFID 172

9.5 초음파 거리센서 176

연습문제 181

10.1 배터리 검사기 184

10.2 자동 조명장치 187

10.3 자동차용 초음파 후방 감지기 190

10.4 RFID를 이용한 도어락 193

10.5 LCD 시계와 온습도계 199

10.6 제품 신뢰성 시험기 206

모터 구동

07

적외선 리모컨

08

여러 가지 부품들

09

프로젝트

10

Page 7: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

1. Arduino란?

2. Arduino의 하드웨어

3. Arduino의 소프트웨어

4. Arduino IDE 준비하기

5. Arduino IDE 사용하기

6. 스케치의 기본 구성

7. 전압, 전류, 저항

8. 브레드 보드

9. Arduino UNO Starter kit

01

시작> > > > > > > > >

CHAPTER

Page 8: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

10

> > >

01CHAPTER

시작

1.1 Arduino란?

마이크로컨트롤러를 이용하여 제어장치를 만들 때 첫 번째 단계는 적절한 하드웨어

(hardware)를 구성하는 것이다. 하드웨어를 구성하는 과정은 전문 지식을 갖고 회로도 작

성부터 PCB(Printed Circuit Board)를 설계하는 과정을 거치거나, 시중에 판매되는 하드

웨어를 구매하여 사용하는 방법이 있다. 하드웨어의 설계는 많은 전문 지식과 경험을 요구

하기 때문에 상용 하드웨어를 선택하는 경우가 많은데 이 또한 표준화, 안정성 등의 문제를

갖고 있다. 사용하고자 하는 목적에 적합한 상용 하드웨어를 선택하더라도 센서, 모터 등

필요한 제어장치를 구성하는 것도 전문적인 지식을 요구한다.

하드웨어가 구성되었다면 펌웨어(firmware)를 설계하여야 한다. 펌웨어란 마이크로컨

트롤러 등의 메모리에 저장되어 주변 장치를 제어하는 프로그램을 말한다. 소프트웨어

(software)와는 구분되는데 펌웨어는 하드웨어를 직접 제어하기 때문에 하드웨어와 소프

트웨어의 중간 역할을 하는 프로그램이라고 할 수 있다.

초기의 펌웨어는 어셈블리어 같은 일반인이 접근이 힘든 언어로 작성해야만 했다. 하지만

근래에는 대부분의 펌웨어가 C언어를 이용하여 작성할 수 있어 접근성뿐만 아니라 다양한

알고리즘의 구현도 가능하게 되었다.

Arduino는 2005년 이탈리아의 이브레이 지방에서 마시모 반지(Massimo Banzi)와 데이비

드꾸아르띠에예스(David Cuartielles)에 의해서 개발된 오픈소스 하드웨어(OSHW: Open

Source Hardware)이다. 오픈소스 하드웨어란 회로도와 PCB등 제품의 모든 것이 공개

된 하드웨어로서 누구나 이를 사용하고 발전시킬 수 있는 새로운 개념의 하드웨어를 말한

다. Arduino의 탄생 목적은 전문 지식이 없는 초보자나 예술가, 학생 등도 쉽게 원하는 제

어장치를 만들 수 있고 전자공학을 쉽게 이해하기 위해서 개발되었다. 입출력 핀의 개수,

Page 9: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

11

CHAPTER 01 시작> > >

01CHAPTER

시작메모리의 크기 등에 따라 UNO, Leonardo, Due, Micro 등 다양한 사양을 갖은 형태가 있

다. GSM, Ethernet, WiFi 등의 기능을 추가할 수 있는 확장 장치인 쉴드(shield)도 제공되

며 다양한 형태의 LED, 스위치, 센서 등이 모듈(module) 형태로 제작되어 있다. 마이크로

컨트롤러의 펌웨어에 해당하는 소프트웨어를 스케치(Sketch)라고 하며 통합 개발 환경인

Arduino IDE(Integrated Development Environment)를 이용하여 손쉽게 스케치를 작성

할 수 있다. 다양한 예제와 라이브러리(library)는 인터넷상에서 손쉽게 구할 수 있다.

Arduino에 대한 교육은 세계적으로 어린 학생부터 대학생 이상까지 다양하게 진행되고 있

다. 이는 Arduino가 초보자도 사용할 수 있지만 복잡한 시스템에도 사용될 수 있다는 것을

의미한다. 예전처럼 하드웨어를 그때그때 새로 설계할 필요가 없어졌으며, 표준화되지 않

은 시중의 하드웨어를 구매하기 위해 고민할 필요도 없어졌다. 어려운 C언어를 깊게 공부

할 필요도 없이 예제와 라이브러리의 응용만으로도 원하는 동작 대부분을 구현할 수 있게

되었다.

Arduino의 등장으로 상용 마이크로컨트롤러는 사실상 표준화되고 있다. 이미 Labview,

MATLAB, AVR studio 등에서 Arduino를 지원하고 있으며 3D 프린터와 실험용 로봇 등

의 일부 장치는 Arduino를 기반으로 제작되어 판매되고 있다. 앞으로 Arduino는 표준화

된 마이크로컨트롤러로서 자리가 확고할 것으로 기대된다.

좀 더 자세한 사항은 Arduino 홈페이지(ardiino.cc)에서 확인할 수 있다.

1.2 Arduino의 하드웨어

Arduino 보드는 마이크로컨트롤러와 몇 가지 전자 부품들로 이루어져 있다. 이 보드는 사

용자가 작성한 프로그램대로 각 핀으로 신호를 내보내거나 받아들여 처리하게 된다. 예를

들어 어떠한 센서가 측정한 값을 읽어오기 위해서 특정 핀을 사용해서 센서가 측정한 값을

읽어 오고, 이를 처리하여 제어하고자 하는 대상에 신호를 출력하게 된다.

그림 1.1 Arduino UNO R3 보드 (Arduino.cc 제공)

Page 10: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

12

예제로 쉽게 배우는 아두이노> > >

Arduino 보드의 회로도는 공개되어 있으므로 공식 보드뿐만 아니라 호환이 되는 다양한

보드가 시중에 판매되고 있으며 커뮤니티 등에서는 직접 제작하기도 한다. 호환 보드는 비

교적 저렴하게 구매할 수 있으며 기능의 차이도 없다. 일부 호환 보드는 블루투스 기능 등

을 내장하기도 하여 편리하게 사용할 수도 있다. 좀 더 관심이 있다면 공개된 회로를 이용

하며 나만의 보드를 만들어 보는 것도 좋은 방법이 될 수 있다.

그림 1.1은 입문용으로 많이 사용되는 Arduino UNO 보드로서 현재 R3 버전까지 출시되

어 있다. Arduino UNO의 경우는 총 13개의 디지털 입출력 핀과 여섯 개의 PWM 출력, 여

섯 개의 아날로그입력, 하나의 시리얼 통신 포트를 갖고 있다. 일반적인 마이크로컨트롤러

와는 달리 디지털 입출력에서 A, B, C와 같은 포트의 개념이 없고 0~13번 핀과 같이 핀 개

념만 있어 초보자가 사용하기에 편리하다. Arduino UNO와 비슷한 사양이면서 주변 회로

를 줄여 크기가 작은 Arduino NANO도 많이 사용된다.

그림 1.2 Arduino NANO와 Arduino MEGA2560 (Wikipedia 제공)

Arduino UNO보다 입출력 핀의 수가 증가된 Arduino MEGA2560은 많은 수의 입출력 핀

이 필요할 경우 주로 사용된다. Arduino MEGA2560은 54개의 디지털 입출력 핀을 갖고

있고, 16개의 아날로그입력 핀과 15개의 PWM 출력 핀을 갖고 있다. 4개의 UARTs 통신을

포트를 갖고 있다.

Arduino 보드의 기능을 확장하기 위하여 쉴드(shield)라는 모듈 형태의 보드가 제공된

다. 쉴드를 이용하면 모터, 이더넷, WiFi, 블루투스 등의 기능을 사용할 수 있게 되는데

Arduino사에서 공식적으로 인증한 쉴드와 함께 다양한 곳에서 제작된 쉴드도 라이브러리

와 함께 시중에 출시되어 있으므로 필요에 따라 사용할 수 있다.

그림 1.3 Arduino Motor Shield와 Ethernet Shield

Page 11: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

13

CHAPTER 01 시작

1.3 Arduino의 소프트웨어

Arduino를 동작시키기 위한 프로그램을 작성하기 위해서는 스크래치(scratch)를 사용하는

방법과 C 언어를 사용하는 방법이 있다. 스크래치는 미국 MIT 공과대학 미디어랩에서 초

보자들의 알고리즘 교육을 위해 개발한 것으로서 그래픽 환경에서 블록을 조립하는 직관적

인 방법으로 프로그래밍을 할 수 있는 툴이다. 스크래치의 공식 사이트는 (http://scratch.

mit.edu)이고 한국어를 지원한다. 스크래치는 원래 애니메이션, 게임 등을 위한 툴이지만

S4A(Scratch for Arduino)를 사용하여 Arduino를 제어할 수 있다. LED, 센서, 모터 등의

하드웨어 블록을 제공하므로 직관적으로 구현할 수 있다. S4A는 공식 사이트(http://s4a.

cat)에서 다운로드 할 수 있다.

그림 1.4 S4A 실행화면

스크래치는 초보자를 위한 교육용 언어이므로 실제로 Arduino를 사용하기 위해서는 C

언어를 사용하여야 한다. 마이크로컨트롤러 시스템의 프로그램을 펌웨어(firmware)라

고 하는데, Arduino에서는 이와 같은 펌웨어를 스케치(sketch)라고 한다. 스케치는 컴퓨

터에 설치된 Arduino의 통합 개발환경인 ‘Arduino IDE’를 이용하여 만들어진다. IDE란

Integrated Development Environment의 약자로써 프로그램을 만드는 코딩(cording),

프로그램의 문제를 찾아 해결하는 디버그(debug), C 언어를 기계어로 변경하는 컴파일

(compile) 등 프로그램 개발에 대한 모든 작업을 처리할 수 있는 개발용 소프트웨어를 뜻

한다. Arduino IDE에서는 사용자가 스케치를 작성하면 Arduino가 이해할 수 있는 언어로

변경시켜 주는데 이렇게 작성된 스케치는 Arduino로 전송되어(upload) Arduino를 동작시

키게 된다. Arduino IDE는 마이크로컨트롤러 등에서 사용되는 것에 비하여 매우 단순한

Page 12: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

14

예제로 쉽게 배우는 아두이노> > >

형태로 초보자도 쉽게 사용할 수 있다. Arduino IDE는 Arduino 공식 홈페이지(arduino.

cc)에서 다운받을 수 있다.

1.4 Arduino IDE 준비하기

Step 1 자신이 사용할 Arduino 보드를 선택한다. Arduino 보드와 컴퓨터와 연결할 USB

케이블을 준비한다. 소형 시스템에서는 ‘Arduino Nano’, 입출력 핀이 많이 필요할 때는

‘Arduino MEGA 2560’을 주로 사용한다. 입문용으로는 ‘Arduino Uno’가 많이 사용된다.

Step 2 Arduino 보드가 준비되었다면 Arduino 공식 홈페이지(arduino.cc)에서 Arduino

IDE를 다운받는다. 자신의 OS에 맞게 Windows 사용자는 ‘Windows Installer’ 혹은

‘Windows ZIP file’을 다운로드 받고 MAC 사용자는 MAX OS X 버전을 다운받는다. 다운

로드가 끝났다면 설치를 하거나 임의의 폴더에 압축을 풀어 실행시킨다.

Step 3 Arduino 보드를 USB 케이블을 이용하여 컴퓨터에 연결한다. Arduino UNO R3

의 경우 보드에 4개의 LED가 내장되어 있다. 정상적으로 연결되었다면 ‘ON LED’가 점등

된다. 이 외에 시리얼 통신 상태를 볼 수 있는 ‘RX LED’, ‘TX LED’와 13번 핀에 연결된 ‘L

LED’ 등이 있다.

Step 4 Arduino 보드를 PC에 연결하였으면 드라이버를 설치해야 한다. Windows 사용자

를 기준으로 ‘장치관리자’ 내에 ‘포트’에 ‘Arduino UNO(COM X : X는 포트 번호)가 생성되

었는지 확인한다. 만일 생성되지 않고 ‘알 수 없는 장치’로 표시될 경우, 앞서 Arduino IDE

를 설치하였던 폴더의 ‘Drivers‘ 폴더에서 ‘arduino.inf’ 파일을 선택해 준다. 이때 주의할

점은 ‘FTDI USB Drivers’ 폴더를 선택해선 안 된다. 일부 호환보드는 제조사에서 제공하

는 드라이버를 사용해야 한다.

Step 5 드라이버 설치가 끝났으면 Windows Installer를 받은 사용자는 메뉴에서

Arduino IDE 아이콘을 찾아 실행하고, Zip 파일 버전을 받은 사용자는 ‘arduino.exe’를 실

행한다. 설치가 정상적으로 되었는지를 확인하기 위하여 예제 프로그램을 실행시켜본다.

테스트할 예제 프로그램은 ‘File>Examples>1.Basics>Blink’이다. 예제 프로그램을 선택하

여 열어보자.

Page 13: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

15

CHAPTER 01 시작

그림 1.5 Blink 예제

Step 6 ‘툴’ 탭에서 Arduino 보드를 선택한다.

그림 1.6 Arduino 보드 선택

Page 14: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

16

예제로 쉽게 배우는 아두이노> > >

Step 7 보드 선택이 완료되었으면 컴퓨터와 통신할 포트를 선택한다. 자신의 Arduino 보

드가 연결된 통신포트는 장치관리자에서 확인할 수 있다.

그림 1.7 장치관리자에서 Arduino의 포트를 확인 한 후 동일하게 설정해 준다.

Step 8 모든 설정을 마쳤으면 프로그램을 업로드 해준다. 그림 1.5에서의 오른쪽 화살표

아이콘을 누르면 컴파일 후 업로드까지 끝마치게 된다.

그림 1.8 업로드 아이콘

Step 9 Blink 예제는 13번 핀의 LED가 1초 간격으로 점멸하는 스케치이다. 정상적으로

업로드 되었다면 Arduino 보드 위의 ‘L’ 이라고 표시된 부분의 LED가 점멸할 것이다. 만일

정상 동작하지 않으면 앞의 과정을 다시 확인하며 설치 후 실행해 본다.

1.5 Arduino IDE 사용하기

Arduino IDE의 구성은 그림 1.9와 같다.

Page 15: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

17

CHAPTER 01 시작

컴파일

새 스케치 스케치 저장 시리얼 모니터기존 스케치

열기컴파일 및업로드

파일명

그림 1.9 Arduino IDE 구성

파일명: 파일명은 새 파일을 생성시키면 우선 오늘의 날짜로 표시된다. 이후에 저장 버튼을

누를 때 재설정할 수 있다.

컴파일: 작성한 스케치를 Arduino가 인식할 수 있는 언어로 변경해준다. 단순히 스케치의

오류를 확인하거나 Arduino에 업로드할 필요가 없을 때 컴파일만 실행시킨다.

컴파일 및 업로드: 컴파일과 Arduino로의 업로드를 연속적으로 수행한다. 컴파일에서 에

러가 없으면 자동으로 업로드된다.

새 스케치: 새로운 스케치를 작성한다. 기존의 편집 창은 유지한 채 새로운 창이 열린다.

기존 스케치 열기: 저장되어 있던 스케치 파일을 연다.

스케치 저장: 현재의 스케치를 저장한다.

시리얼 모니터: 시리얼 통신 상태를 볼 수 있는 창을 연다. Windows의 하이퍼터미널과 유

사하다.

편집 창: 스케치를 작성하고 편집한다.

텍스트 콘솔: Arduino의 상태 및 에러 메시지를 출력한다.

Page 16: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

18

예제로 쉽게 배우는 아두이노> > >

1.6 스케치의 기본 구성

스케치의 기본 구성은 그림 1.10과 같다.

그림 1.10 스케치의 구성

그림 1.7은 앞서 Arduino 보드의 연결을 테스트하기 위해 실행 하였던 예제이다. 일반적으

로 스케치는 네 부분으로 구성된다.

주석: 스케치의 이름, 목적, 제작자, 제작일, 갱신일, 갱신 내용 등의 정보를 적는다. 특히

갱신일과 갱신한 내용은 프로그램을 작성하는 데 있어서 매우 중요한 일이므로 항상 정확

히 기재하는 습관을 들이자.

변수, 상수 라이브러리 등의 정의: 스케치에서 사용할 전역 변수, 상수, 라이브러리 등 사전

설정이 필요한 것들을 정의한다.

설정 루틴(setup): 설정루틴에서는 각 핀의 인풋과 아웃풋 및 시리얼 통신 등을 설정해준

다. Arduino가 동작할 때 최초 한 번만 실행하여야 하는 명령어를 넣기도 한다.

반복 루틴(loop): 무한 반복되는 루틴으로 C언어의 ‘main( )’ 함수와 동일한 기능을 한다.

동작에 관한 스케치는 이 부분에서 작성한다.

Page 17: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

19

CHAPTER 01 시작

스케치는 맨 위의 정의 부분부터 설정 루틴, 반복 루틴 순서로 실행된다. 반복 루틴을 만나

면 반복 루틴의 괄호 안의 내용을 계속 반복하여 실행하게 되며 다시 위의 설정 루틴으로

돌아가지 않는다. 이처럼 스케치는 다른 마이크로컨트롤러의 개발환경보다 간단하고 직관

적인 구성으로 초보자가 접근하기가 용이하다. 이미 다른 개발환경을 접해본 사용자도 단

순함에 매력을 느낄 것이다.

스케치 작성 시 두 가지를 항상 생각하자. 첫 번째는 주석이다. 스케치와 같은 프로그램

을 작성할 때 주석을 최대한 많이 기재하는 습관을 들이자. 주석에 작성자, 작성일, 수정

일 등을 반드시 포함하고 요소마다 설명을 추가하여 이해하기 쉽도록 해야 한다. 하지만

Arduino IDE의 편집창에서는 한글이 정상적으로 입력되지 않는다. 윈도우의 메모장과 같

은 텍스트에디터를 이용하여 한글을 입력하도록 하자. 두 번째는 띄어쓰기다. 스케치를 작

성하다 보면 while, for, if 문과 같은 명령어가 단계별로 섞이게 된다. 즉 while 문 안에

for 문이 들어가기도 하고 그 안에 if 문이 들어가기도 하면서 몇 단계로 괄호가 쳐지게 된

다. 이 때 반드시 단계별로 띄어쓰기하자. 그래야만 지금 명령어들이 어떤 괄호 속에 속하

였는지를 쉽게 알 수 있다. 띄어쓰기는 ‘스페이스 바’ 보다는 키보드 왼쪽의 ‘Tab’ 키를 이용

하자.

Arduino를 접하다 보면 라이브러리(library)란 말을 많이 접하게 되다. 이는 프로그래밍에

서 자주 사용되는 부분을 모아 놓은 것으로 매번 새로 작성하지 않고 필요할 때마다 불러와

사용할 수 있다. 사용자는 누군가가 만들어 놓은 라이브러리를 가져다 쓰거나 스스로 만들

수도 있다. 다소 복잡한 하드웨어의 동작에 대한 부분은 대부분 라이브러리화 되어 있어서

간단한 명령어만으로 복잡한 하드웨어도 구현할 수 있다. Arduino에서는 공식적으로 인증

된 라이브러리 외에 모듈마다 사용되는 라이브러리를 인터넷상에서 쉽게 구할 수 있다. 본

교재에서도 이러한 라이브러리를 이용한 예제들이 다수 포함되어 있다.

1.7 전압, 전류, 저항

전압(voltage): 전위가 높은 쪽과 낮은 쪽의 차이를 의미한다. 전하를 물이라고 가정하면

높은 지점에 있는 물과 낮은 지점에 있는 물 사이에 수압 차가 발생하듯 높은 전위의 전하

와 낮은 전위의 전하는 전압을 만들어 낸다. 이는 전하가 가진 에너지의 개념으로서 1쿨롱

(coulomb: 전하의 단위)의 전하 갖고있는 에너지로 정의할 수 있다. 마이크로컨트롤러를

사용하는 시스템에서는 일반적으로 직류 3.3[V]나 5[V]를 사용하는데, Arduino에는 이 두

전압 핀이 모두 배치되어 있으므로 필요에 따라 사용할 수 있다.

Page 18: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

20

예제로 쉽게 배우는 아두이노> > >

전류(current): 전압이 전하가 갖고 있는 에너지의 개념이었다면 전류는 흐르는 전류의 양

의 개념이다. 1초당 1쿨롱의 전하가 단위 면적을 통과했을 때를 1[A]로 정의한다. 1[A]의 전

류는 매우 큰 값며, Arduino에서는 1/1000[A] 단위인 [mA]를 사용한다.

저항(resistor): 전류의 흐름을 방해하는 정도를 나타낸다. 형태에 따라 색 띠나 숫자로 값

을 표시한다. 허용오차와 구성 물질 등에 따라 같은 값의 저항이라도 다양한 종류가 있다.

Arduino에서는 칩(chip) 형태의 저항이 사용되며, 이러한 형태의 부품을 표면실장소자

(SMD: Surface-Mount Device)라고 한다.

1.8 브레드 보드

납땜 없이 다양한 부품들을 조립하여 원하는 회로를 간단히 구성할 수 있는 장치이다. 시제

품 제작이나 실험용으로 주로 사용된다. 내부 결선은 그림 1.11과 같다. 처음 접하는 사용

자는 예제 실습 시 혼동하기 쉬우니 내부 결선을 잘 보고 사용해야 한다. 아래위의 가로로

된 부분은 가로로 서로 연결되어 있다. 이 부분에는 주로 전원을 연결한다. 적색 줄에는 양

극(+), 다른 색에는 접지(GND)를 연결하도록 한다. 그 아래 ‘ABCDE’가 쓰여있는 부분은

이들끼리 연결되어 있으며 ‘12345’ 같은 숫자끼리는 연결되어 있지 않다. 즉 세로로만 연결

되어 있고 옆의 구멍과는 연결되어 있지 않다.

그림 1.11 브레드 보드(bread board)와 내부 결선

1.9 Arduino UNO Starter kit

본 교재에 수록된 예제는 파츠키츠사(www.parts-kits.com)의 ‘Arduino UNO Starter

kit(ADK-01)’를 사용하여 구성하였다. ‘ADK-01’은 모든 예제를 실행할 수 있으며 구성

부품은 표 1.1과 같다.

Page 19: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

21

CHAPTER 01 시작

그림 1.12 Arduino Uno Starter kit (ADK-01)

표 1. 1 ADK-01 부품리스트

구분 품 명 수량

1 Arduino UNO R3 1개

2 USB 케이블 1개

3 브레드보드 MB-102 1개

4 RFID 모듈 1개

5 RFID 키체인 1개

6 RFID IC 카드 1개

7 I2C 1602 LCD모듈 1개

8 1채널 릴레이모듈 1개

9 DS1302 RTC 모듈 + CR2032 배터리 1개

10 마이크로폰 모듈 1개

11 온습도센서 모듈 1개

12 수위센서 모듈 1개

13 4 x 4 키패드 모듈 1개

14 RGB LED 모듈 1개

15 XY-Z 조이스틱 1개

16 서보모터 SG-90 1개

17 스텝모터 + 드라이버 1개

18 5mm LED 적색 5개

19 5mm LED 황색 5개

20 5mm LED 녹색 5개

21 1/4W 저항 220Ω 10개

Page 20: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

22

예제로 쉽게 배우는 아두이노> > >

22 1/4W 저항 330Ω 10개

23 1/4W 저항 1kΩ 10개

24 1/4W 저항 4.7kΩ 10개

25 1/4W 저항 10kΩ 10개

26 피에조 부저 1개

27 Passive 부저 1개

28 택트스위치 + 캡 7세트

29 기울기센서 1개

30 LM35 온도센서 1개

31 CDS센서 1개

32 화재감지센서 1개

33 IR 리시버 1개

34 10kΩ 포텐쇼미터 1개

35 1채널 7세그먼트 1개

36 4채널 7세그먼트 1개

37 8 x 8 도트매트릭스 1개

38 74HC595N 1개

39 IR 리모컨 1개

40 점퍼와이어 (수-수) 10개

41 20cm 듀폰케이블 (수-수) 20개

42 20cm 듀폰케이블 (수-암) 20개

43 9V 배터리 연결 스냅 1개

44 L298N 모듈 1개

45 DC모터 기어박스 1개

46 초음파거리센서 HC-SR04 1개

47 플라스틱 키트보관상자 1개

Page 21: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

1. Arduino에서 컴퓨터로 데이터 전송하기

2. 변수 유형별로 컴퓨터에 전송하기

3. Arduino에서 시리얼 통신을 이용하여 데이터 수신하기

02

시리얼 통신> > > > > > > > >

CHAPTER

Page 22: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

24

> > >

02CHAPTER

시리얼 통신

시리얼 통신이란 거의 모든 PC에서 표준으로 사용되는 통신 규약으로서 UART(Universal

Asynchronous Receiver/Transmitter)로 불리기도 하고 근래에는 USARTs(Universal

Synchronous/Asynchronous Receiver/Transmitter)라고도 한다. 이들은 동일한 의미

로 사용되고 RS-232, RS-422, RS-485와 같은 통신 표준과 함께 사용한다. 일반적인 마

이크로컨트롤러에서는 하나 혹은 그 이상의 시리얼 통신 포트를 지원한다. 실습에 사용할

Arduino UNO에는 두 개의 시리얼 통신 포트를 갖고 있으며, 이 중 하나가 USB를 통하여

사용자의 컴퓨터와 연결된다. 최근에는 USB의 등장으로 시리얼 통신 포트를 내장하지 않

은 노트북이나 PC가 대부분인데 그 이유는 USB가 외부 장치를 연결하는 간편한 방법이기

때문이다. Arduino 내부에는 USARTs를 USB(Universal Serial Bus)로 변환해주는 부품

으로 컴퓨터와 연결된다. 마이크로컨트롤러에서는 시리얼 통신을 위하여 다소 복잡한 과정

을 거치게 되지만 Arduino에서는 시리얼 통신 라이브러리를 이용하여 간편하게 사용할 수

있다.

시리얼 통신속도는 bps(bits per second) 혹은 Bps(bytes per second)로 나타낸다. 알파

벳은 같지만, 소문자와 대문자에 따라 구분된다. 1byte는 8bit로 9600bps는 1200Bps와 같

게 된다. 오늘날에는 전송속도의 증가로 kbps나 KBps를 쓰기도 한다. 1kbps는 1000bps,

1KBps는 1000Bps와 같다.

마이크로컨트롤러 시스템에서는 디버깅(Debugging: 프로그램의 오류를 수정하는작업)을

위해 별도의 장치인 ICE(In-Circuit Emulator)를 사용하지만 Arduino에서 디버깅하기 위

해서는 시리얼 통신을 통해 Arduino의 상태를 컴퓨터로 전송하는 방법을 사용한다. 본 장

에서는 Arduino에서 컴퓨터로 데이터나 문장을 전송하는 방법과 컴퓨터에서 Arduino로

문장이나 데이터를 전송하는 방법에 대하여 알아본다.

Page 23: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

25

CHAPTER 02 시리얼 통신> > >

02CHAPTER

시리얼 통신

ATMEGA328

ARDUINO UNO

ANALOG INPOWER

IOR

EFR

ESET

3.3V

5V GN

DG

ND

Vin

A0 A1 A2 A3 A4 A5

1213

TX ON

DIGITAL(PWM~)L

RX

GN

DAR

EF 11 ~10 ~9 8 7 ~6 ~5 4 ~3 2

TX

1R

X0

그림 2.1 Arduino와 PC와의 연결

2.1 Arduino에서 컴퓨터로 데이터 전송하기

Ex 2.1 Arduino에서 컴퓨터로 변수와 문자열 전송하기

실습 목표

1. Arduino에서 문자열과 데이터를 시리얼 통신을 이용하여 컴퓨터로 전송한다.

2. 전송할 데이터는 0부터 1초 간격으로 1씩 증가하는 숫자와 ‘sec’라는 문자열이다.

2. Arduino IDE의 시리얼 모니터에서 이를 확인해 본다.

Hardware Arduino를 컴퓨터와 USB 케이블을 이용하여 연결한다.

Commands

• Serial.begin(전송속도)

시리얼 통신 포트를 컴퓨터와 연결한다. 전송속도는 bps(bits per sec)로 일반적으로 9600으

로 설정한다. 19200, 57600, 115200 등의 값을 설정할 수 있다.

• Serial.print(전송내용)

괄호 안의 내용을 시리얼 통신으로 전송한다. 따옴표로 구분된 부분은 텍스트를 직접 전송하고

따옴표 없이 변수를 써주면 변수의 값이 전송된다.

• Serial.println(전송내용)

'Serial.print'와 같으나 전송 뒤 줄 바꿈을 한다.

•delay(지연시간)

지연시간에는 잠시 동작을 지연시키기 위한 값을 넣는다. 1/1000초 단위로 넣는다. 즉 1초를 지

연시키기 위해선 1000의 값을 입력시킨다.

Sketch

구성

1. 시리얼통신을 시작한다. ‘Serial.begin( )’ 명령어로 할 수 있다.

2. 변수를 전송하기 위해 ‘Serial.print( )’ 명령어를 사용하고, 문자열 전송 후 줄바꿈을 하기 위해

서 ‘Serial.println( )’ 명령어를 사용한다.

3. 루프를 1초마다 실행하기 위해서 ‘delay( )’ 명령어로 시간지연을 시켜준다.

Sketch

/*

예제 2.1

Arduino에서 컴퓨터로 변수와 문자열 전송하기

*/

// -32768~32767 범위의 변수 number 설정, 초기값은 0

int number = 0;

Page 24: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

26

예제로 쉽게 배우는 아두이노> > >

Sketch

void setup()

// 9600bps로 시리얼 통신 설정

Serial.begin(9600);

void loop()

Serial.print(number); // number 변수값 출력

Serial.println("ec"); // "sec"를 출력 후 줄 바꿈

delay(1000); // 1초동안 지연시킨다.

number++; // number 변수값을 하나 증가시킨다.

실습 결과

IDE의 시리얼 모니터를 실행시켜 Arduino에서 전송되는 메시지를 확인할 수 있다.

시리얼 통신으로 PC에 변수와 문자를 전송하는 스케치이다. ‘Serial.print’라는 간단한 명령어로

가능하다는 것을 알 수 있다. 마이크로프로세서를 공부했다면 시리얼통신에 대하여 서로 비교해

보는 것도 좋은 방법이다.

응용 문제1. 2초, 5초 단위로 시간을 변경해 보자.

2. 자신만의 메시지를 출력해보자.

Page 25: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

27

CHAPTER 02 시리얼 통신

2.2 변수 유형별로 컴퓨터에 전송하기

Arduino에서는 다양한 형태의 변수가 사용된다. 변수란 프로그램 내에서 필요에 따라 값

이 변하는 수이며 사용자가 이름을 정하여 사용하게 된다. 변수는 수의 계산에 사용되기도

하지만 ‘boolean’ 형 변수는 ‘참(true)’ 혹은 ‘거짓(false)’의 디지털 값과 문자열을 갖기도 한

다. 변수의 범위에 따라서 1바이트, 2바이트, 4바이트의 길이를 갖는데, 1바이트(Byte)는 8

비트(bit)로서 28개의 범위의 수를 표현할 수 있다. 즉 Arduino 내에 1바이트를 사용하게

설정된 변수는 0~255까지의 숫자를 저장할 수 있고, 한 개 비트를 부호를 나타내기 위한

부호비트로 사용하여 -128~127까지의 범위의 수를 저장할 수 있다. 부호의 사용여부는

변수 선언 시 ‘unsigned’의 유무에 따라 결정된다.

표 2.1 Arduino 변수 유형

변수 유형 바이트 변수 범위 용도

boolean 1 true(1) 혹은 false(0) 참(1) 아니면 거짓(0) 값을 나타냄.

char 1-128~127 혹은 아스키 코드

값과 매칭되는 문자부호가 있는 1바이트 숫자를 나타냄

unsigned char 1 0~255 0~255의 숫자를 나타낼 때 사용함

byte 1 0~255 unsinged char과 동일

int 2 -32,768~32767 부호가 있는 2바이트 숫자를 나타냄

short 2 -32,768~32767 int와 동일

unsigned int 2 0~65,535 부호가 없는 2바이트 숫자를 나타냄

word 2 0~65,535 unsigned int와 동일

long 4-2,147,483,648

~2,147,483,647부호가 있는 4바이트 숫자를 나타냄

unsigned long 4 0~4,294,967,295 부호가 없는 4바이트 숫자를 나타냄

float 4-3.4028235*1038

~3.4028235*1038소수점 있는 숫자를 나타냄

double1) 4 or 8

-3.4028235*1038

~3.4028235*1038

Or

-1.79*10308~1.79*10308

소수점 있는 숫자를 나타냄.

4바이트의 경우 float과 동일

8바이트의 경우 변수 범위가 커짐

String - 문자열에 따라 다름 문자열을 나타냄.

C 언어를 접한 적이 있는 사용자라면 Arduino에서 사용되는 변수 유형이 C 언어와 흡사한

Page 26: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

28

예제로 쉽게 배우는 아두이노> > >

것을 알 수 있을 것이다. 변수 형태는 사용자가 원하는 수의 범위의 변수 형태로 선언해서

사용하면 된다. 그러나 전문적인 마이크로컨트롤러 시스템과 같이 메모리를 최적화하여 사

용할 필요가 있을 경우에는 수의 범위에 유의해야 하지만 특별한 상황이 아니라면 int 등의

형태로 통일하는 것이 편리하다. 소수점 연산은 정수 연산보다 복잡한 과정을 거치기 때문

에 Arduino의 속도를 떨어트릴 수 있으므로 특별히 소수점이 필요하지 않은 경우를 제외

하고는 모두 char형이나 int형의 변수를 사용하는 것이 효율적이다.1)

예제 2.2는 Arduino에서 PC로 전송할 때 변수 유형별로 어떠한 특징을 갖는지에 대한 예

제이다. 숫자의 경우 옵션에 따라 전송되는 형태가 결정되지만, 문자의 경우 ASCII 코드와

대응되는 숫자가 전송된다. ASCII 코드는 ‘American Standard Code for Information

Interchange’ 의 약자로 컴퓨터나 통신기기 등에 사용되는 알파벳, 숫자, 특수 기호 등에

대응되는 8비트 코드를 의미한다. 실제 문자를 전송할 때 16진수 코드 ‘0x41’은 알파벳 ‘A’

에 대응된다. 즉 ‘A’를 전송하면 실제로는 ‘0x41’이란 코드가 전송되는 것이다.

ASCII CODE TABLE

0 0x00 NULL

1 0x01 SOH

10 HEX 문자

2 0x02 STX

3 0x03 ETX

4 0x04 EOT

5 0x05 ENQ

6 0x06 ACK

7 0x07 BEL

8 0x08 BS

9 0x09 HT

10 0x0A LF

11 0x0B VT

12 0x0C FF

13 0x0D CR

14 0x0E SO

15 0x0F SI

16 0x10 DEL

17 0x11 DC1

18 0x12 DC2

19 0x13 DC3

20 0x14 DC4

21 0x15 NAK

22 0x16 STN

23 0x17 ETB

10 HEX 문자

24 0x18 CAN

25 0x19 EM

26 0x1A SUB

27 0x1B ESC

28 0x1C FS

29 0x1D GS

30 0x1E RS

31 0x1F US

32 0x20 SP

33 0x21 !

34 0x22 "

35 0x23 #

36 0x24 $

37 0x25 %

38 0x26 &

39 0x27 '

40 0x28 (

41 0x29 )

42 0x2A *

43 0x2B +

44 0x2C ,

45 0x2D -

10 HEX 문자

46 0x2E .

47 0x2F /

48 0x30 0

49 0x31 1

50 0x32 2

51 0x33 3

52 0x34 4

53 0x35 5

54 0x36 6

55 0x37 7

56 0x38 8

57 0x39 9

58 0x3A :

59 0x3B ;

60 0x3C <

61 0x3D =

62 0x3E >

63 0x3F ?

64 0x40 @

65 0x41 A

66 0x42 B

67 0x43 C

10 HEX 문자

68 0x44 D

69 0x45 E

70 0x46 F

71 0x47 G

72 0x48 H

73 0x49 I

74 0x4A J

75 0x4B K

76 0x4C L

77 0x4D M

78 0x4E N

79 0x4F O

80 0x50 P

81 0x51 Q

82 0x52 R

83 0x53 S

84 0x54 T

85 0x55 U

86 0x56 V

87 0x57 W

88 0x58 X

89 0x59 Y

10 HEX 문자

90 0x5A Z

91 0x5B [

92 0x5C \

93 0x5D ]

94 0x5E ^

95 0x5F _

96 0x60 .

97 0x61 a

98 0x62 b

99 0x63 c

100 0x64 d

101 0x65 e

102 0x66 f

103 0x67 g

104 0x68 h

105 0x69 i

106 0x6A j

107 0x6B k

108 0x6C l

109 0x6D m

110 0x6E n

111 0x6F o

10 HEX 문자

112 0x70 p

113 0x71 q

114 0x72 r

115 0x73 s

116 0x74 t

117 0x75 u

118 0x76 v

119 0x77 w

120 0x78 x

121 0x79 y

1222 0x7A z

123 0x7B

124 0x7C |

125 0x7D

126 0x7E ~

127 0x7F DEL

그림 2.2 ASCII 코드표

1) ATmega 계열을 사용하는 Arduino 시리즈(UNO, NANO, MEGA 등)는 4바이트를 사용하고 ARM 계열을 사용하는 Arduino Due는 8바이트를 사용한다.

Page 27: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

29

CHAPTER 02 시리얼 통신

Ex 2.2 변수 유형별 Arduino에서 컴퓨터로 전송하기

실습 목표

1. Arduino에서 컴퓨터로 데이터를 전송할 때 변수 유형별로 출력한다.

2. char로 선언된 변수, int로 선언된 변수, float로 선언된 변수를 Serial.print 명령어를 이용하여

PC로 전송하자.

3. Serial.print 명령어의 출력 옵션을 변경하여 전송해 보자.

4. 문자열 변수를 사용해 보자.

5. 각 변수 유형별 출력되는 차이를 비교해 보자.

Hardware Arduino를 컴퓨터와 USB 케이블을 이용하여 연결한다.

Commands

• Serial.write(char 변수);

char변수에 해당하는 ASCII 코드값의 문자를 출력한다.

Commands

• Serial.print(변수,BIN);

변수를 2진수(Binary)로 표시한다.

• Serial.print(변수,DEC);

변수를 10진수(Binary)로 표시한다.

• Serial.print(변수,HEX);

정해진 변수를 16진수(Hexadecimal)로 표시한다.

Sketch

구성

1. ‘65’란 숫자를 char형, int형, float형 변수에 각각 저장한다.

2. ‘Binary:’, ‘Decimal:’, ‘Hexadecimal:’, ‘ASCII:’ 등 네가지 문자열을 저장하여 호출하여 사용

한다.

3. 변수에 저장된 숫자를 2진수형, 10진수형, 16진수형, ASCII 코드형 등 Serial.print 명령어의 옵

션을 변경하여 전송한다.

4. 옵션이 변경될 때마다 문자열을 호출하여 함께 출력한다.

5. loop가 반복될 때마다 숫자를 1씩 증가시킨다. float형은 0.1씩 증가시킨다.

Sketch

/*

예제 2.2

변수 유형별 Arduino에서 컴퓨터로 전송하기

*/

// 65란 숫자를 유형별 변수에 저장한다.

char charValue = 65;

int intValue = 65;

float floatValue = 65.0;

// 문자열 네가지를 설정한다.

String stringValue[]="Binary:", "Decimal:", "Hexadecimal:", "ASCII:";

Page 28: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

30

예제로 쉽게 배우는 아두이노> > >

Sketch

void setup()

// 9600bps로 시리얼 통신 설정

Serial.begin(9600);

void loop()

// ‘char Value’를 출력하고 문자열과 숫자를 변수 유형별로 출력한다.

Serial.println("*** char Value ***");

Serial.print(stringValue[0]); // stringValue 중 첫 번째 문자열 출력

Serial.println(charValue,BIN); // 2진수 형태로 출력

Serial.print(stringValue[1]); // stringValue 중 두 번째 문자열 출력

Serial.println(charValue,DEC); // 10진수 형태로 출력

Serial.print(stringValue[2]); // stringValue 중 세 번째 문자열 출력

Serial.println(charValue,HEX); // 16진수 형태로 출력

Serial.print(stringValue[3]); // stringValue 중 네 번째 문자열 출력

Serial.write(charValue); // charValue에 해댕하는 ASCII 코드값 출력

// 줄바꿈

Serial.println();

// 줄바꿈

Serial.println();

// 'int Value'를 출력하고 문자열과 숫자를 변수 유형별로 출력한다.

Serial.println("*** int Value ***");

Serial.print(stringValue[0]);

Serial.println(intValue,BIN);

Serial.print(stringValue[1]);

Serial.println(intValue,DEC);

Serial.print(stringValue[2]);

Serial.println(intValue,HEX);

Serial.print(stringValue[3]);

Serial.write(intValue);

Serial.println();

Serial.println();

// 'float Value'를 출력하고 문자열과 숫자를 변수 유형별로 출력한다.

Serial.println("*** float Value ***");

Serial.print("float Value:");

Serial.println(floatValue);

Page 29: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

31

CHAPTER 02 시리얼 통신

Sketch

Serial.println();

charValue++; // charValue 1 증가

intValue++; // intValue 1 증가

floatValue +=0.1; // floatValue 0.1 증가

delay(10000); // 10초동안 지연시킨다.

실습 결과

IDE의 시리얼 모니터를 실행시켜 Arduino에서 전송되는 메시지를 확인할 수 있다.

10초 간격으로 증가된 값에 대하여 출력하게 된다. 이때 2진수, 10 진수, 16진수로 표시되고, 증

가된 숫자에 해당하는 아스키코드의 문자가 전송된다. ‘float’형 변수는 소수점이 함께 표시된다.

응용 문제

1. 0~15까지 2진수를 10진수와 16진수로 출력하는 스케치를 작성해보자.

(hint: 10진수 숫자를 16진수 형태로 출력하면 10진수가 16진수로 변경되어 출력된다.)

2. 간단한 연산을 넣어서 결과를 확인해보자.

Page 30: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

32

예제로 쉽게 배우는 아두이노> > >

2.3 Arduino에서 시리얼 통신을 이용하여 데이터 수신하기

Arduino에서 다른 기기나 컴퓨터로부터 전송되는 데이터를 수신하려고 한다. 시리얼 통

신은 8비트를 기본으로 하여 통신한다. 예제 2.3에서는 컴퓨터로부터 시리얼 통신으로 데

이터를 수신하여 이를 처리하는 스케치이다.

Ex 2.3 컴퓨터로부터 데이터 수신하기

실습 목표1. 컴퓨터에서 Arduino로 0~9의 숫자를 전송한다.

2. Arduino에서는 전송 받은 숫자만큼 Arduino 보드의 LED를 점멸시킨다.

Hardware Arduino를 컴퓨터와 USB를 이용하여 연결한다.

Commands

• Serial.available( )

시리얼 통신에 수신된 데이터가 있는지 확인한다. 있을 경우 참(true)의 값을 갖는다.

• Serial.read( )

시리얼 통신을 통하여 수신된 값을 읽는다.

• isDigit(변수)

변수의 값이 ASCII 코드의 0~9의 숫자 범위에 있는지 여부를 판단. 범위에 있을 경우 참

(true)의 값을 갖는다.

• pinMode(핀번호, 설정)

핀의 입출력 모드를 설정한다. '핀번호'에는 설정하고자 하는 핀의 번호와 '설정'에는 입력

으로 사용하기 위해선 'INPUT', 출력으로 사용하기 위해선 'OUTPUT', 입력이며 풀업 사용시

'INPUT_PULLUP'을 적는다.

• digitalWrite(핀번호, 값)

핀에 디지털 출력(High or Low)을 한다. '핀번호'에는 출력하고자 하는 핀의 번호를, '값'에는

'HIGH' 혹은 'LOW'를 설정하여 High 혹은 Low 출력을 한다.

Sketch

구성

1. 13번 핀에 연결된 내장 LED를 이용한다.

2. 시리얼 통신 상태를 감시한 후 시리얼 통신으로 입력되는 데이터가 있을 때 이를 저장한다.

3. 전송된 값은 ASCII 코드값이므로 이를 숫자로 변경한다.

4. 숫자만큼 LED를 0.2초 간격으로 점멸시킨다.

Sketch

/*

예제 2.3

컴퓨터로부터 시리얼 통신을 통하여 데이터 수신하기

*/

// LED 출력을 할 핀번호 설정

const int ledPin = 13;

Page 31: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

33

CHAPTER 02 시리얼 통신

Sketch

// 점멸횟수 변수 설정

int blinkNumber = 0;

void setup()

Serial.begin(9600); // 9600bps로 시리얼 통신 설정

pinMode(ledPin,OUTPUT); // 13번 핀을 출력으로 설정

void loop()

// 시리얼 통신으로 입력 받은 데이터가 있는지를 검사하여

// 데이터가 있을 경우에 if문 안의 명령어를 실행

if(Serial.available())

// val 변수에 시리얼 통신값 읽어오기

char val = Serial.read();

// 입력된 값이 0~9의 숫자인지를 판단

if(isDigit(val))

// val은 ASCII 코드값이므로 숫자로 바꿔주기 위하여

// ‘0’의 아스키 코드값을 빼줌

// blinkNumber에는 실제 숫자가 저장된다.

blinkNumber = (val - ‘0’);

// blinkNumber 만큼 LED를 점멸시킴

for(char i=0;i < blinkNumber;i++)

digitalWrite(ledPin, HIGH);

delay(200);

digitalWrite(ledPin,LOW);

delay(200);

// 점멸 횟수를 리셋함

blinkNumber = 0;

실습 결과IDE의 시리얼 모니터를 실행시켜 전송란에 0~9의 값을 입력한 후 Arduino의 LED가 입력한 값

만큼 점멸하는지를 확인해 본다.

응용 문제

1. 0~9의 입력 값에 따라 점멸 주기가 변화하는 스케치를 작성해 보자.

2. 0~9의 숫자를 전송하면 전송된 수의 2진수와 16진수를 컴퓨터로 전송하는 스케치를 만들어

보자. (hint: 예제 2.2를 참고하자)

Page 32: 머리말 · 2016-01-26 · 4 머리말 각 예제는 다음의 순서로 구성되었다. 예제 번호 예제 이름 실습 목표 예제에서 수행하고자 하는 동작에

34

예제로 쉽게 배우는 아두이노> > >

연습문제

1. 시리얼 통신에는 다양한 규격이 있다. RS-232, RS-485, RS422에 대하여 조사하고 그

차이점을 설명하시오.

2. USB도 대표적인 시얼 통신 방식 중 하나이다. USB에 대하여 설명하시오.

3. 표준 ASCII 코드표와 확장 ASCII 코드표를 찾아 비교하여라.

4. ‘char’형 변수와 ‘unsigned char’형 변수는 표현할 수 있는 수의 범위가 다르다. 또한, ‘int’

형과 ‘unsigned int’형 변수도 수의 범위가 다르다. 그 이유를 설명하여라.

5. bps는 ‘bit per sec’의 약자로서 1초에 전송되는 비트의 수이다. Bps는 ‘Byte per sec’로 1

초에 전송되는 바이트의 수이다. 인터넷 속도에 대하여 광고하는 ‘Mbps’란 어떠한 의미가

있는가?