아두이노 코딩 및 프로젝트 실습 -...

230
v1.0 김영준 저 공학박사, 목원대학교 겸임교수 前 Microsoft 수석연구원 헬로앱스 http://www.helloapps.co.kr 아두이노 코딩 및 프로젝트 실습

Upload: others

Post on 02-Sep-2019

9 views

Category:

Documents


0 download

TRANSCRIPT

v1.0

김영준 저공학박사, 목원대학교 겸임교수

前 Microsoft 수석연구원

헬로앱스http://www.helloapps.co.kr

아두이노 코딩 및 프로젝트 실습

- II -

목차

01. 아두이노 코딩 및 프로젝트 준비작업 1

02. LED 점멸하기 29

03. 절전기능 LED 후레쉬 47

04. 틱톡 스위치 만들기 61

05. 토글 스위치를 활용하는 프로젝트 73

06. 스마트 헤드라이트 86

07. 동체인식 및 경보음 실행 장치 만들기 104

08. 차량 후방감지기 및 멜로디 연주장치 125

09. 컬러 LED바 예술 창작작품 만들기 141

10. 컬러 무드등 만들기 161

11. 나만의 로봇 제어함수 만들기 169

12. 로봇 조종기 만들기 190

13. 자율 주행 로봇 204

14. 블루투스 원격 제어하기 213

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 3 -

◾ 아두이노 프로젝트 활동에 필요한 H/W 및 S/W 설치 작업을 완료한다.

◾ 아두이노의 역사와 기능에 대해 이해한다.

◾ 아두이노의 용도와 기능에 대해 살펴한다.

◾ 아두이노 S/W 개발툴을 설치한다.

◾ USB 드라이버를 설치한다.

◾ 아두이노 연결 상태를 확인한다.

01 아두이노 코딩 및 프로젝트 준비작업

학습 목표

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 4 -

◾ 아두이노 보드, 올인원 쉴드, USB 연결 케이블

아두이노 우노보드 올인원 쉴드

준비물

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 5 -

1.1 아두이노(Arduino)란?

◾ 아두이노는 2003년 이탈리아의 Interaction Design Institute Ivrea (IDII)

학생들의 수업을 위해 개발이 시작된 오픈소스 프로젝트의 결과물이다.

◾ 초기 프로젝트 팀에는 Massimo Banzi, David Cuartielles, Tom Igoe,

Gianluca Martino와 David Mellis 등이 참여하였으며 이들이 프로젝트

모임을 위해 만난 장소는 이탈리아 Ivrea에 있는 술집인데, 이 술집의 이

름이 Arduin of Ivrea 이었다.

◾ Arduin of Ivrea은 1002년 부터 1014년 까지 이탈리아 Ivrea 지역을 통

치한 후작(Margrave)의 이름으로서, 이러한 이유 때문에 아두이노가 이탈

리아 왕의 이름을 의미한다고도 알려져 있다.

◾ 아두이노(Aruino)라는 공식 상표는 5명의 아두이노 참여 팀원들이 2008년

Arduino LLC라는 회사를 설립하면서 만들어 졌으나, 미국 이 외의 지역

에서의 아두이노 상표권은 Arduino SRL이라는 회사가 가져감으로써, 미

국 이외의 지역에서 Arduino 라는 상표를 사용하지 못하는 문제가 발생을

하였다. 이로 인해 Genuino 라는 새로운 상표를 만들어서 사용하기 시작

을 하였다. 하지만 이 두 회사는 2016년 합병을 하게 됨으로써, Arduino

와 Genuino로 분리되어 있던 아두이노 상표권 문제는 결국 마무리 되었

다.

아두이노 탄생 배경

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 6 -

◾ 구글 검색에서 Arduino라는 단어로 검색을 하면 아래의 사진에 있는 제품

이 가장 많이 표시되는 것을 볼 수 있다. 이 제품은 수 많은 아두이노 지

원 보드 제품 중에서 가장 많이 알려져 있는 아두이노 우노 (Arduino

Uno) 제품으로서, 단지 아두이노 지원 보드 중에서 가장 보편적인 보드일

뿐 아두이노 그 자체를 정의하는 것이 아니다.

일반인들에게 대표적으로 알려져 있는 아두이노 우노 보드

아두이노에 대한 오해

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 7 -

◾ 그렇다면, 아두이노의 정체는 무엇일까? 아두이노는 크게 3가지 종류의 구

성 요소로 이루어져 있으나, 핵심은 SW 라이브러리를 의미한다.

구성 요소 설명

SW 라이브러리

� Arduino.h 라는 이름으로 사용되는 SW 라이브러리로서, 복잡한 AVR 명령어 기능들을 쉬운 C언어 기반의 함수로 정의해 놓은 것이다.

� 실제 아두이노 프로젝트의 가장 핵심적인 결과물이며, 아두이노 그 자체라고도 부를 수 있다.

개발 툴 (IDE)

� 흔히 스케치 코드라고 부르는 아두이노 코드를 작성하는 개발 툴이다.

� 이 툴은 아두이노 프로젝트 팀에서 개발한 것이 아니라 MIT에서 C언어 교육용으로 개발하여 배포하고 있는 프로세싱이라는 교육용 SW 개발툴을 가져다 사용한 것이다.

하드웨어 보드� 아두이노 우노 보드와 같은 아두이노 라

이브러리를 지원하는 하드웨어 보드를 의미한다.

다양한 아두이노 H/W 보드 종류들

아두이노의 구성 요소

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 8 -

◾ 아두이노 보드와 라즈베리파이 보드는 일반인이 보기에 비슷한 것처럼 보

이지만 아주 큰 차이점을 가진다.

◾ 라즈베리파이는 컴퓨터로 분류되지만 아두이노는 컴퓨터가 아닌 마이크로

컨트롤러 (일명 마이컴 이라 부름)로 분류되기 때문이다.

아두이노와 라즈베리파이의 차이점

아두이노 라즈베리파이

� 마이크로 컨트롤러이다.

� OS가 없으며, 메모리에 저장된

하나의 프로그램이 바로 실행된

다.

� 키보드나 마우스 같은 입출력

장치를 연결할 수 없다.

� 비전문가를 위한 임베디드 장치

개발용으로 만들어 졌다.

� 임베디드 기반 창작 작품이나

C언어 교육용으로 활용된다.

� 컴퓨터이다.

� OS(리눅스, Windows 10)를

설치할 수 있다.

� 키보드나 마우스 같은 입출력

장치가 연결된다.

� 개발도상국에 저렴한 비용의

컴퓨터를 보급하기 위해 만들어

졌다.

� OS나 보안, 네트워크 교육용으로

주로 활용되고 있다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 9 -

◾ 기업 형태의 변화 (직장 형태 및 직장에서의 역할의 변화)

4차 혁명시대를 대비한 아두이노 활용 직무훈련의 필요성

기존의 기업 형태 다가올 미래에서의 기업 형태

� 많은 인원이 모여 규모화된 기업 활동� 역할 전문화 및 세분화

� 개인 또는 소수인원의 네트워크화� 개인이 개발의 전과정 역량 보유 요구� 기획/설계/개발/테스트/생산 전과정에 대한 프로젝트형 체험 및 실습 필요� 시장의 요구에 민첩하게 대응할 수 있는 훈련 및 생산 역량 필요

� C언어 / 전자회로 / 납땜 등 개별적인 기술 지식 및 훈련 위주의 교육

� 아이디어 도출 / 프로젝트 기획 / 자료수집 / 디자인 / 설계 / 개발 / 테

스트 / 생산 전과정에 대한 프로젝트 수행 교육

� 아두이노 활용 프로젝트형 수행 교육은 미래 시대를 대비하기 위한 가장 효과 적인 직무 개발 및 직무 교육 과정으로 활용될 수 있음

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 10 -

1.2 초보자용 아두이노 코딩 SW 설치

◾ 아두이노 코딩을 하기 위해서는 아두이노 라이브러리를 사용할 수 있는 개

발 환경이 필요하다.

◾ 아두이노 라이브러리는 기본적으로 C언어로 작성되어 있다 (엄밀히 말하면

AVR C++ 언어로 작성되어 있음).

◾ C언어로 라이브러리가 작성되어 있긴 하지만 여전히 일반인이 사용하기에

는 어려운 문제점이 있으며, 이를 해소하기 위해 다양한 보완 툴들이 계속

만들어지고 공급되고 있다.

코딩 SW의 종류

아두이노 공식 홈페이지에서배포하는 IDE 툴

헬로앱스에서 배포하는초보자용 코딩 SW 툴

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 11 -

◾ 초보자용 아두이노 코딩 SW는 아래의 페이지에서 다운로드 가능하다.

http://www.helloapps.co.kr/download/

초보자용 코딩 SW 설치

� 무료� C/C++ 언어로만 개발� 코드 공유 기능 없음

� 유료 (무료 체험판 사용 가능)� 블록/스크립트/C언어/C++언어 지원� 사용자 수준별로 언어 선택 가능� 블록이나 스크립트 코딩시 실시간

C언어 생성 기능 지능� 교사와 학생간 코드 공유기능 지

원� 아두이노 시뮬레이터 기능 지원

아두이노 공식 홈페이지에서배포하는 IDE 툴

헬로앱스에서 배포하는초보자용 코딩 SW 툴

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 12 -

◾ 아래의 페이지에서 오른쪽에 있는 다운로드 아이콘을 클릭하여 최종 버전

의 아두이노 코딩 SW를 다운로드 받는다.

◾ 다운로드 받은 설치 파일을 마우스로 클릭하여 설치를 진행한다. 특별히 선

택할 사항은 없으며, 다음 버튼을 계속 눌러주면 설치가 마무리 된다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 13 -

◾ 모든 아두이노 보드들은 컴퓨터에 연결하기 전에 반드시 USB 드라이버가

설치되어 있어야 하며, 매번 설치할 필요 없이 맨 처음 한번만 설치해 주

면 된다.

◾ 초보자용 코딩 SW가 설치되고 나면, 바탕 화면에 SPL 폴더가 만들어 진

다. SPL 폴더에서 맨 아래에 있는 『아두이노 우노 보드 USB 드라이버

(64bit)』 파일을 클릭하여 설치를 진행한다. 만약 컴퓨터의 OS가 32비트라

면 오류가 발생할 것이다. 이 경우에는 『아두이노 우노 보드 USB 드라이

버 (32bit)』 파일을 클릭하여 설치를 진행해 주면 된다.

USB 드라이버 설치 전에 아두이노 보드를 컴퓨터에 연결하면 않된다. 반드

시 USB 드라이버를 먼저 설치한 후에 아두이노 보드를 컴퓨터에 연결해 주

어야 설치 작업이 마무리 될 수 있다.

USB 드라이버 설치

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 14 -

◾ 아두이노 우노 보드를 USB 케이블을 이용하여 컴퓨터와 연결해 준다.

◾ 아두이노 보드가 컴퓨터에 맨 처음 연결되는 순간, 컴퓨터에서 남아 있는

USB 드라이버 설치 작업이 자동으로 진행되며, 10초 ~ 20초 정도 시간이

지나면 설치 작업이 마무리 된다.

USB 드라이버를 컴퓨터에 연결한 후, 진행되는 USB 드라이버 설치 마무리

작업은 따로 눈에 보이지 않는다. 설치 작업이 끝나면 조그만 팝업창으로

준비되었다는 메시지 창이 보일 수도 있고 그렇지 않을 수도 있기 때문에,

USB 케이블 연결 후, 잠시 기다렸다가 프로그램을 실행시켜 주어야 한다.

아두이노 보드 연결하기

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 15 -

◾ 아두이노 USB 설치 및 케이블 연결 작업이 끝나고 나면, 이제 아두이노용

코딩 SW를 실행시켜 보자. 바탕화면의 SPL 폴더를 살펴보면 『SPL for

아두이노』 항목이 보일 것이다. 이 항목을 클릭하여 프로그램을 실행시킨

다.

◾ 제품키를 입력하는 창이 표시되면 체험판으로 활성화 버튼을 클릭하거나

제품키를 입력하고 제품 활성화 버튼을 클릭한다.

코딩 SW 실행하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 16 -

◾ 코딩 편집기에 명령어를 한글로 표시할지 아니면 영어로 표시할지 선택하

는 창에서 영어로 표시를 선택한다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 17 -

◾ SPL은 EPL (Educational Programming Language)의 한 종류로서,

Simple Programming Language의 약자이다. C언어를 BASIC 언어처럼

사용하기 쉽게 정의한 언어로서, 아래의 표는 기존 C언어 코드를 SPL 언

어로 표시한 예를 보여준다.

◾ 프로그램 실행 후, 아두이노 보드가 정상적으로 인식되었다면, 다음과 같이

프로그램 상단에 아두이노 보드 종류와 COM 포트가 표시되어 있어야 한

다.

참고 자료

C언어 SPL언어 int a = 0;

for (int i = 0; i < 10; i++) { a = a + 1; }

a = 0

for (i = 0; i < 10; i++) { a = a + 1 }

아두이노 연결 상태 확인하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 18 -

◾ 아두이노 보드가 Arduino Uno로 선택되어 있는 지 반드시 확인한다. 보

드 종류가 다르면 프로그램이 아우이노 보드로 정상적으로 업로드 되지 않

는다.

◾ COM 포트를 눌러서 COM 포트에 여러 포트들이 표시될 경우, 맨 마지막

에 있는 포트가 선택되어 있는 지 확인한다. 만약 아두이노 프로그램 업로

드시 아두이노 보드에 정상적으로 업로드가 되지 않는 다면, COM 포트를

다른 포트로 변경해 보기 바란다.

◾ 프로그램을 새로 작성하거나 기존 프로그램을 불러올 경우, 코드의 내용을

블록 또는 스크립트 (C언어 포함) 모드로 열어서 보거나 편집할 수 있다.

◾ 블록으로 개발된 코드를 스크립트로 볼 수 있으며, 반대로 스크립트나 C언

어로 개발된 코드를 블록으로 열어서 볼 수 도 있다.

※ 주의 사항

스크립트나 C언어 입력 모드

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 19 -

◾ 아두이노 개발 환경은 실질적으로 C언어이다. 사용자가 블록 코딩이나 스

크립트 형태로 개발하든 결과물은 반드시 C언어로 변환된 후, 컴파일되어

야 한다. SPL 코딩 SW는 블록 코딩이나 스크립트로 개발된 코드를 자동

으로 C언어로 변환을 시킨다.

◾ 개발된 C언어는 컴파일 과정을 거쳐 바이너리 파일 (HEX 파일)로 생성되

며, 이 파일을 아두이노 보드에 업로드 시키면 아두이노 보드에서 실행되

게 된다.

◾ 현재 상태의 비어있는 기본 프로그램을 다음과 같이 실행 버튼을 클릭하여

업로드해 보자.

프로그램 실행하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 20 -

◾ 아두이노 코딩 툴의 상단 메뉴에서 실행 버튼을 클릭한 후, 다음과 같이 콘

솔창이 뜨면서 조금 기다리면, 많은 라인의 결과들이 화면에 표시된다.

◾ 콘솔창이 표시된 후, 콘솔창 내부에 위와 같이 메시지가 표시되지 않고 다

르게 표시된다면, 업로드가 진행되지 못한 경우이다.

◾ 업로드 실패 원인 1 – 스크립트 오류 발생) 작성한 프로그램에 오류가 있

는 경우에는 위와 달리 error: 라는 단어가 표시된 문자열이 표시된다. 콘

솔창의 메시지에 error: 표시가 있다면 프로그램에 오류가 있는 경우이므

로 반드시 오류를 수정한 후, 업로드 하기 바란다.

업로드 결과 확인하기

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 21 -

◾ 업로드 실패 원인 2 – 아두이노 보드 미연결) “아두아노 보드가 연결되지

않았습니다”라고 메시지가 뜨는 경우는 해당 컴포트를 인식하지 못하였거

나 실제로 아두이노 보드와 컴퓨터가 연결되지 않은 경우이다. USB 케이

블을 연결하거나 케이블을 뺐다가 다시 연결한 후, 업로드를 실행해 보기

바란다.

◾ 업로드 실패 원인 3 – 아두이노 보드 선택 오류) 콘솔창에서 오랜 시간이

경과된 후, 메시지가 표시되는 경우인데, 아두이노 보드를 다른 종류로 선

택하여 실행을 한 경우이다. 아두이노 보드 종류가 Arduino Uno로 되어

있는 지 다시 한번 확인해 보기 바란다.

◾ 업로드 실패 원인 4 – COM 포트 선택 오류) 실패원인 3과 비슷한 경우로

서, 아두이노 보드의 종류가 정상적으로 선택되어 있다면, COM 포트에

COM 포트가 여러 개가 있는 지 화인해 보아야 한다. 보통 맨 마지막에

있는 COM 포트를 선택하여 진행하면 정상적으로 잘 진행되는데, COM

포트를 다른 것을 변경한 후, 업로드를 진행해 보기 바란다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 22 -

1.3 전문가용 아두이노 코딩 SW 설치

◾ 전문가용 아두이노 코딩 SW는 아두이노 홈페이지에서 다운로드 받을 수

있다. 이 툴은 아두이노 IDE (Integrated Development Environment) 라

고 불리며, IDE 툴로 만들어진 소스코드를 우리가 보통 스케치 라고 부른

다.

◾ 따라서 통상 스케치 개발 툴 이라고도 불린다.

◾ 스케치 코드를 개발하는 아두이노 IDE 툴은 MIT에서 개발한 프로세싱

