Smart Mini City Manual

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 54

DownloadSmart Mini City Manual
Open PDF In BrowserView PDF
▣ 아두이노
◇ 아두이노
1. 아두이노란?
2. 아두이노 우노(Uno)
3. 브레드보드(빵판) & 점퍼선
4. 아두이노 프로그래밍 툴

◇ 기초학습
1. 아두이노를 이용한 LED 제어
2. 아두이노를 이용한 Motor 제어
3. 아두이노를 이용한 Sensor 제어

- 1 -

- 2 -

▣ 스마트 미니시티

▣ 아두이노
◇ 아두이노

◇ 스마트 미니시티
1. 스마트 미니티시란?

1. 아두이노란?

2. 재료 배치도
아두이노(Arduino)는 오픈 소스를 기반으로 한 단일 보드 마이크로컨트롤러(MCU)로, 완성 된 보드(상품)
와 관련 개발 도구 및 환경을 말합니다. 아두이노는 하드웨어에 익숙지 않은 학생들이 자신들의 디자인 작품

◇ 조립

을 손쉽게 제어할 수 있도록 고안된 것입니다.

1. 아두이노 우노(Uno)보드 & 브레드보드(빵판) 연결
아두이노(Arduino)는 다수의 스위치나 센서로부터 값을 받아들여, LED나 모터와 같은 외부 전자 장치들을

2. LED 조립 & 테스트

통제함으로써 환경과 상호작용이 가능한 것을 만들어 낼 수 있습니다. 아두이노는 소프트웨어를 처음 배우는

3. 카페 조립 & 테스트

사용자들이 가장 쉽게 접근할 수 있는 플랫폼이며, 다양한 센서 및 액추에이터를 지원해 드론 , 로봇제어, 사

4. 가로등 조립 & 테스트

물인터넷 등의 제품 개발 및 제작에 최적화된 플랫폼입니다.

5. 크레인 조립 & 테스트
2. 아두이노 우노(Uno)

6. 건물 조립 & 테스트

◇ 센서 응용
1.조도 센서
2.사운드 센서
3.적외선 센서

◇ 미니시티 ­ 독립
1.기본 예제 소스
2.심화 예제 소스

◇ 미니시티 ­ 협업
1.협업이란?
2.협업방법

<아두이노 우노보드 구조도>

3.협업 시나리오 예제
▶

아두이노 우노(Arduino Uno)는 가장 많이 사용되는 보드로써 거의 표준과 같이 사용되고 있습니다.
우노는 총 44개의 핀과 단자들로 구성되어 있습니다. 각 핀과 단자들은 아두이노와 다른 보드 또는 센
서들의 제어에 이용될 수 있으며 다양한 응용을 할 수 있습니다. 또한 안드로이드 표준 보드로, 핀 배열
등이 Uno를 기준으로 맞춰져 있으므로 확장 쉴드 등을 사용하는데 최적입니다.

- 3 -

- 4 -

Ÿ

전원 커넥터 : 아두이노에 외부전원을 공급할 때 사용합니다. (9v 권장)

Ÿ

전원 핀 : 아두이노로부터 브레드보드(빵판)나 센서, 모터 등 사용할 모듈에 전원을 공급하기 위해 사용합

Ÿ

니다. 3v, 5v를 모듈들의 (+) 혹은 VCC라 표시된 핀에 연결하고 GND는 (-)혹운 GND라 표시된 핀과 연

=> 점퍼선은 떨어져 있는 두 위치를 도선으로 이어주는 역할을 합니다. 점퍼선은 길이와 타입에 따라 구분할

결하면 됩니다.

수 있습니다. 길이는 10cm, 20cm, 30cm 로 나눌 수 있고, 타입은 점퍼선의 끝의 모양에 따라 F타입 또는

USB 포트 : 아두이노와 PC를 연결할 수 있습니다. PC와 연결하여 소스 프로그램을 업로드할 수 있으며,
전원을 공급할 수 있습니다.

Ÿ

Ÿ

디지털 핀 : 0번핀 ~ 13번핀 까지 총 14개의 핀으로 디지털 신호를 사용하는 센서 혹은 모듈을 사용할

F타입 : F타입은 Female의 F자를 의미하며 암단자라고도 불립니다. M타입을 끼울 수 있도록 안으로 들
어간 형태입니다.

Ÿ

때 연결하여 사용합니다.
Ÿ

M타입으로 나눕니다.

아날로그 핀 : A0핀 ~ A5핀 까지 총 6개의 핀으로 아날로그 신호를 사용하는 센서 혹은 모듈을 연결하
여 사용합니다.

Ÿ

○ 점퍼선

M타입 : M타입은 Male의 M자를 의미하며 수단자라고도 불립니다. F타입에 끼울 수 있도록 핀이 나와있
는 형태입니다.
점퍼선의 양끝의 타입에 따라 암/암(F/F), 수/수(M/M), 암/수(F/M) 으로 구분 합니다.

PWM 핀 : 디지털 핀중 ~ 표시가 되어 있는 핀으로 3번, 5번, 6번, 9번, 10번, 11번 총 6개의 핀으로
모터와 같이 세밀한 값 제어를 할 때 사용합니다.

3. 브레드보드(빵판) & 점퍼선

○ 브레드보드(빵판)

4. 아두이노 프로그래밍 툴
이 교재에서 사용할 프로그래밍 툴은 아두이노 IDE (스케치)와 스크래치(MBlock)입니다. 두 프로그래밍 툴
에 대하여 간단하게 알아보도록 하겠습니다.

아두이노 통합개발환경은 아두이노를 개발하기 위한 거의 모든 기능이 내장된 컴파일러입니다. 다른 말로는
아두이노 IDE 혹은 스케치라고 합니다. C, C++ 기반의 프로그래밍 언어를 사용하여 프로그램을 만들 수 있
=> 브레드보드는 빵판으로도 불립니다. 납땜을 하지 않고도 전자 부품을 쉽게 꽂아 전자회로를 구성할 수 있

습니다.

는 보드입니다. 재사용이나 수정이 가능합니다. 위 그림과 같이 녹색으로 표시된 곳을 IC 영역이라고 하며 세
로로 연결 되어 있으며 회로를 구성할 수 있습니다. 그리고 빨간색 선(+), 파란색선(-)은 버스영역이라 하며
가로로 연결 되어 있고 부품들의 전원을 연결할 때 사용합니다.

스크래치는 초·중 학생들의 컴퓨팅 사고능력 향상을 목표로 개발된 프로그래밍 교육용 도구입니다. 복잡한
프로그래밍 언어대신 블록을 쌓아 올려 간단한 애니메이션이나 게임과 같은 프로그램을 만들 수 있습니다.
mblock 프로그램을 사용하여 아두이노 하드웨어와 연동하여 사용할 수 있습니다. 아두이노 IDE의 모든 기능
을 사용할 수 없다는 단점이 있지만 난이도가 쉬워 어린아이도 배울 수 있다는 장점이 있습니다.

- 5 -

- 6 -

○ 아두이노 IDE (스케치)

Ÿ

JUST DOWNLOAD를 클릭하여 파일을 다운로드 합니다.

Ÿ

다운 받은 파일을 더블클릭하여 설치를 진행합니다.

Ÿ

설치가 완료되면 바탕화면의 Arduino 아이콘을 더블클릭하여 실행합니다.

