• 검색 결과가 없습니다.

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
235
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

v3.0

김영준 저

공학박사, 목원대학교 겸임교수 前 Microsoft 수석연구원

헬로앱스

http://www.helloapps.co.kr

(2)

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

(3)

- 3 -

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

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

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

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

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

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

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

학습 목표

실습 개요

(4)

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

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

준비물

(5)

- 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로 분리되어 있던 아두이노 상표권 문제는 결국 마무리 되었 다.

아두이노 탄생 배경

(6)

◾ 구글 검색에서 Arduino라는 단어로 검색을 하면 아래의 사진에 있는 제품 이 가장 많이 표시되는 것을 볼 수 있다. 이 제품은 수 많은 아두이노 지 원 보드 제품 중에서 가장 많이 알려져 있는 아두이노 우노 (Arduino Uno) 제품으로서, 단지 아두이노 지원 보드 중에서 가장 보편적인 보드일 뿐 아두이노 그 자체를 정의하는 것이 아니다.

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

아두이노에 대한 오해

(7)

- 7 -

◾ 그렇다면, 아두이노의 정체는 무엇일까? 아두이노는 크게 3가지 종류의 구 성 요소로 이루어져 있으나, 핵심은 SW 라이브러리를 의미한다.

구성 요소 설명

SW 라이브러리

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

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

개발 툴 (IDE)

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

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

하드웨어 보드

� 아두이노 우노 보드와 같은 아두이노 라 이브러리를 지원하는 하드웨어 보드를 의 미한다.

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

아두이노의 구성 요소

(8)

◾ 아두이노 보드와 라즈베리파이 보드는 일반인이 보기에 비슷한 것처럼 보 이지만 아주 큰 차이점을 가진다.

◾ 라즈베리파이는 컴퓨터로 분류되지만 아두이노는 컴퓨터가 아닌 마이크로 컨트롤러 (일명 마이컴 이라 부름)로 분류되기 때문이다.

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

아두이노 라즈베리파이

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

� OS가 없으며, 메모리에 저장된 하나의 프로그램이 바로 실행된

다.

� 키보드나 마우스 같은 입출력 장치를 연결할 수 없다.

� 비전문가를 위한 임베디드 장치 개발용으로 만들어 졌다.

� 임베디드 기반 창작 작품이나 C언어 교육용으로 활용된다.

� 컴퓨터이다.

� OS(리눅스, Windows 10)를 설치할 수 있다.

� 키보드나 마우스 같은 입출력 장치가 연결된다.

� 개발도상국에 저렴한 비용의 컴퓨터를 보급하기 위해 만들어 졌다.

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

주로 활용되고 있다.

(9)

- 9 -

◾ 기업 형태의 변화 (직장 형태 및 직장에서의 역할의 변화) 4차 혁명시대를 대비한 아두이노 활용 직무훈련의 필요성

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

� 많은 인원이 모여 규모화된 기업 활동

� 역할 전문화 및 세분화

� 개인 또는 소수인원의 네트워크화

� 개인이 개발의 전과정 역량 보유 요구

� 기획/설계/개발/테스트/생산 전과정에 대한 프로젝트형 체험 및 실습 필요

� 시장의 요구에 민첩하게 대응할 수 있는 훈련 및 생산 역량 필요

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

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

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

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

(10)

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

◾ 아두이노 코딩을 하기 위해서는 아두이노 라이브러리를 사용할 수 있는 개 발 환경이 필요하다.

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

◾ C언어로 라이브러리가 작성되어 있긴 하지만 여전히 일반인이 사용하기에 는 어려운 문제점이 있으며, 이를 해소하기 위해 다양한 보완 툴들이 계속 만들어지고 공급되고 있다.

코딩 SW의 종류

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

헬로앱스에서 배포하는

초보자용 코딩 SW 툴

(11)

- 11 -

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

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

초보자용 코딩 SW 설치

� 무료

� C/C++ 언어로만 개발

� 코드 공유 기능 없음

� 유료 (무료 체험판 사용 가능)

� 블록/스크립트/C언어/C++언어 지원

� 사용자 수준별로 언어 선택 가능

� 블록이나 스크립트 코딩시 실시간 C언어 생성 기능 지능