(http://www.processing.org) 이라는 C언어 교육용 SW에서 사용중인 개

발툴로서, 아두이노 그룹이 이 개발환경을 가져다 사용하고 있다. 프로세싱

에서 만든 소스 코드도 동일하게 스케치라고 불리기 때문에 스케치 코드는

아두이노에서만 사용되는 것이 아니라는 것에 유의하기 바란다.

◾ 아래의 경로에 접속하여 아두이노 IDE 툴을 다운로드 받는다.

https://www.arduino.cc/en/Main/Software

아두이노 IDE 다운로드

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 23 -

◾ Arduino IDE 다운로드 화면에서 두 번째 항목인 “Windows ZIP file for

non admin install” 항목을 클릭한다.

◾ Windows용 설치 파일의 비교

Windows Installer� USB 드라이버 까지 자동으로 설치해 준다.� PC에 관리자 권한이 있는 경우에만 설치 가능

Windows ZIP file for non admin install

� 설치 과정없이 압축을 아무 폴더에나 풀기만 하면 실행 가능� USB 드라이버를 따로 설치해 주어야 한다.� PC에 관리자 권한이 없어도 설치가 가능하다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 24 -

◾ JUST DOWNLOAD 링크를 클릭한다.

◾ 다른 이름으로 저장 항목을 클릭한 후, 파일을 저장하고자 하는 아무 폴더

나 지정한다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 25 -

◾ 다운로드 받은 zip 파일의 압축을 푼다.

◾ 다운로드 받은 zip 파일을 더블클릭하지 말고, 반드시 압축을 푼 후에 압축

이 풀린 폴더로 이동하여 프로그램을 실행해야 한다. 압축을 풀지 않고

zip 파일을 더블 클릭하는 경우에도 zip 파일의 내용이 폴더에 보이게 되

는데, 사용자가 이 상태에서 아두이노 편집기 파일을 실행하게 되면 정상

적으로 실행되지 않는다.

◾ USB 드라이버를 설치하기 전에는 아두이노 보드를 아직 PC에 연결시키지

말고 분리시켜 놓는다.

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 26 -

◾ 압축이 풀린 폴더로 이동하면 다음과 같이 파일들이 보일 것이다. 이 목록

에서 drivers 라는 폴더로 이동한다.

◾ 윈도우 OS 종류에 맞게 해당 USB 드라이버 설치 파일을 실행해 준다.

USB 드라이버 설치

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 27 -

◾ 아두이노 우노 보드를 USB 케이블을 이용하여 컴퓨터와 연결해 준다.

◾ 아두이노 보드가 컴퓨터에 맨 처음 연결되는 순간, 컴퓨터에서 남아 있는

USB 드라이버 설치 작업이 자동으로 진행되며, 10초 ~ 20초 정도 시간이

지나면 설치 작업이 마무리 된다.

USB 드라이버를 컴퓨터에 연결한 후, 진행되는 USB 드라이버 설치 마무리

작업은 따로 눈에 보이지 않는다. 설치 작업이 끝나면 조그만 팝업창으로

준비되었다는 메시지 창이 보일 수도 있고 그렇지 않을 수도 있기 때문에,

USB 케이블 연결 후, 잠시 기다렸다가 프로그램을 실행시켜 주어야 한다.

아두이노 보드 연결하기

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 28 -

◾ 이전 폴더로 돌아가면 아두이노 압축이 풀린 폴더에 arduino.exe 라는 실

행 파일을 볼 수 있을 것이다. 이 exe 파일을 실행한다.

◾ 툴 -> 보드 -> Arduino Uno 보드를 선택한다.

프로그램 실행하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 29 -

◾ 포트를 선택한다. 포트가 여러 개인 경우, 마지막 포트를 선택하거나

Arduio라고 표시된 포트를 선택한다.

◾ 파일 -> 예제 -> 01.Basic -> Blink 예제를 오픈한다.

예제 실행하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 30 -

◾ 예제 파일의 내용을 확인해 본다.

◾ 왼쪽 위에 있는 아이콘 메뉴 중에서 다음 그림과 같이 오른쪽 화살표 아이

콘을 클릭하여 프로그램을 아두이노 보드에 업로드해 준다. 정상적으로 업

로드가 완료되고 나면 화면 아래 콘솔창에 업로드 완료라는 메시지가 표시

된다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 29 -

◾ 디지털 쓰기 명령어(DigitalWrite)의 활용 방법을 이해하고 응용할 수 있다.

◾ 아두이노의 디지털 쓰기 (DigitalWrite) 명령어로 LED를 제어한다.

◾ 기다리기 함수를 이용하여 LED의 점멸 간격을 조절해 본다.

◾ setup()과 loop() 함수의 차이점을 이해할 수 있다.

◾ 일정한 시간 후에 자동으로 꺼지는 장치를 구현해 본다.

학습 목표

02 LED 점멸하기

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 30 -

2.1 아두이노 쉴드 및 핀 정보

◾ 아두이노 보드 위에 적층식으로 쌓아 나가는 전자회로 모듈을 쉴드(Shield)

라고 부른다. 보통 기능이 복잡하거나 연결되는 핀 수가 많은 모듈을 별도

로 쉴드로 개발하는 경우가 많다.

◾ 브레드보드가 필요없는 올인원 쉴드 (All-In-One Shield)는 센서 연결시

브레드보드 없이 3핀 또는 4핀으로 되어 있는 모듈을 바로 아두이노에 연

결할 수 있도록 도와주는 보드로서, 아두이노 작품 개발시 시간을 단축시

켜 주고 아두이노의 편리성을 최대한 활용하는 보드이다.

아두이노 쉴드

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 31 -

◾ 아두이노는 디지털 핀 14개와 아날로그 핀 6개를 가지고 있다.

◾ 디지털 핀과 아날로그 핀에는 핀번호가 0번부터 부여된다.

디지털 핀번호 (14개) 아날로그 핀번호 (6개)D0 ~ D13 A0 ~ A5

아두이노 핀 정보

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 32 -

◾ 디지털 핀들은 GND (검정), 5V (빨강), Data 선 (초록) 등 3개의 핀으로

구성되어 있으며, 부품을 연결할 때 방향을 맞추어 연결해 주어야 한다.

◾ 디지털 부품 연결시 케이블의 색상 또는 각 케이블이 극성을 확인하여 연

결한다.

◾ 디지털 0번 (Rx)과 1번(Tx)은 시리얼 통신에 사용되기 때문에 실제로 D2부

터 부품을 연결할 수 있다.

핀정보 케이블 색상GND 검정5V 빨강

Data 초록

디지털 핀

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 33 -

◾ 아날로그 핀들은 GND (검정), 5V (빨강), Data 선 (파랑) 등 3개의 핀으로

구성되어 있으며, 부품을 연결할 때 방향을 맞추어 연결해 주어야 한다.

◾ 아날로그 4번(A4)과 아날로그 5번(A5)은 I2C와 같은 다른 용도로도 사용되

기 때문에 아날로그 부품을 연결할 때에는 A0부터 연결한다.

아두이노 아날로그 핀

핀정보 케이블 색상GND 검정5V 빨강

Data 파랑

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 34 -

2.2 준비하기

◾ 아두이노 보드, 올인원 쉴드, 디지털 LED 모듈 1개

아두이노 우노보드 올인원 쉴드

디지털 LED 소자

준비물

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 35 -

◾ 디지털 LED 소자를 디지털 13번에 연결한다.

※ 센서 및 소자 연결시 케이블의 색상을 올인원 쉴드의 핀 색상에 맞게 연결

해 준다.

H/W 연결하기

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 36 -

2.3 디지털 쓰기 명령어 (DigitalWrite)

◾ LED는 디지털 소자로서 0과 1 또는 HIGH와 LOW 등 2가지 상태 중에 한

가지 상태의 값을 가진다.

◾ 디지털 쓰기 명령어 (DigitalWrite)

디지털 소자에 값을 전달하기 위한 명령어는 다음과 같이 DigitalWrite 명

령어를 사용한다. 핀번호와 상태값을 인수로 전달한다.

※ 디지털 핀은 2번부터 13번 핀 까지 총 12개를 사용할 수 있으나, 디지털

4, 5, 6, 7번은 자동차의 모터를 제어할 때 사용되므로, 해당 핀을 제외한

다른 핀들에 소자 또는 센서를 연결해 주어야 한다.

디지털 소자 값의 범위

0 또는 LOW : 꺼짐1 또는 HIGH : 켜짐

디지털 소자에 값을 쓰는 명령어

DigitalWrite(13, LOW) : 디지털 13번 핀의 값을 끔DigitalWrite(13, HIGH) : 디지털 13번 핀의 값을 켬

※ 주의 사항

디지털 쓰기 명령어

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 37 -

2.4 LED 켜기

◾ 디지털 13번에 연결된 LED 소자를 켜기 위해서는 아래와 같이

DigitalWrite 명령어를 사용하고, 핀번호 13, 그리고 값을 HIGH로 설정해

준다.

▶ 켜진 LED를 끄는 기능으로 프로그램을 수정해 보기 바란다.

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ //디지털 13번 핀에 연결된 LED를 켠다. DigitalWrite(13, HIGH)

//1초간 기다린다. Delay(1000)}

void setup(){ //디지털 13번 핀을 쓰기 모드로 지정 pinMode(13, OUTPUT);}

void loop(){ //디지털 13번 핀에 연결된 LED를 켠다. digitalWrite(13, HIGH);

//1초간 기다린다. delay(1000);}

LED 소자 켜기

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 38 -

※ 참고자료) 상수와 변수

◾ 프로그램에서 상수는 변경할 수 없는 값을 저장해 놓은 저장소 이며, 이

와 반대로 변수는 값을 변경할 수 있는 저장소이다.

- 상수: 값을 변경할 수 없다.

const int a = 10;

- 변수: 값을 변경할 수 있다.

int a = 10;

◾ 상수는 자료형 앞에 const 라는 단어가 더 추가된다.

◾ 위의 예에서 사용된 HIGH나 LOW와 같은 단어는 프로그램의 내부에서

상수로 정의된 이름이다. 즉 다음과 같이 내부에 정의되어 있다.

const int HIGH = 1;

const int LOW = 0;

◾ DigitalWrite 명령어에서 상수 대신에 다음과 같이 직접 값을 사용해도

된다.

DigitalWrite(13, 1)

DigitalWrite(13, 0)

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 39 -

※ 참고자료) 자료형

◾ C언어에서는 변수를 정의할 때 변수 이름 앞에 자료형을 표기해 주어야

한다. 저장하고자 하는 값이 어떠한 종류인지를 설명해 주는 것이다.

◾ 변수의 자료형에는 다음과 같은 종류들이 있다.

◾ int a = 10; 이라는 의미는 정수형 값을 저장하는 변수 a에 10을 저장

하라는 의미이다.

자료형 설명

int⦁정수형(Integer)⦁0, -50, 300 등의 정수형 숫자를

저장한다.

float⦁실수형(float)⦁0.5, -50.5, 303.345 등의 실수

형 숫자를 저장한다.

byte⦁바이트형(byte)⦁0 ~ 255 사이의 숫자를 저장한

다.

char⦁문자형(char)⦁알파벳 문자나 기호를 저장한다.

String⦁문자열형(String)⦁여러 문자 데이터를 하나로 이어

서 저장한다.

boolean⦁논리형(Boolean)⦁true 또는 false와 같이 논리형

값을 저장한다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 40 -

▶ 앞에서 소개된 코드 중에서 상수로 정의된 부분을 찾아 본다.

▶ 아래 제시된 각각의 자료형에 대해 사례가 되는 코드를 작성해 본다.

실습

※ 참고자료) C언어는 명령어 뒤에 ‘;’로 끝난다.

◾ 앞에서 제시된 예제에서 스크립트와 C언어를 비교해 봄으로써 C언어 사

용시 어떠한 특징들이 있는 지 살펴 보자.

◾ 다음은 SPL 스크립트와 C언어의 차이점이다.

◾ C언어 문법에서는 각 명령어가 ‘;’로 끝나는 것에 유의하기 바란다.

SPL 명령어 스케치 코드 (C언어)

DigitalWrite(13, HIGH) Delay(1000)

digitalWrite(13, HIGH); delay(1000);

자료형 사례

int int a = 255;

float

byte

char

String

boolean

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 41 -

※ 참고자료) 아두이노 명령어가 소문자로 시작하는 이유

◾ 모든 스크립트 코딩에서 변수나 함수 등의 이름을 부여할 때 크게 4가

지 표기법 중에 한가지를 따른다.

◾ 다음은 4가지 표기법의 차이점을 설명한 것이다.

◾ 변수나 함수 이름이 표기법은 정답이 있는 것은 아니고 개발자의 취향에

따라서 달라지며, 자신이 이해하기 쉬운 표기법을 정해서 프로그램 전

체적으로 일관되게 적용하기만 하면 된다.

변수 및 함수 표기법 설명

헝가리안 표기법

변수나 함수 이름 시작을 자료형을 나타내는 알파벳을 붙인다.

예) int iNum = 10;

파스칼 표기법

변수나 함수 이름이 대문자로 시작한다. 파스칼 언어나 C# 언어, SPL 등이 이 표기법을 따른다.

예) DigitalWrite(13, HIGH)

카멜 표기법

시작은 소문자로 하고 중간에 있는 단어는 대문자로 시작한다. Java나 아두이노 함수 등이 이에 해당한다.

예) digtalWrite(13, HIGH)

언더바 표기법

변수 단어 사이에 ‘_’를 붙여서 단어를 구분한다.

예) digital_write(13, HIGH)

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 42 -

2.5 LED 점멸시키기

◾ 디지털 LED 소자를 점멸시키기 위한 코드는 아래와 같다. 빈 칸에 어떠한

값이 들어가야 할지 생각해 보고 필요한 값을 입력한 후, 코드를 완성해

보기 바란다.

▶ LED의 점멸 주기를 각각 500밀리초, 100밀리초, 50밀리초, 20밀리초 등으

로 수정하여 점멸되는 결과를 확인해 본다.

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ //디지털 13번 핀에 연결된 LED를 켠다. DigitalWrite(13, _____ )

//1초간 기다린다. Delay(1000)

//디지털 13번 핀에 연결된 LED를 끈다. DigitalWrite(13, _____ )

//1초간 기다린다. Delay(1000)}