① 설치
아두이노를 사용하기 위해서는 IDE 소프트웨어(S/W) 설치가 꼭 필요합니다. 아두이노 IDE는 아두이노 홈
페이지(https://www.arduino.cc/)에서 다운받을 수 있습니다.

Ÿ

Ÿ

홈페이지에 접속해 상단의 [SOFTWARE] > [DOWNLOADS]로 이동합니다.

자신의 PC 운영체제(OS)환경에 맞는 파일을 마우스로 클릭 합니다.

- 7 -

- 8 -

② 연결 및 드라이버 설치

Ÿ

USB 케이블을 이용하여 아두이노 우노보드와 PC를 연결합니다.

Ÿ

연결하면 아래와 같은 메시지창이 모니터 화면의 오른쪽 아래에 뜹니다.

Ÿ

드라이버 설치가 완료되었다면 스케치를 실행합니다.

Ÿ

[툴] -> [보드] -> [Arduino/Genuino UNO]를 선택합니다.

Ÿ

[툴] -> [포트] -> 아두이노 우노 보드와 연결된 포트를 선택합니다.

Ÿ

업로드 버튼을 눌러 업로드가 완료되면 정상적으로 연결된 것입니다.

④ 라이브러리 사용법
Ÿ

아두이노 라이브러리
- 다양한 센서, 모터, 모듈을 쉽게 제어할 수 있도록 지원하는 파일입니다.
- 헤더 파일을 include 한 뒤, 초기화해서 사용합니다.

Ÿ

아두이노 라이브러리 사용방법예시 -> 서보모터 라이브러리 (뒤에서 자세히 다룰 예정입니다.)
- #include 를 입력합니다.

③ 화면구성

- 컴파일해서 오류가 발생하는지 확인합니다.

- 9 -

- 10 -

○ 스크래치(MBlock)

Ÿ

자신의 PC 운영체제(OS)환경에 맞는 파일을 마우스로 클릭 합니다. MBlock의 설치는 일반적인 소프트웨
어 프로그램 설치처럼 간단하게 진행할 수 있습니다.

① 설치
Ÿ

MBlock 프로그램 다운로드 사이트 http://www.mblock.cc/software/에 접속하여 환경에 알맞은 방법을
선택합니다.

② MBlock 기본 설정
Ÿ

본 교재는 MBlock3를 기준으로 작성되었습니다. MBlock3를 선택합니다.

- 11 -

Ÿ

MBlock 첫 실행화면에서 상단의 [Language] 탭을 클릭하여 언어를 한국어로 설정합니다.

- 12 -

③ 라이브러리 사용법

④ 아두이노 모드 설정

Ÿ

상단의 [확장] 탭을 클릭하여 [확장 관리]로 이동합니다.

Ÿ

MBlock 화면에서 상단의 [연결] 탭에서 [아두이노 드라이버 설치]를 클릭하여 설치를 진행합니다.

Ÿ

확장관리 창에서 필요한 라이브러리를 설치 또는 추가할 수 있습니다.

Ÿ

상단의 [보드] 탭에서 [Arduino Uno]를 선택합니다.

- 13 -

- 14 -

Ÿ

Ÿ

상단의 [연결] 탭에서 [시리얼포트] 메뉴를 열어 현자 아두이노가 연결되어 있는 시리얼 번호를 선택합니다.

⑤ 화면 구성
Ÿ

MBlock 아두이노 모드의 화면은 크게 [스크립트], [블록코딩], [C코딩] 세 곳으로 나눠집니다.

Ÿ

[스크립트] 창은 사용할 블록들이 있으며, 아두이노 모드에서는 제어, 연산, 데이터&추가블록, 로봇 블록을

상단의 [편집] 탭에서 [아두이노 모드]를 클릭합니다.

사용할 수 있습니다.

- 15 -

- 16 -

Ÿ

[블록코딩] 창은 [스크립트] 창에서 블록들을 마우스로 끌어 놓아 작성하는 공간입니다.

⑥ 블록 설명
Ÿ

제어 블록
명령 블록

설명

지정된 시간동안 기다렸다가 다음 명령 블록을 실행합니다.

지정된 횟수만큼만 반복합니다. 반복 횟수가 정해져 있을 때 사용합니다.

끝나지 않고 계속해서 반복하며, 이후 다른 명령 블록을 연결할 수 없습니다.
만약 <조건>을 검사하여 참이면(조건을 만족하면) 명령 블록 안에 포함된 명령 블
록을 실행합니다. 거짓이면(조건을 만족하지 않으면) 명령 블록을 실행하지 않고
다음 명령 블록을 실행합니다.
만약 <조건>을 검사하여 조건이 참이면, 블록을 실행하고 조건이 거짓이면 아래에
있는 [아니면] 명령 블록을 실행합니다.

Ÿ

[C코딩] 창은 [블록코딩] 창에서 블록코딩을 하면 C 코딩이 자동으로 입력이 됩니다. 블록에 해당하는 C소스를
확인 가능하며 [아두이노 IDE로 편집하기] 버튼을 눌러 편집이 가능합니다. 그리고 [아두이노 업로드] 버튼을

<조건>이 참일 때까지 기다립니다.

눌러 연결된 아두이노에 소스를 업로드할 수 있습니다.
Ÿ

아두이노IDE를 이용한 편집은 블록코딩에 반영이 되지 않아 따로 저장하여 관리하면 됩니다.
<조건>을 검사하여 거짓이면 반복을 합니다. 조건이 참이면 반복을 끝냅니다.

- 17 -

- 18 -

Ÿ

연산 블록

Ÿ

명령 블록

설명
첫 번째 값과 두 번째 값을 더합니다.

데이터&추가블록

명령 블록

설명

새로운 변수를 만듭니다.

첫 번째 값과 두 번째 값을 뺍니다.
변수의 값을 보고합니다.
첫 번째 값과 두 번째 값을 곱합니다.

첫 번째 값과 두 번째 값을 나눕니다.

변수의 값을 지정된 값으로 변경합니다.

첫 번째 값부터 두 번째 값 사이의 난수를 구합니다. 정수를 입력하면 정수 난수
를 구하고, 소수를 입력하면 소수 난수를 구합니다.

변수의 값을 현재 값에서 지정된 값만큼 변경합니다.

첫 번째 값과 두 번째 값을 비교하여 두 번째 값이 크면 ‘참’ 아니면 ‘거짓’이 됩니
다.
변수를 화면에 표시합니다.
첫 번째 값과 두 번째 값을 비교하여 같으면 ‘참’ 아니면 ‘거짓’이 됩니다.
첫 번째 값과 두 번째 값을 비교하여 첫 번째 값이 크면 ‘참’ 아니면 ‘거짓’이 됩니
변수를 화면에서 숨깁니다.

다.
첫 번째 식과 두 번째 식이 모두 참이면 ‘참’, 두 식 중 하나의 식이 거짓이면 ‘거
짓’이 됩니다.
첫 번째 식과 두 번째 식 중 하나라도 참이면 ‘참’, 두 식 모두 거짓이면 ‘거짓’이

새로운 블록을 만듭니다.

됩니다.
수식이 참이면 ‘거짓’, 수식이 거짓이면 ‘참’이 됩니다.

두 문자열을 결합하여 새로운 문자열을 만듭니다.

문자열에서 지정된 순서의 문자를 기억합니다.

문자열의 길이를 기억합니다.

첫 번째 값을 두 번째 값으로 나눈 나머지를 기억합니다.

입력된 값을 반올립합니다.
입력된 값의 수학함수(절대값, 바닥함수, 천장합수, 제곱근, sin, cos, tan, asin
등)에 해당하는 결과 값을 구합니다.

- 19 -

- 20 -

Ÿ

로봇 블록

◇ 기초학습
명령 블록

설명

블록 코딩을 C코드로 바꿔줍니다.

1. 아두이노를 이용한 LED 제어
○ 기본 설명
아두이노를 이용한 LED 켜보기는 프로그램 소스가 업로드 된 보드에 LED를 연결하고 전원을 ON하면
LED 불이 켜지는 기본적인 예제입니다. 일반적인 LED는 저항을 따로 연결해 주어야 하지만 사용할 LED바는

해당 디지털 핀으로 입력받는 값을 읽어 옵니다.

해당 아날로그 핀으로 입력받는 값을 읽어 옵니다.

저항이 달려있어 별도의 저항이 필요 없습니다.

재료 구성

해당 디지털 핀에 켜짐/꺼짐 신호를 보냅니다.

해당 핀에 PWM 값을 보냅니다.

해당 핀에 서보모터 연결 및 회전 각도를 입력합니다.
아두이노 우노 보드

LED 바

점퍼선

문자를 출력합니다.

○ 하나의 LED바 ON
시리얼 통신으로 데이터를 받았는지 확인합니다.

시리얼 통신으로 받은 데이터를 읽어옵니다.

초음파센서를 사용할 때 핀 설정 및 데이터를 읽어옵니다.

① 연결

아두이노

LED 바

디지털 핀 5

(+)

GND

(-)

실행 시간 값을 읽어옵니다.

*LED바의 (+),(-)줄 끝

타이머를 초기화 합니다.

작은 구멍에 점퍼선의
핀을 끼우면 됩니다.



- 21 -

- 22 -

○ 하나의 LED바 ON/OFF 반복
② 스케치 작성 및 업로드
int ledPin = 5;

① 연결
// 핀 번호, 이름 설정

연결 구조는 5페이지의 <2-2 하나의 LED바 ON>과 같습니다.

void setup() {
pinMode(ledPin, OUTPUT);

// ledPin의 출력(OUTPUT) 설정

② 스케치 작성 및 업로드

}
int ledPin = 5;

// 핀 번호, 이름 설정

void loop() {
digitalWrite(ledPin, HIGH);

void setup() {

// LED바 ON

pinMode(ledPin, OUTPUT);

}

// ledPin의 출력(OUTPUT) 설정

}
Ÿ

int ledPin = 5;

=> 변수이름을 정해주고 해당 변수의 값을 5로 지정해줍니다.

void loop() {
digitalWrite(ledPin, HIGH);

Ÿ

pinMode(ledPin, OUTPUT);

delay(2000);

digitalWrite(ledPin, LOW);
delay(2000);

// LED바의 불이 켜짐

// 2초 대기
// LED바의 불이 꺼짐

// 2초 대기

}
Ÿ

delay(2000);

=> pinMode는 사용할 핀들의 입력(INPUT), 출력(OUTPUT)을 설정 해주는 함수로, setup() 안에서 선언해
줍니다. pinMode(ledPin, OUTPUT); 소스의 의미는 5번(ledPin)핀을 출력으로 설정 한다는 의미입니다.
Ÿ

digitalWrite(ledPin, HIGH);
=> delay(ms);는 밀리초 단위로 프로그램을 일시적으로 중지하는 함수입니다. 이 시간 동안에는 센서의 값을
읽거나, 연산, 통신 등의 기능도 중단 됩니다. 위 소스는 2초 동안 LED바의 불이 켜졌다 2초 동안 LED
바의 불이 꺼지는 것을 반복합니다.

=> digitalWrite()는 아두이노 보드의 디지털 핀에 디지털 신호(HIGH/LOW)를 주기위해 사용되는 함수입니다.

*ms는 밀리초를 말하며 1ms는 1/1000초를 의미합니다. 예를 들어 1000ms는 1초입니다.

HIGH신호를 주면 LED바의 불이 켜지고 LOW신호를 주면 LED바의 불이 꺼집니다.

○ 3개의 LED바 ON
① 연결

- 23 -

아두이노

LED 바

디지털 핀 5, 6, 7

(+)

GND

(-)

- 24 -

2. 아두이노를 이용한 Motor 제어
○ 기본 설명
모터의 종류는 DC모터, SERVO모터, STEP모터 등이 있습니다. 아두이노에서는 세 가지 모터를 쉽게 제어
가 가능합니다. 스마트 미니시티에서 사용할 SERVO모터와 STEP모터에 대해

알아보겠습니다.

SERVO모터는 0도 ~ 180도를 회전할 수 있으며, STEP모터는 모터드라이브를 사용하여 360도 회전, 회
전속도와 방향을 제어할 수 있습니다.

재료 구성

<3개의 LED바 배선 연결도>

② 스케치 작성 및 업로드
int ledPin1 = 5;

// 핀 번호, 이름 설정

int ledPin2 = 6;
int ledPin3 = 7;

아두이노 우노 보드

점퍼선

STEP모터

모터드라이브

SERVO모터

void setup() {
pinMode(ledPin1, OUTPUT);

// ledPin1의 출력(OUTPUT) 설정

pinMode(ledPin2, OUTPUT);

// ledPin2의 출력(OUTPUT) 설정

pinMode(ledPin3, OUTPUT);

// ledPin3의 출력(OUTPUT) 설정

}
void loop() {
digitalWrite(ledPin1, HIGH);

// LED바1의 불이 켜짐

digitalWrite(ledPin2, HIGH);

// LED바2의 불이 켜짐

digitalWrite(ledPin3, HIGH);

// LED바3의 불이 켜짐

}

○ SERVO모터 동작하기

아두이노 우노보드의 5~7번 핀을 사용하여 3개의 LED바를 연결하고 digitalWrite함수를 이용하여 3개의
LED바에 불이 들어오는 것을 확인할 수 있습니다.

* 응용예제 ­ 3개의 LED ON/OFF 반복하기
=> 3개의 LED바가 2초 동안 켜지고 2초 동안 꺼지는 것을 반복하는 스케치를 작성해 보세요.

① 연결

아두이노

SERVO모터 선

디지털 핀 6

주황색

5V

빨간색

GND

갈색

* 위의 서보모터 선의 역할과 색을 기억하고 10cm수/수 점퍼선을 이어서 연결해주세요.

- 25 -

- 26 -

<서보모터 90도->0도, 0도->90도 반복 회전하는 예제>
/* 90도->0도, 0도->90도 반복 회전하는 서보모터 예제 */
#include 

// 라이브러리 Servo.h를 포함시키는 명령.

Servo myservo;

// 서보모터를 제어하기 위해 myservo라는 객체 생성

void setup() {
myservo.attach(6);

// 6번 핀에 서보모터가 연결돼있음을 설정

}
void loop() {
myservo.write(90);
delay(5000);
<서보모터 배선 연결도>

// 서보모터 90도 회전
// 5초

myservo.write(0);

// 서보모터 0도 회전

delay(5000);

// 5초

}

② 스케치 작성 및 업로드
<서보모터 90도 회전 예제>

<0도->180도, 180도->0도로 반복 회전하는 서보모터 예제>

/* 90도 회전하는 서보모터 예제 */

/* 0도->180도, 180도->0도로 일정 각도씩 움직여 반복 회전하는 서보모터 예제 */

#include  // 라이브러리 Servo.h를 포함시키는 명령.

#include 

// 라이브러리 Servo.h를 포함시키는 명령.

Servo myservo;

Servo myservo;

// 서보모터를 제어하기 위해 myservo라는 객체 생성

// 서보모터를 제어하기 위해 myservo라는 객체 생성

void setup() {
myservo.attach(6);

void setup() {
// 6번 핀에 서보모터를 연결하기 위해 설정

}

myservo.attach(6);

// 6번 핀에 서보모터가 연결돼있음을 설정

}

void loop() {
myservo.write(90);

void loop() {
// 서보모터 90도 회전

for(int pos = 0; pos <= 180; pos += 10) {

}

myservo.write(pos);

// pos의 값 만큼 회전

delay(100);
Ÿ

#include 

// 서보모터가 0도 -> 180도로 10도씩회전
// 0.1초

}

=> #include는 외부 라이브러리를 스케치 안에 포함할 때 사용합니다. Servo.h는 서모모터를 제어하기 위한

Ÿ

아두이노에서 기본적으로 제공하는 라이브러리입니다.

delay(1000);

// 1초 대기

Servo myservo;

for(int pos = 180; pos >= 0; pos -= 10) {

// 서보모터가 180도 -> 0도로 10도씩회전

=> myservo라는 객체를 선언해줍니다.
Ÿ

myservo.attach(6);

// pos의 값 만큼 회전

delay(100);

// 0.1초

}

=> 서보모터의 주황색 선이 연결된 핀을 지정해줍니다. 위의 소스는 6번 핀에 지정된 것입니다.
Ÿ

myservo.write(pos);

}

myservo.write(90);

=> 0도 ~ 180도 사이의 각도를 지정해줍니다.

- 27 -

- 28 -

Ÿ

for문

○ STEP모터 동작하기
① 연결

=> 위와 같은 프로그래밍 문법을 반복문 for문이라고 합니다. for문은 기초적은 문법중 하나로 식을 활용하
여 조건이 만족할 때 까지 반복합니다.

아두이노

모터드라이브

STEP모터

디지털 핀 8

IN1

-

디지털 핀 9

IN2

-

디지털 핀 10

IN3

-

디지털 핀 11

IN4

-

묶음 핀 5개

묶음 선 5개

5V

(+)

-

GND

(-)

-

초기화식 : 조건식에서 참조될 변수의 초기 값을 지정한 식, 위의 소스에서 초기화식은 int pos = 0;이다.
조건식 : for문을 계속 수행할지 아닌지를 결정하는 부분. 위의 소스에서 조건식은 pos <= 180;이며
pos의 값이 0부터 180이 될 때까지 수행을 반복합니다.
증가식 : 변수의 값을 증가시키거나 감소시키는 식이 들어갑니다. 예를 들어 pos++는 pos의 값을 1씩 증가
시키고 pos--는 pos의 값을 1씩 감소시키는 식입니다. 위의 소스에서 pos+=10과 pos-=10은 변수
값을 10씩 증가시키거나 10씩 감소시키는 것입니다.

for(int pos = 0; pos <= 180; pos += 10) {
myservo.write(pos);
delay(100);
}

=> 변수 pos의 값이 초기값 0에서 180미만인지 확인 후 for문 안의 내용을 수행 합니다. 그런 다음 증가식
에 따라 pos의 값을 10증가시켜 서보모터를 10도 회전 합니다. 이렇게 계속 반복하여 pos의 값이 180이
되었을 때 반복을 중지합니다.

<스텝모터 & 모터드라이브 배선 연결도>

* 스텝모터의 묶음 선 5가닥과 모터드라이브의 묶음 핀 5개를 표시된 방향에 맞게 꽂아주세요.

- 29 -

- 30 -

② 스케치 작성 및 업로드

3. 아두이노를 이용한 Sensor 제어

#include  // 라이브러리 Stepper.h를 포함시키는 명령.
// 2048은 360도를 의미하며 스텝모터가 한번 동작할 때 마다 360도 움직이게 됩니다.

○ 기본 설명

const int stepsPerRevolution = 2048;

센서란 열, 빛, 소리, 움직임 등을 계측하여 신호로 알려주는 부품입니다. 여기서 말하는 신호에 따라 센서를

// myStepper 객체 생성과 회전각과 핀 번호 8,9,10,11 설정

두 가지로 분류할 수 있습니다. 디지털 신호를 출력해주는 디지털 센서와 아날로그 신호를 출력해주는 아날로그

Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

센서가 있습니다. 디지털 신호는 두 가지 종류의 전압으로만 변화하는 특성을 가지고 있으며, 아날로그 신호는
시간에 따라 연속적으로 변화하는 특성을 가지고 있습니다.

void setup() {
myStepper.setSpeed(14);

// STEP모터 회전속도

}
void loop() {
myStepper.step(stepsPerRevolution);

// STEP모터 회전

}
먼저 #include 를 통해 스텝모터를 쉽게 제어하기 위한 아두이노에서 기본적으로 제공하는 라
이브러리 Stepper.h를 사용하였습니다.
Ÿ

Ÿ

#include 

Ÿ

Ÿ

const int stepsPerRevolution = 2048;

Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

=> myStepper라는 객체를 생성하고 위에서 설정한 회전각도와, 핀 번호를 설정해 줍니다.
Ÿ

Ÿ

적외선 센서 : 장애물 감지 측정하는 디지털 센서.
실생활 예 - 아파트 복도 전등(움직임이 감지되면 일정시간 동안 불이 켜짐) 등

myStepper.setSpeed(14);

=> 스텝수를 2048로 설정할 경우 모터의 회전속도를 10~14로 설정하는 것이 적절합니다.
Ÿ

사운드 센서 : 소리의 크기를 측정하는 아날로그 센서.
실생활 예 - 소음측정기, 데시벨 측정기 등

=> 스텝모터가 360도 회전을 위한 총 스텝수입니다.
Ÿ

조도 센서 : 빛의 밝은 정도를 측정하는 아날로그 센서.
실생활 예 - 스마트폰(화면 밝기 자동 조절 기능), 자동으로 켜지는 무드등, 가로등 등

=> Stepper.h는 스텝모터를 제어하기 위한 아두이노에서 기본적으로 제공하는 라이브러리입니다.

○ 조도센서 값 시리얼모니터에서 알아보기
① 조도 센서란?

myStepper.step(stepsPerRevolution);

=> stepsPerRevolution앞에 ‘ - ’ 를 붙여주면 반대방향으로 회전하게 됩니다.

* 응용예제 ­ 반대방향으로 회전하기
=> 시계방향으로 회전하고 2초 후 반시계방향으로 회전하고 2초 후 다시 반복하는 스케치를 작성해서 아두
이노 우노보드에 업로드하여 동작을 확인해 보세요.

<조도센서 모듈의 기능 및 핀 배열>
▶ 조도센서는 측정된 빛의 세기에 따라 저항 값이 변하는 센서입니다. 빛이 강하면 저항 값이 약해지고,
빛이 약하면 저항 값이 높아집니다. 이러한 성질에 따라 아날로그 신호를 발생시키며 아두이노로 밝기
값을 얻어와 LED로 확인할 수 있습니다. 조도센서의 경우 디지털 핀을 사용할 때 감도조절을 합니다.
- 31 -

- 32 -

② 동작 원리

<조도센서 배선 연결도>

④ 스케치 작성 및 업로드
<동작 원리>
int cdsPin = A0;

▶ 센서에 빛을 비추게 되면 센서 내부의 CDs 광도전체에서 전류가 증가하게 됩니다. 증가된 전류는 옴의 법칙에
따라 저항의 크기를 줄여줍니다. 만약 센서에 빛을 비추지 않게 된다면, 적은 양의 전류를 가지게 되어 저항의

// 아날로그 핀 A0을 cdsPin로 설정

void setup() {

크기가 늘어나게 됩니다. 이 때 생성된 전류는 전극을 타고 리드선으로 흘러 SIG핀으로 흐르게 됩니다.

Serial.begin(9600);

// 시리얼 통신을 위한 통신속도 설정

pinMode(cdsPin, INPUT);
재료 구성

// A0핀 입력핀 설정

}
void loop() {
int cds_data = analogRead(cdsPin);
Serial.print("빛의 어두운 정도 : ");
Serial.println(cds_data);

// A0 핀으로 입력된 데이터를 cds_data에 저장

// 시리얼모니터에 " "안의 문자 출력

// 시리얼모니터에 cds_data 값 출력

delay(10);
}
* 시리얼 모니터 사용방법
아두이노 우노 보드

점퍼선

조도센서

=> 시리얼 모니터 창을 띄우는 다음 세 가지 방법이 있습니다.
① 시리얼 모니터 화면은 스케치화면 상단의 탭 [툴] > [시리얼 모니터]

③ 연결

② 단축키[Ctrl+Shift+M]
③ 시리얼 모니터 아이콘을 클릭 (6페이지의 아두이노 스케치 화면구성 참고)
아두이노

조도센서

아날로그 핀 A0

AO(AnalogOut)

5V

VCC

GND

GND

Ÿ

Serial.begin(9600);

=> 시리얼 데이터 통신을 위해 보드레이트(초당 전송 비트수)를 설정합니다. 보드레이트는 보통 9600으로 설정
합니다. 시리얼 모니터에서 데이터를 확인하기 위해서는 소스와 시리얼모니터의 보드레이트를 동일하게
지정해줘야 합니다.
- 33 -

- 34 -

Ÿ

Serial.print(“문자”);

○ 조도센서를 이용한 LED ON/OFF
재료 구성

=> 입력한 문자를 시리얼 모니터에 출력합니다.
Ÿ

Serial.print(데이터);

아두이노 우노 보드

점퍼선

조도센서

아두이노

조도센서

LED 바

아날로그 핀 A0

AO(AnalogOut)

-

디지털 핀 5

-

(+)

5V

VCC

-

GND

GND

(-)

=> 시리얼 모니터에 데이터 값을 출력합니다.
Ÿ

Serial.println( ~ );

=> 기능은 위의 Serial.print()와 같습니다. 뒤에 ln을 붙여주면 줄바꿈이 추가되어 시리얼 모니터에서 문자가
출력된 다음 엔터를 한번 쳐주는 효과가 있습니다.

LED 바

① 연결

<시리얼 모니터 화면>

- 35 -

- 36 -

Ÿ

if(cds_data >= 500) { ~ }

=> 위와 같은 프로그래밍 문법을 if문이라고 합니다. if문은 기초적은 문법중 하나입니다. if문은 크게 세 가지
구조로 작성 됩니다.
Ÿ

<조도센서, LED바 배선 연결도>

=> 가장 기초적인 if문 구조로서 하나의 조건에 대해 참/거짓을 판별한 다음 조건이 참일 때 동작이 실행됩니다.
Ÿ

② 스케치 작성 및 업로드
int cdsPin = A0;

// 아날로그 핀 A0을 cdsPin로 설정

int ledPin = 5;

// 디지털 핀 5번을 ledPin로 설정

if문

if ~ else문

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

// 시리얼 통신을 위한 통신속도 설정

pinMode(cdsPin, INPUT);

// cdsPin 입력핀 설정

pinMode(ledPin, OUTPUT); // ledPin 출력핀 설정
}
void loop() {

=> if문에 else문을 추가한 구조입니다. else문은 if문이 실행되지 않을시 반드시 실행되는 블록으로 조건이

int cds_data = analogRead(cdsPin);

// A0 핀으로 입력된 데이터를 cds_data에 저장

if(cds_data >= 500) {

// cds_data 값이 500 이상이면

Serial.println("어두움");

참일 경우에는 if문 반드시 실행되고 조건이 거짓일 경우에는 else문이 반드시 실행됩니다.
Ÿ

if ~ else if문

digitalWrite(ledPin, HIGH);
} else {

// cds_data 값이 500보다 작으면

Serial.println("밝음");
digitalWrite(ledPin, LOW);
}
delay(10);
}
빛의 밝기 데이터 값이 500 이상이면 시리얼 모니터에 “어두움” 이라는 문자가 출력되면서 LED불이 켜집니다.
500보다 작으면 “밝음” 이라는 문자가 출력되면서 LED불이 꺼집니다.
=> if문에 else if문을 추가한 구조입니다. if문의 조건1이 참일 경우 동작을 실행하고 거짓일 경우 else if문
의 조건2의 참/거짓을 판별한 다음 참일 경우 다른 동작을 실행하게 됩니다.