� 교사와 학생간 코드 공유기능 지 원

� 아두이노 시뮬레이터 기능 지원 아두이노 공식 홈페이지에서

배포하는 IDE 툴

헬로앱스에서 배포하는

초보자용 코딩 SW 툴

(12)

◾ 아래의 페이지에서 오른쪽에 있는 다운로드 아이콘을 클릭하여 최종 버전 의 아두이노 코딩 SW를 다운로드 받는다.

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

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

(13)

- 13 -

◾ 모든 아두이노 보드들은 컴퓨터에 연결하기 전에 반드시 USB 드라이버가 설치되어 있어야 하며, 매번 설치할 필요 없이 맨 처음 한번만 설치해 주 면 된다.

◾ 초보자용 코딩 SW가 설치되고 나면, 바탕 화면에 SPL 폴더가 만들어 진 다. SPL 폴더에서 맨 아래에 있는 『아두이노 우노 보드 USB 드라이버 (64bit)』 파일을 클릭하여 설치를 진행한다. 만약 컴퓨터의 OS가 32비트라 면 오류가 발생할 것이다. 이 경우에는 『아두이노 우노 보드 USB 드라이 버 (32bit)』 파일을 클릭하여 설치를 진행해 주면 된다.

USB 드라이버 설치 전에 아두이노 보드를 컴퓨터에 연결하면 않된다. 반드 시 USB 드라이버를 먼저 설치한 후에 아두이노 보드를 컴퓨터에 연결해 주 어야 설치 작업이 마무리 될 수 있다.

USB 드라이버 설치

※ 주의 사항

(14)

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

◾ 아두이노 보드가 컴퓨터에 맨 처음 연결되는 순간, 컴퓨터에서 남아 있는 USB 드라이버 설치 작업이 자동으로 진행되며, 10초 ~ 20초 정도 시간이 지나면 설치 작업이 마무리 된다.

USB 드라이버를 컴퓨터에 연결한 후, 진행되는 USB 드라이버 설치 마무리 작업은 따로 눈에 보이지 않는다. 설치 작업이 끝나면 조그만 팝업창으로 준비되었다는 메시지 창이 보일 수도 있고 그렇지 않을 수도 있기 때문에, USB 케이블 연결 후, 잠시 기다렸다가 프로그램을 실행시켜 주어야 한다.

아두이노 보드 연결하기

※ 주의 사항

(15)

- 15 -

◾ 아두이노 USB 설치 및 케이블 연결 작업이 끝나고 나면, 이제 아두이노용 코딩 SW를 실행시켜 보자. 바탕화면의 SPL 폴더를 살펴보면 『SPL for 아두이노』 항목이 보일 것이다. 이 항목을 클릭하여 프로그램을 실행시킨 다.

◾ 제품키를 입력하는 창이 표시되면 제품키를 입력하고 제품 활성화 버튼을 클릭한다.

코딩 SW 실행하기

(16)

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

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

(17)

- 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 }

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

(18)

◾ 아두이노 보드가 Arduino Uno로 선택되어 있는 지 반드시 확인한다. 보 드 종류가 다르면 프로그램이 아우이노 보드로 정상적으로 업로드 되지 않 는다.

◾ COM 포트를 눌러서 COM 포트에 여러 포트들이 표시될 경우, 맨 마지막 에 있는 포트가 선택되어 있는 지 확인한다. 만약 아두이노 프로그램 업로 드시 아두이노 보드에 정상적으로 업로드가 되지 않는 다면, COM 포트를 다른 포트로 변경해 보기 바란다.

◾ 프로그램을 새로 작성하거나 기존 프로그램을 불러올 경우, 코드의 내용을 블록 또는 스크립트 (C언어 포함) 모드로 열어서 보거나 편집할 수 있다.

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

※ 주의 사항

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

(19)

- 19 -

◾ 아두이노 개발 환경은 실질적으로 C언어이다. 사용자가 블록 코딩이나 스 크립트 형태로 개발하든 결과물은 반드시 C언어로 변환된 후, 컴파일되어 야 한다. SPL 코딩 SW는 블록 코딩이나 스크립트로 개발된 코드를 자동 으로 C언어로 변환을 시킨다.