void setup(){ //디지털 13번 핀을 쓰기 모드로 지정 pinMode(13, OUTPUT);}

void loop(){ //디지털 13번 핀에 연결된 LED를 켠다. digitalWrite(13, _____ );

//1초간 기다린다. delay(1000);

//디지털 13번 핀에 연결된 LED를 끈다. digitalWrite(13, _____ );

//1초간 기다린다. delay(1000);}

실습

LED 소자 점멸시키기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 43 -

2.6 setup() 함수와 loop() 함수

◾ 아두이노 기본 프로그램은 다음과 같이 setup() 함수와 loop() 기본 함수가

자동으로 만들어진 상태에서 시작한다.

◾ 아두이노 프로그램을 실행하면 내부적으로 다음과 같이 main() 함수가 만

들어 진다.

setup과 loop

void setup(){}

void loop(){}

void setup();void loop();

int main(){ setup(); while(true) { loop(); }

return 0;}

void setup(){}

void loop(){}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 44 -

◾ 위의 main 함수를 살펴보면 setup() 함수의 내용이 먼저 실행되고, 그 다

음으로는 loop() 함수만 계속 실행된다.

◾ setup() 함수는 맨 처음 한번 만 실행된다.

◾ loop() 함수는 setup() 함수가 실행된 이후에 실행되며, 아두이노에 전원에

들어와 있는 동안에는 무한히 반복하여 실행된다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 45 -

2.7 일정한 시간 후에 자동으로 꺼지는 LED 등 만들기

◾ 일정한 시간 동안 LED가 켜진 후, 그 이후에는 LED가 계속 꺼져 있게 하

려고 한다. LED를 켜고 끄는 명령어를 setup() 함수와 loop() 함수 중 어

느 곳에 입력해야 이 기능을 구현할 수 있을지 생각해 본다.

◾ 아래의 코드를 일정한 시간 후에 자동으로 꺼지는 기능이다. 아래의 코드들

을 setup() 함수와 loop() 함수 중 어느 곳에 추가해야 할지 생각해 보고

기능을 완성해 본다.

◾ 위의 코드를 아래 두 함수 중에 한 곳에 추가해 본다.

설계하기

구현하기

SPL 스크립트 스케치 코드

DigitalWrite(13, HIGH)Delay(3000)DigitalWrite(13, LOW)

digitalWrite(13, HIGH);delay(3000);digitalWrite(13, LOW);

void setup(){ //이곳에 추가해야 하는가?}

void loop(){ //아니면 이곳에 추가해야 하는가?}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 46 -

◾ setup() 함수에 코드를 추가하게 되면 한번만 실행되게 된다. setup() 함수

에 있는 명령어들을 다시 실행시키려면 아두이노 보드에 업로드된 프로그

램을 처음부터 다시 실행시켜야 주어야 하는데, 이렇게 아두이노 프로그램

을 처음부터 다시 실행하기 위해서는 아두이노 보드를 리셋시켜 주면 된

다. 아래 그림과 같이 아날로그 핀 옆에 있는 리셋 스위치를 눌러서 아두

이노 프로그램이 처음부터 다시 실행되는 지 확인해 보기 바란다.

▶ 앞의 활동에서 작성한 코드 중에서 직접 값을 사용하지 않고 상수로 선언

하여 사용할 수 있는 부분이 어느 부분이 있는 지 생각해 보고 상수를 정의

하여 프로그램을 수정해 본다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 47 -

◾ 아두이노의 디지털 버튼 작동 방법을 이해하고 다양한 용도로 활용할 수

있다.

◾ 문자와 문자라인 출력문을 이용하여 아두이노 내부의 값을 컴퓨터 화면에

출력할 수 있다.

◾ 문자라인 출력문을 이용하여 값을 출력해 본다.

◾ 문자출력문과 문자라인 출력문을 조합하여 구구단을 출력해 본다.

◾ 디지털 읽기 (DigitalRead) 명령어로 버튼값을 인식해 본다.

◾ 버튼 눌림 상태를 이용하여 LED가 켜져 있는 시간을 지정할 수 있다.

학습 목표

03 절전기능 LED 후레쉬

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 48 -

3.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 디지털 LED 모듈 1개, 디지털 버튼 모듈 1개

아두이노 우노보드 올인원 쉴드

디지털 LED 소자 디지털 버튼

준비물

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 49 -

◾ 디지털 버튼을 디지털 2번 핀에 연결한다.

◾ 디지털 LED 소자를 디지털 13번에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 50 -

3.2 문자 및 문자라인 출력하기

◾ 아두이노에서 콘솔 화면에 문자열을 한 줄씩 출력하는 명령어는 다음과 같

이 PrintLine 또는 Serial.println 명령어를 사용한다.

◾ 콘솔 화면에 1씩 증가하는 숫자를 출력해 보자.

문자라인 출력하기

SPL 스크립트 스케치 코드

PrintLine(“Hello”)

PrintLine(12345)

Serial.println(“Hello”)

Serial.println(12345)

1씩 증가하는 숫자 출력하기

SPL 스크립트 스케치 코드

void setup()

{

}

a = 0

void loop()

{

a = a + 1

PrintLine(a)

Delay(1000)

}

void setup()

{

//시리얼 통신 속도를 설정해 준다.

Serial.begin(115200);

}

int a = 0;

void loop()

{

a = a + 1;

Serial.println(a);

delay(1000);

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 51 -

※ Print 명령어는 같은 줄에 값을 이어서 출력하고 PrintLine 명령어는 값을

출력한 후, 줄을 바꾸게 된다. PrintLine 명령어를 사용해야할 곳에 Print

명령어를 사용하지 않도록 주의를 기울인다.

※ Print 명령어 또는 PrintLine 명령어를 코드에 사용할 경우에는 반드시

100밀리초 이상의 값을 가지는 delay 명령이 반드시 사용되어야 한다. 만

약 delay 명령어 없이 Print나 PrintLine 명령어를 사용하게 되면 엄청난

크기의 데이터가 PC로 전달되어 PC의 시리얼 포트가 다운되는 문제가 발

생한다.

※ PC의 시리얼 포트가 다운되면 아두이노 프로그램 업로드가 실패하는 상황

이 발생한다. 이 경우에는 일단 아두이노 보드의 USB 케이블을 제거한 후,

아두이노 코딩 SW를 종료한다. 그 다음, 아두이노 보드를 PC에 연결한 후

코딩 SW를 다시 실행한 후, 프로그램에 delay(100) 명령어를 추가한 다음

업로드하면 프로그램이 정상적으로 업로드 될 수 있다.

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 52 -

◾ Print 명령어와 PrintLine 명령어를 조합하여 사용하면 화면에 필요한 정

보를 보기 좋게 생성하여 표시할 수 있다. Print 명령어는 값을 옆으로 이

어서 출력하는 기능이 있으므로, 구구단의 문자열을 프로그램으로 생성하

여 표시할 수 있다.

▶ 다중 for 반복문을 이용하여 구구단 전체를 출력해 본다.

구구단 출력하기

SPL 스크립트 스케치 코드void setup(){ //7단을 출력해 본다. for (i = 1; i < 10; i++) { Print(“7 x ”) Print(i) Print(“ = ”) PrintLine(i * 7) }}

void loop(){}

void setup(){ Serial.begin(115200);

//7단을 출력해 본다. for (int i = 1; i < 10; i++) { Serial.print(“7 x ”); Serial.print(i); Serial.print(“ = ”); Serial.println(i * 7); }}

void loop(){}

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 53 -

3.3 DigitalRead 명령어로 버튼값 읽어오기

◾ 아두이노의 디지털 핀에서 값을 읽어 오는 명령어는 다음과 같다.

변수 = DigitalRead(핀번호)

◾ DigitalRead() 함수로 읽은 값은 정수형 변수에 저장되며, 값은 0 (LOW)

또는 1 (HIGH) 중에 하나가 된다.

DigitalRead

SPL 스크립트 스케치 코드

d2 = DigitalRead(2) int d2 = digitalRead(2);

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 54 -

◾ 디지털 2번 핀에 연결되어 있는 디지털 버튼의 값을 읽어 와서 화면에 출

력하는 코드이다. 빈 칸에 들어갈 값을 채운 후 프로그램을 완성해 본다.

◾ 콘솔창에 표시되는 값을 확인해 보면, HIGH나 LOW가 아닌 0 또는 1 숫자

로 표시되는 것에 유의한다.

디지털 버튼값 출력하기

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ d2 = DigitalRead( ___ ) PrintLine(d2) Delay(100)}

void setup(){ pinMode(2, INPUT); Serial.begin(115200);}void loop(){ int d2 = digitalRead( ___ ); Serial.println(d2); delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 55 -

3.4 버튼으로 LED 켜기

◾ C언어에서 if 조건비교 명령어는 괄호 안에 있는 조건이 참이면 if 블록 안

에 있는 명령어를 실행하게 된다.

예)

◾ 조건이 만족하지 않는 경우에 명령어를 실행하려면 else 블록을 추가한다.

if 조건문

if (조건이 true 이면){

//이곳에 있는 명령어들이 실행된다.}

if ( d2 == HIGH ){

PrintLine(“Button Pressed”)}

if ( d2 == HIGH ){

PrintLine(“Button Pressed”)}else{

PrintLine(“Button Up”)}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 56 -

◾ 버튼의 상태를 0.1초 간격으로 읽어와서 버튼의 상태가 HIGH이면 13번

LED를 켜고 그렇지 않으면 13번 LED를 끄는 코드를 작성해 보자.

◾ 아래의 코드에서 빈 칸의 내용을 채운 후 코드를 완성해 보자.

if 조건문으로 LED 켜기

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){

d2 = DigitalRead(2)

if ( d2 == ____ ){

DigitalWrite(13, HIGH)

}else{

DigitalWrite(13, LOW)}

Delay(100)}

void setup(){

pinMode(2, INPUT);pinMode(13, OUTPUT);

}

void loop(){

int d2 = digitalRead(2);

if ( d2 == ____ ){

digitalWrite(13, HIGH);}else{

digitalWrite(13, LOW);}

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 57 -

3.5 버튼을 누르고 있는 횟수 측정하기

◾ 버튼이 눌려져 있는 횟수를 저장하기 위해 전역변수를 정의한다. 함수 내부

에 정의된 변수는 로컬변수 또는 지역변수라 하고, 함수 외부에 정의된 변

수는 글로벌변수 또는 전역변수라고 한다.

◾ 전역변수는 프로그램 전체에 영향을 미치지만 지역변수는 함수 안에서만

사용할 수 있다.

◾ 위의 코드에서 cnt = 0 선언 명령어를 loop() 함수 안으로 옮길 경우 결과

가 어떻게 달라지는 지 확인해 본다.

전역변수

SPL 스크립트 스케치 코드

cnt = 0

void setup(){

}

void loop(){

d2 = DigitalRead(2)

if ( d2 == HIGH ){

cnt = cnt + 1}

PrintLine(cnt)

Delay(100)}

int cnt = 0;

void setup(){

pinMode(2, INPUT);Serial.begin(115200);

}

void loop(){

int d2 = digitalRead(2);

if ( d2 == HIGH ){

cnt = cnt + 1;}

Serial.println(cnt);delay(100);

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 58 -

3.6 절전기능 후레쉬 만들기

◾ 버튼이 눌려져 있는 횟수는 cnt라는 이름의 전역변수에 저장되어 있다.

◾ LED를 버튼을 누르고 있는 시간에 비례하여 켜지도록 기능을 구현하려고

한다. 예를 들어 버튼을 1초간 누르고 있으면 LED는 5초간 켜지고, 버튼

을 10초간 누르고 있으면 LED가 50초 동안 켜져 있다가 꺼지도록 하려고

한다.

◾ 필요한 기능을 설계해 본다.

◾ 버튼이 눌릴 때 마다 cnt 변수의 값을 5씩 증가시켜 준다.

◾ cnt 변수의 값이 0보다 크면 cnt 변수의 값을 1씩 감소시켜 주고 LED를

켜준다.

◾ cnt 변수의 값이 0과 같으면 LED를 꺼준다.

설계하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 59 -

◾ 원하는 기능을 구현하기 위해 아래의 빈 칸에 어떠한 내용이 들어가야 할

지 생각해 보고 기능을 완성해 본다.

SPL 스크립트 스케치 코드

cnt = 0

void setup(){}

void loop(){

d2 = DigitalRead(2)

if ( d2 == HIGH )cnt = _________

if (cnt > 0){

cnt = _________

DigitalWrite(13, HIGH)}else

DigitalWrite(13, LOW)

Delay(100)}

int cnt = 0;

void setup(){

pinMode(2, INPUT);pinMode(13, OUTPUT);

}

void loop(){

int d2 = digitalRead(2);

if ( d2 == HIGH )cnt = _________ ;

if (cnt > 0){

cnt = _________ ;

digitalWrite(13, HIGH);}else

digitalWrite(13, LOW);

delay(100);}

구현하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 60 -

▶ 버튼을 1초간 누르고 있으면 LED가 10초간 켜지고, 버튼을 10초간 누르고

있으면 LED가 100초 동안 켜져 있다가 꺼지도록 기능을 수정해 본다.

▶ LED가 꺼지기 10초 전에 LED를 점멸하여 10초 후에 LED가 꺼진다는 정

보를 사용자에게 알리고자 한다. 어떠한 기능을 추가해야 할지 생각해 보고

기능을 완성해 본다.

실습

기능 개선 사항

◾ LED가 꺼지기 10초전에 점멸로 정보를 주어 사용자가

다시 버튼을 눌러 LED가 켜져 있는 시간을 늘릴 수 있

도록 기능을 개선시켜 본다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 61 -

◾ 버튼의 눌림 상태를 감지할 수 있는 기능을 구현할 수 있다.

◾ 버튼이 눌리거나 눌림이 해제될 때 틱톡 소리가 나는 기능을 구현할 수 있

다.

◾ 전역변수를 이용하여 버튼이 눌려져 있는 지 감지하는 기능을 구현한다.

◾ 버튼이 눌려지거나 올라오는 순간을 감지하는 기능을 구현한다.

◾ 톤(tone) 명령어를 이용하여 버튼이 눌리거나 올라올 때 다른 소리가 나도

록 한다.

학습 목표

04 틱톡 스위치 만들기

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 62 -

4.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 디지털 버튼 모듈, 스피커

아두이노 우노보드 올인원 쉴드

스피커 디지털 버튼

준비물

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 63 -

◾ 디지털 버튼을 디지털 2번 핀에 연결한다.

◾ 스피커를 디지털 3번 핀에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 64 -

4.2 소리를 발생시키는 명령어

◾ 아두이노에서 스피커를 통해 소리를 발생시키는 명령어는 톤(tone) 명령어

이다.

Tone(핀번호, 진동수, 소리 지속시간)

◾ 디지털 3번 핀에 연결된 스피커를 통해 1초 (1000밀리초) 동안 700헤르츠

(Hz)의 소리가 발생하도록 설정하는 명령어는 다음과 같다.

톤(tone) 명령어

SPL 스크립트 스케치 코드

void setup()

{

}

void loop()

{

Tone(3, 700, 1000)

Delay(1000)

}

void setup()

{

}

void loop()

{

tone(3, 700, 1000);

delay(1000);

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 65 -

◾ 위의 예제를 실행하면 계속 삐 소리가 연주되면서 시끄러운 상황이 만들어

진다. 스피커의 소리를 끄려면 다음과 같이 빈 프로그램을 생성후 실행하

여 아두이노에서 실행중인 프로그램을 지워버리면 된다.

소리를 끄는 방법

SPL 스크립트 스케치 코드

void setup()

{

}

void loop()

{

}

void setup()

{

}

void loop()

{

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 66 -

◾ 1초 시간 중에서 0.5초는 삐소리가 나고, 0.5초는 소리가 나지 않도록 하기

위해서는 다음과 같이 간단히 tone 명령어의 세 번째 인수값을 500으로

줄여 주기만 하면 된다. delay 명령어에서 1000 밀리초 간 기다리는 동안

0.5초간만 소리가 나기 때문에 나머지 0.5초 동안에는 소리가 나지 않는

다.

※ tone 명령어에는 delay 기능이 없기 때문에 tone 명령어의 소리가 나는 시

간 동안에는 tone 명령이 다시 실행되면 안 된다. 이러한 이유 때문에

tone 명령어 뒤에 delay 명령어를 두어 tone 명령어가 일정 시간이 지난

후에 다시 실행되도록 해 주어야 한다.

삐삐 소리 만들기

SPL 스크립트 스케치 코드

void setup()

{

}

void loop()

{

Tone(3, 700, 500)

Delay(1000)

}

void setup()

{

}

void loop()

{

tone(3, 700, 500);

delay(1000);

}

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 67 -

4.3 틱톡 소리 만들기

◾ 틱톡 소리를 만들기 위해 다음과 같이 소리가 발생하도록 로직을 완성해

본다.

0.1초 간격으로 소리 만들기

SPL 스크립트 스케치 코드

void setup()

{

}

void loop()

{

Tone(3, 700, ___ )

Delay( ____ )

Tone(3, 500, ___ )

Delay( ____ )

}

void setup()

{

}

void loop()

{

tone(3, 700, ___ );

delay( ____ );

tone(3, 500, ___ );

delay( ____ );

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 68 -

4.4 버튼의 눌림 상태를 전역변수로 저장하기

◾ 버튼이 현재 눌려져 있는 지 아니면 그렇지 않은지 상태를 저장하고 있는

전역변수를 다음과 같이 추가해 보자.

pressed 변수 선언

SPL 스크립트 스케치 코드

pressed = false

void setup()

{

}

void loop()

{

d2 = DigitalRead(2)

if ( d2 == HIGH )

{

pressed = true

}

else

{

pressed = false

}

PrintLine(pressed)

Delay(100)

}

boolean pressed = false;

void setup()

{

pinMode(2, INPUT);

Serial.begin(115200);

}

void loop()

{

int d2 = digitalRead(2);

if ( d2 == HIGH )

{

pressed = true;

}

else

{

pressed = false;

}

Serial.println(pressed);

delay(100);

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 69 -

4.5 버튼이 눌려지는 순간과 올라오는 순간을 감지하기

◾ 버튼이 눌려지는 순간에 한번 “Down” 이라는 메시지를 출력하고, 버튼이

올라오는 순간에 한번 “Up” 이라는 메시지를 출력하려고 한다.

◾ 버튼의 상태가 변하는 순간을 감지하기 위해서는 버튼의 상태를 저장하고

있는 전역변수의 값을 비교해야 한다. 이전 활동에서 사용한 pressed와

같은 역할의 전역 변수 값을 비교하여 버튼이 눌려 지거나 올라오는 순간

을 감지할 수 있다.

버튼의 상태 변화 감지

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 70 -

◾ 버튼이 눌려지는 순간과 올라오는 순간을 감지하여 메시지를 표시하는 코

드는 다음과 같다.

버튼의 상태 변화 감지 코드

SPL 스크립트 스케치 코드

pressed = false

void setup()

{

}

void loop()

{

d2 = DigitalRead(2)

if ( d2 == HIGH )

{

if (pressed == false)

PrintLine(“Down”)

pressed = true

}

else

{

if (pressed == true)

PrintLine(“Up”)

pressed = false

}

Delay(100)

}

boolean pressed = false;

void setup()

{

pinMode(2, INPUT);

Serial.begin(115200);

}

void loop()

{

int d2 = digitalRead(2);

if ( d2 == HIGH )

{

if (pressed == false)

Serial.println(“Down”)

pressed = true;

}

else

{

if (pressed == true)

Serial.println(“Up”);

pressed = false;

}

delay(100);

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 71 -

4.6 틱톡 스위치 구현하기

◾ 이전 활동의 코드들을 활용하여 버튼이 눌리는 순간 0.1초 동안 ‘틱’ 소리

(700Hz)가 나고 버튼이 올라오는 순간 ‘톡’ 소리 (500Hz)가 나오도록 tone

명령어를 추가하려고 한다. 아래 빈 칸에 필요한 명령어를 추가해 본다.

소리 기능 추가하기

SPL 스크립트 스케치 코드pressed = falsevoid setup(){}

void loop(){ d2 = DigitalRead(2) if ( d2 == HIGH ) { if (pressed == false) { ____________________ PrintLine(“Down”) } pressed = true } else { if (pressed == true) { ____________________ PrintLine(“Up”) }

pressed = false }

Delay(100)}

boolean pressed = false;void setup(){ pinMode(2, INPUT); Serial.begin(115200);}

void loop(){ int d2 = digitalRead(2); if ( d2 == HIGH ) { if (pressed == false) { ____________________ ; Serial.println(“Down”); }

pressed = true; } else { if (pressed == true) { ____________________ ; Serial.println(“Up”); }

pressed = false; }

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 72 -

▶ tone 명령어에 사용된 진동수 값을 다른 값으로 변경하여 다른 틱톡 소리

가 나오도록 버튼의 효과음을 다양하게 변경해 보자.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 73 -

◾ 디지털 버튼의 중복 눌림 방지를 위한 기능을 구현할 수 있다.

◾ 디지털 버튼의 중복 눌림 방지 기능 및 전역변수를 활용하여 LED 전등이

계속 켜질 수 있도록 토글 스위치 기능을 구현할 수 있다.

◾ 차량의 방향지시등과 비상등 기능을 구현할 수 있다.

◾ 버튼의 중복 눌림 감지를 방지하는 기능을 구현한다.

◾ 버튼 눌림 상태를 이용하여 토글 기능을 구현하다.

◾ 한 번의 버튼 눌림으로 LED 등을 켜거나 끌 수 있는 편리한 전등을 구현

해 본다.

◾ 토글 기능으로 취침시간을 설정할 수 있는 취침등을 제작해 본다.

◾ 토글 기능으로 차량의 방향지시등과 비상등 기능을 구현해 본다.

학습 목표

05 토글 스위치를 활용하는 프로젝트

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 74 -

5.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 디지털 버튼 모듈, 스피커, LED 모듈

아두이노 우노보드 올인원 쉴드

스피커 디지털 버튼

준비물

LED 모듈

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 75 -

◾ 디지털 버튼을 디지털 2번 핀에 연결한다.

◾ 스피커를 디지털 3번 핀에 연결한다.

◾ 디지털 LED 소자를 디지털 13번에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 76 -

5.2 버튼의 눌림 횟수를 표시하는 장치 만들기

◾ 버튼을 눌러 1씩 증가하는 장치를 만들어 학생들의 인원수를 세려고 한다.

버튼이 눌릴 때 마다 1씩 증가시켜 화면에 출력하는 기능을 구현해 본다.

◾ 이전 활동에서 작성한 프로그램에 기능을 추가하여 버튼이 눌려졌다가 올

라오는 순간에 1씩 증가하도록 기능을 구현해 본다.

눌림 횟수 체크 장치

SPL 스크립트 스케치 코드

pressed = falsecnt = 0

void setup(){}

void loop(){ d2 = DigitalRead(2)

if ( d2 == HIGH ) { pressed = true } else { if (pressed == true) { cnt = cnt + 1 Tone(3, 500, 100) PrintLine(cnt) }

pressed = false }

Delay(100)}

boolean pressed = false;int cnt = 0;

void setup(){ pinMode(2, INPUT); Serial.begin(115200);}

void loop(){ int d2 = digitalRead(2);

if ( d2 == HIGH ) { pressed = true; } else { if (pressed == true) { cnt = cnt + 1; tone(3, 500, 100); Serial.println(cnt); }

pressed = false; }

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 77 -

5.3 토글 기능 구현하기

◾ 이전 활동에서 사용된 cnt 전역변수 값이 버튼이 눌릴 때 마다 0 과 1 값

으로 반복해서 변경되도록 해보자. 즉 버튼이 처음 눌리면 cnt 값이 0에서

1로 바뀌고, 버튼이 다시 눌리면 cnt 값이 1에서 0으로 다시 변경되도록

기능을 구현해 본다.

◾ 버튼이 눌릴 때 마다 cnt 값이 0 또는 1이 되도록 하기 위해서 빈 칸에 들

어가야 할 수식에 대해 생각해 보고 코드를 완성해 보자.

SPL 스크립트 스케치 코드

pressed = falsecnt = 0

void setup(){}

void loop(){ d2 = DigitalRead(2)

if ( d2 == HIGH ) { pressed = true } else { if (pressed == true) { cnt = cnt + 1 Tone(3, 500, 100)

if (cnt == 1) { cnt = ___ } else {

boolean pressed = false;int cnt = 0;

void setup(){ pinMode(2, INPUT); Serial.begin(115200);}

void loop(){ int d2 = digitalRead(2);

if ( d2 == HIGH ) { pressed = true; } else { if (pressed == true) { cnt = cnt + 1; tone(3, 500, 100);

if (cnt == 1) { cnt = ___ ; }

토글 기능

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 78 -

cnt = ___ }

PrintLine(cnt) }

pressed = false }

Delay(100)}

else { cnt = ___ ; }

Serial.println(cnt); }

pressed = false; }

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 79 -

5.4 토글 기능으로 LED 작동시키기

◾ 이전 활동에서는 LED를 켜기 위해 버튼을 계속 누르고 있어야 하는 번거

로움이 있었다. 이러한 번거로움을 없애기 위해서 버튼을 한번 누르면

LED 등이 켜지고, 다시 한번 누르면 LED 등이 꺼지도록 하려고 한다.

◾ 아래 빈 칸에 LED 등을 제어하는 명령어를 추가하여 기능을 완성해 보기

바란다.

SPL 스크립트 스케치 코드

pressed = falsecnt = 0

void setup(){}

void loop(){ d2 = DigitalRead(2)

if ( d2 == HIGH ) { pressed = true } else { if (pressed == true) { cnt = cnt + 1 Tone(3, 500, 100)

if (cnt == 1) { cnt = 0 DigitalWrite(13, ___ ) } else { cnt = 1

boolean pressed = false;int cnt = 0;

void setup(){ pinMode(2, INPUT); Serial.begin(115200);}

void loop(){ int d2 = digitalRead(2);

if ( d2 == HIGH ) { pressed = true; } else { if (pressed == true) { cnt = cnt + 1; tone(3, 500, 100);

if (cnt == 1) { cnt = 0; digitalWrite(13, ___ ); } else

토글 LED

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 80 -

DigitalWrite(13, ___ ) }

PrintLine(cnt) }

pressed = false }

Delay(100)}

{ cnt = 1; digitalWrite(13, ___ ); }

Serial.println(cnt); }

pressed = false; }

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 81 -

▶ 버튼을 한번 씩 누를 때 마다 LED가 켜져 있는 시간이 10초씩 늘어나도록

하려고 한다.

▶ 예를 들어, 버튼을 3번 누르면 30초간 LED 등이 켜진 후 다시 꺼지도록

하는 기능을 기존 코드에 추가하여 저절로 꺼지는 취침등을 구현해 보자.

실습 – 저절로 꺼지는 취침등

힌트

⦁ LED가 켜져 있어야 하는 시간을 저장하기 위한 전역변수를 정의한다.

⦁ 전역변수는 기존 예제에서 정의된 cnt 값을 이용한다.

⦁ 버튼이 눌려졌다가 올라갈 때 마다 cnt 값을 100씩 증가시킨다.

⦁ loop 함수는 0.1초마다 반복되므로, 100번 반복하면 10초가 된다.

⦁ cnt 값이 0보다 크면 1씩 감소시켜 주고 LED를 켠다.

⦁ cnt 값이 0과 같으면 LED를 꺼준다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 82 -

SPL 스크립트 스케치 코드

pressed = falsecnt = 0

void setup(){}

void loop(){ d2 = DigitalRead(2)

if ( d2 == HIGH ) { pressed = true } else { if (pressed == true) { cnt = cnt + ___ Tone(3, 500, 100) PrintLine(cnt) }

pressed = false }

if ( ______ ) { cnt = cnt - ___ DigitalWrite(13, ___ ) } else { DigitalWrite(13, ___ ) }

Delay(100)}

boolean pressed = false;int cnt = 0;

void setup(){ pinMode(2, INPUT); Serial.begin(115200);}

void loop(){ int d2 = digitalRead(2);

if ( d2 == HIGH ) { pressed = true; } else { if (pressed == true) { cnt = cnt + ___ ; tone(3, 500, 100); Serial.println(cnt); }

pressed = false; }

if ( ______ ) { cnt = cnt - ___ ; digitalWrite(13, ___ ); } else { digitalWrite(13, ___ ); }

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 83 -

▶ 활동1) 자동차에 쓰이는 방향 지시등 기능을 버튼과 LED를 이용하여 구현

하려고 한다. 버튼을 한번 누르면 LED가 틱톡 소리와 함께 점멸하고, 버튼

을 다시 한번 누르면 LED 점멸이 멈추도록 한다.

▶ 활동2) 위의 기본 기능이 완성된 후에는 버튼과 LED를 추가하여 왼쪽과

오른쪽 방향지시등 기능을 모두 완성해 본다. 이 실습에서는 버튼 2개,

LED 2개, 스피커 1개가 사용된다.

▶ 활동3) 또 다른 버튼을 추가하여 비상등 기능을 구현해 본다. 3번째 버튼을

추가하면 양쪽의 LED가 틱톡 소리와 함께 같이 점멸되도록 한다. 이 실습

에서는 버튼 3개, LED 2개, 스피커 1개가 사용된다.

▶ 활동4) 로봇 자동차 키트에 LED와 스피커, 버튼을 장착하여 방향지시등 기

능을 시현해 본다.

팀 프로젝트 실습 – 차량 방향 지시등

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 84 -

SPL 스크립트 스케치 코드

pressed = falsecnt = 0

void setup(){}

void loop(){ d2 = DigitalRead(2)

if ( d2 == HIGH ) { pressed = true } else { if (pressed == true) { cnt = cnt + 1

if (cnt == 1) cnt = 0 else cnt = 1

PrintLine(cnt) }

pressed = false }

//이곳에 방향지시등 기능을 추가한다. if ( ____ ) { //LED가 점멸하고 틱톡 소리를 낸다. }

Delay(100)}

boolean pressed = false;int cnt = 0;

void setup(){ pinMode(2, INPUT); Serial.begin(115200);}

void loop(){ int d2 = digitalRead(2);

if ( d2 == HIGH ) { pressed = true; } else { if (pressed == true) { cnt = cnt + 1;

if (cnt == 1) cnt = 0; else cnt = 1;

Serial.println(cnt); }

pressed = false; }

//이곳에 방향지시등 기능을 추가한다. if ( ____ ) { //LED가 점멸하고 틱톡 소리를 낸다. }

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 85 -

※ C언어에서 if 나 else 조건문에서 해당 조건문이 블록에 속하는 명령어가

하나인 경우에는 ‘{’ 와 ‘}’ 괄호가 생략될 수 있다.

※ 아래의 2가지 코드는 동일한 기능을 수행하는 코드로서 C언어 문법을 준

수하는 코드이다. 아래 코드에서 사용된 if 조건문을 살펴 보면 ‘{’와 ‘}’ 사

이에 오는 명령어가 한 줄일 경우, ‘{’ 와 ‘}’ 괄호가 생략될 수 있으나, 명

령어가 2줄 이상인 경우에는 생략할 수 없음에 유의하기 바란다.

※ 주의 사항

중괄호를 사용하는 경우 중괄호가 생략된 경우

a = 10b = 20

if ( a == 10 ){ DigitalWrite(13, HIGH)}else{ DigitalWrite(13, LOW)}

if ( b == 10 ){ DigitalWrite(13, HIGH) PrintLine(“On”)}else{ DigitalWrite(13, LOW) PrintLine(“Off”)}

a = 10

if ( a == 10) DigitalWrite(13, HIGH)else DigitalWrite(13, LOW)

if ( b == 10 ){ DigitalWrite(13, HIGH) PrintLine(“On”)}else{ DigitalWrite(13, LOW) PrintLine(“Off”)}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 86 -

◾ 아두이노의 아날로그 명령어를 이해하고 활용할 수 있다.

◾ 조도센서의 작동원리를 이해하고 활용할 수 있다.

◾ 어두워 지면 저절로 켜지는 장치를 구현하여 자동차의 헤드라이트와 같은

분야에 응용할 수 있다.

◾ 아두이노의 PWM 핀을 활용하여 LED의 밝기를 조절할 수 있다.

◾ 아두이노의 아날로그 센서 값을 읽어와서 화면에 표시한다.

◾ 임계치를 결정하여 어두워 지면 저절로 켜지는 장치를 구현하다.

◾ LED의 밝기를 조절해 본다.

학습 목표

06 스마트 헤드라이트

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 87 -

6.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 아날로그 조도센서, LED 모듈

아두이노 우노보드 올인원 쉴드

디지털 LED 모듈 아날로그 조도 센서

준비물

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 88 -

◾ 디지털 LED 소자를 디지털 13번에 연결한다.

◾ 아날로그 조도 센서를 아날로그 0번 핀에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 89 -

◾ LED를 헤드라이트 대신 사용한다.

◾ 밝기를 측정하기 위해 조도 센서를 사용한다.

◾ 제어 보드로 아두이노 보드를 사용한다.

설계하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 90 -

6.2 조도 센서값 확인하기

◾ 아날로그 조도 센서를 활용하기 위해서는 첫 번째 절차로서 아날로그 센서

인 조도 센서의 값을 확인해 보는 단계이다. 아날로그 센서는 다음과 같이

1024 크기의 값의 범위를 가진다.

◾ 아날로그 센서의 값을 읽기 위해서는 다음과 같이 AnalogRead 명령어를

이용한다.

아날로그 센서 값의 범위

0 ~ 1023

아날로그 센서값 읽기

SPL 스크립트 스케치 코드

a0 = AnalogRead( 핀번호 ) int a0 = analogRead( 핀번호 );

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 91 -

◾ 조도센서가 어떠한 특성으로 작동하는 지 확인하기 위해 다음의 코드를 실

행하여 결과를 기록해 본다.

◾ 위의 코드를 아두이노 보드에 업로드한 후, 조도 센서를 손으로 빛을 가려

가면서 어둡게 하거나 밝게 해 보기 바란다. 콘솔창에서 다음과 같이 변화

되는 값을 확인할 수 있다.

SPL 스크립트 스케치 코드

void setup()

{

}

void loop()

{

//아날로그 0번 핀에서 값을 읽어서

//변수에 저장한다.

a0 = AnalogRead(0)

//한 라인씩 값을 콘솔에 출력한다.

PrintLine(a0)

//0.1초씩 기다린다.

Delay(100)

}

void setup()

{

Serial.begin(115200);}

void loop()

{

//아날로그 0번 핀에서 값을 읽어서

//변수에 저장한다.

int a0 = analogRead(0);

//한 라인씩 값을 콘솔에 출력한다.

Serial.println(a0);

//0.1초씩 기다린다.

delay(100);

}

조도 센서값 읽기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 92 -

◾ 밝기가 밝을 수록 출력되는 숫자 값이 크고, 어두워 질수록 값이 작아지는

것을 볼 수 있다.

실행결과)

...

967

854

843

784

721

687

655

544

344

210

...

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 93 -

6.3 헤드라이트가 켜지는 조건

◾ 자동차의 헤드라이트 역할은 아두이노에서 LED가 대신한다. 본 실습에서는

어두워지는 조건을 만족하면 LED가 자동으로 켜지도록 기능을 구현하려고

한다.

◾ 아래의 순서도는 어두워지는 조건을 정의하는 것으로서, 아날로그 조도 센

서의 값이 일정한 값 이하이면 LED가 켜지도록 하는 과정을 정의한 것이

다.

◾ 빈 칸에 어떠한 숫자가 들어가야 할지 생각해 보고 값을 입력해 본다.

LED가 켜지기 위한 조건

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 94 -

6.4 헤드라이트를 자동으로 켜는 기능 구현하기

◾ 자동차의 헤드라이트를 외부 밝기에 따라 어두우면 자동으로 켜기 위한 코

드를 다음과 같이 구현해 보자.

※ 조도 센서는 센서마다 약간 씩 차이가 날 수 있다. LED를 켜기 위한 기준

값은 센서 값을 확인해 보고, 최대 값과 최소 값의 중간 정도 값으로 설정

해 보도록 한다.

※ 주의 사항

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ a0 = AnalogRead(0) PrintLine(a0)

if (a0 < _____ ) { //이곳에 LED를 켜는 명령어를 추가한다. DigitalWrite(13, _____ ) } else { //이곳에 LED를 끄는 명령어를 추가한다. DigitalWrite(13, _____ ) }

Delay(100)}

void setup(){ Serial.begin(115200);}

void loop(){ int a0 = analogRead(0); Serial.println(a0);

if (a0 < _____ ) { //이곳에 LED를 켜는 명령어를 추가한다. digitalWrite(13, _____ ); } else { //이곳에 LED를 끄는 명령어를 추가한다. digitalWrite(13, _____ ); }

delay(100);}

LED를 자동으로 켜기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 95 -

6.5 밝기가 조절되는 헤드라이트

◾ 이번에는 헤드라이트의 밝기를 조절하는 기능을 구현해 본다. 아두이노의

디지털 핀 중에서 3, 5, 6, 9, 10, 11핀의 경우에는 다른 핀들과 달리

256 단계로 출력값을 설정하는 기능이 가능하다. 이 핀들은 PWM (Pulse

Width Modulation) 핀이라고 부른다.

◾ 아두이노 보드의 디지털 핀 중에서 PWM 핀에는 ~ 표시가 붙어 있다.

디지털 PWM 핀

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 96 -

◾ 아두이노 보드의 PWM은 필요한 전압을 0과 1의 간격을 조절하여 생성한

다.

◾ 0 ~ 255 사이의 값을 PWM 핀에 입력하면 0V ~ 5V 사이의 가상 전압이

만들어 진다.

PWM의 작동 원리

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 97 -

◾ PWM 핀에 값을 쓸 때에는 AnalogWrite 명령어를 사용한다.

◾ 기존의 DigitalWrite 명령어는 0과 1 또는 HIGH와 LOW 상태로만 값을 출

력시킬 수 있지만, AnalogWrite 명령어를 사용하면 0 ~ 255 사이의 값을

디지털 핀에 출력시킬 수 있다.

※ AnalogWrite 명령어는 비록 Analog라는 단어가 붙어 있긴 하지만 실질적

으로는 디지털 명령어이다. 기존 AnalogRead 명령어에서 읽은 값은 0 ~

1023 사이의 값을 가지는 반면에 AnalogWrite 명령어에서는 256 단계의

값만 사용할 수 있다.

AnalogWrite 명령어 사용법

�AnalogWrite(11, 0) : LED를 끔

�AnalogWrite(11, 255) : LED를 가장 밝게 켬

�AnalogWrite(11, 120) : 중간 밝기로 LED를 켬

AnalogWrite

SPL 스크립트 스케치 코드

AnalogWrite( 핀번호, 값 ) analogWrite( 핀번호, 값 );

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 98 -

◾ 디지털 13번에 연결되어 있는 LED 소자를 디지털 11번으로 옮겨서 연결한

다.

◾ 아래의 코드는 LED의 밝기를 256단계로 변화를 주는 과정을 보여준다. 빈

칸에 들어가야 할 내용에 대해 생각해 본 후 코드를 완성해 본다.

◾ for 반복문은 반복되는 횟수를 지정할 수 있는 반복문으로서, 반복 조건문

에 사용되는 변수값이 증가 및 감소 조건에 따라 값이 변화된다.

구현하기

SPL 스크립트 스케치 코드

void setup()

{

}

void loop()

{

for (i = 0; i < 256; i++)

{

//이곳에 LED의 밝기를 256단계로

//변화시키는 명령어를 추가한다.

AnalogWrite(11, _____ )

Delay(10)

}

}

void setup()

{

}

void loop()

{

for (int i = 0; i < 256; i++)

{

//이곳에 LED의 밝기를 256단계로

//변화시키는 명령어를 추가한다.

analogWrite(11, _____ );

delay(10);

}

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 99 -

▶ LED의 밝기가 서서히 밝아졌다가 서서히 어두워 지도록 기능을 수정해 본

다.

▶ 디지털 10번에 또 다른 LED를 연결한 후, 2개의 LED의 밝기 변화가 서로

대칭이 되도록 기능을 수정해 본다. 한 쪽 LED가 서서히 밝아 질 때 다른

쪽 LED는 서서히 어두워 지도록 하고, 각각의 LED가 이 과정을 반복하도

록 기능을 구현해 본다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 100 -

6.6 외부 밝기에 따라 자동 반응하는 헤드라이트

◾ 이전 활동에서 실습한 내용을 기반으로 외부의 밝기에 따라 차량의 헤드라

이트 밝기가 자동으로 조절되는 기능을 작성해 보자.

◾ 다음과 같은 기능에 대해 생각해 보고, 필요한 로직을 완성해 본다.

◾ 아래의 코드는 조도 센서의 값을 LED의 밝기 값으로 변환하여 조도 센서

값에 따라 상대적으로 LED의 출력 값이 조절되는 기능을 추가한 과정을

보여준다. 빈 칸에 필요한 값을 채운 후 기능을 완성해 본다.

외부 조도에 반응하는 헤드라이트

�외부의 밝기가 밝으면 헤드라이트의 밝기가 약해지고, 외부가 어

두워 질수록 헤드라이트의 밝기는 세진다.

자동 감응 헤드라이트

구현하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 101 -

SPL 스크립트 스케치 코드

void setup()

{

}

void loop()

{

a0 = AnalogRead(0)

//조도 센서값을 LED 출력값으로 변환한다.

b = 1023 – a0

//값을 4로 나누어 0 ~ 255 사이의

//값으로 변환한다.

b = b / 4

PrintLine(b)

AnalogWrite(11, ____ )

Delay(100)

}

void setup()

{

Serial.begin(115200);

}

void loop()

{

int a0 = analogRead(0);

//조도 센서값을 LED 출력값으로 변환한다.

int b = 1023 – a0;

//값을 4로 나누어 0 ~ 255 사이의

//값으로 변환한다.

b = b / 4;

Serial.println(b);

analogWrite(11, ____ );

delay(100);

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 102 -

6.7 매핑 함수

◾ 이전 예제에서는 읽은 센서의 값을 PWM에 전달하기 위한 용도로 변환하

기 위해 2번 정도 계산 과정을 거쳤다. 그리 어려운 과정은 아니지만, 수

식의 내용을 한 번에 이해하기 어려운 문제점이 발생을 한다.

◾ 아두이노에서는 값을 다른 범위로 한번에 변환시킬 수 있는 유용한 함수를

제공한다. 함수 이름은 map() 으로서 다음과 같이 사용할 수 있다.

변환값 = map(원본 값, 원본 시작값, 원본 끝 값, 변환 대상 시작값, 변환 대상 끝값)

◾ 이전 예제에서 변환되는 과정을 map 함수를 이용하면 다음과 같이 적용할

수 있다.

◾ a0 값은 0 ~ 1023 범위를 가지는 값인데, 이를 255 ~ 0 범위로 값을 매핑

시키라는 의미입니다. 값의 범위가 작아지면서 반대로 뒤집히는 효과를 한

번에 얻을 수 있습니다.

map() 함수

map 함수를 사용하지 않을 경우

//조도 센서값을 LED 출력값으로 변환한다.

b = 1023 – a0

//값을 4로 나누어 0 ~ 255 사이의

//값으로 변환한다.

b = b / 4

map 함수를 사용할 경우 b = map(a0, 0, 1023, 255, 0)

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 103 -

▶ map() 함수를 이용하여, 이전 활동의 예제를 수정해 본다.

▶ map() 함수를 활용하는 다양한 사례를 제시해 본다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 104 -

◾ 아날로그 PSD 거리센서를 이해하고 활용할 수 있다.

◾ 동체인식 장치의 작동원리를 이해하고 구현할 수 있다.

◾ 경보음 소리를 발생시킬 수 있으며, 침입탐지 장치에 적용할 수 있다.

◾ PSD 센서의 특징을 확인 한다.

◾ 디지털 거리계 장치를 구현한다.

◾ 동체인식 장치를 구현해 본다.

◾ tone 명령어를 이용해 경보음 소리를 구현해 본다.

◾ 침입 탐지 및 경보 장치를 구현해 본다.

학습 목표

07 동체인식 및 경보음 실행 장치 만들기

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 105 -

7.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 아날로그 PSD센서, LED 모듈, 스피커

아두이노 우노보드 올인원 쉴드

디지털 LED 모듈 아날로그 PSD 거리 센서

준비물

스피커

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 106 -

◾ 디지털 LED 소자를 디지털 13번에 연결한다.

◾ 스피커를 디지털 3번에 연결한다.

◾ 아날로그 PSD 거리 센서를 아날로그 0번 핀에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 107 -

7.2 PSD 거리 센서값 확인하기

◾ 아날로그 PSD 거리 센서를 활용하기 위해서는 첫 번째 절차로서 아날로그

센서인 PSD 센서의 값을 확인해 보는 단계이다. 아날로그 센서는 다음과

같이 1024 크기의 값의 범위를 가진다.

◾ 아날로그 PSD 거리 센서의 값을 읽기 위해서는 다음과 같이 AnalogRead

명령어를 이용한다.

아날로그 센서 값의 범위

0 ~ 1023

아날로그 PSD 거리 센서값

SPL 스크립트 스케치 코드

a0 = AnalogRead( 핀번호 ) int a0 = analogRead( 핀번호 );

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 108 -

◾ PSD 거리센서가 어떠한 특성으로 작동하는 지 확인하기 위해 다음의 코드

를 실행하여 결과를 기록해 본다.

◾ 위의 코드를 아두이노 보드에 업로드한 후, PSD 센서 앞에서 손을 움직여

보기 바란다.

SPL 스크립트 스케치 코드

void setup()

{

}

void loop()

{

//아날로그 0번 핀에서 값을 읽어서

//변수에 저장한다.

a0 = AnalogRead(0)

//한 라인씩 값을 콘솔에 출력한다.

PrintLine(a0)

//0.1초씩 기다린다.

Delay(100)

}

void setup()

{

Serial.begin(115200);}

void loop()

{

//아날로그 0번 핀에서 값을 읽어서

//변수에 저장한다.

int a0 = analogRead(0);

//한 라인씩 값을 콘솔에 출력한다.

Serial.println(a0);

//0.1초씩 기다린다.

delay(100);

}

PSD 센서값 읽기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 109 -

◾ PSD 센서는 유효 측정 거리가 10cm ~ 80cm이다. 따라서 손을 너무 가까

이 접근시키지 말고 10cm에서 80cm 사이를 움직여 본다.

◾ PSD 센서는 대상 물체와의 거리가 멀수록 값이 작고 가까울수록 값이 커

지는 특성이 있으므로 이 값의 특성에 유의하기 바란다.

◾ 센서 앞에 대상 물체가 없는 경우는 100 이하의 작은 값이 읽혀지며, 대상

물체가 센서 쪽으로 가까이 접근할 수록 900 이상의 값으로 점차 증가한

다.

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 110 -

7.3 디지털 거리계 만들기

◾ map() 함수를 이용하면 PSD 센서 값을 간단히 거리값으로 변환시킬 수 있

다. 정확도는 낮지만 거리계처럼 유사한 값을 출력시킬 수 있다.

◾ 위의 코드에서 map 함수는 0 ~ 1023 범위로 읽혀지는 PSD 센서값을 800

~ 100mm 거리로 변환시키는 기능을 수행한다.

구현하기

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ a0 = AnalogRead(0) a0 = Map(a0, 0, 1023, 800, 100)

Print(a0) PrintLine("mm")

Delay(100)}

void setup(){ pinMode(13, OUTPUT); Serial.begin(115200);}

void loop(){ int a0 = analogRead(0); a0 = map(a0, 0, 1023, 800, 100);

Serial.print(a0); Serial.println(“mm”);

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 111 -

7.4 동체인식 장치 구현하기

◾ 아파트 현관이나 엘리베이터 앞에는 동체인식 장치가 천장에 부착되어 있

어 사람들의 움직임이 감지되면 자동으로 등이 켜지는 기능이 작동한다.

◾ PSD 센서를 이용해 이와 유사한 기능을 구현할 수 있는데, PSD 센서 앞

에 움직임이 감지되면 LED가 3초간 켜져 있도록 하는 기능을 구현해 보

자.

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ a0 = AnalogRead(0) PrintLine(a0)

//움직이는 대상을 감지한다. if (a0 ___ _____ ) { //LED를 켠다 DigitalWrite(13, HIGH)

//3초간 기다린다. Delay(3000)

//LED를 끈다. DigitalWrite(13, LOW) }

Delay(100)}

void setup(){ pinMode(13, OUTPUT); Serial.begin(115200);}

void loop(){ int a0 = analogRead(0); Serial.println(a0);

//움직이는 대상을 감지한다. if (a0 ___ _____ ) { //LED를 켠다 digitalWrite(13, HIGH);

//3초간 기다린다. delay(3000);

//LED를 끈다. digitalWrite(13, LOW); }

delay(100);}

움직임이 감지되면 3초간 LED 켜기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 112 -

◾ 위의 코드에서 빈 칸에 들어갈 조건에 대해 생각해 보고 기능을 완성해 본

다.

◾ 위의 코드가 실제 실행된다면 어떠한 문제점이 발생할지 예측해 보자.

※ 실생활에 적용되는 모든 센서는 아주 짧은 시간 간격으로 계속 감지되어야

한다.

※ 위의 예제에서는 중간에 delay(3000) 이라는 아주 큰 시간 만큼 실행을 멈

추는 기능이 들어가 있다. 3초 만큼의 시간 동안 센서 감지가 멈추어 있게

되는 문제가 발생한다.

※ 실 생활에 적용되기 위한 프로그램을 작성할 때에는 프로그램 중간에 위와

같이 큰 시간동안 실행을 멈추는 delay 명령어를 사용하는 것을 가급적 자

제해야 한다. delay 명령어는 프로그램 맨 아래에 아주 짧은 간격으로 가능

한 한 한번 정도 사용해 주면 된다.

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 113 -

7.5 움직임을 계속 감지하는 동체인식 장치

◾ 이번에는 기능을 보완하여 LED가 켜져 있는 동안에도 PSD 센서 앞에서

대상 물체가 움직이면 LED가 계속 켜져 있도록 한다.

◾ 즉, 대상 물체가 PSD 센서 앞에서 계속 움직일 경우에는 LED가 계속 켜

져 있고, 센서 앞에 대상 물체가 없을 경우에는 마지막 감지 이후 3초 후

에 LED가 꺼지도록 한다.

◾ delay 명령어는 프로그램 아래에 delay(100) 명령어 한번만 오도록 기능을

설계해 본다.

◾ 만약 3초간 어떠한 기능을 수행해야 한다면, 이를 0.1초 간격으로 30번 수

행하면 동일한 결과를 얻을 수 있다.

◾ 즉 LED를 3초간 켜기 위해서 delay(3000) 대신에 delay(100)을 30번 반복

하면 동일한 효과가 발생을 하는 것이다.

움직이는 동안에는 계속 LED가 켜져 있도록 하기

나누어서 기능을 수행하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 114 -

◾ 아래의 코드는 loop() 함수가 반복되는 특성을 이용해 LED가 3초간 켜져

있도록 하는 프로그램을 보여준다.

◾ cnt 값은 30으로 초기화 되어 있고 loop 함수가 실행되면 값이 1씩 감소

한다. 결국 30번 정도 반복하면 값이 0이 되며, LED가 꺼지게 된다. 0.1

초를 30번 반복하는 효과를 cnt 변수를 통해서 구현한 것이다.

※ cnt 변수 이름은 다른 이름으로 수정하여 사용해도 된다. 단지 count 라는

의미의 단어를 줄여서 사용한 것이다.

loop() 반복을 이용해 LED를 3초간 겨기

SPL 스크립트 스케치 코드

cnt = 30

void setup(){

}

void loop(){ if ( cnt > 0) { cnt = cnt - 1

//LED를 켠다. DigitalWrite(13, HIGH) } else { //LED를 끈다. DigitalWrite(13, LOW) }

//0.1초를 기다린다. Delay(100)}

int cnt = 30;

void setup(){ pinMode(13, OUTPUT);}

void loop(){ if ( cnt > 0) { cnt = cnt - 1;

//LED를 켠다. digitalWrite(13, HIGH); } else { //LED를 끈다. digitalWrite(13, LOW); }

//0.1초를 기다린다. delay(100);}

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 115 -

◾ 아래 프로그램의 기능을 완성해 본다.

구현하기

SPL 스크립트 스케치 코드

cnt = 30

void setup(){

}

void loop(){ a0 = AnalogRead(0)

//움직이는 대상을 감지한다. if (a0 ___ _____ ) { ___ = ___ }

if ( cnt > 0) { cnt = cnt - 1

//LED를 켠다. DigitalWrite(13, HIGH) } else { //LED를 끈다. DigitalWrite(13, LOW) }

//0.1초를 기다린다. Delay(100)}

int cnt = 30;

void setup(){ pinMode(13, OUTPUT);}

void loop(){ int a0 = analogRead(0);

//움직이는 대상을 감지한다. if (a0 ___ _____ ) { ___ = ___ ; }

if ( cnt > 0) { cnt = cnt - 1;

//LED를 켠다. digitalWrite(13, HIGH); } else { //LED를 끈다. digitalWrite(13, LOW); }

//0.1초를 기다린다. delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 116 -

▶ 동체인식 장치를 통해 움직임이 감지되면 5초간 LED가 켜져 있도록 한다.

이때 마지막 2초 동안은 LED가 점멸하여 잠시후 꺼질 수 있음을 사용자에

게 전달할 수 있는 기능을 구현해 본다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 117 -

7.6 경보음 소리 발생시키기

◾ tone 명령어에서 진동수 값을 아주 빠르게 증가시켜 주거나 감소시켜 주면

사이렌 소리나 경보음 소리와 같은 효과를 발생시킬 수 있다.

◾ 다음의 코드를 실행하여 어떠한 소리가 발생하는 지 확인해 본다.

tone 명령어로 경보음 소리 발생시키기

SPL 스크립트 스케치 코드

void setup()

{

}

void loop()

{

for (i = 0; i <100; i++)

{

f = i * i

tone(3, f, 100)

delay(10)

}

}

void setup()

{

}

void loop()

{

for (int i = 0; i <100; i++)

{

int f = i * i;

tone(3, f, 100);

delay(10);

}

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 118 -

▶ delay 간격을 수정하여 다른 소리가 발생하도록 시도해 본다.

▶ 진동수 값이 증가하다가 감소하는 기능을 추가하여 다양한 경보음 소리 패

턴을 구현해 본다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 119 -

7.7 경보음 소리 기능을 함수로 만들기

◾ 반복적으로 사용되는 기능은 함수로 분리해 놓으면 프로그램의 길이가 줄

어들고 재사용성이 높아진다.

◾ 함수는 다음과 같은 규칙으로 생성한다.

◾ 함수를 만드는 예는 다음과 같다.

함수 만들기

넘겨주는 값이 없는 경우 넘겨주는 값이 있는 경우

void 함수이름()

{

//이곳에 명령어들을 추가한다.

}

자료형 함수이름()

{

//이곳에 명령어들을 추가한다.

return 결과값;

}

넘겨주는 값이 없는 경우 넘겨주는 값이 있는 경우

void LEDBlink()

{

DigitalWrite(13, HIGH)

delay(1000)

DigitalWrite(13, LOW)

delay(1000)

}

int Sum(int a, int b)

{

c = a + b

return c

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 120 -

◾ 아래 코드는 이전 활동에서 작성한 코드에서 경보음 소리 발생 부분을 함

수로 변환한 예를 보여준다.

경보음 소리 함수 만들기

SPL 스크립트 스케치 코드

void setup()

{

}

void PlayAlert()

{

for (i = 0; i <100; i++)

{

f = i * i

tone(3, f, 100)

delay(10)

}

}

void loop()

{

PlayAlert()

}

void setup()

{

}

void PlayAlert()

{

for (int i = 0; i <100; i++)

{

int f = i * i;

tone(3, f, 100);

delay(10);

}

}

void loop()

{

PlayAlert();

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 121 -

7.8 보안 경보 장치 만들기

◾ PSD 센서와 경보음 소리 발생 기능을 이용하여 PSD 센서 앞에 대상 물체

가 감지되면 경보음 소리가 3초간 실행되는 기능을 구현해 보자.

◾ 아래 빈 칸에 들어가야 할 내용에 대해 생각해 보고 기능을 완성해 본다.

침입 탐지 장치

SPL 스크립트 스케치 코드

void setup()

{

}

void PlayAlert()

{

for (i = 0; i <100; i++)

{

f = i * i

tone(3, f, 100)

delay(10)

}

}

void loop()

{

a0 = AnalogRead(0)

//움직이는 대상을 감지한다. if (a0 ___ _____ ) { //PlayAlert() 함수를 3번 실행시키는 //코드를 이곳에 추가한다. }

void setup()

{

}

void PlayAlert()

{

for (int i = 0; i <100; i++)

{

int f = i * i;

tone(3, f, 100);

delay(10);

}

}

void loop()

{

int a0 = analogRead(0);

//움직이는 대상을 감지한다. if (a0 ___ _____ ) { //PlayAlert() 함수를 3번 실행시키는 //코드를 이곳에 추가한다. }

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 122 -

delay(100)

}

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 123 -

7.9 경광등 기능이 추가된 보안 경보 장치

◾ 이전 활동에서 구현한 보안감지 장치는 소리만 발생한다. 대상 물체가 감지

되면 소리 뿐 만이 아니라 LED도 같이 점멸하도록 기능을 추가해 보자.

◾ 전체 코드 중에서 어느 위치에 LED를 점멸하는 기능을 추가해야 할지 생

각해 보고 적당한 위치를 찾아보자.

◾ 만약, PlayAlert() 함수에 LED를 점멸하는 기능을 추가시키려고 한다면 함

수의 내용을 어떻게 수정해야 하는가?

설계하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 124 -

◾ PlayAlert() 함수 내에 있는 for 반복문은 0.01초 간격으로 100번 실행된

다. 총 실행 시간은 1초가 된다.

◾ 1초의 시간 중에서 0.5초는 LED를 켜고, 0.5초는 LED가 꺼져 있도록 조건

을 추가해 본다.

힌트

SPL 스크립트 스케치 코드

void PlayAlert()

{

for (i = 0; i <100; i++)

{

f = i * i

tone(3, f, 100)

//500 밀리초로 LED 동작을 나눈다.

if ( ___ < ___ )

{

//LED를 켠다.

}

else

{

//LED를 끈다.

}

delay(10)

}

}

void PlayAlert()

{

for (int i = 0; i <100; i++)

{

int f = i * i;

tone(3, f, 100);

//500 밀리초로 LED 동작을 나눈다.

if ( ___ < ___ )

{

//LED를 켠다.

}

else

{

//LED를 끈다.

}

delay(10);

}

}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 125 -

◾ 아날로그 PSD 거리센서를 활용하여 차량 후방 감지장치를 구현할 수 있다.

◾ tone 명령어를 이용하여 다양한 멜로디를 연주할 수 있다.

◾ PSD 센서 값을 소리의 높낮이 정보로 변환해 본다.

◾ PSD 센서 값을 소리의 점멸 정보로 변환해 본다.

◾ tone 명령어로 멜로디를 연주해 본다.

◾ 배열을 이용하여 멜로디를 연주해 본다.

학습 목표

08 차량 후방감지기 및 멜로디 연주장치

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 126 -

8.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 아날로그 PSD센서, LED 모듈, 스피커

아두이노 우노보드 올인원 쉴드

스피커 아날로그 PSD 거리 센서

준비물

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 127 -

◾ 스피커를 디지털 3번에 연결한다.

◾ 아날로그 PSD 거리 센서를 아날로그 0번 핀에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 128 -

8.2 거리 정보를 소리의 높낮이로 바꾸기

◾ PSD 거리 센서의 정보를 tone 명령어의 진동수 값으로 활용하면 거리 정

보를 소리의 높낮이 정보로 표현할 수 있다.

◾ 아래 코드의 기능을 완성해 본다.

기본 기능 구현하기

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ a0 = AnalogRead(0)

tone(3, ___ , 100 )

Delay(100)}

void setup(){

}

void loop(){ int a0 = analogRead(0);

tone(3, ___ , 100 );

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 129 -

◾ 이번에는 센서값을 그대로 전달하지 않고 값을 다양하게 변환하여 진동수

값으로 전달해 보자.

◾ 위의 코드에서 먼저 f = a0 * a0 와 같이 원래의 값이 제곱이 되도록 값

을 변환하면 어떠한 결과가 나오는지 확인해 본다.

◾ delay 값을 더 작게 또는 더 크게 변경할 경우 소리가 어떻게 달라 지는지

확인해 본다.

소리 높낮이 변환하기

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ a0 = AnalogRead(0)

f = ___ __ ___

tone(3, f , 100 )

Delay(100)}

void setup(){

}

void loop(){ int a0 = analogRead(0);

f = ___ __ ___ ;

tone(3, ___ , 100 );

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 130 -

8.3 간단한 멜로디 연주하기

◾ 다음 음계표는 각 옥타브별 진동수를 정의한 표이다.

◾ 아래 예제는 도 음을 한 박자 (500 밀리초) 연주한 예를 보여준다.

tone(3, 262, 480)

delay(500)

◾ 아래 예제는 레 음을 반 박자 (250 밀리초) 연주한 예를 보여준다.

tone(3, 294, 480)

delay(500)

음계표

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 131 -

◾ 아래 예제는 미 음을 한 박자 (500 밀리초) 연주한 후, 한 박자를 쉬는 예

를 보여준다. delay에서 사용된 1000 밀리초는 총 2박자 길이인데, 이중

450밀리초만 소리가 나고 나머지 시간에는 소리가 나지 않게 된다.

tone(3, 330, 480)

delay(1000)

◾ 소리가 나지 않게 하는 또 다른 방법은 진동수 부분을 값을 0으로 하는 것

이다.

tone(3, 0, 480)

delay(500)

◾ 위의 음계표를 참고하여 도레미파솔라시도를 연주해 본다.

도레미파솔라시도

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 132 -

※ tone 명령어의 세 번째 값은 delay에 있는 값보다 20밀리초 정도 작게 설

정하는 것이 음을 구분할 때 도움이 된다. 가령 아래와 같이 ‘미’ ‘미’ 두

음을 이어서 연주할 경우 tone의 세 번째 값과 delay 값이 같으면 두 음이

이어서 하나의 긴 음처럼 연주된다.

tone(3, 330, 500)

delay(500)

tone(3, 330, 500)

delay(500)

※ 위의 경우에서 ‘미’ ‘미’ 음이 서로 구분되어 연주되도록 하려면 다음과 같

이 살짝 소리가 나지 않는 시간을 만들어 주어야 한다.

tone(3, 330, 480)

delay(500)

tone(3, 330, 480)

delay(500)

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 133 -

8.4 동요 연주하기

◾ 아래의 악보를 참고하여 간단한 동요를 아두이노로 연주해 본다.

악보

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 134 -

8.5 거리 센서로 연주하기

◾ 거리 센서 값을 그대로 tone 명령어에 대입하게 되면 정확한 음계로 연주

되는 것이 아니라서 제대로 연주하기가 거의 불가능하다.

◾ 거리 센서 값을 map() 함수를 이용하여 음계로 대입한다면 어느 정도 간단

한 멜로디 음을 연주할 수 있다. 아래는 거리센서의 값을 음계 정보로 변

환하여 연주하는 과정을 보여준다.

거리센서 건반

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ a0 = AnalogRead(0)

//8 음계로 변환 f = map(a0, 0, 1023, 1, 8)

if (f == 1) tone(3, 262, 230) else if (f == 2) tone(3, 294, 230)

//나머지 음계도 추가한다.

delay(250)}

void setup(){

}

void loop(){ int a0 = analogRead(0);

//8 음계로 변환 int f = map(a0, 0, 1023, 1, 8);

if (f == 1) tone(3, 262, 230); else if (f == 2) tone(3, 294, 230);

//나머지 음계도 추가한다.

delay(250);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 135 -

▶ A4 종이에 피아노 건반 그림을 그린 후, PSD 센서를 이용하여 종이 피아

노 건반을 연주하는 장치를 만들어 보자.

실습

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ a0 = AnalogRead(0)

if (a0 > 100 && a0 <= 200) tone(3, 262, 230) else if (a0 > 200 && a0 <= 300) tone(3, 294, 230) else if (a0 > 300 && a0 <= 400) tone(3, 330, 230) else if (a0 > 400 && a0 <= 500) tone(3, 349, 230)

//나머지 음계도 추가한다.

delay(250)}

void setup(){

}

void loop(){ int a0 = analogRead(0);

if (a0 > 100 && a0 <= 200) tone(3, 262, 230); else if (a0 > 200 && a0 <= 300) tone(3, 294, 230); else if (a0 > 300 && a0 <= 400) tone(3, 330, 230); else if (a0 > 400 && a0 <= 500) tone(3, 349, 230);

//나머지 음계도 추가한다.

delay(250);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 136 -

8.6 배열로 멜로디 연주하기

◾ 아두이노에서도 배열을 사용할 수 있다. 아래의 예는 정수형 값과 문자들을

배열로 선언한 예를 보여준다.

자료형 배열이름[] = { 값, 값, 값, ... 값 };

배열 선언

int f[] = {262, 294, 330, 349, 392, 440, 494};

char a[] = {'A', 'B'};

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 137 -

◾ 음의 높낮이와 음의 길이를 각각 배열로 선언하면 음의 길이가 길어도 코

드의 길이가 늘어나지 않는다.

◾ tone 명령어에서 세 번째 인수의 값인 d[i]에 20일 빼 준 이유에 대해 설

명해 보자.

배열로 멜로디 연주하기

SPL 스크립트 스케치 코드

int f[] = {262, 294, 330, 349, 392, 440, 494}int d[] = {500, 250, 250, 500, 500, 250, 250}

void setup(){}

void loop(){ for (i = 0; i < 7; i++) { tone(2, f[i], d[i] - 20) delay(d[i]) }}

int f[] = {262, 294, 330, 349, 392, 440, 494}int d[] = {500, 250, 250, 500, 500, 250, 250}

void setup(){}

void loop(){ for (int i = 0; i < 7; i++) { tone(2, f[i], d[i] - 20); delay(d[i]); }}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 138 -

8.7 차량 후방 감지기 만들기

◾ 그동안의 활동에서는 거리 정보를 소리의 높낮이로 변환하여 멜로디로 표

현하였다.

◾ 요즘 대부분의 자동차에는 후방 장애물 감지기가 장착되어 있다. 후방에 있

는 장애물이 가까이 접근하면 소리의 점멸 간격이 더 짧아지고 장애물이

멀면 소리의 점멸 간격이 더 길어진다.

◾ 아래의 코드에서는 진동수는 1000Hz로 고정되고, 소리가 나는 지속 시간과

delay 값에 센서의 거리값을 대입하였다.

◾ 위의 코드를 실행해 보면 일반적인 후방 감지기와 달리 거리에 반비례하여

작동되는 것을 볼 수 있을 것이다. 이 문제를 보완해 보자.

거리를 소리의 점멸 정보로 표현하기

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ a0 = AnalogRead(0)

tone(3, 1000, a0 / 2)

delay(a0)}

void setup(){

}

void loop(){ int a0 = analogRead(0);

tone(3, 1000, a0 / 2);

delay(a0);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 139 -

◾ map() 함수를 이용하여 센서 값을 적절히 조절해 주면 점멸 간격이 이전

예제와 달리 거리값에 비례하여 작동시킬 수 있다.

◾ 프로그램의 기능을 완성해 본다.

가까워 지면 점멸 간격이 짧아지도록 개선하기

SPL 스크립트 스케치 코드

void setup(){

}

void loop(){ a0 = AnalogRead(0)

//이곳에서 a0값을 변한해 준다. a0 = map(a0, ___, ___, ___, ___)

tone(3, 1000, a0 / 2)

delay(a0)}

void setup(){

}

void loop(){ int a0 = analogRead(0);

//이곳에서 a0값을 변한해 준다. a0 = map(a0, ___, ___, ___, ___);

tone(3, 1000, a0 / 2);

delay(a0);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 140 -

▶ 이전 코드는 PSD 센서 앞에 대상 물체가 없는 경우에도 항상 소리가 발생

하는 문제점이 있다. if 조건문을 추가하여 이 문제를 해결해 보도록 한다.

즉, PSD 센서 앞에 대상 물체가 없는 경우에는 점멸 소리가 발생하지 않도

록 기능을 보완한다.

▶ PSD 센서에 대상 물체가 가깝게 접근할 경우에는 연속적으로 삐 소리가

나도록 기능을 개선해 보기 바란다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 141 -

◾ 컬러 LED바의 제어 명령어를 이해하고 활용할 수 있다.

◾ 컬러 LED바로 다양한 조형예술 창작 작품을 만들 수 있다.

◾ 컬러 LED바의 색상을 제어해 본다.

◾ 컬러 LED바의 색상 위치를 제어해 본다.

◾ 랜덤 함수를 활용하여 임의의 색상을 생성해 본다.

◾ 랜덤 함수를 활용하여 소리와 색상을 융합해 본다.

◾ 다양한 애니메이션 패턴을 생성해 본다.

학습 목표

09 컬러 LED바 예술 창작작품 만들기

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 142 -

9.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 컬러 LED바, PSD 거리 센서, 스피커

아두이노 우노보드 올인원 쉴드

스피커 아날로그 PSD 거리 센서

준비물

컬러 LED바

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 143 -

◾ 컬러 LED바를 디지털 2번에 연결한다.

◾ 스피커를 디지털 3번에 연결한다.

◾ 아날로그 PSD 거리 센서를 아날로그 0번 핀에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 144 -

9.2 컬러 LED바 이해하기

◾ 컬러 LED바는 8개의 컬러 LED셀로 구성되어 있으며, 한쪽에 있는 연장

핀을 통해 계속 8개씩 확장시켜 나갈 수 있다. 하나의 디지털 핀에서 최대

256개의 컬러 LED셀을 제어할 수 있다.

◾ 컬러 LED바는 8개를 연결한 것이 8x8 매트릭스이며, 64개의 컬러 LED가

연결되어 있다.

컬러 LED바

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 145 -

◾ 컬러 LED바에 있는 각 컬러 LED 셀은 위치값으로 각각을 제어할 수 있

다. 아두이노 보드에 가장 가까운 LED 셀부터 자동으로 0번, 1번 순으로

부여된다.

◾ 컬러 LED바를 연장하여 연결할 경우, 자동으로 위치는 이어진다.

◾ 컬러 LED바의 각 색상은 R (Red), G (Green), B (Blue) 3원색 조합을 통

해 색상을 표현한다.

컬러 LED바의 셀 위치

컬러 LED바의 색상

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 146 -

9.3 컬러 LED바 켜기

◾ 컬러 LED바를 켜기 위해서는 몇 가지 사전 명령어들을 프로그램에 추가해

주어야 한다.

◾ 아래 코드는 컬러 LED바를 켜기 위한 사전 작업들을 보여준다.

◾ SPL 스크립트와 스케치 코드의 결과물이 크게 다른 것에 유의하기 바란다.

컬러 LED바를 켜기 위한 사전 작업

SPL 스크립트 스케치 코드

void setup(){ //2번 핀에 8개의 LED 셀이 연결되어 있음 NSBegin(8, 2)}

void loop(){ //LED 셀을 모두 끔 NSClear()

//이곳에 명령어를 추가함

delay(1000)}

#include <NS_Rainbow.h>

//2번 핀에 8개의 LED 셀이 연결되어 있음NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ //LED 셀을 모두 끔 ns_stick2.clear();

//이곳에 명령어를 추가함

delay(1000);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 147 -

◾ 첫 번째 컬러 LED 셀을 빨강색으로 켜 보자.

◾ 컬러 LED 셀에 색상을 지정하는 명령어는 다음과 같다. 총 4개의 인수를

필요로 하는데, 첫 번째 인수는 LED 셀의 위치이며, 그 다음 3개는 Red,

Green, Blue 색상 값이다.

첫 번째 LED 셀 켜기

SPL 스크립트 스케치 코드

//위치, R, G, BNSSetColor(0, 255, 0, 0)NSShow()

//위치, R, G, Bns_stick2.setColor(0, 255, 0, 0);ns_stick2.show();

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 148 -

◾ 각 색상값은 0 ~ 255 사이의 숫자 값으로 구성된다. 첫 번째 LED를 빨간

색으로 켜는 코드는 다음과 같다.

▶ 두 번째 LED 셀을 초록색으로 켜보자.

▶ 7개의 LED 셀에 무지개 색상을 표현해 본다.

SPL 스크립트 스케치 코드

void setup(){ //2번 핀에 8개의 LED 셀이 연결되어 있음 NSBegin(8, 2)}

void loop(){ //LED 셀을 모두 끔 NSClear()

//첫번째 LED셀을 빨간색으로 켜기 NSSetColor(0, 255, 0, 0) NSShow()

delay(1000)}

#include <NS_Rainbow.h>

//2번 핀에 8개의 LED 셀이 연결되어 있음NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ //LED 셀을 모두 끔 ns_stick2.clear();

//첫번째 LED셀을 빨간색으로 켜기 ns_stick2.setColor(0, 255, 0, 0); ns_stick2.show();

delay(1000);}

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 149 -

9.4 신호등 만들기

◾ 컬러 LED바의 앞 3개의 LED 셀을 활용하여 1초 간격으로 변하는 신호등

을 구현해 보자.

◾ 신호등은 초록 -> 노랑 -> 빨강 의 순으로 1초씩 순차적으로 켜지도록 한

다.

초록 -> 노랑 -> 빨강 신호등

SPL 스크립트 스케치 코드

void setup(){ NSBegin(8, 2)}

void loop(){ //첫번째 LED셀을 초록색으로 켜기 NSClear() NSSetColor(0, 0, 255, 0) NSShow() delay(1000)

//두번째 LED셀을 노란색으로 켜기

//세번째 LED셀을 빨간색으로 켜기 }

#include <NS_Rainbow.h>NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ //첫번째 LED셀을 초록색으로 켜기 ns_stick2.clear(); ns_stick2.setColor(0, 0, 255, 0); ns_stick2.show(); delay(1000);

//두번째 LED셀을 노란색으로 켜기

//세번째 LED셀을 빨간색으로 켜기 }

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 150 -

9.5 반복문으로 하나씩 켜기

◾ for 반복문을 이용하여 LED를 순차적으로 켜보자.

LED를 순차적으로 켜기

SPL 스크립트 스케치 코드

void setup(){ NSBegin(8, 2)}

void loop(){ NSClear()

for (i = 0; i < 8; i++) { NSSetColor( ___ , 0, 255, 0) NSShow() delay(100) } }

#include <NS_Rainbow.h>NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ ns_stick2.clear();

for (int i = 0; i < 8; i++) { ns_stick2.setColor( ___ , 0, 255, 0); ns_stick2.show(); delay(100); } }

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 151 -

◾ 이전 예제는 LED가 계속 누적하여 켜지는 과정을 보여 주었다. 만약 한 개

씩만 순차적으로 LED가 켜지도록 하려면 이전 코드의 어떠한 부분을 수정

해 주어야 하는가?

LED를 순차적으로 하나씩만 켜기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 152 -

9.6 LED 전체 켜기

◾ 8개의 LED 전체를 R, G, B 색상으로 지정하여 켜기 위한 명령어는 다음과

같다. 기존 NSSetColor 명령어 대신에 NSSetAllColor 명령어를 사용하면

되며, 위치 인수가 필요 없다.

◾ 아래의 코드는 후레쉬 용도로 사용하기 위해 LED 전체를 흰색으로 켜기

위한 과정을 보여준다.

LED를 전체를 특정 색상으로 켜기

SPL 스크립트 스케치 코드

//R, G, BNSSetAllColor(255, 0, 0)NSShow()

//R, G, Bns_stick2.setAllColor(0, 255, 0, 0);ns_stick2.show();

SPL 스크립트 스케치 코드

void setup(){ NSBegin(8, 2)}

void loop(){ NSSetAllColor(255, 255, 255) NSShow() delay(1000)}

#include <NS_Rainbow.h>NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ ns_stick2.setAllColor(255, 255, 255); ns_stick2.show(); delay(1000);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 153 -

▶ 컬러 LED바 전체의 색상이 1초 간격으로 빨강, 초록, 파랑의 순서대로 변

경되도록 기능을 작성해 본다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 154 -

9.7 랜덤 함수

◾ 아두이노에서는 임의의 정수 값을 생성시키는 용도로 random() 이라는 아

주 유용한 함수를 제공한다.

◾ 함수의 사용 방법은 2가지가 있는데 각각의 사용 방법은 다음과 같다.

임의의 정수 값을 발생시키는 random() 함수

인수가 1개인 경우 인수가 2개인 경우

a = random(100)

⦁ 위의 변수 a에는 0 ~ 99까지의 임의의 값이 저장된다.

⦁ 100은 절대 나오지 않는다. random 함수에 사용된 인수보다 항상 1 작은 값 까지만 생성된다.

a = random(50, 100)

⦁ 위의 변수 a에는 50 ~ 99까지의 임의의 값이 저장된다.

⦁ 100은 절대 나오지 않는다. random 함수에 사용된 두 번째 인수보다 항상 1 작은 값 까지만 생성된다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 155 -

9.8 임의의 색상 생성하기

◾ random() 함수를 이용하여 0.3초 간격으로 LED 전체 색상을 임의의 색상

으로 변경하려고 한다.

◾ 아래의 코드를 완성해 보기 바란다.

임의의 색상으로 LED 켜기

SPL 스크립트 스케치 코드

void setup(){ NSBegin(8, 2)}

void loop(){ r = random( ___ ) g = random( ___ ) b = random( ___ )

NSSetAllColor(___, ___, ___) NSShow()

delay(300)}

#include <NS_Rainbow.h>NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ int r = random( ___ ); int g = random( ___ ); int b = random( ___ );

ns_stick2.setAllColor(___, ___, ___); ns_stick2.show();

delay(300);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 156 -

9.9 임의의 위치에 있는 LED를 임의의 색상으로 켜기

◾ random() 함수를 이용하여 0.1초 간격으로 8개의 LED 중에서 특정 LED

만 임의의 색상으로 켜려고 한다.

◾ 아래의 코드를 완성해 보기 바란다.

랜덤 LED 켜기

SPL 스크립트 스케치 코드

void setup(){ NSBegin(8, 2)}

void loop(){ p = random( ___ ) r = random( ___ ) g = random( ___ ) b = random( ___ )

NSClear() NSSetColor(___, ___, ___, ___) NSShow()

delay(100)}

#include <NS_Rainbow.h>NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ int p = random( ___ ); int r = random( ___ ); int g = random( ___ ); int b = random( ___ );

ns_stick2.clear(); ns_stick2.setColor(___, ___, ___, ___); ns_stick2.show();

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 157 -

▶ 임의의 진동수를 발생시켜 LED 셀이 켜질 때 스피커에 임의의 소리도 같

이 연주되도록 기능을 수정해 본다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 158 -

9.10 이퀄라이저 효과 만들기

◾ 오디오에 자주 사용되는 이퀄라이저 효과를 컬러 LED바로 구현해 본다.

◾ 컬러 LED바에 LED가 표시되는 길이가 랜덤하게 변경되도록 기능을 구현

해 본다.

이퀄라이저 효과

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 159 -

◾ for 반복문을 활용하여 임의의 위치까지 LED 셀을 켜는 기능을 구현한다.

◾ NSShow() 명령어의 위치에 대해 유의하기 바란다.

구현하기

SPL 스크립트 스케치 코드

void setup(){ NSBegin(8, 2)}

void loop(){ p = random( ___ ) r = random( ___ ) g = random( ___ ) b = random( ___ )

NSClear()

for (i = 0; i < ___ ; i++) { NSSetColor( __ , __, __, __) }

NSShow()

delay(100)}

#include <NS_Rainbow.h>NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ int p = random( ___ ); int r = random( ___ ); int g = random( ___ ); int b = random( ___ );

ns_stick2.clear();

for (int i = 0; i < ___ ; i++) { ns_stick2.setColor( __ , __, __, __); }

ns_stick2.show();

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 160 -

▶ LED 셀이 켜지는 길이 만큼 소리의 높낮이가 높아지도록 소리를 발생시키

는 기능을 추가하여 이전 활동의 예제에 추가해 보자. 즉, 이퀄라이저 표시

막대바의 길이가 길수록 더 높은 음의 소리가 같이 연주되도록 기능을 구현

하면 된다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 161 -

◾ 컬러 LED바의 제어 명령어를 이해하고 활용할 수 있다.

◾ 컬러 LED바로 센서 값을 시각적으로 표시할 수 있는 컬러 게이지바를 만

들 수 있다.

◾ 컬러 무드등을 제작할 수 있다.

◾ 거리 정보를 컬러 막대바로 표시한다.

◾ 거리 정도를 컬러 게이지바로 구현해 본다.

◾ 색상이 부드럽게 변화되는 컬러 무드등을 제작해 본다.

학습 목표

10 컬러 무드등 만들기

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 162 -

10.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 컬러 LED바, PSD 거리 센서, 스피커

아두이노 우노보드 올인원 쉴드

스피커 아날로그 PSD 거리 센서

준비물

컬러 LED바

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 163 -

◾ 컬러 LED바를 디지털 2번에 연결한다.

◾ 스피커를 디지털 3번에 연결한다.

◾ 아날로그 PSD 거리 센서를 아날로그 0번 핀에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 164 -

10.2 거리 센서의 값을 막대 그래프로 표시하기

◾ PSD 거리 센서의 값을 컬러 LED바에 막대 그래프로 표시해 보자.

◾ map 함수를 이용하여 거리 정보를 컬러바의 LED 셀 개수로 변환해 보자.

거리 센서를 막대 그래프로 표시하기

SPL 스크립트 스케치 코드

void setup(){ NSBegin(8, 2)}

void loop(){ a0 = AnalogRead(0) p = map(a0, ___, ___, ___, ___ ) r = 0; g = 255 b = 0

NSClear()

for (i = 0; i < ___ ; i++) { NSSetColor( i, r, g, b) }

NSShow()

delay(100)}

#include <NS_Rainbow.h>NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ int a0 = analogRead(0); int p = map(a0, ___, ___, ___, ___ ); int r = 0; int g = 255; int b = 0;

ns_stick2.clear();

for (int i = 0; i < ___ ; i++) { ns_stick2.setColor( i, r, g, b); }

ns_stick2.show();

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 165 -

10.3 거리 센서 값의 강도를 색상으로 표시하기

◾ 이전 활동의 코드에서, 컬러 LED바에 막대 그래프를 그릴 때 LED 셀의

개수가 증가할수록 LED 셀의 색상이 초록에서 빨간색으로 변화되 가면서

표시되도록 기능을 추가해 본다.

◾ map() 함수를 이용하면 변화되는 색상들의 중간 값을 아주 쉽게 계산할 수

있다. 아래의 예는 a0값에 따라서 초록에서 빨간색으로 변화되는 값을 얻

는 과정을 보여준다.

r = map(a0, 0, 1023, 0, 255)

g = map(a0, 0, 1023, 255, 0)

b = 0

초록과 빨강으로 그래프 표시하기

map() 함수를 이용해 컬러 매핑하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 166 -

◾ 아래 코드의 빈 간을 작성하여 프로그램을 완성해 본다.

구현하기

SPL 스크립트 스케치 코드

void setup(){ NSBegin(8, 2)}

void loop(){ a0 = AnalogRead(0) p = map(a0, ___, ___, ___, ___ ) r = map(a0, ___, ___, ___, ___ ) g = map(a0, ___, ___, ___, ___ ) b = 0

NSClear()

for (i = 0; i < ___ ; i++) { NSSetColor( i, r, g, b) }

NSShow()

delay(100)}

#include <NS_Rainbow.h>NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ int a0 = analogRead(0); int p = map(a0, ___, ___, ___, ___ ); int r = map(a0, ___, ___, ___, ___ ); int g = map(a0, ___, ___, ___, ___ ); int b = 0;

ns_stick2.clear();

for (int i = 0; i < ___ ; i++) { ns_stick2.setColor( i, r, g, b); }

ns_stick2.show();

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 167 -

10.4 컬러 무드등 만들기

◾ 빨간색 영역의 값에 대해서 임의의 시작 값과 끝 값을 생성한 후, 해당 값

의 범위를 256 단계로 서서히 변화시켜 보다.

◾ map 함수를 이용하여 변환되는 값을 계산해 보자.

임의의 색상으로 부드럽게 변화하기

SPL 스크립트 스케치 코드

void setup(){ NSBegin(8, 2)}

void loop(){ r1 = random(256) r2 = random(r1, 256)

for (i = 0; i < 256; i++) { r = map(i, 0, 255, r1, r2)

NSSetAllColor(r, 0, 0) NSShow() delay(10) }}

#include <NS_Rainbow.h>NS_Rainbow ns_stick2 = NS_Rainbow(8,2);

void setup(){ ns_stick2.begin();}

void loop(){ int r1 = random(256); int r2 = random(r1, 256);

for (int i = 0; i < 256; i++) { int r = map(i, 0, 255, r1, r2); ns_stick2.setAllColor( r, 0, 0); ns_stick2.show(); delay(10); }}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 168 -

▶ 이전 활동의 코드는 빨간색 영역만 서서히 변화시키는 기능을 제공하고 있

다. 이 코드에 초록색과 파란색 영역도 임의로 생성한 후 3가지의 R, G, B

색상이 서서히 256단계로 변화되도록 이전 코드의 기능을 개선해 본다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 169 -

◾ PWM으로 로봇 모터를 제어하는 명령어를 이해하고 활용할 수 있다.

◾ 로봇 주행을 제어하는 나만의 함수를 만들 수 있다.

◾ 아두이노 라이브러리를 등록하고 활용하는 방법을 익힐 수 있다.

◾ PWM 함수로 모터의 속도를 제어해 본다.

◾ 모터의 회전 방향을 제어해 본다.

◾ 나만의 로봇 모터 제어함수를 만들어 본다.

◾ 아두이노 라이브러리로 내가 만든 함수를 등록하고 활용해 본다.

학습 목표

11 나만의 로봇 제어함수 만들기

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 170 -

11.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 모바일 로봇 플랫폼

아두이노 우노보드 올인원 쉴드

모바일 로봇 플랫폼

준비물

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 171 -

◾ 왼쪽 모터의 케이블을 MOTOR1 단자에 연결한다.

◾ 오른쪽 모터의 케이블을 MOTOR2 단자에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 172 -

※ 로봇을 활용한 실습에서는 로봇이 갑자기 책상에서 움직일 수 있으며, 이

경우 자칫하면 로봇이 책상 아래로 떨어져 파손될 수 있다.

※ 로봇 실습시 로봇이 갑자기 이동하는 것을 방지하기 위해서는 다음과 같이

로봇의 앞쪽을 아래 방향으로 해서 세워 놓고 실습을 진행해야 한다. 즉,

바퀴가 공중에 떠 있어야 안전하게 실습할 수 있다.

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 173 -

※ 로봇 실습시 업로드 결과는 반드시 아래와 같아야 한다.

※ 만약 위와 다르게 결과가 표시된다면 업로드가 실패한 것이다. 업로드가 실

패하는 이유는 로봇의 모터가 순간적으로 전원을 많이 사용하기 때문에 PC

에서 USB 연결을 차단하였기 때문이다.

※ 문제를 해결하기 위해서는 아래의 절차대로 진행한다.

절차1) 아두이노 보드의 USB 케이블을 PC에서 제거한다.

절차2) 코딩 SW를 종료한다.

절차3) 아두이노 보드를 PC에 다시 연결한다.

절차4) 코딩 SW를 다시 실행한다.

※ 주의 사항

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 174 -

11.2 모터 제어에 대한 이해

◾ 일반적인 아두이노 우노 보드에서는 모터를 직접적으로 제어할 수 없다.

◾ 로봇의 모터를 구동시키기 위해서는 모터 드라이브라고 하는 별도의 전자

회로가 필요한데, 올인원 쉴드에는 이미 모터 드라이브 회로가 내장되어

있다.

모터 구동에 필요한 부품

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 175 -

◾ 아래 그림은 모터 드라이브 회로에 연결된 모터와 아두이노 디지털 핀들에

대한 연결 정보이다.

◾ 위의 그림에서 보이듯이 모터 드라이브 회로는 아두이노 디지털 4번, 5번,

6번, 7번 등 총 4개의 핀을 내부적으로 사용한다.

◾ 디지털 5번과 6번은 각각 PWM 핀으로서 AnalogWrite 명령을 이용하여

256 단계로 생성되는 전압을 조절할 수 있다.

◾ 예를 들어, 모터1의 경우 AnalogWrite(5, 255)를 실행하게 되면 가장 빠른

속도로 모터가 회전하게 된다.

◾ 디지털 4번과 7번은 모터의 회전 방향 즉, 전압의 방향을 결정짓는 핀이다.

예를 들어 디지털 4번에 DigitalWrite(4, LOW)를 실행하게 되면, 모터1의

전압이 반대로 걸리게 되어 모터1의 회전 방향이 반대가 된다.

모터 드라이브 연결 핀

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 176 -

11.3 모터1 제어하기

◾ 디지털 5번에 연결되어 있는 모터1을 제어해 보자. 아래 코드는 2초간 모

터를 200 정도의 파워 값으로 작동시키고 다시 2초간 정지 시키는 예제이

다.

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ AnalogWrite(5, 200) delay(2000)

AnalogWrite(5, 0) delay(2000)}

void setup(){}

void loop(){ analogWrite(5, 200); delay(2000);

analogWrite(5, 0); delay(2000);}

AnalogWrite 명령으로 모터 제어하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 177 -

◾ AnalogWrite 함수의 두 번째 인자는 0 ~ 255 사이의 값을 가질 수 있으

며, 0이면 모터가 멈추고 255이면 최대 속도로 회전한다. 하지만 모터의

특성상 0 ~ 150 사이의 값을 지정하면 모터가 작동하지 않는다.

◾ 아래의 코드는 모터의 속도를 반복문을 이용해 제어해 보는 과정을 보여준

다.

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ for (int i = 0; i < 255; i++) { AnalogWrite(5, i) delay(50) }}

void setup(){}

void loop(){ for (int i = 0; i < 255; i++) { analogWrite(5, i); delay(50); }}

모터 속도 제어하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 178 -

◾ 모터1의 회전 방향은 디지털 4번 핀의 값을 설정하기에 따라 달라진다.

HIGH 값으로 설정하면 + 전압이 발생하지만, LOW 값으로 설정하면 – 전

압이 발생한다.

◾ 아래의 코드는 모터1의 회전 방향을 전진 -> 정지 -> 후진 -> 정지의 순

서로 회전시키는 과정을 보여준다.

모터의 회전 방향 제어하기

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ //정방향 회전 DigitalWrite(4, HIGH) AnalogWrite(5, 200) delay(2000)

AnalogWrite(5, 0) delay(1000)

//역방향 회전 DigitalWrite(4, LOW) AnalogWrite(5, 200) delay(2000)

AnalogWrite(5, 0) delay(1000)}

void setup(){}

void loop(){ //정방향 회전 digitalWrite(4, HIGH); analogWrite(5, 200); delay(2000);

analogWrite(5, 0); delay(1000);

//역방향 회전 digitalWrite(4, LOW); analogWrite(5, 200); delay(2000);

analogWrite(5, 0); delay(1000);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 179 -

11.4 모터를 제어하는 함수 만들기

◾ 모터를 제어하는 기능을 로봇에서 계속 사용되는 명령어이기 때문에 가급

적 함수로 만들어 놓고 사용해야 한다.

◾ 다음과 같이 RobotWrite() 라는 이름으로 나만의 모터 제어용 함수를 만들

어 보자.

◾ 함수의 인수로는 모터 파워값을 받도록 하며, +값이면 모터가 앞으로 회전

하고, -값이면 모터가 반대로 회전하도록 설계한다. 즉, 모터 파워값은 –

255 ~ 255 사이의 값을 넘겨 받도록 한다.

◾ 위의 함수에서 사용된 abs() 함수는 수학함수로서 절대값을 넘겨주는 함수

이다.

모터 제어용 함수 만들기

SPL 스크립트 스케치 코드

void RobotWrite(int left){ left_power = abs(left) AnalogWrite(5, left_power)

if (left >= 0) DigitalWrite(4, HIGH) else DigitalWrite(4, LOW)}

void RobotWrite(int left){ int left_power = abs(left); analogWrite(5, left_power);

if (left >= 0) digitalWrite(4, HIGH); else digitalWrite(4, LOW);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 180 -

◾ 기존 예제를 함수로 변경한 결과이다.

통합된 코드

SPL 스크립트 스케치 코드

void RobotWrite(int left){ left_power = abs(left) AnalogWrite(5, left_power)

if (left >= 0) DigitalWrite(4, HIGH) else DigitalWrite(4, LOW)}

void setup(){}

void loop(){ //정방향 회전 RobotWrite(200) delay(2000)

RobotWrite(0) delay(1000)

//역방향 회전 RobotWrite(-200) delay(2000)

RobotWrite(0) delay(1000)}

void RobotWrite(int left){ int left_power = abs(left); analogWrite(5, left_power);

if (left >= 0) digitalWrite(4, HIGH); else digitalWrite(4, LOW);}

void setup(){}

void loop(){ //정방향 회전 RobotWrite(200); delay(2000);

RobotWrite(0); delay(1000);

//역방향 회전 RobotWrite(-200); delay(2000);

RobotWrite(0); delay(1000);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 181 -

11.5 2개의 모터를 동시에 제어하는 함수 만들기

◾ 로봇의 주행을 제어하기 위해서는 양쪽 모터를 동시에 제어해 주어야 한다.

모터1과 모터2를 동시에 제어하기 위해 다음과 같이 RobotWrite 함수에

모터2에 대한 제어 기능을 추가해 놓는다.

양쪽 모터 모두 제어하는 함수

SPL 스크립트 스케치 코드

void RobotWrite(int left, int rght){ left_power = abs(left) right_power = abs(right)

AnalogWrite(5, left_power) AnalogWrite(6, right_power)

if (left >= 0) DigitalWrite(4, HIGH) else DigitalWrite(4, LOW)

if (right >= 0) DigitalWrite(7, HIGH) else DigitalWrite(7, LOW)}

void RobotWrite(int left, int right){ int left_power = abs(left); int right_power = abs(right);

analogWrite(5, left_power); analogWrite(6, right_power);

if (left >= 0) digitalWrite(4, HIGH); else digitalWrite(4, LOW);

if (right >= 0) digitalWrite(7, HIGH); else digitalWrite(7, LOW);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 182 -

11.6 로봇 주행 제어하기

◾ 이전 활동에서 제작한 함수를 이용하여 다음과 같이 로봇이 동작하도록 기

능을 완성해 보자.

1초간 전진 -> 0.5초간 후진 -> 1초간 회전

◾ 이전 활동에서 작성한 RobotWrite() 함수는 프로그램 맨 위에 추가해 놓는

다.

간단한 로봇 주행 제어하기

SPL 스크립트 스케치 코드

void RobotWrite(int left){ ...}

void setup(){}

void loop(){ RobotWrite(200, 200) delay(1000)

RobotWrite(-200, -200) delay(500)

RobotWrite(-200, 200) delay(1000)}

void RobotWrite(int left){ ...}

void setup(){}

void loop(){ RobotWrite(200, 200); delay(1000);

RobotWrite(-200, -200); delay(500);

RobotWrite(-200, 200); delay(1000);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 183 -

▶ 나만의 로봇 주행 패턴을 만들어 본다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 184 -

11.7 라이브러리로 분리시키기

◾ RobotWrite() 함수를 다른 프로그램에서도 사용하려면 해당 함수를 별도의

파일로 분리시켜 놓아야 한다.

◾ 새로운 파일을 생성한 후, 소스의 모든 내용을 삭제한다. 그 다음,

RobotWrite() 함수의 내용만 해당 파일에 복사해 놓는다.

함수만 분리하기

스케치 코드

#include<Arduino.h>

void RobotWrite(int left, int right){ int left_power = abs(left); int right_power = abs(right);

analogWrite(5, left_power); analogWrite(6, right_power);

if (left >= 0) digitalWrite(4, HIGH); else digitalWrite(4, LOW);

if (right >= 0) digitalWrite(7, HIGH); else digitalWrite(7, LOW);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 185 -

◾ 함수를 라이브러리로 분리하기 위해서는 함수의 내용이 모두 C언어 문법으

로 작성되어 있어 한다. 위의 코드는 RobotWrite() 함수를 분리시킨 결과

를 보여준다.

◾ 위의 코드 위쪽을 살펴보면 아래의 명령어가 추가되어 있는 것을 볼 수 있

을 것이다. 추가된 이유는 이 라이브러리에서 사용하는 아두이노 명령어들

이 Arduino.h 파일에 있는 명령어들을 사용하기 때문이다.

#include<Arduino.h>

◾ 화면 상단에서 라이브러리로 저장 메뉴를 클릭한다.

◾ 파일을 저장하는 창이 뜨는 표시된 폴더에서 RobotWrite 라는 이름으로

폴더를 새로 생성한다.

◾ 새로 생성된 폴더로 이동한 후에, RobotWrite.h 이름으로 현재의 라이브러

리 함수를 파일로 저장한다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 186 -

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 187 -

11.8 라이브러리 사용하기

◾ 이전 단계에서 라이브러리로 만들어 놓은 RobotWrite 함수를 다른 프로그

램에서 사용해 보자.

◾ 새로운 프로그램을 생성한 후에, 아래의 명령어를 프로그램 맨 위에 추가한

다.

#include<RobotWrite.h>

◾ 로봇의 주행을 제어하는 기능을 loop() 함수 안에 추가해 준다.

RobotWrite 라이브러리 사용하기

SPL 스크립트 스케치 코드

#include<RobotWrite.h>

void setup(){}

void loop(){ RobotWrite(200, 200) delay(1000)

RobotWrite(-200, -200) delay(500)

RobotWrite(-200, 200) delay(1000)}

#include<RobotWrite.h>

void setup(){}

void loop(){ RobotWrite(200, 200); delay(1000);

RobotWrite(-200, -200); delay(500);

RobotWrite(-200, 200); delay(1000);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 188 -

11.9 SPL 편집기에 있는 로봇 주행제어 명령어

◾ SPL 편집기에는 사용자가 로봇 함수를 만들지 않아도 동일하게 사용할 수

있는 로봇 주행 제어용 명령어가 있다. 내장명령어에서 2번째 그룹에 있는

DriveWrite 함수를 이용하면 RobotWrite 함수를 만들지 않아도 동일하게

로봇을 제어할 수 있다.

DriveWrite() 함수

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 189 -

◾ 아래의 코드는 SPL 편집기에 내장된 DriveWrite 함수를 사용하여 별도의

라이브러리 추가 없이 로봇을 제어하는 과정을 보여준다.

DriveWrite 함수로 로봇 제어하기

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ DriveWrite(200, 200) delay(1000)

DriveWrite(-200, -200) delay(500)

DriveWrite(-200, 200) delay(1000)}

void setup(){}

void loop(){ DriveWrite(200, 200); delay(1000);

DriveWrite(-200, -200); delay(500);

DriveWrite(-200, 200); delay(1000);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 190 -

◾ 아날로그 키패드 센서를 활용할 수 있다.

◾ 키패드 센서를 이용하기 위한 함수를 만들 수 있다.

◾ 키패드 센서로 로봇 조종기를 제작할 수 있다.

◾ 키패드 센서의 특성을 확인해 본다.

◾ 키패드 센서용 함수를 작성한다.

◾ 키패드 센서용 함수를 이용하여 오르간 연주 장치를 구현해 본다.

◾ 키패드 함수를 이용해 로봇 조종기를 구현한다.

학습 목표

12 로봇 조종기 만들기

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 191 -

12.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 키패드센서, 모바일 로봇 플랫폼

아두이노 우노보드 올인원 쉴드

준비물

아날로그 키패드 센서 모바일 로봇 플랫폼

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 192 -

◾ 왼쪽 모터의 케이블을 MOTOR1 단자에 연결한다.

◾ 오른쪽 모터의 케이블을 MOTOR2 단자에 연결한다.

◾ 아날로그 키패드 센서를 아날로그 0번 핀에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 193 -

12.2 키패드 센서값 읽기

◾ 키패드 센서는 5개의 버튼으로 구성되어 있으며, 각 버튼을 누를 때 마다

센서 값이 달라진다.

◾ 각 버튼이 눌려질 때 콘솔창에 표시되는 값을 아래에 기록한다.

◾ 측정값에 오차가 있으므로 측정값에서 +10 또는 –10을 계산한 값을 같이

기록한다.

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ a0 = AnalogRead(0) PrintLine(a0) delay(100)}

void setup(){ Serial.begin(115200);}

void loop(){ int a0 = analogRead(0); Serial.println(a0); delay(100);}

키패드 센서 값 확인하기

버튼 측정값 측정값-10 측정값+10

노랑

빨강

흰색

초록

파랑

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 194 -

12.3 키패드 버튼의 번호를 리턴하는 기능

◾ 키패드 센서의 버튼을 누르면 버튼에 해당하는 번호를 출력하는 기능을 구

현해 본다.

키패드 버튼의 번호 리턴하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 195 -

◾ 아래의 코드에서 if 조건문의 값을 자신이 측정한 센서 값에 맞추어 수정해

준다.

SPL 스크립트 스케치 코드void setup(){}

void loop(){ pin = 0 a = AnalogRead(pin)

if (608 < a && a < 628) PrintLine(1) else if (797 < a && a < 816) PrintLine(2) else if (a> 895 && a<915) PrintLine(3) else if (a> 666 && a<686) PrintLine(4) else if (a> 724 && a<744) PrintLine(5)

Delay(100)}

void setup(){ Serial.begin(115200);}

void loop(){ int pin = 0; int a0 = analogRead(0);

if (608 < a && a < 628) Serial.println(1); else if (797 < a && a < 816) Serial.println(2); else if (a> 895 && a<915) Serial.println(3); else if (a> 666 && a<686) Serial.println(4); else if (a> 724 && a<744) Serial.println(5);

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 196 -

12.4 키패드 버튼의 번호를 리턴하는 함수

◾ 이전 활동에서 작성한 코드를 다른 프로그램에서 사용하기 위해 함수로 분

리해 본다.

키패드 버튼의 번호 리턴 함수

SPL 스크립트 스케치 코드void setup(){}

void loop(){ a = KeyPad(0) PrintLine(a) delay(100)}

int KeyPad(int pin){ res = -1 a = AnalogRead(pin)

if (608 < a && a < 628) res = 1 else if (797 < a && a < 816) res = 2 else if (a> 895 && a<915) res = 3 else if (a> 666 && a<686) res = 4 else if (a> 724 && a<744) res = 5

return res}

void setup(){ Serial.begin(115200);}

void loop(){ int a = KeyPad(0); Serial.println(a) delay(100);}

int KeyPad(int pin){ int res = -1; int a = analogRead(pin);

if (608 < a && a < 628) res = 1; else if (797 < a && a < 816) res = 2; else if (a> 895 && a<915) res = 3; else if (a> 666 && a<686) res = 4; else if (a> 724 && a<744) res = 5;

return res;}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 197 -

12.5 키패드 함수를 라이브러리로 등록하기

◾ 키패드 함수를 다른 프로그램에서도 사용하려면 해당 함수를 별도의 파일

로 분리시켜 놓아야 한다.

◾ 새로운 파일을 생성한 후, 소스의 모든 내용을 삭제한다. 그 다음, 키패드

함수의 내용만 해당 파일에 복사해 놓는다.

함수만 분리하기

스케치 코드

#include<Arduino.h>

int KeyPad(int pin){ int res = -1; int a = analogRead(pin);

if (608 < a && a < 628) res = 1; else if (797 < a && a < 816) res = 2; else if (a> 895 && a<915) res = 3; else if (a> 666 && a<686) res = 4; else if (a> 724 && a<744) res = 5;

return res;}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 198 -

◾ 함수를 라이브러리로 분리하기 위해서는 함수의 내용이 모두 C언어 문법으

로 작성되어 있어 한다. 위의 코드는 키패드 함수를 분리시킨 결과를 보여

준다.

◾ 위의 코드 위쪽을 살펴보면 아래의 명령어가 추가되어 있는 것을 볼 수 있

을 것이다. 추가된 이유는 이 라이브러리에서 사용하는 아두이노 명령어들

이 Arduino.h 파일에 있는 명령어들을 사용하기 때문이다.

#include<Arduino.h>

◾ 화면 상단에서 라이브러리로 저장 메뉴를 클릭한다.

◾ 파일을 저장하는 창이 뜨는 표시된 폴더에서 KeyPad 라는 이름으로 폴더

를 새로 생성한다.

◾ 새로 생성된 폴더로 이동한 후에, KeyPad.h 이름으로 현재의 라이브러리

함수를 파일로 저장한다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 199 -

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 200 -

12.6 라이브러리 사용하기

◾ 이전 단계에서 라이브러리로 만들어 놓은 KeyPad 함수를 다른 프로그램에

서 사용해 보자.

◾ 새로운 프로그램을 생성한 후에, 아래의 명령어를 프로그램 맨 위에 추가한

다.

#include<KeyPad.h>

◾ 버튼의 번호가 정상적으로 출력되는 지 다음과 같이 확인해 본다.

KeyPad 라이브러리 사용하기

SPL 스크립트 스케치 코드

#include<KeyPad.h>

void setup(){}

void loop(){ a = KeyPad(0) PrintLine(a) delay(100)}

#include<KeyPad.h>

void setup(){ Serial.begin(115200);}

void loop(){ int a = KeyPad(0); Serial.println(a) delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 201 -

12.7 오르간 연주장치 만들기

◾ 디지털 3번 핀에 스피커를 연결한 후, 키패드 버튼을 이용해 도레미파솔

까지의 음계를 연주해 보자.

키패드 건반으로 연주하기

SPL 스크립트 스케치 코드

#include<KeyPad.h>

void setup(){}

void loop(){ a = KeyPad(0)

if (a == 1) tone(3, 262, 200) else if (a == 2) tone(3, 294, 200) else if (a == 3) tone(3, 330, 200) else if (a == 4) tone(3, 349, 200) else if (a == 5) tone(3, 392, 200)

delay(100)}

#include<KeyPad.h>

void setup(){ Serial.begin(115200);}

void loop(){ int a = KeyPad(0); if (a == 1) tone(3, 262, 200); else if (a == 2) tone(3, 294, 200); else if (a == 3) tone(3, 330, 200); else if (a == 4) tone(3, 349, 200); else if (a == 5) tone(3, 392, 200);

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 202 -

12.8 로봇 조종기 만들기

◾ 5개의 키패드 버튼을 활용하여 다음과 같이 로봇의 동작을 제어해 보자.

키패드 버튼으로 로봇 조종하기

버튼 번호 동작 명령어

2 전진 DriveWrite(200, 200)

1 좌회전 DriveWrite(0, 200)

3 정지 DriveWrite(0, 0)

5 우회전 DriveWrite(0, 200)

4 후진 DriveWrite(-200, -200)

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 203 -

◾ 아래의 코드를 완성해 본다.

SPL 스크립트 스케치 코드

#include<KeyPad.h>

void setup(){}

void loop(){ a = KeyPad(0)

if (a == 1) DriveWrite( ___ , ___) else if (a == 2) DriveWrite( ___ , ___) else if (a == 3) DriveWrite( ___ , ___) else if (a == 4) DriveWrite( ___ , ___) else if (a == 5) DriveWrite( ___ , ___)

delay(100)}

#include<KeyPad.h>

void setup(){ Serial.begin(115200);}

void loop(){ int a = KeyPad(0); if (a == 1) DriveWrite( ___ , ___); else if (a == 2) DriveWrite( ___ , ___); else if (a == 3) DriveWrite( ___ , ___); else if (a == 4) DriveWrite( ___ , ___); else if (a == 5) DriveWrite( ___ , ___);

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 204 -

◾ PSD 거리 센서를 활용하여 사람의 접근에 반응하는 로봇을 구현할 수 있

다.

◾ 장애물을 회피하는 자율 주행 로봇을 구현할 수 있다.

◾ 사람의 접근을 회피하는 로봇을 구현한다.

◾ 사람에게 다가서는 로봇을 구현한다.

◾ 장애물을 회피하는 기능을 구현한다.

학습 목표

13 자율 주행 로봇

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 205 -

13.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 컬러 LED바, PSD 거리 센서, 스피커, LED,

모바일 로봇 플랫폼

아두이노 우노보드 올인원 쉴드

준비물

아날로그 PSD 거리 센서 모바일 로봇 플랫폼

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 206 -

◾ 왼쪽 모터의 케이블을 MOTOR1 단자에 연결한다.

◾ 오른쪽 모터의 케이블을 MOTOR2 단자에 연결한다.

◾ 아날로그 PSD 거리 센서를 아날로그 0번 핀에 연결한다.

◾ 아날로그 PSD 거리 센서를 로봇의 전방에 고정시킨다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 207 -

13.2 사람이 접근하면 도망가는 로봇

◾ 사람이 로봇에 접근하면 아래의 동작을 구동하도록 기능을 구현해 본다.

후진 (1초) -> 회전 (0.5초) -> 전진 (1초)

◾ 아래 프로그램을 완성해 본다.

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ a0 = AnalogRead(0) if (a0 __ ___ ) { DriveWrite( ___, ___ ) delay(1000)

DriveWrite( ___, ___ ) delay(500)

DriveWrite( ___, ___ ) delay(1000) } delay(100)}

void setup(){}

void loop(){ int a0 = analogRead(0);

if (a0 __ ___ ) { DriveWrite( ___, ___ ); delay(1000);

DriveWrite( ___, ___ ); delay(500);

DriveWrite( ___, ___ ); delay(1000); }

delay(100);}

구현하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 208 -

13.3 사람에게 점점 더 다가오는 로봇

◾ 사람이 로봇에 접근하면 사람 쪽으로 빠르게 다가오는 기능을 구현한다.

◾ 사람과의 거리가 가까울수록 더 빠르게 다가온다.

◾ 아래 프로그램을 완성해 본다.

구현하기

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ a0 = AnalogRead(0) s = a0 / 4

DriveWrite( ___, ___ ) delay(100)}

void setup(){}

void loop(){ int a0 = analogRead(0);

int s = a0 / 4;

DriveWrite( ___, ___ );

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 209 -

13.4 장애물을 회피하는 자율주행 로봇

◾ 자율 주행을 하다가 장애물을 만나면 아래의 동작을 수행한다.

후진 (1초) -> 회전 (1초) -> 전진

구현하기

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ a0 = AnalogRead(0) if (a0 __ ___ ) { DriveWrite( ___, ___ ) delay(1000)

DriveWrite( ___, ___ ) delay(1000) } DriveWrite( ___, ___ )

delay(100)}

void setup(){}

void loop(){ int a0 = analogRead(0);

if (a0 __ ___ ) { DriveWrite( ___, ___ ); delay(1000);

DriveWrite( ___, ___ ); delay(1000); }

DriveWrite( ___, ___ ); delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 210 -

13.5 LED를 점멸하는 로봇

◾ 로봇이 움직일 때 LED가 0.5초 간격으로 점멸하는 기능을 구현해 본다.

◾ 전역변수를 활용하여 0.1초 간격으로 loop() 함수가 실행되면서 동시에

LED가 점멸하도록 기존 코드에 기능을 추가해 본다.

구현하기

SPL 스크립트 스케치 코드

cnt = 0

void setup(){}

void loop(){ a0 = AnalogRead(0)

if (a0 __ ___ ) { DriveWrite( ___, ___ ) delay(1000)

DriveWrite( ___, ___ ) delay(1000) } DriveWrite( ___, ___ ) cnt = ( cnt + 1 ) % 10

if (cnt < ___ ) DigitalWrite(13, HIGH) else DigitalWrite(13, LOW)

delay(100)}

int cnt = 0;

void setup(){}

void loop(){ int a0 = analogRead(0);

if (a0 __ ___ ) { DriveWrite( ___, ___ ); delay(1000);

DriveWrite( ___, ___ ); delay(1000); }

DriveWrite( ___, ___ ); cnt = ( cnt + 1 ) % 10;

if (cnt < ___ ) digitalWrite(13, HIGH); else digitalWrite(13, LOW); delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 211 -

13.6 후진시 삐삐 경보 소리 연주하기

◾ 로봇이 뒤로 움직일 때 0.4초 간격으로 삐삐삐삐 소리가 나도록 한다.

구현하기

SPL 스크립트 스케치 코드

cnt = 0

void setup(){}

void loop(){ a0 = AnalogRead(0)

if (a0 __ ___ ) { for (int i = 0; i < 4; i++) { tone(3, 1000, 200) DriveWrite( ___, ___ ) delay(400) }

DriveWrite( ___, ___ ) delay(1000) } DriveWrite( ___, ___ ) cnt = ( cnt + 1 ) % 10

if (cnt < ___ ) DigitalWrite(13, HIGH) else DigitalWrite(13, LOW)

delay(100)}

int cnt = 0;

void setup(){}

void loop(){ int a0 = analogRead(0);

if (a0 __ ___ ) { for (int i = 0; i < 4; i++) { tone(3, 1000, 200); DriveWrite( ___, ___ ); delay(400); }

DriveWrite( ___, ___ ); delay(1000); }

DriveWrite( ___, ___ ); cnt = ( cnt + 1 ) % 10;

if (cnt < ___ ) digitalWrite(13, HIGH); else digitalWrite(13, LOW); delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 212 -

▶ 컬러 LED바를 로봇에 장착하여 회전시 방향지시등의 역할을 하도록 기능

을 추가해 본다.

▶ 후진시 컬러 LED바가 비상등의 역할을 하도록 기능을 추가해 본다.

▶ 전진시에는 차량의 미등과 같이 컬러 LED바에 약한 빛이 켜지도록 기능을

추가해 본다.

실습

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 213 -

◾ 시리얼 데이터 수신 명령어를 이해하고 활용할 수 있다.

◾ 블루투스 통신을 통해 스마트폰으로 아두이노를 제어할 수 있다.

◾ 콘솔창의 키패드 버튼을 이용한 시리얼 데이터 읽기 기능을 구현한다.

◾ 시리얼 읽기 기능으로 LED를 제어한다.

◾ 시리얼 읽기 기능으로 로봇을 제어한다.

◾ 스마트폰의 블루투스 통신 기능을 이용하여 아두이노를 제어해 본다.

학습 목표

14 블루투스 원격 제어하기

실습 개요

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 214 -

14.1 준비하기

◾ 아두이노 보드, 올인원 쉴드, 모바일 로봇 플랫폼, 블루투스 모듈, LED 모

듈, 스마트폰

아두이노 우노보드 올인원 쉴드

준비물

블루투스 모듈 모바일 로봇 플랫폼

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 215 -

◾ 왼쪽 모터의 케이블을 MOTOR1 단자에 연결한다.

◾ 오른쪽 모터의 케이블을 MOTOR2 단자에 연결한다.

◾ LED 모듈을 디지털 13번에 연결한다.

H/W 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 216 -

◾ 블루투스 모듈은 디지털 핀 0번과 1번에 연결되어야 하는데, 블루투스 모

듈이 아두이노 보드에 연결되어 있으면 프로그램이 업로드가 되지 못한다.

◾ 따라서 블루투스 모듈은 아두이노 보드에 업로드가 완료된 후에 연결을 해

주어야 한다.

블루투스 모듈

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 217 -

14.2 시리얼 데이터 읽기

◾ 지금까지 사용해온 PrintLine() 함수는 아두이노 보드에서 PC로 데이터를

보내는 명령이다.

◾ 반대로 PC에서 보낸 데이터를 아두이노 보드에서 읽으려면 SerialRead()

명령어를 사용해 주어야 한다.

◾ 아래의 코드를 업로드 한 콘솔창의 확인해 본다.

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ s = SerialRead() PrintLine(s) delay(100)}

void setup(){ Serial.begin(115200);}

void loop(){ int s = Serial.read(); Serial.println(s);

delay(100);}

SerialRead() 명령어

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 218 -

14.3 콘솔창에서 데이터 보내기

◾ 콘솔창의 우측 하단을 보면 8개의 키패드 버튼이 있다. 각각의 버튼을 클

릭하면 버튼에 쓰여진 번호가 바이트 값으로 아두이노 보드로 전송된다.

◾ 블루투스 모듈을 통해 아두이노로 값을 전송하는 경우에도 위의 콘솔창에

서 버튼을 눌러 값을 전송하는 것과 동일한 값이 전송된다.

◾ 스마트폰이 없는 경우는 위의 콘솔창을 이용해 블루투스를 이용하는 시나

리오를 동일하게 테스트할 수 있다.

데이터 전송하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 219 -

14.4 시리얼 통신으로 LED 제어하기

◾ 콘솔창의 키패드 버튼으로 아두이노 보드에 값을 전송하고, 이 값을 이용하

여 LED를 제어하는 기능을 작성해 본다.

구현하기

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ s = SerialRead() if (s == 1) ____________ else if (s == 2) ____________ delay(100)}

void setup(){ Serial.begin(115200);}

void loop(){ int s = Serial.read(); if (s == 1) ____________ else if (s == 2) ____________

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 220 -

14.5 시리얼 통신으로 로봇 제어하기

◾ 콘솔창의 키패드 버튼으로 아두이노 보드에 값을 전송하고, 이 값을 이용하

여 로봇을 제어하는 기능을 작성해 본다.

구현하기

SPL 스크립트 스케치 코드

void setup(){}

void loop(){ s = SerialRead() if (s == 1) DriveWrite( ___ , ___ ) else if (s == 2) DriveWrite( ___ , ___ ) else if (s == 3) DriveWrite( ___ , ___ ) else if (s == 4) DriveWrite( ___ , ___ ) else if (s == 5) DriveWrite( ___ , ___ ) delay(100)}

void setup(){ Serial.begin(115200);}

void loop(){ int s = Serial.read(); if (s == 1) DriveWrite( ___ , ___ ); else if (s == 2) DriveWrite( ___ , ___ ); else if (s == 3) DriveWrite( ___ , ___ ); else if (s == 4) DriveWrite( ___ , ___ ); else if (s == 5) DriveWrite( ___ , ___ );

delay(100);}

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 221 -

14.6 블루투스 모듈 연결하기

◾ 아두이노 보드에 프로그램이 정상적으로 업로드가 되었다면, 이제 블루투스

모듈을 연결할 수 있다.

◾ 블루투스 모듈이 아두이노 보드에 미리 연결되어 있다면 프로그램이 업로

드 되지 못하므로 반드시 업로드할 때에는 블루투스 모듈을 아두이노 보드

로부터 제거해 놓아야 한다.

◾ 블루투스 모듈은 다음과 같이 연결한다.

블루투스 모듈 연결하기

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 222 -

◾ 블루투스 모듈은 다음과 같이 4핀으로 구성되어 있다.

◾ 블루투스 모듈이 연결된 결과는 다음과 같다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 223 -

14.7 스마트폰용 앱 설치하기

◾ 아두이노의 블루투스 모듈에 무선으로 값을 전송하기 위해서는 스마트폰을

활용하는 방법이 있다.

◾ 블루투스가 지원되는 스마트폰에 앱을 설치한 후, 스마트폰의 앱을 통해 아

두이노 보드로 값을 전송해 보자.

◾ 먼저, Play 스토어를 실행시킨다.

앱 설치

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 224 -

◾ 먼저, Play 스토어를 실행시킨다.

◾ 검색창에서 helloapps 단어를 입력한다.

◾ SPL-Duino Lite 앱을 선택한다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 225 -

◾ 블루투스를 켠 후, SPL Example 4를 실행한다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 226 -

◾ 블루투스 모듈 뒷면에 있는 번호를 찾아서 페어링을 진행한다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 227 -

◾ 페어링 화면에서 숫자 0000 또는 1234를 입력한다.

헬로앱스 – www.helloapps.co.kr 아두이노 프로젝트 실습

- 228 -

◾ 스마트폰의 화면에서 버튼을 눌러 로봇이 제어되는 지 확인한다.