- 37 -

- 38 -

○ 사운드센서 값 시리얼모니터에서 알아보기

③ 연결

① 사운드 센서란?
아두이노

사운드센서

아날로그 핀 A1

AO(AnalogOut)

5V

VCC

GND

GND

<사운드 센서 기능 및 핀 배열>
▶ 사운드센서는 주변에서 발생되는 소리를 마이크로 모아, 소리의 크기를 증폭시켜 출력합니다. 만약 원하는
대상의 소리가 잘 감지가 안 되는 경우에는 가변저항을 통해 감도를 조절할 수 있습니다. 소리 신호는 기본
적으로 아날로그 전압 신호로 출력되기 때문에 아두이노를 사용할 경우 아날로그 핀을 통해 측정이 됩니다.

② 감도 조절

<사운드 센서 배선 연결도>

④ 스케치 작성 및 업로드
int soundPin = A1;

<감도 조절부 사진>
▶ 센서의 감도 조절부를 반시계 방향으로 돌리면 감지감도가 증가하고, 시계 방향으로 돌리면 감지감도가 감

// 아날로그 핀 A1를 soundPin으로 설정

void setup() {

소합니다.

Serial.begin(9600);

// 시리얼 통신을 위한 통신속도 설정

pinMode(soundPin, INPUT);

// A1핀 입력 설정

}
재료 구성
void loop() {
int sound_data = analogRead(soundPin);

// sound_data에 값 저장

Serial.print("소리 크기 : ");
Serial.println(sound_data);
delay(10);
}
시리얼 모니터를 통해 사운드센서로 측정되는 소리크기에 대한 데이터를 알 수 있습니다.
아두이노 우노 보드

점퍼선

- 39 -

사운드센서

* 감도를 조절하면서 사운드센서 데이터가 정상적으로 측정되는지 꼭 확인해 주세요.

- 40 -

○ 사운드 센서를 이용한 LED ON/OFF

delay(3000);
} else {

① 연결

// 500보다 작으면

digitalWrite(ledPin, LOW);
}
아두이노

사운드센서

LED 바

아날로그 핀 A1

AO(AnalogOut)

-

디지털 핀 5

-

(+)

5V

VCC

-

GND

GND

(-)

delay(10);
}
사운드센서를 통해 측정된 값이 500보다 크면 LED의 불이 들어오고 500보다 작으면 LED가 켜지지 않습
니다. LED 불이 켜진 것을 확인하기 쉽게 delay()함수를 이용해 켜지고 3초 후에 꺼지도록 합니다.

<사운드 센서, LED바 배선 연결도>

② 스케치 작성 및 업로드
int soundPin = A1;

// 아날로그 핀 A1를 soundPin으로 설정

int ledPin = 5;

// 디지털 핀 5번을 ledPin으로 설정

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

// 시리얼 통신을 위한 통신속도 설정

pinMode(soundPin, INPUT);

// soundPin 핀 입력 설정

pinMode(ledPin, OUTPUT);