◾ 개발된 C언어는 컴파일 과정을 거쳐 바이너리 파일 (HEX 파일)로 생성되 며, 이 파일을 아두이노 보드에 업로드 시키면 아두이노 보드에서 실행되 게 된다.

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

프로그램 실행하기

(20)

◾ 아두이노 코딩 툴의 상단 메뉴에서 실행 버튼을 클릭한 후, 다음과 같이 콘 솔창이 뜨면서 조금 기다리면, 많은 라인의 결과들이 화면에 표시된다.

◾ 콘솔창이 표시된 후, 콘솔창 내부에 위와 같이 메시지가 표시되지 않고 다 르게 표시된다면, 업로드가 진행되지 못한 경우이다.

◾ 업로드 실패 원인 1 – 스크립트 오류 발생) 작성한 프로그램에 오류가 있 는 경우에는 위와 달리 error: 라는 단어가 표시된 문자열이 표시된다. 콘 솔창의 메시지에 error: 표시가 있다면 프로그램에 오류가 있는 경우이므 로 반드시 오류를 수정한 후, 업로드 하기 바란다.

업로드 결과 확인하기

※ 주의 사항

(21)

- 21 -

◾ 업로드 실패 원인 2 – 아두이노 보드 미연결) “아두아노 보드가 연결되지 않았습니다”라고 메시지가 뜨는 경우는 해당 컴포트를 인식하지 못하였거 나 실제로 아두이노 보드와 컴퓨터가 연결되지 않은 경우이다. USB 케이 블을 연결하거나 케이블을 뺐다가 다시 연결한 후, 업로드를 실행해 보기 바란다.

◾ 업로드 실패 원인 3 – 아두이노 보드 선택 오류) 콘솔창에서 오랜 시간이 경과된 후, 메시지가 표시되는 경우인데, 아두이노 보드를 다른 종류로 선 택하여 실행을 한 경우이다. 아두이노 보드 종류가 Arduino Uno로 되어 있는 지 다시 한번 확인해 보기 바란다.

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

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

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

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

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