// ledPin 핀 출력 설정

}
void loop() {
int sound_data = analogRead(soundPin);

// sound_data에 값 저장

Serial.print("소리 크기 : ");
Serial.println(sound_data);
if(sound_data >= 500) {

// 500보다 크면

digitalWrite(ledPin, HIGH);

- 41 -

- 42 -

○ 적외선센서 값 시리얼모티터에서 알아보기

재료 구성

① 적외선 센서란?

아두이노 우노 보드

점퍼선

적외선센서

④ 연결
<적외선 송수신 센서의 기능 및 핀 배열>
▶ 적외선(IR) 송수신 센서 모듈은 적외선 수광부와 발광부를 가지고 있으며, 가변 저항을 이용해 측정 거리

아두이노

적외선센서

디지털 핀 7

OUT

5V

VCC

GND

GND

조절이 가능한 모듈입니다. 측정거리는 2cm ~ 15cm이며, 아두이노와 연결하여 스마트 카 등 다양한
적외선 기반 장애물 인식 및 회피를 위한 용도로 사용합니다.

② 동작 원리

<적외선 송수신 센서 모듈의 원리>
▶ 우리가 주변에서 쉽게 볼 수 있는 TV 리모컨 등에 내장된 적외선 LED에서 적외선을 방출합니다. 방출된
적외선이 물체에 부딪혀 반사되어 포토트랜지스터가 이를 받아들여 장애물을 감지하는 원리입니다. 장애물이
감지되면 센서 LED가 불이 들어옵니다.

③ 감도 조절
<적외선 센서 배선 연결도>

<감도 조절부 사진>
▶ 센서의 감도 조절부를 반시계 방향으로 돌리면 감지거리가 감소하고, 시계 방향으로 돌리면 감지거리가 증가합니다.

- 43 -

- 44 -

④ 스케치 작성 및 업로드
int irPin = 7;

// 디지털 핀 7번 설정

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

// 시리얼 통신을 위한 통신속도 설정

pinMode(irPin, INPUT);

// A1핀 입력 설정

}
void loop() {
int ir_data = digitalRead(irPin);

// ir_data에 값 저장

Serial.print("감지 체크 : ");
Serial.println(ir_data);

<적외선 센서 배선 연결도>

if(ir_data == HIGH) {

// 장애물 미확인시

② 스케치 작성 및 업로드

Serial.println("감지된 물체가 없습니다.");
} else {

// 장애물 확인시

int irPin = 7; // 디지털 핀 7번을 irPin로 설정

Serial.println("물체가 감지되었습니다.");

int ledPin = 5; // 디지털 핀 5번을 ledPin로 설정

}
delay(100);

void setup() {

}

Serial.begin(9600);

// 시리얼 통신을 위한 통신속도 설정

pinMode(irPin, INPUT);

// irPin 핀 입력 설정

pinMode(ledPin, OUTPUT); // ledPin 핀 출력 설정

적외선 센서는 디지털 핀으로 연결되어 있기 때문에 HIGH, LOW 신호를 보냅니다. 물체가 감지되면 LOW
}

신호를, 감지되지 않으면 HIGH 신호를 보냅니다.

void loop() {
int ir_data = digitalRead(irPin);

// ir_data에 값 저장

Serial.print("감지 체크 : ");

○ 적외선 센서를 이용한 LED ON/OFF

Serial.println(ir_data);

① 연결
if(ir_data == HIGH) {
아두이노

적외선센서

LED 바

디지털 핀 7

OUT

-

// 장애물 미확인시

Serial.println("감지된 물체가 없습니다.");
digitalWrite(ledPin, LOW);

디지털 핀 5

-

(+)

5V

VCC

-

GND

GND

(-)

} else {

// 장애물 확인시

Serial.println("물체가 감지되었습니다.");
digitalWrite(ledPin, HIGH);
}
delay(500);
}
적외선 센서에 의해 물체가 감지되면 LED바의 불빛이 켜지고 감지되지 않으면 LED바의 불이 꺼지는 것을
확인할 수 있습니다.

- 45 -

- 46 -

◇ 스마트 미니시티 조립

▣ 스마트 미니시티

1. 아두이노 우노(Uno)보드 & 브레드보드(빵판) 연결

◇ 스마트 미니시티

○ 아두이노 우노(Uno)보드

1. 스마트 미니시티란?
○ 단계별 실습
Ÿ

기초 H/W 실습

Ÿ

개인용 Smart Mini City 실습

Ÿ

4인 협업 ­ 팀 프로젝트 실습

Ÿ

8인 협업 ­ 팀 프로젝트 실습

○ 협업 효과
Ÿ

협업 프로젝트(2명이상) 가능

Ÿ

다양한 협업 시나리오에 따른 차별화된 스마트 미니시티 동작 가능

① 플라스틱 서포트 너트형 4개, 볼트형 4개, 아두

Ÿ

사용자 또는 팀별의 다양한 응용

이노 우노(Uno)보드입니다.

② 볼트형 플라스틱 서포트를 아두이노 우노보드의
구멍에 아래에서 꽂은 다음 너트형 플라스틱 서포트
를 보드 위에서 조여 고정합니다.

2. 재료 배치도

- 47 -

③ 아두이노 우노(Uno)보드에 USB 케이블을 연결
합니다.

④ 사진과 같이 아두이노 우노(Uno)보드와 브레드
보드를 박스 안쪽에 배치해주세요.

⑤ 10cm 수/수 점퍼선 2개를 사용하여 아두이노
우노(Uno)보드의 GND, 5V핀과 브레드보드의 (+),
(-)버스를 연결 합니다.

⑥ 사진과 같이 브레드보드의 반대쪽 (+), (-) 버스
에도 10cm 수/수 점퍼선 2개를 사용하여 확장시켜
줍니다.

- 48 -

2. LED 조립 & 동작 테스트

○ 점퍼선-커넥터연결
○ LED-점퍼선 연결 및 박스고정

① 사진에 표시한 것과 같이 LED바와 연결한 곳이
① 그림과 같이 노란부분이 중심에 오도록 LED바를
가위로 잘라주세요.
*이때 동그란 구멍이 잘리지 않도록 유의해주세요.

(-)줄은 파란색 ,(+)줄은 빨간색처럼 되어있는지 확
② ①에서 자른 LED바 8개와 점퍼선 30cm 수/수
6개, 10cm 수/수 14개를 준비해주세요.

③ LED바 뒷면의 양면테이프를 뗀 후 7개는 10cm

④ ③에서 LED바에 넣어준 점퍼선을 사진과 같이

수/수 점퍼선으로 1개는 30cm 수/수 점퍼선으로
(+), (-)에 끼워주세요.

바깥방향으로 구부려 주세요.
* 옆에서 봤을 때 위의 그림처럼 점퍼선의 검은 부분

*끼울 때 손을 찔리지 않도록 조심하세요.

이 LED바 밖으로 나가게 해주세요.

③ ①번 사진의 첫 번째 파란색(-)줄의 점퍼선3개를

④ 그 다음 두 번째 꽂음형 커넥터에 빨간색(+)줄의

첫 번째 꽂음형 커넥터 1개에 끼워서 연결해줍니다.

점퍼선 3개를 연결해줍니다.

⑤ ③,④와 같은 과정을 반복해 꽂음형 커넥터를 이
용해서 4줄을 완성해주세요. 그리고 각 커넥터의 구
⑤ ③,④ 과정을 반복하여 10cm점퍼선을 연결한
LED바 7개와 30cm 점퍼선을 연결한 LED바 1개를
만들어주세요.

⑥ LED 부분이 가운데 구멍에 위치하여 붙이고 (+)

② 꽂음형 커넥터 4개를 준비합니다.

인해주세요.

멍 한 개에 30cm 수수 점퍼선을 끼워주세요.

⑥ ⑤까지 완료했다면 끝에 두 줄이 남습니다. 이
두 줄은 T형 커넥터 2게를 이용해 연결합니다.

에 연결된 점퍼선을 LED 중심으로 오른쪽 구멍에
꽂아주세요. *연결된 점퍼선은 양쪽 구멍에 넣어주면
됩니다.

- 49 -

- 50 -

○ 배선 연결

아두이노

⑦ 먼저 30cm 수/수 점퍼선과 연결한 LED바1개가
있습니다. 점퍼선의 5cm 정도 부분에 T형 커넥터를
연결해주세요.
*연결 시 손으로 누르는 것보다 도구를 이용하면

브레드보드

LED바 A, B, C 그룹

디지털 핀 4

A 그룹 (+)

디지털 핀 12

B 그룹 (+)

디지털 핀 13

C 그룹 (+)

5V

(+)

GND

(-)

A, B, C 그룹 (-)

⑧ 그 다음 10cm수/수 점퍼선과 연결된 LED바의
점퍼선을 4cm정도 남겨두고 가위로 잘라주세요.

쉽습니다.

⑨ 자른 점퍼선을 30cm 점퍼선과 연결되어있는
T형 커넥터와 연결해주세요.
앞에서 준비했던 10cm 암수 점퍼선을 T형 커넥
터와 연결된 30cm 점퍼선과 연결하여 연장 해주
세요.

⑩ 꽂음혐 커넥터 이용 2그룹 + T형 커넥터 이용
1그룸 총 3개의 LED바 그룹이 만들어졌습니다. 1
개의 그룹 당 (+)줄, (-)줄 총 2개의 줄을 연결해
불을 ON/OFF 가능합니다.

<건둘 LED A, B, C, 그룹 배선 연결도>

① 20cm 수/수 점퍼선 3개를 준비합니다.
② 20cm 수/수 점퍼선 3개를 아두이노의 4번, 12번, 13번 핀에 연결한 다음 브레드보드에 확장해줍니다.
③ 다음과 같이 건물 LED A, B, C 그룹의 선을 브레드보드에 연결합니다.
-> A그룹 (+)핀 ­ 4번 핀 확장 / (-)핀 - (-)버스
-> B그룹 (+)핀 ­ 12번 핀 확장 / (-)핀 - (-)버스
-> C그룹 (+)핀 ­ 13번 핀 확장 / (-)핀 - (-)버스
*배선 연결이 바르게 되었는지 꼭 확인해주세요.
*아두이노 보드와 브레드보드의 전원 연결과 전원 버스 확장은 <아두이노 우노(Uno)보드 & 브레드보드
(빵판) 연결> 과정을 참고하세요.

- 51 -

- 52 -

3. 카페 조립 & 동작 테스트

○ 동작 테스트 소스
○ 스텝모터 박스고정

/* 건물LED 동작 테스트 */
int buildingA = 4;

// 건물 A그룹

int buildingB = 13;

// 건물 B그룹

int buildingC = 12;

// 건물 C그룹

② 사진과 같이 박스 속 뚜껑에 표시한 위치에 스

① 스텝모터, 접시나사, 너트 입니다.

텝 모터를 고정 시킵니다.

void setup() {
pinMode(buildingA, OUTPUT);
*카페 건물은 6. 건물 조립 과정 진행 후

pinMode(buildingB, OUTPUT);

조립하시면 됩니다.

pinMode(buildingC, OUTPUT);
}
void loop() {
digitalWrite(buildingA, HIGH);
③ 스텝 모터를 접시나사와 너트를 이용해 고정

digitalWrite(buildingB, HIGH);

시켜 줍니다.

digitalWrite(buildingC, HIGH);
delay(2000);
digitalWrite(buildingA, LOW);
digitalWrite(buildingB, LOW);
digitalWrite(buildingC, LOW);
delay(2000);
}

- 53 -

- 54 -

○ 배선 연결

아두이노

○ 동작 테스트 소스

브레드보드

모터드라이브

디지털 핀 8

IN1

디지털 핀 9

IN2

디지털 핀 10

IN3

디지털 핀 11

IN4
핀 5개

5V

(+)

(+)

GND

(-)

(-)

스텝모터

/* 전원 연결시 스텝 모터 회전 동작 테스트 소스 */
핀 5개
#include 
const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);
void setup() {
myStepper.setSpeed(14);
}
void loop() {
myStepper.step(stepsPerRevolution);
}

* 선 정리대 붙이기
<스텝모터&모터드라이브 배선 연결도>

① 20cm 암/수 점퍼선 4개, 10cm 암/수 점퍼선 2개 준비합니다.
② 20cm 암/수 점퍼선 4개를 아두이노와 모터드라이브를 연결합니다.
-> 아두이노 8번핀 ­ 모터드라이브 IN1, 아두이노 9번핀 ­ 모터드라이브 IN2
-> 아두이노 10번핀 ­ 모터드라이브 IN3, 아두이노 11번핀 ­ 모터드라이브 IN4
③ 10cm 암/수 점퍼선 2개를 모터드라이브의 (+),(-)핀과 브레드보드의 (+), (-) 버스를 연결합니다.
④ 스텝모터 선 끝의 하얀 커넥터를 표시된 방향에 맞게 모터드라이브의 하얀 핀에 연결합니다.
*배선 연결이 바르게 되었는지 꼭 확인해주세요.

② 박스 겉 뚜껑 안쪽에 사진과 같은 위치에 4개의
① 뒷면에 양면테이프가 붙어 있는 선 정리대입니다.

*아두이노 보드와 브레드보드의 전원 연결과 전원 버스 확장은 <아두이노 우노(Uno)보드 & 브레드보드

선 정리대를 갈고리(끼우는 부분)가 밖을 향하도록 붙여
줍니다.

(빵판) 연결> 과정을 참고하세요.

- 55 -

- 56 -

4. 가로등 조립 & 동작 테스트

○ 박스에 가로등 고정하기
○ 가로등-점퍼선 연결

① 가로등 모듈 4개, 20cm 수/수 점퍼선 6개,

② 가로등의 흰색 선의 피복을 손톱으로 눌러 2cm

30cm 수/수 점퍼선 4개, 꽂음형 커넥터 2개

정도 벗겨주세요.

*가로등 4개중 2개는 30cm 점퍼선으로 연결하고

*선이 끊어지지 않도록 주의하세요. 도구를 이용해

나머지 2개는 20cm 점퍼선으로 연결합니다.

선을 눌러주어 피복을 제거할 수 있습니다.

③ 가로등의 흰색 선의 피복을 벗긴 부분을 30cm
수/수 점퍼선 핀에 감아줍니다. 그 다음 회색 선을
다른 30cm 수/수 점퍼선 핀에 감아 줍니다.

④ 감은 부분에 글루건을 사용하여 고정해주세요.

① 총 4개의 가로등을 박스의 가로등 구멍에 선을

② 가로등을 모두 알맞게 끼웠다면 글루건을 사용해

하나씩 넣어 끼워줍니다.

고정시켜주세요.

*30cm와 연결한 가로등을 안쪽구멍에 20cm와 연

*글루건을 사용할 때 화상위험이 있으니 조심하세

결한 가로등을 바깥구멍에 끼워주세요.

요.

③ 왼쪽의 선 정리대에는 왼쪽 가로등 2개 오른쪽

④ 각 가로등의 흰색 선과 연결된 점퍼선에 10cm

의 선 정리대에는 오른쪽 가로등 2개 선들을 끼워

암/수 점퍼선을 연결해 길이를 연장해줍니다.

주세요.

*브레드보드에 꽂을 핀입니다.

*글루건을 사용할 때 화상에 주의하세요. 적당량만 사
용해주세요.

*선들이 풀리지 않게 꽉 감아주세요.

⑤ 가로등의 회색 선과 연결된 점퍼선을 꽂음형 커
⑤ 사진과 같이 30cm 수/수 점퍼선과 연결한 가로

넥터에 연결합니다. 그 다음 브레드보드에 (-)(GND)

등 2개 20cm 수/수 점퍼선과 연결한 가로등 2개

와 연결할 수/수 20cm을 커넥터에 연결합니다.

⑥ 왼쪽 가로등 2개와 오른쪽 가로등 2개의 선들을
각각 라벨지로 묶어 표시해 줍니다.

총 4개를 만들어 주세요.

- 57 -

- 58 -

○ 배선 연결

○ 5V릴레이-점퍼선 연결

아두이노

브레드보드

가로등

디지털 핀 5

릴레이
첫 번째 나사구멍

(+)

①

5V릴레이

모듈,

수/수

점퍼선

10cm(1개)

20cm(1개), 암/수 점퍼선 10cm(2개) 20cm(1개)
*릴레이 모듈은 가로등의 전원을 제어하기 위해 사
용합니다.

③ 나사를 조절하여 수/수 점퍼선을 연결한 사진입
니다.

커넥터

5V

(+)

GND

(-)

IN
VCC, 두 번째
나사구멍

(-) : 커넥터연결

(-)

(-)

② 드라이버를 사용해 나사를 조절하여 점퍼선 핀을
꽂을 공간을 만들고 꽂은 다음 다시 나사를 조여
고정해주세요.

④ 암/수 점퍼선을 연결한 사진입니다.

<가로등&릴레이 배선 연결도>
① 그림과 같이 5v릴레이 오른쪽의 전원 핀(VCC, GND)을 브레드보드의 (+),(-) 버스에 연결합니다.
② 그림과 같이 5v릴레이 IN을 브레드보드에 연결합니다.
③ 그림과 같이 5v릴레이 왼쪽의 짧은 점퍼선을 브레드보드의 (+)버스에 연결하고 긴 점퍼선을 아두이노의
5번 핀에 연결합니다.
④ 그림과 같이 가로등의 흰색 선(+)은 브레드보드에 연결된 릴레이의 IN핀과 연결합니다. 커넥터의
20cm 수/수 점퍼선을 브레드보드의 (-)버스에 연결합니다.
*배선 연결이 바르게 되었는지 꼭 확인해주세요.
*아두이노 보드와 브레드보드의 전원 연결과 전원 버스 확장은 <아두이노 우노(Uno)보드 & 브레드보드
(빵판) 연결> 과정을 참고하세요.