(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 다운로드

(23)

- 23 -

◾ Arduino IDE 다운로드 화면에서 두 번째 항목인 “Windows ZIP file for non admin install” 항목을 클릭한다.

◾ Windows용 설치 파일의 비교

Windows Installer � USB 드라이버 까지 자동으로 설치해 준다.

� PC에 관리자 권한이 있는 경우에만 설치 가능

Windows ZIP file for non admin install

� 설치 과정없이 압축을 아무 폴더에나 풀기만 하면 실행 가능

� USB 드라이버를 따로 설치해 주어야 한다.

� PC에 관리자 권한이 없어도 설치가 가능하다.

(24)

◾ JUST DOWNLOAD 링크를 클릭한다.

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

나 지정한다.

(25)

- 25 -

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

◾ 다운로드 받은 zip 파일을 더블클릭하지 말고, 반드시 압축을 푼 후에 압축 이 풀린 폴더로 이동하여 프로그램을 실행해야 한다. 압축을 풀지 않고 zip 파일을 더블 클릭하는 경우에도 zip 파일의 내용이 폴더에 보이게 되 는데, 사용자가 이 상태에서 아두이노 편집기 파일을 실행하게 되면 정상 적으로 실행되지 않는다.

◾ USB 드라이버를 설치하기 전에는 아두이노 보드를 아직 PC에 연결시키지 말고 분리시켜 놓는다.

※ 주의 사항

(26)

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

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

USB 드라이버 설치

(27)

- 27 -

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

◾ 아두이노 보드가 컴퓨터에 맨 처음 연결되는 순간, 컴퓨터에서 남아 있는 USB 드라이버 설치 작업이 자동으로 진행되며, 10초 ~ 20초 정도 시간이 지나면 설치 작업이 마무리 된다.

USB 드라이버를 컴퓨터에 연결한 후, 진행되는 USB 드라이버 설치 마무리 작업은 따로 눈에 보이지 않는다. 설치 작업이 끝나면 조그만 팝업창으로 준비되었다는 메시지 창이 보일 수도 있고 그렇지 않을 수도 있기 때문에, USB 케이블 연결 후, 잠시 기다렸다가 프로그램을 실행시켜 주어야 한다.

아두이노 보드 연결하기

※ 주의 사항

(28)

◾ 이전 폴더로 돌아가면 아두이노 압축이 풀린 폴더에 arduino.exe 라는 실 행 파일을 볼 수 있을 것이다. 이 exe 파일을 실행한다.

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

프로그램 실행하기

(29)

- 29 -

◾ 포트를 선택한다. 포트가 여러 개인 경우, 마지막 포트를 선택하거나 Arduio라고 표시된 포트를 선택한다.

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

예제 실행하기

(30)

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

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

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

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

된다.

(31)

- 29 -

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

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

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

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

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

학습 목표

02 LED 점멸하기

실습 개요

(32)

2.1 아두이노 쉴드 및 핀 정보

◾ 아두이노 보드 위에 적층식으로 쌓아 나가는 전자회로 모듈을 쉴드(Shield) 라고 부른다. 보통 기능이 복잡하거나 연결되는 핀 수가 많은 모듈을 별도 로 쉴드로 개발하는 경우가 많다.

◾ 브레드보드가 필요없는 올인원 쉴드 (All-In-One Shield)는 센서 연결시 브레드보드 없이 3핀 또는 4핀으로 되어 있는 모듈을 바로 아두이노에 연 결할 수 있도록 도와주는 보드로서, 아두이노 작품 개발시 시간을 단축시 켜 주고 아두이노의 편리성을 최대한 활용하는 보드이다.

아두이노 쉴드

(33)

- 31 -

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

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

디지털 핀번호 (14개) 아날로그 핀번호 (6개)

D0 ~ D13 A0 ~ A5

아두이노 핀 정보

(34)

◾ 디지털 핀들은 GND (검정), 5V (빨강), Data 선 (초록) 등 3개의 핀으로 구성되어 있으며, 부품을 연결할 때 방향을 맞추어 연결해 주어야 한다.

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

◾ 디지털 0번 (Rx)과 1번(Tx)은 시리얼 통신에 사용되기 때문에 실제로 D2부 터 부품을 연결할 수 있다.

핀정보 케이블 색상

GND 검정

5V 빨강

Data 초록

디지털 핀

(35)

- 33 -

◾ 아날로그 핀들은 GND (검정), 5V (빨강), Data 선 (파랑) 등 3개의 핀으로 구성되어 있으며, 부품을 연결할 때 방향을 맞추어 연결해 주어야 한다.

◾ 아날로그 4번(A4)과 아날로그 5번(A5)은 I2C와 같은 다른 용도로도 사용되 기 때문에 아날로그 부품을 연결할 때에는 A0부터 연결한다.

아두이노 아날로그 핀

핀정보 케이블 색상

GND 검정

5V 빨강

Data 파랑

(36)

2.2 준비하기

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

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

디지털 LED 소자

준비물

(37)

- 35 -

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

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

H/W 연결하기

※ 주의 사항

(38)

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번 핀의 값을 켬

※ 주의 사항

디지털 쓰기 명령어

(39)

- 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 소자 켜기

실습

(40)

※ 참고자료) 상수와 변수

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

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

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)

(41)

- 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와 같이 논리형 값을 저장한다.

(42)

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

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

실습

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

◾ 앞에서 제시된 예제에서 스크립트와 C언어를 비교해 봄으로써 C언어 사 용시 어떠한 특징들이 있는 지 살펴 보자.

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

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

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

DigitalWrite(13, HIGH) Delay(1000)

digitalWrite(13, HIGH);

delay(1000);

자료형 사례

int int a = 255;

float float a = 123.56;

byte byte a = 25;

char char c = ‘A’;

String String s = “Hello”;

boolean boolean b = true;

(43)

- 41 -

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

◾ 모든 스크립트 코딩에서 변수나 함수 등의 이름을 부여할 때 크게 4가 지 표기법 중에 한가지를 따른다.

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

◾ 변수나 함수 이름이 표기법은 정답이 있는 것은 아니고 개발자의 취향에 따라서 달라지며, 자신이 이해하기 쉬운 표기법을 정해서 프로그램 전 체적으로 일관되게 적용하기만 하면 된다.

변수 및 함수 표기법 설명

헝가리안 표기법

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

예) int iNum = 10;

파스칼 표기법

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

예) DigitalWrite(13, HIGH)

카멜 표기법

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

예) digtalWrite(13, HIGH)

언더바 표기법

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

예) digital_write(13, HIGH)

(44)

2.5 LED 점멸시키기

◾ 디지털 LED 소자를 점멸시키기 위한 코드는 아래와 같다. 프로그램을 작성 한 후 LED 점멸 상태를 확인해 보기 바란다.

▶ LED의 점멸 주기를 각각 500밀리초, 100밀리초, 50밀리초, 20밀리초 등으 로 수정하여 점멸되는 결과를 확인해 본다.

SPL 스크립트 스케치 코드

void setup() {

}

void loop() {

//디지털 13번 핀에 연결된 LED를 켠다.

DigitalWrite(13, HIGH )

//1초간 기다린다.

Delay(1000)

//디지털 13번 핀에 연결된 LED를 끈다.

DigitalWrite(13, LOW )

//1초간 기다린다.

Delay(1000) }

void setup() {

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

}

void loop() {

//디지털 13번 핀에 연결된 LED를 켠다.

digitalWrite(13, HIGH );

//1초간 기다린다.

delay(1000);

//디지털 13번 핀에 연결된 LED를 끈다.

digitalWrite(13, LOW );

//1초간 기다린다.

delay(1000);

}

실습

LED 소자 점멸시키기

(45)

- 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() {

}

(46)

◾ 위의 main 함수를 살펴보면 setup() 함수의 내용이 먼저 실행되고, 그 다 음으로는 loop() 함수만 계속 실행된다.

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

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

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

(47)

- 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() {

digitalWrite(13, HIGH);

delay(3000);

digitalWrite(13, LOW);

}

void loop() {

}

(48)

◾ setup() 함수에 코드를 추가하게 되면 한번만 실행되게 된다. setup() 함수 에 있는 명령어들을 다시 실행시키려면 아두이노 보드에 업로드된 프로그 램을 처음부터 다시 실행시켜야 주어야 하는데, 이렇게 아두이노 프로그램 을 처음부터 다시 실행하기 위해서는 아두이노 보드를 리셋시켜 주면 된 다. 아래 그림과 같이 아날로그 핀 옆에 있는 리셋 스위치를 눌러서 아두 이노 프로그램이 처음부터 다시 실행되는 지 확인해 보기 바란다.

▶ 앞의 활동에서 작성한 코드 중에서 직접 값을 사용하지 않고 상수로 선언 하여 사용할 수 있는 부분이 어느 부분이 있는 지 생각해 보고 상수를 정의 하여 프로그램을 수정해 본다.

실습

(49)

- 47 -

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

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

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

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

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

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

학습 목표

03 절전기능 LED 후레쉬

실습 개요

(50)

3.1 준비하기

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

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

디지털 LED 소자 디지털 버튼

준비물

(51)

- 49 -

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

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

H/W 연결하기

(52)

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);

}

(53)

- 51 -

※ Print 명령어는 같은 줄에 값을 이어서 출력하고 PrintLine 명령어는 값을 출력한 후, 줄을 바꾸게 된다. PrintLine 명령어를 사용해야할 곳에 Print 명령어를 사용하지 않도록 주의를 기울인다.

※ Print 명령어 또는 PrintLine 명령어를 코드에 사용할 경우에는 반드시 100밀리초 이상의 값을 가지는 delay 명령이 반드시 사용되어야 한다. 만 약 delay 명령어 없이 Print나 PrintLine 명령어를 사용하게 되면 엄청난 크기의 데이터가 PC로 전달되어 PC의 시리얼 포트가 다운되는 문제가 발 생한다.

※ PC의 시리얼 포트가 다운되면 아두이노 프로그램 업로드가 실패하는 상황 이 발생한다. 이 경우에는 일단 아두이노 보드의 USB 케이블을 제거한 후, 아두이노 코딩 SW를 종료한다. 그 다음, 아두이노 보드를 PC에 연결한 후 코딩 SW를 다시 실행한 후, 프로그램에 delay(100) 명령어를 추가한 다음 업로드하면 프로그램이 정상적으로 업로드 될 수 있다.

※ 주의 사항

(54)