- 59 -

- 60 -

5. 크레인 조립 & 동작 테스트

○ 동작 테스트 소스
○ 크레인 건물(3번) 접기

/* 5V 릴레이 사용하여 가로등 on/off 동작 테스트 소스 */
int streetLightPin = 5;

② 3-1, 3-2를 접어주세요. 3-2는 날개를 접을 때

void setup() {
pinMode(streetLightPin, OUTPUT);

① 도면에서 3-1, 3-2, 3-3, 3-4, 3-5 총 5개 건물

사진과 같이 바깥쪽으로 접어주세요. 접은 다음 테

을 찢어지지 않게 주의하며 손으로 뜯어 주세요.

이프로 감아주면 더욱 단단하게 고정할 수 있습니
다.

}
void loop() {
digitalWrite(streetLightPin, LOW); // 가로등 ON
delay(2000);
digitalWrite(streetLightPin, HIGH); // 가로등 OFF
delay(2000);
}

③ 3-2의 작은 구멍으로 서보모터의 선을 통과시키
기고 감싸주세요.
Ÿ

세요.

*옆면을 테이프고 감싸주시면 편리해요.

5v 릴레이 모듈

④ 사진과 같이 위치에 맞춰 3-1 아래에서 붙여주

=> 릴레이(Relay)란 전류가 흐르면 자력이 발생하여 스위치가 닫힌 상태가 되고 전류가 흐르지 않으면 자
력이 없어져 스위치가 열린 상태가 되는 원리를 이용한 모듈입니다. 따라서 적은 양의 전력으로 큰 전력
을 제어하거나 하나의 신호로 다수의 전원을 제어할 수 있습니다.

=> 사용할 릴레이 모듈은 Low-Trigger이므로 사용 시 기존의 디지털 신호(HIGH, LOW)가 반대가 됩니
다. 예를 들어 HIGH신호를 주면 LED가 꺼지고 LOW신호를 주면 LED가 켜집니다.

⑤ 서보모터에 십자가 모양의 하얀 플라스틱 날개를
끼워주고 같이 들어있던 끝이 뾰족하지 않은 작은
나사로 고정시켜 줍니다.

⑥ 날개에 풀을 많이 발라 줍니다.

*날개의 앞뒤를 구분하여 서보모터에 끼워 줍니다.

- 61 -

- 62 -

○ 크레인-박스 연결

⑦ 3-3을 접어 풀칠한 날개 위에 붙여주세요.

⑨ 3-4위에 3-5를 접어 붙여주세요.

⑧ 3-3 위에 3-4를 접어 붙여주세요.
① 위의 사진과 같이 표시된 위치에 크레인을 배치

② 서보모터에 연결된 줄을 일자 홈에 끼워 줍니다.

하세요.

*서보모터 선 => 갈색-GND, 빨강-VCC, 주황-OUT

⑩ 크레인 완성
④ 선의 끝에 10cm수/수 점퍼선을 끼워 연장해주
③ 건물에 달린 지지대를 양쪽의 일자 홈에 끼우고

세요.

안쪽으로 접은 다음 테이프로 고정시켜줍니다.

*서보모터 선 => 갈색-GND, 빨강-VCC, 주황-OUT
센서의 OUT, GND, VCC와 연결했던 선을 기억하
세요.

* 남은 지지대는 건물 안쪽으로 접어주세요.

⑤ 연장된 선을 사진과 같이 선 정리대의 갈고리에
끼워 고정시켜 주세요.

- 63 -

- 64 -

○ 배선연결

○ 동작 테스트 소스

아두이노

SERVO모터 선

디지털 핀 6

주황색

5V

빨간색

GND

갈색

/* 크레인 동작 테스트 소스 */
#include 
int servoPin = 6;
Servo myservo;
int pos = 0;
void setup() {
myservo.attach(servoPin);
}
void loop() {
for (pos = 0; pos <= 90; pos += 10) {
myservo.write(pos);
delay(30);
}
delay(3000);
for (pos = 90; pos >= 0; pos -= 10) {
myservo.write(pos);

<서보모터 배선 연결도>

delay(30);
}
delay(3000);

① 10cm 암/수 점퍼선 3개를 준비합니다. 서보모터 선의 길이를 준비한 점퍼선으로 연장해줍니다.

}

② 다음과 같이 연결합니다.
-> 서보모터 갈색(GND)선 ­ 브레드보드 (-)버스
-> 서보모터 빨강(VCC)선 ­ 브레드보드 (+)버스
-> 서보모터 주황(OUT)선 ­ 아두이노 6번 핀
*배선 연결이 바르게 되었는지 꼭 확인해주세요.
*아두이노 보드와 브레드보드의 전원 연결과 전원 버스 확장은 <아두이노 우노(Uno)보드 & 브레드보드
(빵판) 연결> 과정을 참고하세요.

- 65 -

- 66 -

6. 건물 조립 & 동작 테스트

○ 조도센서 건물 박스고정

○ 조도센서 건물(5번) 접기

② 센서에 연결된 3줄의 선을 하나씩 구멍을 통해
① 도면에서 5-1번 건물과 5-S 센서 건물을 찢어지
지 않게 주의하며 손으로 뜯어 주세요.

② 조도센서를 5-S로 감싸 풀로 붙여주세요.

① 위의 사진과 같이 표시된 위치에 조도센서 건물을

뚜껑 아래로 빼주세요.

*센서 바닥면의 튀어나온 핀의 길이가 달라 종이가

배치하세요.

* 센서의 AO, GND, VCC와 연결했던 선을 기억하
세요.

헐렁하거나 모자를 수 있습니다.

③ 건물에 달린 지지대를 구멍 옆의 일자 홈에 끼워

③ 조도센서에 30cm암/수 점퍼선 3개를 한 가닥
씩 왼쪽부터 AO, GND, VCC에 연결하세요.

④ 5-1 건물을 풀을 붙여 잘 접어주세요.

* DO는 연결하지 마세요.

주세요.

④ 그 다음 겉 뚜껑 안쪽에서 접어 테이프를 이용해

* 사각형 홈에 끼울 수 없는 위치는 건물 안쪽으로

고정시켜주세요.

접어두시면 됩니다.

⑤ 5-S 글씨가 적힌 면에 풀칠을 하고 5-1의 건물
안쪽으로 윗면의 구멍에 센서가 나오도록 끼운 다음
붙여주세요.

* 센서의 AO, GND, VCC와 연결했던 선을 기억하
세요.

- 67 -

⑤ 뺀 선의 끝에 30cm암/수 점퍼선을 끼워 연장해
주세요. 센서의 OUT핀과 연결된 선은 20cm암/수
점퍼선으로 한번 더 연장해주세요.
* 센서의 AO, GND, VCC와 연결했던 선을 기억하
세요.

⑥ 연장된 선을 사진과 같이 선 정리대의 갈고리에
끼워 고정시켜 주세요.

- 68 -

○ 배선연결 및 동작 테스트

○ 적외선센서 건물(6번) 접기

아두이노

조도센서

아날로그 핀 A0

AO(AnalogOut)

5V

VCC

GND

GND
① 도면에서 6-1번 건물과 6-S 센서 건물을 찢어지
지 않게 주의하며 손으로 뜯어 주세요.

③ 적외선센서에 30cm암/수 점퍼선 3개를 한 가닥
씩 왼쪽부터 OUT, GND, VCC에 연결하세요.

② 적외선센서를 6-S로 감싸 풀로 붙여주세요.

④ 6-1 건물을 풀을 붙여 잘 접어주세요.

<조도센서 배선 연결도>

① 다음과 같이 연결합니다.
-> 조도센서 AO 점퍼선 ­ 아두이노 아날로그 핀 A0
-> 조도센서 VCC 점퍼선 ­ 브레드보드 (+)버스
-> 조도센서 GND 점퍼선 ­ 오른쪽 꽂음형 커넥터
② 동작테스트소스 -> 기초학습 ­ 조도센서 예제소스를 참고하세요. (34p)

⑤ 6-S 글씨가 적힌 면에 풀칠을 하고 6-1의 건물
안쪽으로 옆면의 구멍에 센서가 나오도록 끼운 다음
붙여주세요.

*배선 연결이 바르게 되었는지 꼭 확인해주세요.

* 센서의 OUT, GND, VCC와 연결했던 선을 기억
하세요.

*아두이노 보드와 브레드보드의 전원 연결과 전원 버스 확장은 <아두이노 우노(Uno)보드 & 브레드보드
(빵판) 연결> 과정을 참고하세요.

- 69 -

- 70 -

○ 적외선센서 건물 박스고정

○ 배선연결 및 동작 테스트

아두이노

적외선센서

디지털 핀 7

OUT

5V

VCC

GND

GND

② 센서에 연결된 3줄의 선을 구멍을 통해 뚜껑
① 위의 사진과 같이 표시된 위치에 적외선센서

아래로 빼주세요.

건물을 배치하세요.

* 센서의 OUT, GND, VCC와 연결했던 선을 기억
하세요.

③ 건물에 달린 지지대를 구멍 옆의 일자 홈에 끼워
주세요.

④ 그 다음 겉 뚜껑 안쪽에서 접어 테이프를 이용해

* 사각형 홈에 끼울 수 없는 위치는 건물 안쪽으로

붙여주세요.

접어두시면 됩니다.
<적외선센서 배선 연결도>

① 다음과 같이 연결합니다.
-> 적외선센서 OUT 점퍼선 ­ 아두이노 디지털 핀 7
-> 적외선센서 VCC 점퍼선 ­ 브레드보드 (+)버스
-> 적외선센서 GND 점퍼선 ­ 왼쪽 꽂음형 커넥터
② 동작테스트소스 -> 기초학습 ­ 적외선센서 예제소스로 테스트 하면 됩니다. (45p)
⑤ 뺀 선의 끝에 20cm암/수 점퍼선을 끼워 연장해
주세요.
* 센서의 OUT, GND, VCC와 연결했던 선을 기억
하세요.

⑥ 연장된 선을 사진과 같이 선 정리대의 갈고리에
끼워 고정시켜 주세요.

- 71 -

*배선 연결이 바르게 되었는지 꼭 확인해주세요.
*아두이노 보드와 브레드보드의 전원 연결과 전원 버스 확장은 <아두이노 우노(Uno)보드 & 브레드보드
(빵판) 연결> 과정을 참고하세요.

- 72 -

○ 사운드센서 건물(12번) 접기

○ 사운드센서 건물 박스고정

① 도면에서 12-1번 건물과 12-S 센서 건물을 찢
어지지 않게 주의하며 손으로 뜯어 주세요.

② 센서에 연결된 3줄의 선을 구멍을 통해 뚜껑
② 사운드센서를 12-S로 감싸 풀로 붙여주세요.

① 위의 사진과 같이 표시된 위치에 사운드센서

아래로 빼주세요.

건물을 배치하세요.

* 센서의 OUT, GND, VCC와 연결했던 선을 기억
하세요.

③ 사운드센서에 30cm암/수 점퍼선 3개를 한 가닥
씩 왼쪽부터 OUT, GND, VCC에 연결하세요.

④ 12-1 건물을 풀을 붙여 잘 접어주세요.

③ 건물에 달린 지지대를 구멍 옆의 일자 홈에
끼워주세요.

④ 그 다음 겉 뚜껑 안쪽에서 접어 테이프를 이용해

* 사각형 홈에 끼울 수 없는 위치는 건물 안쪽으로

붙여주세요.

접어두시면 됩니다.

⑤ 12-S 글씨가 적힌 면에 풀칠을 하고 12-1의 건
물 안쪽으로 윗면의 구멍에 센서가 나오도록 끼운
다음 붙여주세요.

* 센서의 OUT, GND, VCC와 연결했던 선을 기억
하세요.

- 73 -

⑤ 뺀 선의 끝에 20cm암/수 점퍼선을 끼워 연장해
주세요.
* 센서의 OUT, GND, VCC와 연결했던 선을 기억
하세요.

⑥ 연장된 선을 사진과 같이 선 정리대의 갈고리에
끼워 고정시켜 주세요.

- 74 -

○ 배선연결 및 동작 테스트

○ 일반건물 접기 (완성 사진)

아두이노

사운드센서

아날로그 핀 A1

OUT

5V

VCC

GND

GND

1번 건물

2번 건물

4번 건물

7번 건물

8번 건물

9번 건물

<사운드센서 배선 연결도>

① 다음과 같이 연결합니다.
-> 사운드센서 OUT 점퍼선 ­ 아두이노 아날로그 핀 A1
-> 사운드센서 VCC 점퍼선 ­ 브레드보드 (+)버스
-> 사운드센서 GND 점퍼선 ­ 오른쪽 꽂음형 커넥터
④ 동작테스트소스 -> 기초학습 ­ 사운드센서 예제소스로 테스트 하면 됩니다. (40p)
*배선 연결이 바르게 되었는지 꼭 확인해주세요.
*아두이노 보드와 브레드보드의 전원 연결과 전원 버스 확장은 <아두이노 우노(Uno)보드 & 브레드보드
(빵판) 연결> 과정을 참고하세요.

- 75 -

- 76 -

○ 일반건물 박스고정

10번 건물

11번 건물

13번 건물

14번 건물

① 박스의 원하는 위치에 건물을 꽂아줍니다.

② 박스안쪽에서 꽂은 곳을 접고 테이프를 이용해

*LED바 불빛이 나오는 구멍위에 건물을 위치해주세

고정합니다.

요.

*다른 일반 건물들도 원하는 위치에 조립해주세요.