◾ Print 명령어와 PrintLine 명령어를 조합하여 사용하면 화면에 필요한 정 보를 보기 좋게 생성하여 표시할 수 있다. Print 명령어는 값을 옆으로 이 어서 출력하는 기능이 있으므로, 구구단의 문자열을 프로그램으로 생성하 여 표시할 수 있다.

구구단 출력하기

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() {

}

(55)

- 53 -

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

실습

SPL 스크립트 스케치 코드

void setup() {

for (i = 1; i < 10; i++) {

for (j = 1; i < 10; j++) {

Print(i) Print(“ x ”) Print(j) Print(“ = ”) PrintLine(i * j) }

} }

void loop() {

}

void setup() {

Serial.begin(115200);

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

for (int j = 1; i < 10; j++) {

Serial.print(i);

Serial.print(“ x ”);

Serial.print(j);

Serial.print(“ = ”);

Serial.println(i * j);

} } }

void loop() {

}

(56)

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

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

변수 = DigitalRead(핀번호)

◾ DigitalRead() 함수로 읽은 값은 정수형 변수에 저장되며, 값은 0 (LOW) 또는 1 (HIGH) 중에 하나가 된다.

DigitalRead

SPL 스크립트 스케치 코드

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

(57)

- 55 -

◾ 디지털 2번 핀에 연결되어 있는 디지털 버튼의 값을 읽어 와서 화면에 출 력하는 코드이다. 핀 번호와 변수 이름을 확인한 후 아래의 코드를 작성해 본다.

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

디지털 버튼값 출력하기

SPL 스크립트 스케치 코드

void setup() {

}

void loop() {

d2 = DigitalRead( 2 ) PrintLine(d2)

Delay(100) }

void setup() {

pinMode(2, INPUT);

Serial.begin(115200);

}

void loop() {

int d2 = digitalRead( 2 );

Serial.println(d2);

delay(100);

}

(58)

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”) }

(59)

- 57 -

◾ 버튼의 상태를 0.1초 간격으로 읽어와서 버튼의 상태가 HIGH이면 13번 LED를 켜고 그렇지 않으면 13번 LED를 끄는 코드를 작성해 보자.

◾ 아래의 예제에서 if 조건문에 유의하여 코드를 작성해 본다.

if 조건문으로 LED 켜기

SPL 스크립트 스케치 코드

void setup() {

}

void loop() {

d2 = DigitalRead(2)

if ( d2 == HIGH ) {

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 == HIGH ) {

digitalWrite(13, HIGH);

} else {

digitalWrite(13, LOW);

}

delay(100);

}

(60)

◾ if 블록의 ‘{’ 와 ‘}’은 해당 괄호 영역안에 명령어가 한 줄만 있는 경우에는 생략이 가능하다. 위의 예제에서 if 블록 안에 명령어가 한 줄 씩만 있기 때문에 다음과 같이 ‘{’ 와 ‘}’가 생략이 가능하다. 하지만 if 블록안에 명령 어가 두 줄 이상이 있는 경우에는 생략할 수 없다.

참고자료

SPL 스크립트 스케치 코드

void setup() {

}

void loop() {

d2 = DigitalRead(2)

if ( d2 == HIGH )

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 == HIGH )

digitalWrite(13, HIGH);

else

digitalWrite(13, LOW);

delay(100);

}

(61)

- 59 -

◾ 버튼으로 LED를 켜는 기능은 다음과 같이 2줄의 명령으로도 실행이 가능 하다.

응용하기

SPL 스크립트 스케치 코드

void setup() {

}

void loop() {

d2 = DigitalRead(2) DigitalWrite(13, d2) }

void setup() {

pinMode(2, INPUT);

pinMode(13, OUTPUT);

}

void loop() {

int d2 = digitalRead(2);

digitalWrite(13, d2);

}

(62)

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);

}

(63)

- 61 -

3.6 절전기능 후레쉬 만들기

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

◾ LED를 버튼을 누르고 있는 시간에 비례하여 켜지도록 기능을 구현하려고 한다. 예를 들어 버튼을 1초간 누르고 있으면 LED는 5초간 켜지고, 버튼 을 10초간 누르고 있으면 LED가 50초 동안 켜져 있다가 꺼지도록 하려고 한다.

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

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

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

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