③ 카페도로(건물14-4)의 구멍을 모터에 끼우고
동그란 나무원판을 끼워 고정시켜주세요.
*나무원판이 종이와 닿는 면에 풀칠을 하면 헛돌

④ 사진과 같이 카페와 터널을 만들어 주세요.

지 않습니다.

⑤ 터널의 한쪽을 박스에 붙여주고 다른 한쪽을
작은 원판에 붙여 줍니다. 그 다음 카페 건물을
나무원판을 덮도록 붙여주세요.

- 77 -

⑥ 앞의 과정과 같은 방법으로 자신이 원하는 위치에
건물들을 배치해 미니시티를 만들어 주세요.

- 78 -

◇ 센서 응용

② 카페 회전 제어

1. 조도센서 응용
Ÿ

① 건물 LED 제어
Ÿ

동작 시나리오

=> 조도센서 값이 500보다 크면 카페 회전

동작 시나리오

Ÿ

스케치 소스

=> 조도센서 값이 500보다 크면 건물LED A, B, C 세 그룹의 불이 동시에 ON, 500 보다 작으면 건물
LED A, B, C 세 그룹의 불이 동시에 OFF
Ÿ

스케치 소스
/* ▣ 응용 단계 ­ 센서 활용
● 조도센서

/* ▣ 응용 단계 ­ 센서 활용

② 카페 회전 */

● 조도센서
① 건물LED ON/OFF */

#include 
int cdsPin = A0; // 조도 센서

int cdsPin = A0; // 조도센서
int buildingA = 4;

const int stepsPerRevolution = 2048;

int buildingB = 12;

Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

int buildingC = 13;

void setup() {

void setup() {

Serial.begin(9600);

Serial.begin(9600);

pinMode(cdsPin, INPUT);

pinMode(cdsPin, INPUT);

myStepper.setSpeed(14);

pinMode(buildingA, OUTPUT);

}

pinMode(buildingB, OUTPUT);
pinMode(buildingC, OUTPUT);

void loop() {

}

int cds_data = analogRead(cdsPin);
Serial.println(cds_data);

void loop() {

delay(100); // 0.1초

int cds_data = analogRead(cdsPin);
Serial.println(cds_data);

if(cds_data >= 500) {

delay(100); // 0.1초 대기

myStepper.step(stepsPerRevolution);
}

if(cds_data >= 500) {

}

digitalWrite(buildingA, HIGH);
digitalWrite(buildingB, HIGH);
digitalWrite(buildingC, HIGH);
} else {
digitalWrite(buildingA, LOW);
digitalWrite(buildingB, LOW);
digitalWrite(buildingC, LOW);
}
}

- 79 -

- 80 -

③ 가로등 제어
Ÿ

④ 크레인 회전 제어

동작 시나리오

Ÿ

=> 조도센서 값이 500보다 크면 가로등 ON. 그렇지 않으면 OFF
Ÿ

스케치 소스

동작 시나리오

=> 조도센서 값이 500보다 크면 크레인 90도 회전, 500보다 작으면 제자리로 회전
Ÿ

스케치 소스

/* ▣ 응용 단계 ­ 센서 활용
● 조도센서

/* ▣ 응용 단계 ­ 센서 활용

④ 크레인 회전 */

● 조도센서
③ 가로등 ON/OFF */

#include 

int cdsPin = A0; // 조도센서

int cdsPin = A0; // 조도센서

int streetLightPin = 5;

int servoPin = 6;
Servo myservo;

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

void setup() {

pinMode(cdsPin, INPUT);

Serial.begin(9600);

pinMode(streetLightPin, OUTPUT);

pinMode(cdsPin, INPUT);

}

myservo.attach(servoPin);
}

void loop() {
int cds_data = analogRead(cdsPin);

void loop() {

Serial.println(cds_data);

int cds_data = analogRead(cdsPin);

delay(100); // 0.1초

Serial.println(cds_data);
delay(100); // 0.1초

if(cds_data >= 500) {
digitalWrite(streetLightPin, LOW);

if(cds_data >= 500) {

} else {

myservo.write(90);

digitalWrite(streetLightPin, HIGH);

} else {

}

myservo.write(0);

}

}
}

- 81 -

- 82 -

2. 사운드센서 응용
② 카페 회전 제어
① 건물 LED 제어
Ÿ
Ÿ

동작 시나리오

=> 사운드센서 값이 500보다 크면 카페 회전

동작 시나리오

=> 사운드센서 값이 500보다 크면 건물LED A, B, C 세 그룹의 불이 3초 동안 ON, 500보다 작으면

Ÿ

스케치 소스

건물LED A, B, C 세 그룹의 모든 불이 OFF
Ÿ

스케치 소스

/* ▣ 응용 단계 ­ 센서 활용
/* ▣ 응용 단계 ­ 센서 활용

● 사운드센서

● 사운드센서

① 건물LED ON/OFF */

② 카페 회전 */

int soundPin = A1; // 사운드 센서
int buildingA = 4;

#include 

int buildingB = 12;

int soundPin = A1;

int buildingC = 13;

const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

void setup() {
void setup() {

Serial.begin(9600);
pinMode(soundPin, INPUT);

Serial.begin(9600);

pinMode(buildingA, OUTPUT);

pinMode(soundPin, INPUT);
myStepper.setSpeed(14);

pinMode(buildingB, OUTPUT);
}

pinMode(buildingC, OUTPUT);
}

void loop() {
int sound_data = analogRead(soundPin);

void loop() {
int sound_data = analogRead(soundPin);

Serial.println(sound_data);

Serial.println(sound_data);

delay(100); // 0.1초

delay(100); // 0.1초
if(sound_data >= 500) {
myStepper.step(stepsPerRevolution);

if(sound_data >= 500) {
}

digitalWrite(buildingA, HIGH);
}

digitalWrite(buildingB, HIGH);
digitalWrite(buildingC, HIGH);
delay(3000);
} else {
digitalWrite(buildingA, LOW);
digitalWrite(buildingB, LOW);
digitalWrite(buildingC, LOW);
}
}

- 83 -

- 84 -

③ 가로등 제어

Ÿ

④ 크레인 회전

Ÿ

동작 시나리오

=> 사운드센서 값이 500보다 크면 가로등 3초 동안 ON, 그렇지 않으면 OFF
Ÿ

=> 사운드센서 값이 500보다 크면 크레인 90도 회전하고 3초 후 제자리로 회전
Ÿ

스케치 소스

동작 시나리오

스케치 소스

/* ▣ 응용 단계 ­ 센서 활용

/* ▣ 응용 단계 ­ 센서 활용

● 사운드센서

● 사운드센서

④ 크레인 회전 */

③ 가로등 ON/OFF */

#include 
int soundPin = A1; // 사운드 센서
int soundPin = A1;

int streetLightPin = 5;

int servoPin = 6;
Servo myservo;

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

void setup() {

pinMode(soundPin, INPUT);

myservo.attach(servoPin);

pinMode(streetLightPin, OUTPUT);
}

}

void loop() {

void loop() {
int sound_data = analogRead(soundPin);

int sound_data = analogRead(soundPin);

Serial.println(sound_data);

Serial.println(sound_data);

delay(100);

delay(100);

if(sound_data >= 500) {

if(sound_data >= 500) {

digitalWrite(streetLightPin, LOW);

myservo.write(90);

delay(3000);

delay(3000);
myservo.write(0);

} else {

delay(3000);

digitalWrite(streetLightPin, HIGH);
}

}
}

}

- 85 -

- 86 -

3. 적외선센서 응용
② 카페 회전 제어
① 건물 LED 제어
Ÿ
Ÿ

동작 시나리오

=> 물체가 감지되면 카페 회전

=> 물체가 감지되면 건물 LED A, B, C 세 그룹 모두 ON, 감지되지 않으면 모두 OFF
Ÿ

동작 시나리오

Ÿ

스케치 소스

스케치 소스

/* ▣ 응용 단계 ­ 센서 활용
● 적외선센서

/* ▣ 응용 단계 ­ 센서 활용

① 건물LED ON/OFF */

● 적외선센서
② 카페 회전 */

int irPin = 7;
int buildingA = 4;

#include 

int buildingB = 12;

int irPin = 7;

int buildingC = 13;

const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

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

void setup() {

pinMode(irPin, INPUT);

Serial.begin(9600);

pinMode(buildingA, OUTPUT);

pinMode(irPin, INPUT);

pinMode(buildingB, OUTPUT);

myStepper.setSpeed(14);

pinMode(buildingC, OUTPUT);

}

}
void loop() {
void loop() {

int ir_data = digitalRead(irPin);

int ir_data = digitalRead(irPin);

Serial.println(ir_data);

Serial.println(ir_data);

delay(100);

delay(100);
if(ir_data == LOW) {
if(ir_data == LOW) {

myStepper.step(stepsPerRevolution);

digitalWrite(buildingA, HIGH);

}

digitalWrite(buildingB, HIGH);
digitalWrite(buildingC, HIGH);

}

} else {
digitalWrite(buildingA, LOW);
digitalWrite(buildingB, LOW);
digitalWrite(buildingC, LOW);
}
}

- 87 -

- 88 -

③ 가로등 제어

Ÿ

④ 크레인 회전 제어
Ÿ

동작 시나리오

=> 물체가 감지되면 가로등 ON, 감지되지 않으면 OFF
Ÿ

=> 물체가 감지되면 크레인 90도 회전, 감지되지 않으면 제자리로 회전
Ÿ

스케치 소스

동작 시나리오

스케치 소스

/* ▣ 응용 단계 ­ 센서 활용
● 적외선센서
/* ▣ 응용 단계 ­ 센서 활용

④ 크레인 회전 */

● 적외선센서
③ 가로등 ON/OFF */

#include 

int streetLightPin = 5;

int irPin = 7;

int irPin = 7;

int servoPin = 6;
Servo myservo;

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

void setup() {

pinMode(streetLightPin, OUTPUT);

Serial.begin(9600);

pinMode(irPin, INPUT);

pinMode(irPin, INPUT);

}

myservo.attach(servoPin);
}

void loop() {
int ir_data = digitalRead(irPin);

void loop() {

Serial.println(ir_data);

int ir_data = digitalRead(irPin);

delay(100);

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

if(ir_data == LOW) {
digitalWrite(streetLightPin, LOW);

if(ir_data == LOW) {

} else {

myservo.write(90);

digitalWrite(streetLightPin, HIGH);

} else {

}

myservo.write(0);

}

}
}

- 89 -

- 90 -

◇ 미니시티 - 독립
1. 기본 예제 소스
○ 기본 예제 소스 ①
Ÿ

동작 시나리오

[조도센서] => 어두워지면 모든 건물 LED ON -> 1초 후 가로등 ON -> 1초 후 카페 한 바퀴 회전 ->

void loop() {

1초 후 크레인 90도 회전
Ÿ

int cds_data = analogRead(cdsPin);// cdsPin의 데이터값 cds_data에 저장
if(cds_data >= 500) {

스케치 소스

lightOn();
} else {
lightOff();
/* ▣ 나만의 미니시티 만들기 ­ 기본

// cds_data가 500보다 크면
// 함수 lightOn() 실행
// cds_data가 500보다 작으면
// 함수 lightOff() 실행

}

기초 예제 소스 ① */

delay(10);
}

#include 

// 서보모터 라이브러리

#include 

// 스텝모터 라이브러리

void lightOn() {
digitalWrite(buildingA, HIGH);

// 건물A ON

// 2048은 360도를 의미, 스텝모터는 한번 동작할 때마다 360도 움직이게 된다.

digitalWrite(buildingB, HIGH);

// 건물B ON

const int stepsPerRevolution = 2048;

digitalWrite(buildingC, HIGH);

// 건물C ON

// myStepper 객체생성 & 회전각과 핀 번호 8,9,10,11 설정

delay(1000);

// 대기 1초

Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

digitalWrite(streetLightPin, LOW);

// 가로등 ON

// myservo 객체생성

delay(1000);

// 대기 1초

Servo myservo;

myStepper.step(stepsPerRevolution); // STEP모터 회전

int cdsPin = A0;

// 조도센서

int streetLightPin = 5;

// 가로등

int buildingA = 4;

// 건물 A그룹

int buildingB = 12;

// 건물 B그룹

int buildingC = 13;

// 건물 C그룹

delay(1000);

// 대기 1초

myservo.write(90);

// 서보모터 90도 회전

}
void lightOff() {

void setup() {

digitalWrite(buildingA, LOW);

// 건물A OFF

digitalWrite(buildingB, LOW);

// 건물B OFF

digitalWrite(buildingC, LOW);

// 건물C OFF

// 시리얼 통신을 위한 통신속도 설정

delay(1000);

// 대기 1초

pinMode(cdsPin, INPUT);

// cdsPin핀 입력핀 설정

digitalWrite(streetLightPin, HIGH);

// 가로등 OFF

pinMode(streetLightPin, OUTPUT);

// 가로등 출력핀 설정

delay(1000);

// 대기 1초

pinMode(buildingA, OUTPUT);

// 건물 A그룹 출력핀 설정

myservo.write(0);

// 서보모터 제자리로 회전

pinMode(buildingB, OUTPUT);

// 건물 B그룹 출력핀 설정

pinMode(buildingC, OUTPUT);

// 건물 C그룹 출력핀 설정

Serial.begin(9600);

myStepper.setSpeed(14);

// STEP모터 회전속도

myservo.attach(6);

// 6번핀 서보모터 연결설정

}

}

- 91 -

- 92 -

○ 기본 예제 소스 ②
void loop() {

동작 시나리오

Ÿ

int sound_data = analogRead(soundPin); // soundPin의 데이터값 sound_data에 저장

[사운드센서] => 소리가 감지되면 카페 두 바퀴 회전 -> 1초 후 모든 건물 LED ON -> 1초 후 모든 건물
LED OFF -> 1초 후 가로등 ON -> 1초 후 가로등 OFF -> 1초 후 크레인 90도 회전 -> 1초 후 크레인

if(sound_data >= 500) {

제자리로 회전
Ÿ

스케치 소스

/* ▣ 나만의 미니시티 만들기 ­ 기본
기초 예제 소스 ② */
#include 

// sound_data가 500보다 크면

Serial.println(sound_data);

// sound_data 값 출력

cafe();

// 함수 cafe() 실행

delay(1000);

// 1초 대기

buildingLED_ON();

// 함수 buildingLED_ON() 실행

delay(1000);

// 1초 대기

buildingLED_OFF();

// 함수 buildingLED_OFF() 실행

delay(1000);

// 1초 대기

digitalWrite(streetLightPin, LOW);

// 가로등 ON

delay(1000);

// 서보모터 라이브러리 포함

// 1초 대기

digitalWrite(streetLightPin, HIGH);

#include  // 스텝모터 라이브러리 포함

// 가로등 OFF

delay(1000);

// 1초 대기

// 2048은 360도를 의미하며 스텝모터가 한번 동작할 때마다 360도 움직이게 됩니다.

myservo.write(90);

// 서보모터 90도 회전

const int stepsPerRevolution = 2048;

delay(1000);

// 1초 대기

// myStepper 객체 생성과 회전각과 핀 번호 8,9,10,11 설정

myservo.write(0);

// 서보모터 제자리로 회전

}

Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

delay(10);

// myservo 객체 생성
}

Servo myservo;
int soundPin = A1;

// 사운드센서

int streetLightPin = 5;

// 가로등

// 카페 2바퀴 회전 함수

for(int i=0; i<2; i++) {

int buildingA = 4;

// 건물 A그룹

int buildingB = 12;

// 건물 B그룹

int buildingC = 13;

void cafe() {
myStepper.step(stepsPerRevolution);
delay(100);
}

// 건물 C그룹
}

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

// 시리얼 통신을 위한 통신속도 설정

pinMode(soundPin, INPUT);

// soundPin핀 입력 설정

pinMode(streetLightPin, OUTPUT);
pinMode(buildingA, OUTPUT);
pinMode(buildingB, OUTPUT);

void buildingLED_ON() {

// 건물 A, B, C그룹 ON

digitalWrite(buildingA, HIGH);

// 건물 A그룹 ON

// 가로등 출력핀 설정

digitalWrite(buildingB, HIGH);

// 건물 B그룹 ON

// 건물 A그룹 출력핀 설정

digitalWrite(buildingC, HIGH);

// 건물 C그룹 ON

// 건물 B그룹 출력핀 설정

pinMode(buildingC, OUTPUT);

// 건물 C그룹 출력핀 설정

myStepper.setSpeed(14);

// STEP모터 회전속도

myservo.attach(6);

// 6번핀 서보모터 연결설정

}
void buildingLED_OFF() {

}

// 건물 A, B, C그룹 OFF

digitalWrite(buildingA, LOW);

// 건물 A그룹 OFF

digitalWrite(buildingB, LOW);

// 건물 B그룹 OFF

digitalWrite(buildingC, LOW);

// 건물 C그룹 OFF

}

- 93 -

- 94 -

○ 기본 예제 소스 ③
void loop() {
Ÿ

int ir_data = digitalRead(irPin);

동작 시나리오

// irPin의 데이터값을 ir_data에 저장

if(ir_data == LOW) {

[적외선센서] => 물체가 감지되면 가로등 ON -> 1초 후 건물 LED ON -> 3초 후 건물 LED OFF -> 1초 후

// 물체 감지

가로등 OFF -> 1초 후 카페 두 바퀴 회전 -> 1초 후 크레인 90도 회전 -> 1초 후 건물 LED ON -> 3초 후 건물

digitalWrite(streetLightPin, LOW);

// 가로등 ON

LED OFF -> 1초 후 크레인 제자리로 회전

delay(1000);

// 1초 대기

Ÿ

스케치 소스

/* ▣ 나만의 미니시티 만들기 ­ 기본
기초 예제 소스 ③ */
#include 

// 서보모터 라이브러리 포함

#include  // 스텝모터 라이브러리 포함

buildingLED_ON();

// 함수 buildingLED_ON() 실행

delay(3000);

// 3초 대기

buildingLED_OFF();

// 함수 buildingLED_OFF() 실행

delay(1000);

// 1초 대기

digitalWrite(streetLightPin, HIGH);

// 가로등 OFF

delay(1000);

// 1초 대기

cafe_ON();

// 함수 cafe_ON() 실행

delay(1000);

// 1초 대기

myservo.write(90);

// 서보모터 90도 회전

delay(1000);

// 1초 대기

buildingLED_ON();

// 함수 buildingLED_ON() 실행

// 2048은 360도를 의미, 스텝모터는 한번 동작할 때마다 360도 움직이게 된다.

delay(3000);

// 3초 대기

const int stepsPerRevolution = 2048;

buildingLED_OFF();

// 함수 buildingLED_OFF() 실행

// myStepper 객체 생성과 회전각과 핀 번호 8,9,10,11 설정

delay(1000);

// 1초 대기

Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

myservo.write(0);

// 서보모터 제자리로 회전

// myservo 객체 생성

delay(1000);

// 1초 대기

Servo myservo;

}
}

int irPin = 7;

// 적외선 센서

int streetLightPin = 5;

// 가로등

int buildingA = 4;

// 건물 A그룹

digitalWrite(buildingA, HIGH);

// 건물 A그룹 ON

int buildingB = 12;

// 건물 B그룹

digitalWrite(buildingB, HIGH);

// 건물 B그룹 ON

int buildingC = 13;

// 건물 C그룹

digitalWrite(buildingC, HIGH);

// 건물 C그룹 ON

void buildingLED_ON() {

// 건물 A, B, C그룹 ON

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

// 시리얼 통신을 위한 통신속도 설정

pinMode(irPin, INPUT);

// irPin핀 입력핀 설정

digitalWrite(buildingA, LOW);

// 건물 A그룹 OFF

pinMode(streetLightPin, OUTPUT);

// 가로등

digitalWrite(buildingB, LOW);

// 건물 B그룹 OFF

digitalWrite(buildingC, LOW);

// 건물 C그룹 OFF

pinMode(buildingA, OUTPUT);

// 건물 A그룹 출력핀 설정

pinMode(buildingB, OUTPUT);

// 건물 B그룹 출력핀 설정

pinMode(buildingC, OUTPUT);

// 건물 C그룹 출력핀 설정

myStepper.setSpeed(14);

// STEP모터 회전속도

myservo.attach(6);

// 6번핀 서보모터 연결설정

void buildingLED_OFF() {

// 건물 A, B, C그룹 OFF

}
void cafe_ON() {

// 카페 2바퀴 회전 함수

for(int i=0; i<2 i++) {

}

myStepper.step(stepsPerRevolution);
}
}

- 95 -

- 96 -

2. 응용 예제 소스
void lightOn() {

○ 응용 예제 소스 ①
Ÿ

digitalWrite(buildingA, HIGH);

동작 시나리오

[조도센서] => 어두워지면 건물 A그룹 LED ON -> 2초 후 건물 B그룹 LED ON -> 2초 후 건물 C그룹
LED ON -> 2초 후 건물 LED 깜빡임 -> 5초 후 건물 LED OFF -> 2초 후 가로등 ON -> 1초 후 크레인
90도 회전 -> 1초 후 카페 한 바퀴 회전 -> 1초 후 크레인 제자리로 회전
Ÿ

스케치 소스

// 건물 A그룹 ON

delay(2000);

// 2초 대기

digitalWrite(buildingB, HIGH);

// 건물 B그룹 ON

delay(2000);

// 2초 대기

digitalWrite(buildingC, HIGH);

// 건물 C그룹 ON

delay(2000);

// 2초 대기

twinkle();

// 함수 twinkle() 실행

/* ▣ 나만의 미니시티 만들기 ­ 기본 응용 예제 소스 ① */

delay(1000);

// 1초 대기

#include 

buildingLED_OFF();

// 함수 buildingLED_OFF() 실행

#include  // 스텝모터 라이브러리 포함

delay(2000);

// 2초 대기

// 2048은 360도를 의미, 스텝모터는 한번 동작할 때마다 360도 움직이게 된다.

digitalWrite(streetLightPin, LOW);

// 가로등 ON

const int stepsPerRevolution = 2048;

delay(1000);

// 1초 대기

// myStepper 객체 생성과 회전각과 핀 번호 8,9,10,11 설정

myservo.write(90);

// 서보모터 90도 회전

Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

delay(1000);

// 1초 대기

// myservo 객체 생성

myStepper.step(stepsPerRevolution);

// STEP모터 회전

Servo myservo;

delay(1000);

// 2초 대기

myservo.write(0);

// 서보모터 제자리로 회전

// 서보모터 라이브러리 포함

int cdsPin = A0;

}

// 조도센서

int streetLightPin = 5;

// 가로등

int buildingA = 4;

// 건물 A그룹

int buildingB = 12;

// 건물 B그룹

buildingLED_ON();

int buildingC = 13;

// 건물 C그룹

delay(1000);

void twinkle() {

buildingLED_OFF();
delay(1000);

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

// 시리얼 통신을 위한 통신속도 설정

buildingLED_ON();

pinMode(cdsPin, INPUT);

// cdsPin핀 입력핀 설정

delay(1000);

pinMode(streetLightPin, OUTPUT);

// 가로등 출력핀 설정

buildingLED_OFF();

pinMode(buildingA, OUTPUT);

// 건물 A그룹 출력핀 설정

delay(1000);

pinMode(buildingB, OUTPUT);

// 건물 B그룹 출력핀 설정

pinMode(buildingC, OUTPUT);

// 건물 C그룹 출력핀 설정

myStepper.setSpeed(14);

// STEP모터 회전속도

myservo.attach(6);

// 6번핀 서보모터 연결설정

buildingLED_ON();
}
void buildingLED_ON() {

}
void loop() {
int cds_data = analogRead(cdsPin);

// cdsPin의 데이터값을 cds_data에 저장

if(cds_data >= 500) {

// cds_data가 500보다 크면

lightOn();

// 함수 lightOn() 실행

// 건물 A, B, C그룹 ON

digitalWrite(buildingA, HIGH);

// 건물 A그룹 ON

digitalWrite(buildingB, HIGH);

// 건물 B그룹 ON

digitalWrite(buildingC, HIGH);

// 건물 C그룹 ON

}
void buildingLED_OFF() {

// 건물 A, B, C그룹 OFF

}

digitalWrite(buildingA, LOW);

// 건물 A그룹 OFF

delay(10);

digitalWrite(buildingB, LOW);

// 건물 B그룹 OFF

digitalWrite(buildingC, LOW);

// 건물 C그룹 OFF

}
}

- 97 -

- 98 -

void loop() {

○ 응용 예제 소스 ②

while(i_state) {
Ÿ

// i_statee가 true인 동안 실행

동작 시나리오 - (두 개 이상의 센서를 사용할 경우 첫 번째 센서의 시나리오 진행 후 두 번째 센서

int ir_data = digitalRead(irPin);

// irPin의 데이터값을 ir_data에 저장

시나리오 진행, 동시 불가)

if(ir_data == LOW) {

// 물체 감지

[적외선센서] => 물체가 감지되면 크레인 90도 회전 -> 1초 후 크레인 180도 회전 -> 1초 후 카페 두 바퀴 회

Serial.println(ir_data);

// ir_data값 출력

전 -> 1초 후 크레인 90도 회전 -> 1초 후 크레인 제자리로 회전

myservo.write(90);

// 서보모터 90도 회전

[조도센서] => 어두워지면 가로등 ON -> 1초 후 건물 A 그룹 LED ON -> 1초 후 건물 B 그룹 LED ON -> 1초 후 건물

delay(1000);

// 1초 대기

C 그룹 LED ON -> 1초 후 모든 건물 LED OFF -> 1초 후 모든 건물 LED ON -> 1초 후 모든 건물 LED OFF -> 1초 후 가로

myservo.write(180);

// 서보모터 180도 회전

등 OFF

delay(1000);

// 1초 대기

Ÿ

스케치 소스

/* ▣ 나만의 미니시티 만들기 ­ 기본
응용 예제 소스 ② */

cafe_ON();

// 함수 cafe_ON() 실행

delay(1000);

// 1초 대기

myservo.write(90);

// 서보모터 90도 회전

delay(1000);

// 1초 대기

myservo.write(0);

// 서보모터 제자리로 회전

// 서보모터 라이브러리

i_state = false;

// i_state값 false

#include  // 스텝모터 라이브러리

c_state = true;

// c_state값 true

#include 

}
// 2048은 360도를 의미, 스텝모터는 한번 동작할 때마다 360도 움직이게 된다.

delay(100);

const int stepsPerRevolution = 2048;

}

// myStepper 객체 생성과 회전각과 핀 번호 8,9,10,11 설정
Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

while(c_state) {

// c_state가 true인 동안 실행

// myservo 객체 생성

int cds_data = analogRead(cdsPin);

// cdsPin의 데이터값을 cds_data에 저장

Servo myservo;

if(cds_data >= 500) {

// cds_data가 500보다 크면

Serial.println(cds_data);

// cds_data값 출력

// 조도센서

digitalWrite(streetLightPin, LOW);

// 가로등 ON

int irPin = 7;

// 적외선 센서

delay(1000);

// 1초 대기

int streetLightPin = 5;

// 가로등

digitalWrite(buildingA, HIGH);

// 건물 A그룹 ON

int buildingA = 4;

// 건물 A그룹

delay(1000);

// 1초 대기

int buildingB = 12;

// 건물 B그룹

digitalWrite(buildingB, HIGH);

// 건물 B그룹 ON

int buildingC = 13;

// 건물 C그룹

delay(1000);

// 1초 대기

int i_state = true;

// 적외선센서 분기 변수

digitalWrite(buildingC, HIGH);

// 건물 C그룹 ON

int c_state = false;

// 조도센서 분기 변수

delay(1000);

// 1초 대기

int cdsPin = A0;

void setup() {

buildingLED_OFF();

// 함수 buildingLED_OFF() 실행

delay(1000);

// 1초 대기

Serial.begin(9600);

// 시리얼 통신을 위한 통신속도 설정

buildingLED_ON();

// 함수 buildingLED_ON() 실행

pinMode(irPin, INPUT);

// irPin핀 입력 설정

delay(3000);

// 3초 대기

pinMode(cdsPin, INPUT);

// cdsPin핀 입력핀 설정

buildingLED_OFF();

// 함수 buildingLED_OFF() 실행

pinMode(streetLightPin, OUTPUT);

// 가로등 출력핀 설정

delay(1000);

// 1초 대기

pinMode(buildingA, OUTPUT);

// 건물 A그룹 출력핀 설정

digitalWrite(streetLightPin, HIGH);

// 가로등 OFF

pinMode(buildingB, OUTPUT);

// 건물 B그룹 출력핀 설정

c_state = false;

// c_state값 false

pinMode(buildingC, OUTPUT);

// 건물 C그룹 출력핀 설정

i_state = true;

// i_state값 true

myStepper.setSpeed(14);

// STEP모터 회전속도

myservo.attach(6);

// 6번핀 서보모터 연결설정

}
delay(100);

}

}
}
- 99 -