설계하기

(64)

◾ 원하는 기능을 구현하기 위해 프로그램을 설계한 후 아래의 코드를 작성해 본다.

SPL 스크립트 스케치 코드

cnt = 0

void setup() {

}

void loop() {

d2 = DigitalRead(2)

if ( d2 == HIGH ) cnt = cnt + 5

if (cnt > 0) {

cnt = cnt - 1

DigitalWrite(13, HIGH) }

else

DigitalWrite(13, LOW)

PrintLine( ) Delay(100) }

int cnt = 0;

void setup() {

pinMode(2, INPUT);

pinMode(13, OUTPUT);

Serial.begin(115200);

}

void loop() {

int d2 = digitalRead(2);

if ( d2 == HIGH ) cnt = cnt + 5;

if (cnt > 0) {

cnt = cnt - 1;

digitalWrite(13, HIGH);

} else

digitalWrite(13, LOW);

Serial.println(cnt);

delay(100);

}

구현하기

(65)

- 63 -

▶ 버튼을 1초간 누르고 있으면 LED가 10초간 켜지고, 버튼을 10초간 누르고 있으면 LED가 100초 동안 켜져 있다가 꺼지도록 기능을 수정해 본다.

▶ LED가 꺼지기 10초 전에 LED를 점멸하여 10초 후에 LED가 꺼진다는 정 보를 사용자에게 알리고자 한다. 어떠한 기능을 추가해야 할지 생각해 보고 기능을 완성해 본다.

실습

기능 개선 사항

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

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

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

(66)

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

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

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

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

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

학습 목표

04 틱톡 스위치 만들기

실습 개요

(67)

- 62 -

4.1 준비하기

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

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

스피커 디지털 버튼

준비물

(68)

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

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

H/W 연결하기

(69)

- 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);

}

(70)

◾ 위의 예제를 실행하면 계속 삐 소리가 연주되면서 시끄러운 상황이 만들어 진다. 스피커의 소리를 끄려면 다음과 같이 빈 프로그램을 생성후 실행하 여 아두이노에서 실행중인 프로그램을 지워버리면 된다.

소리를 끄는 방법

SPL 스크립트 스케치 코드

void setup() {

}

void loop() {

}

void setup() {

}

void loop() {

}

(71)

- 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);

}

※ 주의 사항

(72)

4.3 틱톡 소리 만들기

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

0.1초 간격으로 소리 만들기

SPL 스크립트 스케치 코드

void setup() {

}

void loop() {

Tone(3, 700, 100 ) Delay( 1000 )

Tone(3, 500, 100 ) Delay( 1000 ) }

void setup() {

}

void loop() {

tone(3, 700, 100 );

delay( 1000 );

tone(3, 500, 100 );

delay( 1000 );

}

(73)

- 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);

}

(74)

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

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

◾ 버튼의 상태가 변하는 순간을 감지하기 위해서는 버튼의 상태를 저장하고 있는 전역변수의 값을 비교해야 한다. 이전 활동에서 사용한 pressed와 같은 역할의 전역 변수 값을 비교하여 버튼이 눌려 지거나 올라오는 순간 을 감지할 수 있다.

버튼의 상태 변화 감지

(75)

- 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);

}

(76)

4.6 틱톡 스위치 구현하기

◾ 이전 활동의 코드들을 활용하여 버튼이 눌리는 순간 0.1초 동안 ‘틱’ 소리 (700Hz)가 나고 버튼이 올라오는 순간 ‘톡’ 소리 (500Hz)가 나오도록 tone 명령어를 추가하려고 한다. 프로그램 실행 결과흫 확인해 본다.

소리 기능 추가하기

SPL 스크립트 스케치 코드

pressed = false void setup() {

}

void loop() {

d2 = DigitalRead(2) if ( d2 == HIGH ) {

if (pressed == false) {

Tone(3, 700, 100) PrintLine(“Down”) }

pressed = true }

else {

if (pressed == true) {

Tone(3, 500, 100 ) 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) {

Tone(3, 700, 100);

Serial.println(“Down”);

}

pressed = true;

} else {

if (pressed == true) {

Tone(3, 500, 100);

Serial.println(“Up”);

}

pressed = false;

}

delay(100);

}