- 100 -

○ 응용 예제 소스 ③
Ÿ
void buildingLED_ON() {

// 건물 A, B, C그룹 ON

동작 시나리오

[사운드센서] => 첫 번째 박수 => 가로등 ON -> 2초 뒤 카페 두 바퀴 회전

digitalWrite(buildingA, HIGH);

// 건물 A그룹 ON

두 번째 박수 => 크레인 180도 회전 -> 모든 건물 LED ON

digitalWrite(buildingB, HIGH);

// 건물 B그룹 ON

세 번째 박수 => 가로등 OFF

digitalWrite(buildingC, HIGH);

// 건물 C그룹 ON

네 번째 박수 => 크레인 제자리로 회전 -> 모든 건물 LED OFF

}
Ÿ
void buildingLED_OFF() {

// 건물 A, B, C그룹 OFF

digitalWrite(buildingA, LOW);

// 건물 A그룹 OFF

digitalWrite(buildingB, LOW);

// 건물 B그룹 OFF

digitalWrite(buildingC, LOW);

// 건물 C그룹 OFF

}

스케치 소스

/* ▣ 나만의 미니시티 만들기 ­ 기본
응용 예제 소스 ③ */
#include 

// 서보모터 라이브러리

#include  // 스텝모터 라이브러리

void cafe_ON() {

// 카페 2바퀴 회전 함수

for(int i=0; i<2; i++) {

// 2048은 360도를 의미, 스텝모터는 한번 동작할 때마다 360도 움직이게 된다.
const int stepsPerRevolution = 2048;

myStepper.step(stepsPerRevolution);

// myStepper 객체 생성과 회전각과 핀 번호 8,9,10,11 설정

}

Stepper myStepper(stepsPerRevolution, 8, 10, 9,11);

}

// myservo 객체 생성
Servo myservo;
int soundPin = A1;

// 사운드센서

int streetLightPin = 5;

// 가로등

int buildingA = 4;

// 건물 A그룹

int buildingB = 12;

// 건물 B그룹

int buildingC = 13;

// 건물 C그룹

int clab_count = 0;

// 소리감지카운트

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

// 시리얼 통신을 위한 통신속도 설정

pinMode(soundPin, INPUT);

// soundPin핀 입력 설정

pinMode(streetLightPin, OUTPUT);

// 가로등 출력핀 설정

pinMode(buildingA, OUTPUT);

// 건물 A그룹 출력핀 설정

pinMode(buildingB, OUTPUT);

// 건물 B그룹 출력핀 설정

pinMode(buildingC, OUTPUT);

// 건물 C그룹 출력핀 설정

myStepper.setSpeed(14);

// STEP모터 회전속도

myservo.attach(6);

// 6번핀 서보모터 연결설정

}

- 101 -

- 102 -

◇ 미니시티 ­ 협업
void loop() {
int sound_data = 0;

// sound_data값 초기화

sound_data = analogRead(soundPin);

// soundPin의 데이터값을 sound_data에 저장

1. 협업이란?
독립적으로 동작하던 개개인의 스마트 미니시티를 각 박스 내부에 설치되어있는 아두이노간 유선으로 연결해

delay(10);

시리얼 통신을 이용하여 데이터를 주고받아 동작하는 것입니다.
if(sound_data >= 500) {

// sound_data가 500보다 크면

Serial.println(sound_data);

// sound_data값 출력

clab_count = clab_count+1;

// 소리감지시 clab_count 1씩 증가

Serial.println(clab_count);

// clab_count값 출력

if(clab_count == 1){

// clab_count 1일 때

digitalWrite(streetLightPin, LOW);

// 가로등 ON

delay(2000);

// 2초 대기

cafe_ON();

// 함수 cafe_ON() 실행

} else if(clab_count == 2){

// clab_count 2일 때

myservo.write(180);

// 서보모터 180도 회전

buildingLED_ON();

// 함수 buildingLED_ON() 실행

} else if(clab_count == 3){

// clab_count 3일 때

digitalWrite(streetLightPin, HIGH);
} else if(clab_count == 4){

// 가로등 OFF

2. 협업 방법
Ÿ

시리얼통신
시리얼 통신은 데이터 전송을 위한 선(TX) 하나와 수신을 위한 선(RX) 하나로 이루어진다. 아두이노 우노

보드에서는 0번과 1번 핀을 시리얼 통신을 위한 핀으로 사용합니다. 0번, 1번 핀은 USB to Serial 기능을
하는 칩과 연결되어 있어서 USB 케이블을 통해 아두이노에서 PC로 데이터를 전송, 수신할 수 있고, USB케
이블을 PC와 연결하지 않았을 경우에 0번, 1번 핀을 다른 기기의 시리얼 통신 포트와 연결하여 데이터를 주
고받을 수 있습니다.
- 하드웨어 시리얼(HardWare Serial)
▶ 위에서 설명한 일반적인 시리얼 통신을 하드웨어 시리얼(HardWare Serail)이라고 합니다.

// clab_count 4일 때

myservo.write(0);

// 서보모터 제자리로 회전

buildingLED_OFF();

// 함수 buildingLED_OFF() 실행

clab_count = 0;

명령어

setup() 함수 안에서 선언하면 시리얼 통신을 사용할 수 있습니다.
Serial.begin();

}
Serial.print();

}
Serial.println();
// 건물 A, B, C그룹 ON

digitalWrite(buildingA, HIGH);

// 건물 A그룹 ON

digitalWrite(buildingB, HIGH);

// 건물 B그룹 ON

digitalWrite(buildingC, HIGH);

// 건물 C그룹 ON

Serial.write();
Serial.available();
Serial.read();

}
void buildingLED_OFF() {

9600은 통신 속도를 의미하며 연결되는 장치와 통신 속도가 일치해야 합
니다.

}

void buildingLED_ON() {

설명

// 건물 A, B, C그룹 OFF

배열을 제외한 변수를 괄호 안에 넣으면 그 값을 출력해줍니다.
Serial.print(); 함수에 줄 넘김 문자를 붙여 값을 출력하고 다음 줄로 이동하는
함수입니다.
1바이트(byte), 1개의 문자, 문자열, 배열 값을 출력합니다.
아두이노 버퍼에서 데이터를 읽어오며 데이터가 없을시 ­1(false)을 반환
시리얼 통신을 통해 들어온 데이터를 읽습니다.

- 소프트웨어 시리얼(SoftWare Serial)

digitalWrite(buildingA, LOW);

// 건물 A그룹 OFF

▶ 하드웨어 시리얼 제외한 일반 입출력 핀을 RX, TX핀으로 동작할 수 있게 해주는 방법입니다. 소프트웨어

digitalWrite(buildingB, LOW);

// 건물 B그룹 OFF

시리얼(SoftWare Serial) 라이브러리는 기본적으로 제공됩니다.

digitalWrite(buildingC, LOW);

// 건물 C그룹 OFF

}

명령어

void cafe_ON() {

// 카페 2바퀴 회전 함수

#include 

for(int i=0; i<2; i++) {
myStepper.step(stepsPerRevolution);

SoftwareSerial mySerial(2,3);

}

설명
소프트웨어 시리얼(SoftWare Serial) 라이브러리를 사용하기 위해서
포함 선언을 반드시 해줘야 합니다.
mySerial.xxx()의 형태로 시리얼 함수들을 사용할 수 있습니다.
2번, 3번 핀을 이용하여 시리얼 통신을 할 수 있습니다.

}
위 라이브러리 포함선언과 RX, TX핀을 지정 선언을 해주면 하드웨어 시리얼의 명령어를 그대로 사용할 수 있습니다.

- 103 -

- 104 -

- 배선연결방법

3. 협업 시나리오 예제

▶ 각 아두이노의 RX, TX, GND를 아래 그림처럼 연결하면 A, B 아두이노는 서로 데이터를 주고받을 수 있습니다.

○ 독럽적 협업 예시

A

B

▶ 박스 간의 시리얼 통신 없이 동일한 소스를 업로드하여 각각의 박스마다 센싱을 하여 이벤트가
진행되는 구조입니다. 동일하게 동작하는 박스들을 한 곳에 모아 동시에 움직이는 것처럼 표현할
<두 아두이노간 시리얼 통신 배선 연결도>
▶ 여러 아두이노를 연결하는 방법입니다.

수 있습니다.

○ 독립적 협업 ­ 시나리오

① 조도센서

- 어두워지면
가로등 ON -> 건물 A, B, C 그룹 LED 1초 간격으로 ON

- 박수(소리감지) 카운트 횟수에 따라 이벤트 발생
② 사운드센서
<여러 아두이노 간 시리얼 통신 배선 연결도>

1. 크레인 90도 회전 후 1초 기다리고 제자리(0도)로 회전
2. 카페 3바퀴 회전
3. 가로등, 건물 LED OFF

위 그림의 구조는 A아두이노에서 TX핀으로 데이터를 전송하고 B아두이노는 RX핀으로 데이터를 받고 TX
핀으로 C아두이노로 데이터를 전송하는 구조입니다.

- 105 -

- 106 -

○ 4개 협업 예시

○ 8개 협업 예시

▶ 4개의 박스 A, B, C, D가 시리얼 통신으로 A 박스의 센서에 의해 동작이 진행됩니다. 박스들
은 점퍼선으로 RX, TX를 연결합니다. 각각의 박스는 다른 소스 프로그램을 업로드 합니다. 예를 들

▶ 2개의 박스를 연결해 하나의 블록이 됩니다. 각 블록의 하나의 박스에서 센싱을 하고 연결된 박
스에 값을 전송하여 이벤트가 발생하는 구조입니다.

어 A박스는 센싱과 데이터 전송 소스, B박스는 데이터를 받고 다시 전송하는 소스를 업로드 합니
○ 8개 박스 협업 ­ 시나리오

다.

○ 4개 박스 협업 ­ 시나리오

- 어두워지면
① 조도센서

- 어두워지면
① 조도센서

블록1 -> 블록2 -> 블고3 -> 블록4 순으로 건물 LED ON & 카페 1바퀴 회전
=> delay() 함수를 이용하여 블록간 순차적인 효과를 준다.

1. A,B,C,D -건물 A그룹 LED ON(1초)
2. A,B,C,D -건물 B그룹 LED ON(1초)
3. A,B,C,D -건물 C그룹 LED ON(1초)
- 박수(소리감지) 카운트 횟수에 따라 이벤트 발생
- 첫 번째 박수

② 사운드센서

- 두 번째 박수

1. A 크레인 180도 회전(1초)

6. D 크레인 제자리로(1초)

2. B 크레인 180도 회전(1초)

7. C 크레인 제자리로(1초)

3. C 크레인 180도 회전(1초)

8. B 크레인 제자리로(1초)

4. D 크레인 180도 회전(1초)
5, A,B,C,D 카페 1바퀴 회전

② 사운드센서

1. 모든 블록 동시에 가로등 ON
2. 블록별 순차적 크레인 회전
3. 건물 LED, 가로등 모두 OFF, 크레인 제자리로(0도) 회전

9. A 크레인 제자리로(1초)
10. 모든 건물 LED OFF

- 107 -

- 108 -



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
Linearized                      : Yes
Author                          : FrontU
Create Date                     : 2018:10:12 10:56:44+09:00
Modify Date                     : 2018:10:12 10:57:19+09:00
Language                        : ko-KR
Tagged PDF                      : No
XMP Toolkit                     : Adobe XMP Core 5.6-c015 91.163280, 2018/06/22-11:31:03
PDF Version                     : 1.4
Producer                        : Hancom PDF 1.3.0.433
Creator Tool                    : Hancom PDF 1.3.0.433
Metadata Date                   : 2018:10:12 10:57:19+09:00
Format                          : application/pdf
Creator                         : FrontU
Date                            : 2018:10:12 10:56:44+09:00
Document ID                     : EE64CDCD-ADEE-4719-81AD-9232781141EC
Instance ID                     : uuid:05aa21f0-e765-48bd-b861-94df97126b88
Page Layout                     : SinglePage
Page Count                      : 54
EXIF Metadata provided by EXIF.tools

Navigation menu