(77)

- 72 -

▶ tone 명령어에 사용된 진동수 값을 다른 값으로 변경하여 다른 틱톡 소리 가 나오도록 버튼의 효과음을 다양하게 변경해 보자.

실습

(78)

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

◾ 디지털 버튼의 중복 눌림 방지 기능 및 전역변수를 활용하여 LED 전등이 계속 켜질 수 있도록 토글 스위치 기능을 구현할 수 있다.

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

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

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

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

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

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

학습 목표

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

실습 개요

(79)

- 74 -

5.1 준비하기

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

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

스피커 디지털 버튼

준비물

LED 모듈

(80)

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

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

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

H/W 연결하기

(81)

- 76 -

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

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

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

◾ 이전 활동에서 작성한 프로그램에 기능을 추가하여 버튼이 눌려졌다가 올 라오는 순간에 1씩 증가하도록 기능을 구현해 본다.

눌림 횟수 체크 장치

SPL 스크립트 스케치 코드

pressed = false cnt = 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);

}

(82)

5.3 토글 기능 구현하기

◾ 이전 활동에서 사용된 cnt 전역변수 값이 버튼이 눌릴 때 마다 0 과 1 값 으로 반복해서 변경되도록 해보자. 즉 버튼이 처음 눌리면 cnt 값이 0에서 1로 바뀌고, 버튼이 다시 눌리면 cnt 값이 1에서 0으로 다시 변경되도록 기능을 구현해 본다.

◾ 버튼이 눌릴 때 마다 cnt 값이 0 또는 1이 되도록 하기 위해서 어떠한 기 능이 필요할 지 생각해 보고 코드를 완성해 보자.

SPL 스크립트 스케치 코드

pressed = false cnt = 0

void setup() {

}

void loop() {

d2 = DigitalRead(2) if ( d2 == HIGH ) {

pressed = true }

else {

if (pressed == true) {

Tone(3, 500, 100) if (cnt == 0) {

cnt = 1 }

else {

cnt = 0

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) {

tone(3, 500, 100);

if (cnt == 0) {

cnt = 1;

} else

토글 기능

(83)

- 78 - }

PrintLine(cnt) }

pressed = false }

Delay(100) }

{

cnt = 0;

}

Serial.println(cnt);

}

pressed = false;

}

delay(100);

}

(84)

◾ 나머지 연산자를 이용하면 변수가 0과 1을 반복하는 과정을 간단히 한 두 줄로 구현할 수 있다. cnt 변수값이 2가 되면 나머지 값이 0이 되어, 다시 0으로 저장된다.

참고자료

SPL 스크립트 스케치 코드

pressed = false cnt = 0

void setup() {

}

void loop() {

d2 = DigitalRead(2) if ( d2 == HIGH ) {

pressed = true }

else {

if (pressed == true) {

Tone(3, 500, 100)

cnt = cnt + 1 cnt = cnt % 2 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) {

tone(3, 500, 100);

cnt = cnt + 1;

cnt = cnt % 2;

Serial.println(cnt);

}

pressed = false;

}

delay(100);

}

참조

관련 문서

- 손톱이나 film holder 등에 완전히 정착되기 전에 긁혀서 필름에 손상이 된 경우. -

“성운들은 이제 항성 시스템이라고 알려져있기 때문에 다른 이름이 부여되어져야 한다고 몇몇 천문학자들이 고려하고 있다. 이런 이름들은 구름이나 안개라는

중성자별은 물질을 모으고 각운동량을 모으면서 중성자별의 자전이 빨라진다: X-선

우리은하는 어떻게 형성되었나?.. Timeline of Milky Way

태양계에서의 생명은 발생할

• 은하들의 겉보기 모습과 전체광도의 시간에 따른 변화에 대한 연구는 은하를 구성하고 있는 항성종족의 양상에 대한 문제이다. • 한 은하가 어떤 색으로 보이는지는 주로

다양한 별들의

지구 크기의 행성은 흔한 것이며 거주 가능 영역에서 찾은 행성의 수가 적더라도 별 주위의 거주 가능 영역에 지구 크기의 행성이 존재할 가능성은 다분히 있다.. 확실하진 않더라도 거주