Similar documents
아두이노 프로그램 쉽게 배우기 불 과 얼마 전까지만 해도 PC 가 아닌 다른 장치를 프로그램한다는 것은 전문가들의 일로만 여겼습니다. 특수한 장비를 사용해서 "롬"이라고 불리는 장치에 프로그램을 억지로 집어넣었습니다. 프로그램 장비도 고가여서 일반인은 쉽게 구입하기 어

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft Word - PLC제어응용-2차시.doc

Microsoft PowerPoint - chap04-연산자.pptx

Microsoft PowerPoint - es-arduino-lecture-03

PowerPoint 프레젠테이션

OCW_C언어 기초

PowerPoint 프레젠테이션

Visual Basic 반복문

ISP and CodeVisionAVR C Compiler.hwp

Infinity(∞) Strategy

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Microsoft PowerPoint - chap05-제어문.pptx

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

실험 5

Microsoft PowerPoint - chap06-2pointer.ppt

1

설치 순서 Windows 98 SE/Me/2000/XP 1 PC를 켜고 Windows를 시작합니다. 아직 컴퓨터에 프린터를 연결하지 마십시오. 2 PC에 P-S100 CD-ROM(프 린터 드라이버)을 삽입합니다. 3 설치 프로그램을 시작합니다. q CD-ROM의 PS1

실험 5

OCW_C언어 기초

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

SBR-100S User Manual

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

버퍼오버플로우-왕기초편 3.c언어에서버퍼사용하기 버퍼는 임시기억공간 이라는포괄적인개념이기때문에여러곳에존재할수있습니다. 즉, CPU 에도버퍼가존재할수있으며, 하드디스크에도존재할수있고, CD- ROM 이나프린터에도존재할수있습니다. 그리고앞의예제에서보신바와같이일반프로그램에도

금오공대 컴퓨터공학전공 강의자료

Install stm32cubemx and st-link utility

IRISCard Anywhere 5

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

지도상 유의점 m 학생들이 어려워하는 낱말이 있으므로 자세히 설명해주도록 한다. m 버튼을 무리하게 조작하면 고장이 날 위험이 있으므로 수업 시작 부분에서 주의를 준다. m 활동지를 보고 어려워하는 학생에게는 영상자료를 접속하도록 안내한다. 평가 평가 유형 자기 평가

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

슬라이드 1

차시 AS_02 대상 교육주제아두이노 LED 및버튼제어프로젝트교육시간 120 분 1. 아두이노를이용하여 LED 를제어할수있다. 교육목표 2. 아두이노를이용하여삼색 LED 를제어할수있다. 3. 아두이노에서버튼입력을수행하여프로그램에연동할수있다. 장비류는미리배분하고, 재료는

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

PowerPoint 프레젠테이션

윈도우즈프로그래밍(1)


<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Studuino소프트웨어 설치

API 매뉴얼

< 제누이노스타트키트 > 사용설명서 목차 1. Arduino IDE 설치하기 2. Genuino 연결및 Arduino IDE 셋팅하기 3. 센서설명및연결도, 예제소스 1

PowerPoint Presentation

KMC.xlsm

View Licenses and Services (customer)

<4D F736F F F696E74202D20C1A63036C0E520BCB1C5C3B0FA20B9DDBAB928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

특징 찾아보기 열쇠 없이 문을 열 수 있어요! 비밀번호 및 RF카드로도 문을 열 수 있습니다. 또한 비밀번호가 외부인에게 알려질 위험에 대비, 통제번호까지 입력해 둘 수 있어 더욱 안심하고 사용할 수 있습니다. 나만의 비밀번호 및 RF카드를 가질 수 있어요! 다수의 가

목차 1. 시스템요구사항 암호및힌트설정 ( 윈도우 ) JetFlash Vault 시작하기 ( 윈도우 ) JetFlash Vault 옵션 ( 윈도우 )... 9 JetFlash Vault 설정... 9 JetFlash Vault

Windows 8에서 BioStar 1 설치하기

Microsoft PowerPoint - gnu-w10-c-chap11

BY-FDP-4-70.hwp


새로운 지점에서 단이 시작하는 경우 기둥코로 시작하라고 표시합니다. 기둥코(standing stitch)로 시작하는 방법은 YouTube 에서 찾아볼 수 있습니다. 특수 용어 팝콘뜨기: 1 코에 한길긴뜨기 5 코, 바늘을 빼고 첫번째 한길긴뜨기코의 앞에서 바늘을 넣은

Index 1. Intro Install Connect Scratch 1.4 (Offline Editor) Scratch 2.0 (Online Editor) Connect f

C 프로그램의 기본

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

SIGIL 완벽입문

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

MF Driver Installation Guide

PowerPoint 프레젠테이션

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - chap-03.pptx

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - chap06-1Array.ppt

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

11장 포인터

Oracle VM VirtualBox 설치 VirtualBox에서 가상머신 설치 가상머신에 Ubuntu 설치

Microsoft Word - Crackme 15 from Simples 문제 풀이_by JohnGang.docx

Microsoft Word - Armjtag_문서1.doc

슬라이드 1

Contents 01. 안전을 위한 주의 사항 터치형 멀티 조절기 각부 명칭 터치형 각방 조절기 각부 명칭 조절기 난방/정지 하기 조절기 외출 /해제하기 조절기 반복난방 하기 조절기 예약난방 /

설계란 무엇인가?

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

6. 설치가시작되는동안 USB 드라이버가자동으로로드됩니다. USB 드라이버가성공적으로로드되면 Setup is starting( 설치가시작되는중 )... 화면이표시됩니다. 7. 화면지침에따라 Windows 7 설치를완료합니다. 방법 2: 수정된 Windows 7 ISO

Chapter. 14 DAC 를이용한 LED 밝기제어 HBE-MCU-Multi AVR Jaeheung, Lee

Example: LED flashlight

3 권 정답

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

<4D F736F F F696E74202D20325FBEC6B5CEC0CCB3EB20B1E2C3CABDC3C7E82E BC8A3C8AF20B8F0B5E55D>

슬라이드 1

<4D F736F F F696E74202D203131C1D6C2F7202D E6FB8A620C0CCBFEBC7D120C4B3B8AFC5CD204C43442C C1A6BEEEC7CFB1E2205

PowerPoint 프레젠테이션

PathEye 공식 블로그 다운로드 받으세요!! 지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다.

1.2 자료형 (data type) 프로그램에서다루는값의형태로변수나함수를정의할때주로사용하며, 컴퓨터는선언된 자료형만큼의메모리를확보하여프로그래머에게제공한다 정수 (integer) 1) int(4 bytes) 연산범위 : (-2 31 ) ~ (2 31 /2)-

PowerPoint 프레젠테이션

중간고사

슬라이드 1

쓰리 핸드(삼침) 요일 및 2405 요일 시간, 및 요일 설정 1. 용두를 2의 위치로 당기고 반시계방향으로 돌려 전날로 를 설정합니다. 2. 용두를 시계방향으로 돌려 전날로 요일을 설정합니다. 3. 용두를 3의 위치로 당기고 오늘 와 요일이 표시될 때까지 시계방향으로

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap-06.pptx

실험. Multimeter 의사용법및기초회로이론 Multimeter 의사용법 멀티미터 (Multimeter) 는저항, 전압, 전류등을측정할수있는계측기로서전면은다음그림과같다. 멀티미터를이용해서저항, 전압, 전류등을측정하기위해서는다음그림과같은프로브 (probe) 를멀티미터

Microsoft PowerPoint - Lesson2.pptx

PowerPoint Presentation

Transcription:

누구나 따라하는 아두이노 프로그램 - 초딩도따라하는아두이노프로그램 C 언어를처음부터쉽게공부하고싶은사람을위한무료공개강의노트 저자 : 바람 (eventia@gmail.com)

RDUINO 바람 eventia@gmail.com http://winduino.co.kr 누구나 따라하는 아두이노 프로그램 - 초딩도 따라하는 아두이노 프로그램

저자약력 바람 ( 임성국 ) 대안초등학교를 다니는 아들 하람이와 하준이를 둔 두 아이 아빠중학교 때 Z80 마이컴 제작 시도, 실패 / 전자 장난감과 프라모델 조립이 취미 8051 보드 TY52 개발 / 3D 프린터, 3D 스캐너, 드론 취미 제작 마을과 온라인 카페에서 바람 또는 바람아저씨 로 활동 중카페 누구나 따라하는 아두이노 프로그램 운영자 cafe.naver.com/winduino 블로그 winduino.co.kr 운영 2004. 한양대학교 전자공학 석사 과정 2006. 한양대학교 전자공학 박사 수료 한양대, 산기대 등 대학 강의 경력 누구나따라하는아두이노프로그램 출간일 2016년 5월 10일지은이임성국출판사도서출판퍼플주소서울시종로구종로1가 1번지 www.kyobobook.co.kr c 임성국 2016 이책은 CCL(Creative Commons License) 을따르고있습니다. " 누구나따라하는아두이노프로그램 " 은크리에이티브커먼즈저작자표시 -동일조건변경허락 4.0 국제라이선스에따라이용할수있습니다. 이라이선스의범위이외의이용허락을얻기위해서는 http://www.winduino.co.kr 을참조하십시오. 이책의저자는바람 ( 임성국 ) 입니다. 누구나복사, 제본, 게시하실수있습니다.

머리말 항상응원해준아내 오버 와아빠를좋아하는 첫째 하람 이, 아빠발소리를기억하는막내 하준 이를기억하며이책을씁니다. 대문을열고들어갈때웃어주는가족이있기에 이책이있습니다. FORGET-416-NOT 아직돌아오지못한 9 인의슬픔을함께하려 합니다. 우리에게조금더나은내일이란국민모두가 GDP 평균에서크게벗어나지않게되는날이라생각하고, 그내일이오기를기다리면서만들어갑니다. 이책은그인생의짬을내어잠시돌아가려는이들을위해그리고다른이들과는조금다르게살아보려는이들을생각하며썼습니다. Carpe diem

이책의목차 1 장. 이책의사용설명서 5 1. 시작하면서 5 2. 이책의사용법 8 3. 아두이노와프로그램 10 4. 하드웨어와소프트웨어 13 2 장. 초등학생도따라할수있는아두이노따라잡기 15 1. 아두이노 IDE 설치 15 2. LED 켜고끄는프로그램무조건따라하기 24 3 장. 아두이노프로그램을위한쉬운 C 언어문법 26 1. 아두이노기본구조 26 2. 주석 44 3. 변수 46 4. 연산 60 5. 상수 64 6. 참과거짓 65 7. HIGH / LOW 66 8. if 조건문 67 9. for 반복문 70 10. while 반복문 72

11. 아두이노내부함수들 74 12. 다양한수학함수들 84 13. 디버깅 85 4 장. 아두이노프로그램기본구조 88 1. 디지털출력 88 2. 디지털입력 89 3. 대전류출력 90 4. PWM 출력 91 5. 아날로그값입력받기 92 5 장. 하드웨어연결 93 1. 센서연결 94 2. 출력연결 95 6 장. 프로그램방법 98 1. 입력 100 2. 연산 100 3. 출력 100

Arduino

1 장. 이 책의 사용설명서 1. 시작하면서 아 두이노가일반인들에게알려지기 전에는프로그램을한다고하면보통 PC 에서하는프로그램을 의미했습니다. PC 에서프로그램을만들때사용하는프로그래밍언어는많이있습니다. 지금은일반인도프로그램할수있도록쉬운프로그램언어들이많이나오고있습니다. 스크래치같이프로그램언어는레고블록을가져다끼우는식으로프로그램을할수도있습니다. 1 장. 이책의사용설명서 - 5

아두이노 프로그램 쉽게 배우기 불 과 얼마 전까지만 해도 PC 가 아닌 다른 장치를 프로그램한다는 것은 전문가들의 일로만 여겼습니다. 특수한 장비를 사용해서 "롬"이라고 불리는 장치에 프로그램을 억지로 집어넣었습니다. 프로그램 장비도 고가여서 일반인은 쉽게 구입하기 어려웠습니다. 아주 간단한 프로그램도 전문적인 장비를 가진 전문가들만 할 수 있었습니다. 하지만 아두이노는 이러한 흐름을 바꾸었습니다. 이제는 마이크로프로세서, 아두이노라는 것을 꽤 많은 사람들이 알고 있습니다. 그리고 꽤 많은 사람들이 그것을 다루어보고 싶어합니다. 여기서는 아두이노를 다루고 싶어하는 일반인을 대상으로 쉽게 프로그램할 수 있는 기초적인 프로그램공부를 하려고 합니다. 책은 문법적인 요소를 가능한 쉽게 설명하고 넘어갑니다. 간단한 예제를 통해 프로그램을 직접 하도록 했습니다. 이렇게 이 책의 끝까지 가면 적어도 스스로의 힘으로 아주 복잡하지 않은 아두이노프로그램이 가능할 것입니다. 6-1장. 이 책의 사용설명서

이책은프로그램실행속도를조금더빠르게하거나조금더램을적게사용하는것같은고급기술을가르치지않습니다. 그부분은초급을넘어서중급이상에서다루어야할내용입니다. 아두이노를처음사용하는것에너무많은제약과공부할거리를두지않으려고합니다. 우선사용하면서필요한부분이생기면더공부하면됩니다. 더공부하기위해우선꼭알아야만할것을이책은다루고있습니다. 더많은것을해보고싶다면이책을넘어서서더많은공부가필요합니다. 그건이책을모두마친다음에스스로판단하면됩니다. 내가원하는것을만들기에충분하다면굳이더깊은공부를하려고발버둥칠필요는없습니다. 하지만이정도로는도저히내가원하는것을만들수없다면그때는이책을넘어서심도있게프로그램을더깊이공부하셔야합니다. 건투를빕니다. [ 주저리 주저리 ] 초등 대안학교를 다니는 아이가 있습니다. 제가 어릴 때 그랬던 것처럼 제 아이도 새로운 것을 보면 호기심을 주체할 수 없어합니다. 혼자서 일본 전자 잡지에 나온 Z80 보드를 만들어보겠다며 이리 저리 뛰어 다녔던 중학교 시절이 기억나면서 초등 4 학년 아이에게 스크래치와 아두이노를 가르쳐 보았습니다. 이 책은 제 아이 같은 어린 초등학생 아이들도 공부할 수 있게 도움을 주려고 시작했습니다. 많은 것을 담기보다 가장 기초적인 것을 담으려고 했습니다. 하지만 역시 글을 쓰면서 많은 유혹을 받게 됩니다. 이것도 쓰고 싶고, 저것도 담고 싶어집니다. 하지만 아이를 가르치면서 제가 본 것은 아이는 배우기보다는 직접 자기의 손으로 하면서 더 많은 것을 알게 되는 것을 보았습니다. 가르치고 가르침 받은 것을 따라 하기보다는 궁금한 것을 질문하면서 오히려 더 빨리 지식을 습득하고 있었습니다. 1 장. 이책의사용설명서 - 7

2. 이 책의 사용법 아 두이노를처음다루는사람이라면굳이처음부터 끝까지차분히읽을필요는없습니다. 2 장의내용 설명이이해가되지않아도따라해보세요. 2장에서는아두이노 IDE 설치부터시작해서 LED 를깜박거리는가장간단한프로그램을실행시킵니다. 불 (LED) 을켜고끌수있다면불대신모터를연결할수도있고, 다양한장치를사용할수있습니다. [ 주저리 주저리 ] 초등 대안학교에서 다른 아이들도 스크래치와 아두이노를 그렇게 좋아했습니다. 대학생 이상, 전문가들의 것이라고만 알려졌던 MCU, 마이크로프로세서라는 말은 모르지만 그 아이들은 알아서 LED 를 점멸시키면서 놀았습니다. PC 에는 고양이가 뛰어다니고, 고양이가 발판을 밟으면 선풍기가 돌아가게 만들고 좋다고 낄낄댔습니다. 이 책은 초등학생들을 위한 글입니다. 이후로도 아이들을 가르치면서 필요한 내용과 일반인들을 위해 내용을 계속해서 공개하면서 무료로 배움을 가질 수 있도록 할 생각입니다. 이 책의 내용은 아두이노를 사용한 개인적 경험과 아두이노 홈페이지에 있는 다양한 예제들, 그리고 공개된 ebook인 arduino programming notebook 을 참고했습니다. 영어로 된 arduino programming notebook 은 그 자체로 좋은 교재입니다. 영어만 익숙하다면 아이들이 직접 보아도 좋을 교재입니다. 8-1 장. 이책의사용설명서

아두이노보드에 LED 와저항을연결하여 불을켜고끌수있습니다. fritzing 이라는프로그램으로 그림을그렸습니다. 1 장. 이책의사용설명서 - 9

3. 아두이노와 프로그램 아 두이노는 8 비트마이크로프로세서를사용한초소형컴퓨터입니다. 이글을 쓰고있는 2016 년, 대부분의가정에서사용하는컴퓨터는 CPU 속도가 아무리느려도 1.6GHz 는됩니다. 아두이노우노의속도가 16Mhz 인것과비교해보면 100배이상차이가납니다 (1G = 1000M). 아두이노우노의램은 2k 입니다. 보통컴퓨터의램이 4G 에서 32G 인것과비교하면 2000 배이상차이가납니다 (1M = 1000k). 쉽게말해서컴퓨터와비교하면아두이노는매우느리고저장공간도매우작다는겁니다. PC Arduino 성능 100 성능 1 10-1 장. 이책의사용설명서

하지만이렇게느린것같아보여도아두이노는꽤많은일을처리할수있습니다. 사실아두이노가느리다는것은컴퓨터와비교할때느리다는것이지실제로우리가처리하려는일을처리할때느리다고는전혀생각되지않을겁니다. 16MHz 라는속도는 1초에 1천6백만개의기본명령을처리하는속도입니다. 처음 PC 가나왔을때의속도가 5MHz 가채되지않았습니다. 이와비교해서느리지않은속도입니다. 아두이노가느린게아니라지금 PC 의속도가너무빨라진거죠. 가로와세로가 43mm, 18mm 인 Arduino Pro mini 의사진입니다. 이보다더작은보드도있답니다. 그럼컴퓨터보다느린아두이노가왜필요할까요? 여러가지이유가있습니다. 크기가작아지고, 비용이저렴해지고, 작은전력으로사용할수있기때문입니다. 다양한전자제품들안에작은미니컴퓨터가들어갑니다. 전기밥통안에도들어가고세탁기안에도들어가고에어컨안에도들어갑니다. 밥통에들어가려면크기가작아야하고, 가격도저렴해야합니다. 5만원이면구입할수있는전기밥솥에가정용 PC 가 1 장. 이책의사용설명서 - 11

달려있다고생각해보세요. 얼마나크기도커지고가격이비싸질까요? 아무리커도 손바닥만한크기의미니컴퓨터가필요한이유입니다. 프로그램을짜서아두이노안에넣으며아두이노는작은컴퓨터가되어간단한동작을알아서하게됩니다. 이책은아두이노를사용하는가장기초적인내용을다루고있습니다. 아두이노를전혀모르거나기초가전혀없다면이책의내용을차근차근보시면서공부하시고그다음자신이원하는것을만들면서다른책을공부하시면됩니다. 영어로책을읽는것이가능하다면무료로공개된아두이노책들이꽤있습니다. 그책들을인터넷에서검색해서읽어보시기바랍니다. 보통구글에서 free ebook arduino 검색어로검색하면다읽을수없을만큼많은책들이나옵니다. 안타깝게도한글로된아두이노책은그렇게쉽게찾을수없습니다. 저작권이나공유정신도언제한번다뤄보고싶습니다. 하지만한국에서이런책을쓰거나프로그램을만드는사람들이경제적으로어려운것도현실입니다. 그래서더공유하지못하고, 빈곤한자료속에서계속해서자신의얼마되지않은정보도공개하지못하는악순환이반복됩니다. 이책하나로모든것을해결하지는못하겠지만앞으로일반인들을위한자료를계속해서공유하기위해노력하려고합니다. 12-1 장. 이책의사용설명서

4. 하드웨어와 소프트웨어 P C 에서프로그램을하는사람들은프로그램에만신경을쓰면됩니다. PC 에는키보드도있고, 마우스도있고, 모니터도있고, 프린터도있습니다. 프로그램을짜면서화면에 " 안녕 " 표시하고싶으며그냥 " 안녕 " 이라는 글씨가나오게프로그램을하면됩니다. LG 모니터를쓸때와삼성모니터를쓸때, 저렴한모니터를쓸때달라지지않습니다. 똑같은프로그램을짜서실행시키면어떤 모니터를사용하든지상관없이화면에 " 안녕 " 이라는글씨가나오게됩니다. 하지만아두이노는조금다릅니다. 아두이노에는키보드도없고, 마우스도없고, 모니터는더더욱없습니다. 모니터같은것을달려고알아보면 LCD 리는것이나옵니다. 그런데이것이한줄짜리, 두줄짜리, 네줄짜리가있습니다. 어떤것은그래픽LCD 라고하면서가로와세로가몇개의점이찍히는지그걸로구분합니다. 아두이노와 LCD 가연결되는방식은또다양합니다. 2줄짜리 I2C 라는방식으로연결되는것이있는가하면어떤것은 RS232 시리얼통신으로연결됩니다. 4개의데이터가동시에가는 4줄짜리연결방식도있고, 8개의데이터가동시에가는 8줄짜리연결방식 ( 패러럴방식 ) 도있습니다. 뭐가뭔지머리만아파집니다. 자우선은그런걱정은모두버립시다. 더하기와빼기도못하는아이가미분방정식을풀겠다고대학수학책을들여다보는것은칭찬할일이아닙니다. 뭘공부해야할지를모르고있을뿐입니다. 그때는덧셈과뺄셈을공부할수있는초등학교저학년용수학책과연습장과연필을사주어야합니다. PC에서프로그램을할때는신경쓸필요없던것들이아두이노프로그램을하려고할때는신경을쓰이게합니다. 그래서다른사람은잘된다고하는프로그램소스를그대로가져와서내아두이노에집어넣어서실행시켰는데잘안될때가자주있습니다. 1 장. 이책의사용설명서 - 13

가끔왜안되는지를묻는글을봅니다. " 친구가할때는됐는데왜안되죠?" 안되는이유는수백가지가될수도있습니다. 하나하나다른점을찾아보고다른점을찾아서고쳐가면서실행해보면언젠가는될겁니다. 아주재수가없으면고장난아두이노를붙잡고시간만버릴수도있고생각지도못하게전원어댑터가맞지않아서그럴수도있습니다. 가능하면아두이노와주변장치를 2개사두세요. 아래에나오는모든프로그램예제를실행시킬때반드시전원연결과나머지주변장치들과의연결을확인하시기바랍니다. 프로그램은잘실행이되지만 LED 가제대로깜박이지않는다든지할때가장큰이유는전원연결을안했거나배선을잘못연결한경우가아주많습니다. 가끔부품이상이원인일수도있지만그런경우는경험상 100 번중에 5번이내입니다. 자이제시작해봅시다. 14-1 장. 이책의사용설명서

2 장. 초등학생도 따라할 수 있는 아두이노 따라잡기 1. 아두이노 IDE 설치 아 두이노에프로그램하기위해서는프로그램툴을설치해야합니다. 아두이노 공식홈페이지로가서다운받은후설치를진행합니다. 이책에서는 윈도우환경에서아두이노를사용하는것을기준으로설명하겠습니다. MAC 이나 LINUX 사용자들은이미이책을볼필요가없을정도의중급사용자로판단됩니다. 그정도되면알아서아두이노 IDE 는충분히설치하실수있을겁니다. 저는 PC 윈도우7, 윈도우10 에서테스트하고, 라즈베리파이에서아두이노프로그램을해봤습니다. 2 장. 초등학생도따라할수있는아두이노따라잡기 - 15

STEP 1. 아두이노홈페이지에방문해서아두이노프로그램 (IDE) 을다운받습니다. 홈페이지주소 : http://www.arduino.cc/ 다운받을프로그램 : https://www.arduino.cc/en/main/software 저주소로접속하면다운받을프로그램의링크가다시나옵니다. 영어를읽을수있으면읽어서그대로따라하시면됩니다. 아니면아래에있는링크를따라갑시다. 홈페이지가수정될때마다그에맞추어아두이노 IDE 를다운받는방법을자세히설명해두겠습니다. 16-2 장. 초등학생도따라할수있는아두이노따라잡기

STEP 2. 다운받은프로그램을 PC 에설치합니다. 다운받은파일은 arduino-1.6.8-windows.exe 입니다. 더블클릭해서설치합니다. [I Agree] 버튼을클릭합니다. 설치가시작됩니다. 2 장. 초등학생도따라할수있는아두이노따라잡기 - 17

계속진행합니다. 모두선택해주세요. 아두이노 IDE 를설치할 장소를적으세요. 설치가진행되고있습니다. 18-2 장. 초등학생도따라할수있는아두이노따라잡기

설치중 USB 드라이버 설치를묻습니다. 설치해두세요. 설치가끝나면 Close 를 선택해서끝냅니다. 설치가끝나면바탕화면에 Arduino 아이콘이설치됩니다. 2 장. 초등학생도따라할수있는아두이노따라잡기 - 19

STEP 3. 아두이노와 PC 를 USB 케이블로연결합니다. 위그림대로연결하면됩니다. 우선 PC 는윈도우 7 이상 ( 윈도우 8, 윈도우 10) 을 기준으로설명합니다. MAC 이나리눅스를사용하시는분도크게다르지않습니다만 별도의설명은여기서하지않겠습니다. 20-2 장. 초등학생도따라할수있는아두이노따라잡기

STEP 4. 설치된아이콘을더블클릭하면 IDE 가실행됩니다. 아이콘을더블클릭하면아두이노 IDE 가실행됩니다. 2 장. 초등학생도따라할수있는아두이노따라잡기 - 21

STEP 5. IDE 내부에서보드와포트를설정합니다. [ 툴 ] [ 보드 ] 선택 22-2 장. 초등학생도따라할수있는아두이노따라잡기

[ 툴 ] [ 포트 ] 선택 [ 툴 ] - [ 보드 ] 를선택하고그중자신의아두이노를선택합니다. 아두이노우노를 가지고있다면다음과같이 Arduino/Genuino Uno 를선택합니다. [ 툴 ] - [ 포트 ] 를선택하고자신의아두이노가연결된포트를선택합니다. 일반적으로아두이노 IDE 를설치할때아두이노드라이버가설치됩니다. 그래서자동으로이부분에서아두이노포트가보여집니다. 단, 저가의아두이노호환품중 CH340 계열의 USB 칩을사용하는경우가있는데, 그경우 CH340 드라이버를설치해주어야합니다. 구글에서 ch340 driver 를검색한후찾아서설치하시기바랍니다. 자세한내용은홈페이지 http://electoy.tistory.com/211 을참고하시면됩니다. 2 장. 초등학생도따라할수있는아두이노따라잡기 - 23

2. LED 켜고 끄는 프로그램 무조건 따라하기 아 무것도몰라도괜찮습니다. 무조건따라해보세요. 무조건따라했더니 LED 가깜박이고있다면성공한겁니다. 왜그렇게되는지이해하는것과 프로그램하는방법을다음장에서배우면됩니다. 아두이노우노를준비하고 13번핀과 GND 사이에 LED 와저항을다음그림처럼연결해줍니다. LED 는극성이있습니다. 긴다리와짧은다리를구별해서짧은다리가 GND 에연결되게합니다. 혹시다리를잘라서길이가같아졌다면원통내부를잘보시면한쪽이두껍게되어있는모습을볼수있습니다. 두껍게된부분이 GND 에연결됩니다. 24-2 장. 초등학생도따라할수있는아두이노따라잡기

아두이노 IDE 를실행시킨상태에서 [ 파일 ]-[ 예제 ]-[01.Basics]-[Blink] 를선택해서 클릭합니다. 아두이노우노를 PC 와 USB 케이블로연결합니다. [ 툴 ]-[ 보드 ]-[Arduino/Genuino Uno] 를클릭합니다. [ 툴 ]-[ 포트 ] 에서연결된아두이노 우노의포트를선택합니다. 업로드를위해오른쪽화살표가그려진 아이콘을클릭합니다. 이제아두이노우노보드를잘보면 1 초간격으로 LED 가깜박이는것을볼수 있습니다. 여기까지이상없이진행되었다면 PC 에문제가없고, 아두이노에도문제가없고, 프로그램컴파일도잘되고실행도문제가없는것이확인되었습니다. 이제부터아두이노 프로그램을본격적으로시작해보겠습니다. 2 장. 초등학생도따라할수있는아두이노따라잡기 - 25

3 장. 아두이노 프로그램을 위한 쉬운 C 언어 문법 1. 아두이노 기본 구조 아 두이노프로그램의기본구조는 2 개의몸통으로구분됩니다. 첫번째 몸통은실제일을하기전준비운동을하는단계입니다. setup() 이라고 하는이름이붙어있습니다. 두번째몸통은실제일을하는단계입니다. loop() 라는이름을붙여두었습니다. void setup() { // 여기에 [ 준비운동 ] 에필요한내용을넣습니다. void loop() { // 여기에 [ 실제할일 ] 을넣습니다. 26-3 장. 아두이노프로그램을위한쉬운 C 언어문법

여기보면 setup() 과 loop() 의앞에 void 라는게붙어있습니다. 자세한설명은 함수를다룰때설명하겠습니다. 우선은 * 무조건 * 위의모습을기억해두세요. [ 준비운동 ] 과 [ 실제할일 ] 은나눠집니다. TIP 본래 C 언어는 main() 이라는함수가기본함수입니다. main() 이라는함수를실행시키는것이 C 언어입니다. main() 이라는구조는위에서아래로한번만실행시키고마치는방식입니다. 그래서그안에서 for 나 while, if 등을사용해서프로그램을구성합니다. 그런데마이크로프로세서 ( 이하 MCU) 는조금다른방식으로프로그램언어에접근했습니다. 이를테면 MCU는하드웨어를준비하는것은한번이면되지만한번시동이걸린다음부터는전원이꺼질때까지계속해야하는일을합니다. 그래서아두이노는조금특별하게 setup(), loop() 구조를사용합니다. main() 안에 setup() 을한번실행하고하고 loop() 을무한실행하게두었습니다. main() 함수와 setup(), loop() 의관계는다음과같습니다. 지금은이해가안될수도 있습니다. 그러면그냥넘어가세요. main() { setup(); while(1) { loop(); 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 27

a. setup() setup() 함수는아두이노가시작되는처음단계에서한번만실행됩니다. 다음처럼 어떤핀을출력으로사용한다면먼저그핀을출력으로쓴다고알려주는역할로 사용됩니다. 1 2 3 4 void setup() { pinmode(13, OUTPUT); 여기서절대손대지말아야할곳이바로첫째줄과둘째줄, 그리고맨마지막줄입니다. 첫째줄은 setup() 함수를시작한다는뜻이고, 둘째줄의 { 기호는여기서부터시작이라는뜻입니다. 마지막줄에있는 를만날때까지모든것이 setup() 의내용이됩니다. pinmode(13, OUTPUT); pinmode() 함수는아두이노의핀을입력으로사용할것인지출력으로사용할것인지선택하게해줍니다. OUTPUT 은출력으로쓰겠다는뜻입니다. 이제부터아두이노의 13번핀은전류를흘려서바깥으로내보낼수있습니다. 이전류로꼬마전구 (LED) 를켜서전기가흐르는지, 흐르지않는지를볼수있습니다. 참고로 pinmode() 를통해서 13번핀을출력으로선택했다는것이 13번핀에전류가흐른다는뜻은아닙니다. 출력으로잡혔고, 그출력은 5V가될수도있고, 0V 가될수도 28-3 장. 아두이노프로그램을위한쉬운 C 언어문법

있습니다. 항상명령의끝은 ; 로마무리합니다. 즉, ; 를만나기전까지는프로그램은아직 끝이나지않았다고판단합니다. 처음 C 언어프로그램을하는사람들의잦은실수는 ; 를제대로사용하지않는것입니다. setup() 은처음부터끝까지한번만실행하고끝이납니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 29

b. loop() 준비운동으로 13 번핀을출력으로만들었습니다. 그러면 13 번핀에전기가흐르게 합시다. 13 번핀에꼬마전구 (LED) 를달고전기를흐르게해서불이들어오게합시다. 이것은 loop() 에서하면됩니다. void loop() { digitalwrite(13, HIGH); 위에서 setup() 을통해 13번핀을출력으로쓰겠다고정했으니 loop() 에서는그 13번핀을사용해서전기를흐르게하든지혹은흐르지않게하든지하면됩니다. 아두이노의 13번핀에꼬마전구 (LED) 의한쪽발을연결하고, 다른한쪽발은 0V에연결합니다. 전기는물과같아서높은곳에서낮은곳으로흐릅니다. 13번핀에서전기가나와서 LED의한쪽발로흘러들어가고, 그전기가다른쪽발로나온다음 0V 인 GND 로흘러들어갑니다. 마치산에있는물이아래로아래로흘러바다로들어가듯이전기는이리저리흘러결국은 GND 로흘러들어갑니다. 꼬마전구의한쪽발이 5V 에연결되어있고, 다른한쪽발이 0V 에연결되어있다면 30-3 장. 아두이노프로그램을위한쉬운 C 언어문법

5V에서 0V로전기가흐릅니다. 참고로 LED 라는꼬마전구는반도체입니다. LED 라는반도체는한쪽방향으로는전기가흐르는도체가되지만다른반대방향으로는부도체가됩니다. 다음그림과같이잘연결하세요. 반대로연결하면전기가흐르지않습니다. 전기가흐르지않으면빛도나지않겠지요. 참고로저항을하나연결해주면더좋습니다. 아두이노에서나오는전류가약해서 LED 가손상되지는않습니다만, 아두이노에직접연결하는경우가아니라면 LED 에너무많은전류가흐르게되면 LED 가고장이날수있습니다. 200 ohm 에서 500 ohm 사이의저항을하나연결해주면좋습니다. 13번핀과 LED 사이에연결하거나혹은 GND 와 LED 사이에연결하거나상관없습니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 31

LED 와저항 220Ω 을연결한상태를전기, 전자기호로나타낸손그림 digitalwrite() 함수는 () 안에 2개의내용이들어갑니다. 이걸프로그래머들은인자를받는다고표현합니다만, 굳이어렵게말할필요는없으니앞으로가능한쉽게풀어서설명하겠습니다. digitalwrite() 안에들어가는 2개의내용은첫째, 어떤핀을사용할까와둘째그핀에전기를흐르게할까말까입니다. 13번핀에전기를흐르게하겠다 (5V) 면 13 과 HIGH 를넣어주면됩니다. 반대로흐르지않게하겠다 (OV) 면 LOW 를넣어주면됩니다. HIGH 는 1 과같고, LOW 는 0 과같습니다. 일반적으로전자회로를다룰때 1은전기가흐르는것을의미하고, 0은전기가흐르지않는것을의미합니다. loop() 는처음부터끝까지실행한다음다시처음으로돌아갑니다. 이것을끝없이 반복합니다. 아두이노에전기가공급되는한계속합니다. 그래서위의 loop() 는그냥계속 13 번에연결된 LED 가불이켜진채로그대로 있습니다. 다음과같이바꿔봅시다. 32-3 장. 아두이노프로그램을위한쉬운 C 언어문법

void loop() { digitalwrite(13, HIGH); digitalwrite(13, LOW); 이걸실행하면어떻게될까요? loop() 는처음부터끝까지실행한후다시처음으로돌아간다고했으니까 13번핀에전기를흘렀다 (HIGH) 가그다음에는전기가흐르지않았다 (LOW) 를계속반복하게됩니다. 그러면 LED 가깜박일까요? 그냥켜져있습니다. 이유는전기가흐르고, 흐르지않고를반복하는시간이너무짧기때문에눈에는그냥커져있는것으로보이는것입니다. 나중에는이걸이용해서 LED 의불빛의밝기를조절하는것도가능합니다. 그러면깜박이게하려면어떻게하면될까요? 켜지고꺼지는사이에충분히눈으로 깜박거리는것을알수있도록시간을넣으면됩니다. 아두이노에서는기본적으로 delay() 라는함수를지원해줍니다. delay() 라는함수는 () 안에 mili second 인 1/1000 초의배수를넣게됩니다. 즉, () 안에 1000 을넣으면 1초동안아무것도하지않고잠시멈춰있게됩니다. delay( 시간 ) 는주어진 시간 동안아무것도하지말고정지해있으라고명령하는것입니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 33

void loop() { digitalwrite(13, HIGH); delay(1000); digitalwrite(13, LOW); 어떻게될까요? 3번째줄에서켜지고, 4번째줄에서 1초기다리고, 5번째줄에서다시끕니다. 맨처음으로돌아갑니다. 깜박일것같지요? 하지만실제로실행해보면깜박이지않습니다. 계속켜진채로있습니다. 왜일까요? 잠시멈춰서생각해보세요. 이유는다음소스를보면서차이를비교하면서생각해보세요. 1 2 3 4 5 6 7 void loop() { digitalwrite(13, HIGH); delay(1000); digitalwrite(13, LOW); delay(1000); 맨아래에 delay(1000); 을추가로넣었습니다. 위에서부터순서대로실행시켜보겠습니다. 34-3 장. 아두이노프로그램을위한쉬운 C 언어문법

1 2 3 4 5 6 7 void loop() { digitalwrite(13, HIGH); delay(1000); digitalwrite(13, LOW); delay(1000); 시작부분 3 번째줄에서켭니다. 4 번째줄에서 1 초기다립니다. 5 번째줄에서끕니다. 6 번째줄에서 1 초기다립니다. 시작부분으로갑니다. 3번째줄에서켭니다. 4번째줄에서 1초기다립니다. 5번째줄에서끕니다. 6번째줄에서 1초기다립니다. 그리고다시 3번째줄, 프로그램의처음부분으로갑니다. 첫번째소스도이런식으로하나씩순서대로해석해볼까요? 항상프로그램은 위에서아래로하나씩하나씩순서대로실행됩니다. 1 2 3 4 5 6 void loop() { digitalwrite(13, HIGH); delay(1000); digitalwrite(13, LOW); 시작부분켭니다. 1 초기다립니다. 끕니다. 시작부분으로갑니다. 여기서는켜고, 기다리고, 끄고, 켜고, 기다리고, 끄고... 이렇게반복됩니다. 그런데 잘보면끈다음바로켭니다. 즉, 꼬마전구를끄자마자바로다시켜버리는것이죠. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 35

이때걸리는시간은매우짧습니다. 너무짧아서꺼져있었다는것을사람의눈이인식할수없습니다. 이렇게되면꼬마전구는눈으로봐서는계속켜져있는것으로보입니다. 처음에원했던깜박이는동작을하기는하지만눈으로봐서는알수없습니다. 그래서맨아래에 delay(1000); 을추가로넣었습니다. 그래야끄고다시켜기전에 1초를기다리게해서꺼져있는상태를눈으로확인할수있게됩니다. 1 2 3 4 5 6 7 8 9 10 11 void setup() { pinmode(13, OUTPUT); void loop() { digitalwrite(13, HIGH); delay(1000); digitalwrite(13, LOW); delay(1000); 36-3 장. 아두이노프로그램을위한쉬운 C 언어문법

c. 함수 초등학교교과서에나오는함수의모습은이렇습니다. 상자그림이있고상자의내부는볼수없습니다. 이상자는들어가는입구와나오는출구가있습니다. 들어가는입구로어떤수가들어가면나올때 2를곱해서나옵니다. 이상자를함수라고하고, 이함수상자의이름은 " 두배상자 " 입니다. 함수는기본적으로들어가는값이있고, 나오는값이있습니다. 그리고각각의함수는자신만의이름이있습니다. 여기까지가초등학교때배웠던함수의기본입니다. 아두이노프로그램에사용되는 C언어도함수라는기능이있습니다. 초등학교때배운함수와비슷합니다. 조금더추가되었습니다. 들어오고나가는값뿐만아니라함수는어떤특별한행동을할수도있습니다. 들어오는값이나나가는값은하나이거나혹은여러개일수있습니다. 어떤함수는들어오는값이나나가는값이없습니다. 이를테면 " 들어온동전만큼웃음소리가나는상자 " 와같습니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 37

위의상자는 2 개의동전을넣으면 2 번 " 하 ", " 하 " 소리가나는상자입니다. 웃음소리를듣고싶으면그만큼동전을넣으면됩니다. 입력없이출력만있는상자도만들수있습니다. 입력과는상관없이이상자를 흔들기만하면흔들때마다 10 원씩나오는저금통같은상자도만들수있습니다. 게다가입력도출력도없는상자도있습니다. 입력도출력도없지만이상자를 흔들면음악소리가나옵니다. 뮤직박스같은상자입니다. 즉, 함수는들어오는것이있고나가는것이있는것이기본모습입니다. 하지만위에서설명한것처럼들어오는것이없을수도있고, 나가는것이없을수도있습니다. 나가는것혹은들어오는것이없을때 void 라는단어를씁니다. 함수이름은영어로씁니다. 38-3 장. 아두이노프로그램을위한쉬운 C 언어문법

1 2 3 4 [ 나가는값 ] [ 함수이름 ] ( 들어오는값들 ) { 처리를위한명령문들... 이런식으로함수는구성됩니다. 간단한함수를하나만들어서보겠습니다. 1 2 3 4 void laught() { Serial.println("HA HA"); 입력으로들어오는것이없기때문에 laught() 에서 () 안은비어있습니다. 출력으로나가는것이없기때문에 void 로시작합니다. 함수안에서처리하는것은 HA HA 라는문장을화면에출력만합니다. 아두이노같은 C 언어를사용하는프로그램에서는이렇게만들어지는함수를 사용합니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 39

함수를실행시킬때는함수의이름을쓰면됩니다. 왼쪽에서 loop() 라는함수안에서 laught() 라는함수의이름을쓰면그함수를호출해서실행시킵니다. 1 2 3 4 5 6 7 8 9 10 11 void setup() { Serial.begin(9600); void loop() { laught(); void laught(){ Serial.println("HA HA"); 프로그램의실행순서는다음과같습니다. 1 setup() 을실행합니다. 시리얼통신을하도록초기화합니다. 2 loop() 을실행시킵니다. 3 loop() 안에있는 laught() 를실행시킵니다. # laught() 안에있는 Serial.println( HA HA ) 을실행합니다. # laught() 함수끝까지실행한다음종료합니다. # laught() 가종료되면 loop() 함수 6번줄의끝으로갑니다. # loop() 가종료됩니다. 4 다시 loop() 가시작됩니다. : 3번으로갑니다. (# 표시된줄을계속반복합니다.) 40-3 장. 아두이노프로그램을위한쉬운 C 언어문법

아두이노 IDE 를실행합니다. 오른쪽위확대경모양아이콘을클릭합니다. 시리얼모니터창이열리고시리얼통신내용이보입니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 41

d. { 괄호의 의미 c 언어문법에서 { 괄호는문단을의미하게됩니다. " { " 바로다음이시작이 되고, " " 의바로앞이끝이됩니다. { 로둘러싸인문단은의미상하나로 처리됩니다. 함수의내용은시작하는 { 과끝나는 사이에들어갑니다. 1 2 3 4 void laught() { Serial.println("HA HA"); 42-3 장. 아두이노프로그램을위한쉬운 C 언어문법

e. 세미콜론 ; 세미콜론 ; 은반드시명령의끝에붙어야만합니다. 한줄에명령을하나만써야한다는제약은없습니다. 여러명령을한줄에써도되지만, 각명령의끝에 ; 를붙여야합니다. 초보자뿐만아니라어느정도프로그램을많이한사람들도 ; 를빠트리는실수를합니다. 1 2 3 4 5 6 7 void loop() { digitalwrite(13, HIGH); delay(1000); digitalwrite(13, LOW); delay(1000); 1 2 3 4 5 void loop() { digitalwrite(13, HIGH); delay(1000); digitalwrite(13, LOW); delay(1000); 위의왼쪽과오른쪽은완벽하게같습니다. 때로는읽기에편하도록하기위해서 오른쪽처럼쓰기도합니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 43

2. 주석 a. 여러줄 주석 프로그램을하다보면설명을넣고싶은곳이있습니다. 설명은나중에다시이 프로그램을살펴볼때예전에했던일을왜이렇게했는지기록하는것입니다. /* 이렇게시작하고 */ 이렇게끝납니다. /* 과 */ 사이에있는모든것은눈에는 보이지만프로그램에서는없는것으로간주합니다. 즉, 주석은프로그램과아무런상관이없습니다. 오직주석은나중에소스를보는사람을위한설명입니다. 한달후에혹은일년후에내가만들었던소스를다시수정하거나비슷한다른프로그램을만들려고할때내가만들었지만생소한기분을느낍니다. 그럴때적어둔설명 ( 주석 ) 을보면서내가이부분을왜이렇게만들었는지다시알게해주는기능입니다. 1 2 3 4 5 /* */ 이곳은설명을위한주석입니다. 이곳에쓰는모든것은볼수는있지만 프로그램과는무관합니다. 44-3 장. 아두이노프로그램을위한쉬운 C 언어문법

b. 한줄 주석 간단하게한줄짜리설명을붙이고싶을때설명의앞에 // 를넣으면 // 이후에 줄의끝까지나오는모든것은주석이됩니다. /* */ 과는달리줄의끝부분이나혹은 한줄로설명할수있는간단한주석을달때사용됩니다. 1 // 이줄은한줄짜리설명입니다. /* LED_BLINK.ino 13 번핀에달린 LED 를 1 초간격으로점멸하는프로그램 digitalwrite() 와 delay() 함수를사용함 */ void loop() { digitalwrite(13, HIGH); delay(1000); digitalwrite(13, LOW); delay(1000); // 13번핀을 HIGH 상태로만든다 // 1초간딜레이를준다 // 13번핀을 LOW 상태로만든다 // 1초간딜레이를준다 void loop() { digitalwrite(13, HIGH); delay(1000); digitalwrite(13, LOW); delay(1000); 위의주석달린소스와아래에주석을제거한소스는아두이노에게는완벽하게동일하다. 단, 위의소스처럼주석을적절히적어놓으면나중에시간이지난뒤다시프로그램을수정하거나소스를사용할때도움이됩니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 45

3. 변수 변수라는것은 " 변할수있는수 " 로어떤값을저장할수있는공간을의미합니다. 이를테면빈박스와같습니다. 이박스에는사과도담을수있고, 배도담을수있습니다. 어떤박스는크기가작아서계란하나만담을수있습니다. 또어떤박스는플라스틱밀폐용기로되어있어서물을담을수있습니다. 변수는컴퓨터메모리에차지하는공간을의미합니다. 거기에작은숫자만저장할 수있는변수도있고, 큰숫자를저장할수있는변수도있습니다. 변수를쓰기위해서는먼저변수를쓰겠다고알려야합니다. 이걸 ' 선언 ' 이라고 하는데, 어려운용어를기억할필요는없습니다. int value; 이렇게 value 라는변수를쓰겠다고알리고만드는것이사용하는것보다먼저 있어야합니다. 46-3 장. 아두이노프로그램을위한쉬운 C 언어문법

int value; value = 13; 이렇게만들어진변수 value 에원하는값 13 을넣었습니다. 이제부터 value 라는 상자를들여다보면거기엔 13 이라는값이담겨있게됩니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 47

a. 변수 선언 변수선언은변수를쓰기전에반드시먼저해야합니다. int value; 처럼쓰기전에변수를만들어야합니다. int value = 120; 처럼변수를만들면서변수의값을넣어주어도됩니다. 변수의종류는 byte, char, int, long, float 외에도몇가지가더있습니다. char 은문자를다룰때, int 는정수형숫자를다룰때, long 은정수형숫자로큰수를다룰때, byte 는작은숫자로양수만다룰때, float 은실수형숫자를다룰때사용합니다. 변수의사용법은이후에다루도록하겠습니다. 48-3 장. 아두이노프로그램을위한쉬운 C 언어문법

b. 전역 변수, 지역 변수 위에서선언된변수는어디에있느냐에따라전역변수또는지역변수로다시 분류됩니다. 함수안에서만들어졌으며지역변수라고불리고그함수안에서만사용이 됩니다. 1 2 3 4 5 void func() { int i = 10; Serial.println(i); 그리고, 함수가끝나면지역변수는사라집니다. 위에서 func() 함수밖에서 i 를 사용하면에러가나옵니다. 반면, 전역변수는함수밖에서만들어집니다. 1 2 3 4 5 int i = 10; void func() { Serial.println(i); 함수가끝나도함수밖에서만들어진전역변수는계속남아있습니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 49

지역변수는함수안에서만사용되므로같은이름이다른함수안에서새롭게 만들어지고, 사용될수있습니다. 1 2 3 4 5 6 7 8 9 10 11 void func_i() { int i = 10; Serial.println(i); void func_j() { int i = 20; Serial.println(i); 전역변수는사용에주의해야합니다. 전역변수와지역변수가사용되는곳을알아봅시다. 1 2 3 4 5 6 7 8 9 10 11 int globalvalue; void setup(){ Serial.begin(9600); void loop(){ int b; for (int a=0; a<10; a++) { Serial.println(a); 50-3 장. 아두이노프로그램을위한쉬운 C 언어문법

전역변수인 globalvalue 는어디서나사용할수있습니다. 지역변수인 a 는 for 문안에서만사용할수있습니다. 역시또다른지역변수인 b 는 loop() 안에서만 사용할수있습니다. void loop(){ // 1 int b=10; // 2 for (int a=0; a<10; a++) { // 3 Serial.print("a="); // 4 Serial.println(a); // 5 // 6 Serial.print("a="); // 7 Serial.print(a); // 8 Serial.print(" b="); // 9 Serial.print(b); // 10 // 11 위의예제를실행하면 8번째줄에서에러가납니다. 변수 a 는 3번째줄, for 문에포함되어있습니다. for 문의 { 문단안에서만변수 a 는사용할수있습니다. 즉, 3번줄에서 6번줄을벗어나서는 a를쓸수없습니다. 억지로사용하려고하면에러를발생합니다. 여러함수안에서변수의값을읽거나쓰려면전역변수를사용하면됩니다. 물론그 방법말고도다른좋은방법이있습니다만여기서는전역변수를사용하는방법을 알려드립니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 51

int globalvalue; // 1 void setup(){ // 2 Serial.begin(9600); // 3 globalvalue = 10; // 4 // 5 void loop(){ // 6 int b=10; // 7 globalvalue++; // 8 Serial.print("globalvalue="); // 9 Serial.print(globalvalue); // 10 // 11 함수외부에서선언된전역변수 globalvalue 는어떤함수안에서도사용이가능합니 다. globalvalue 를 setup() 함수에서초기값을준뒤, loop() 함수에서반복될때마다 1 씩증가시켜보았습니다. 이처럼전역변수는여러함수에서읽고쓸수있습니다. 52-3 장. 아두이노프로그램을위한쉬운 C 언어문법

c. 변수의 종류 byte 변수는 0 부터 255 까지의정수숫자를저장할수있습니다. byte byte 변수는 1 개의바이트를사용합니다. 1 바이트는 8 개의비트의 모음입니다. 일반적으로아두이노같은마이크로프로세서는 8 비트, 즉 1바이트를기본단위로합니다. 1비트는전기가흐르거나흐르지않는하나의정보를보관할수있는장소입니다. 1 비트는 0 또는 1을보관할수있는공간입니다. 정보가보관된곳을 1로표시하고비어있는것을 0으로표시하면다음과같습니다. 이진수 십진수 계산 0000 0000 0 = 0 2 7 + 0 2 6 + 0 2 5 + 0 2 4 + 0 2 3 + 0 2 2 + 0 2 1 + 0 2 0 0000 0001 1 = 0 2 7 + 0 2 6 + 0 2 5 + 0 2 4 + 0 2 3 + 0 2 2 + 0 2 1 + 1 2 0 0000 0010 2 = 0 2 7 + 0 2 6 + 0 2 5 + 0 2 4 + 0 2 3 + 0 2 2 + 1 2 1 + 0 2 0 0000 0011 3 = 0 2 7 + 0 2 6 + 0 2 5 + 0 2 4 + 0 2 3 + 0 2 2 + 1 2 1 + 1 2 0 0000 0100 4 = 0 2 7 + 0 2 6 + 0 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 0 2 0 1111 1101 253 = 1 2 7 + 1 2 6 + 1 2 5 + 1 2 4 + 1 2 3 + 1 2 2 + 0 2 1 + 1 2 0 1111 1110 254 = 1 2 7 + 1 2 6 + 1 2 5 + 1 2 4 + 1 2 3 + 1 2 2 + 1 2 1 + 0 2 0 1111 1111 255 = 1 2 7 + 1 2 6 + 1 2 5 + 1 2 4 + 1 2 3 + 1 2 2 + 1 2 1 + 1 2 0 8 개의방, 비트를가지고셀수있는수는 0 부터 255 까지총 256 개가됩니다. byte 변수를만들때다음과같이씁니다. byte sample = 125; 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 53

byte 변수는최대 255 까지담을수있습니다. 여기에 255 가넘는수가들어오면 다시 0 부터시작됩니다. byte sample = 255; sample = sample + 1; // 1111 1111 // 1111 1111 + 1 // 1 0000 0000 이되고, 아래 8 개의비트만변수에저장 // sample 변수에 0000 0000 이저장 byte sample = 0; while(1) { sample++; Serial.println(sample); 위내용을실행시키면 0 부터 255 까지화면에나오고다시 0 부터재시작됩니다. sample 라는변수가 byte 변수여서 8 비트의저장공간을가지고있기때문에그이상의 비트는버려지게됩니다. 54-3 장. 아두이노프로그램을위한쉬운 C 언어문법

char 변수는키보드에나와있는문자나숫자하나를저장할수 char 있습니다. 단, 한글을저장할수는없습니다. 문자나숫자를저장할 때 ' ' 를사용합니다. 8 비트, 한바이트짜리저장공간을 사용합니다. 숫자저장할때는 127 에서 -128 까지저장할수 있습니다. byte 와 char 는동일한저장공간크기인 1바이트를가집니다. 단 byte 는부호를가지지않아서 0부터 255까지사용하지만 char 은첫번째비트를부호로사용하기때문에 7비트로표시가능한 0부터 127까지사용합니다. 그리고첫비트가 1일때는음수를표시합니다. -1부터 128 까지가능합니다. void setup(){ Serial.begin(9600); void loop(){ char sample = 'A'; Serial.println(sample); char sample = 'A'; char sample = 65; 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 55

이진수 십진수 계산 XXXX XXXX -128~127 X는 0 또는 1 = X 2 7 + X 2 6 + X 2 5 + X 2 4 + X 2 3 + X 2 2 + X 2 1 + X 2 0 이진수 십진수 이진수 십진수 0000 0000 0 1000 0000-128 0000 0001 1 1000 0001-127 0000 0010 2 1000 0010-126 0000 0011 3 1000 0011-125 0000 0100 4 1000 0100-124 0111 1101 125 1111 1101-3 0111 1110 126 1111 1110-2 0111 1111 127 1111 1111-1 56-3 장. 아두이노프로그램을위한쉬운 C 언어문법

TIP [2 진수와음수를나타내기위한 2 의보수 ] 전 있습니다. 기의흐름, 즉비트의 0 과 1 로만숫자를나타낼수있는이진수로디지털에서숫자를 처리합니다. 2 진수는각자리수마다다음과같은방식으로수를셉니다. 8 비트이진수는 0000 0000 부터 1111 1111 까지입니다. 이진수는다음과같이 10 진수로바꿀수 이진수 : XXXX XXXX = X 2 7 + X 2 6 + X 2 5 + X 2 4 + X 2 3 + X 2 2 + X 2 1 + X 2 0 (X 는 0 또는 1) 일반적으로음수는숫자의앞에 - 표시를붙입니다. 하지만디지털이진수에서음수를표현하는방법은조금특별합니다. 음수를표시하기위해 2의보수 라는것을사용합니다. 1 과 1을더하면 0이됩니다. 이것을이용해서 1과더해서 0이되는수를찾으면됩니다. 1은아두이노에서이진수로표현할때 B 0000 0001 이됩니다. 이진수 00000001 에서계속증가하면최종적으로 11111111 까지됩니다. 11111111 에서 1이증가하면 (1)00000000 이됩니다. 여기서 8비트를넘어선 9비트째인 1은버리고, 아래쪽 8개의비트만남게되어 00000000 즉, 0이됩니다. 다시말해서 B11111111 에 1을더하면 0이됩니다. 그래서 1의대한음수표현인 1은디지털이진수에서 11111111 이됩니다. 0000 0001 과 1111 1111 을더하면 1 0000 0000 즉, 0 이됩니다. -1 은 1111 1111 입니다. 0000 0010 과 1111 1110 을더하면 1 0000 0000 즉, 0 이됩니다. -2 는 1111 1110 입니다. 0000 1111 과 1111 0001 을더하면 1 0000 0000 즉, 0 이됩니다. -15 는 1111 0001 입니다. 2 의보수를이용한음수표현은이진수에서 1 과 0 을서로바꾼다음 1 을더하면됩니다. -1을표현해보겠습니다. 1은 0000 0001입니다. 여기서 0과 1을바꾸면 1111 1110 이됩니다. 여기에 1을더하면최종적으로 1111 1111 이됩니다. -12를표현해보겠습니다. 12의이진수는 0000 1100입니다. 0과 1을바꾸면 1111 0011 이됩니다. 여기에 1을더해서만들어진 1111 0100 이 12입니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 57

int 변수는 16 비트, 2 바이트를사용합니다. int 변수가표현할수 int 있는숫자는 -32,768 부터 32,765 까지의정수숫자입니다. 일반적으로아두이노에서정수숫자를사용할때가장많이 사용하는변수입니다. int sample = 10000; long 변수는 4 바이트를사용합니다. lng 변수로표현할수있는 long 정수는 -2,147,483,648 부터 2,147,483,647 까지의정수입니다. int 로표현할수있는숫자보다더큰숫자를사용할때 long 변수를사용합니다. int sample = 214748364; int sample = 21474 * 9876; float 변수는 -3.4028235E+38 부터 3.4028235E+38 까지의실수 float 숫자를저장합니다. float 변수는 4 바이트를사용합니다. 단아두이노에서실수연산은속도가많이느려지게됩니다. 그리고실수연산은정확도가많이떨어집니다. 가능하면 float 같은 58-3 장. 아두이노프로그램을위한쉬운 C 언어문법

실수변수를사용하지않는것이좋습니다. float 변수는총 32비트중부호 1비트, 지수부 8비트, 가수부 23비트를사용합니다. 그래서십진수로따지면 7자리숫자가유효숫자가됩니다. float 변수는 -3.4028235 10 38 ~ 3.4028235 10 38 사이의숫자를표현할수있습니다. float sample = 3.1415; 엄밀하게는변수는아니지만아두이노에서 String 은마치 String 문자열을저장하고읽는일을하는변수처럼사용됩니다. void setup(){ Serial.begin(9600); void loop(){ String sample = "Remember 0416"; Serial.print(sample); 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 59

4. 연산 a. "=" 의 의미 수학에서 "=" 은보통좌변과우변이같다는것을의미합니다. 하지만프로그램에서 "=" 는오른쪽에있는값을왼쪽으로넣으라는명령입니다. x = x + 10; x 에 10 을더한다음그값을 x 에저장합니다. 그러면 x 라는저장공간, 변수는 처음값보다 10 이커진값으로바뀝니다. 이것을더간단하게이렇게쓸수있습니다. x += 10; 자주사용하는 1 을더하는것과 1 을빼는것은 ++, -- 를사용합니다. x = x + 1; x++; 위의두줄은같은의미입니다. 60-3 장. 아두이노프로그램을위한쉬운 C 언어문법

b. 기본 수학연산 +, -, *, /, % 이렇게다섯가지기본수학연산이가능합니다. + : 더하기 - : 빼기 * : 곱하기 / : 나누기 % : 나머지 위의 = 과결합하여다음과같이사용할수있습니다. result = result + a; result = result - a; result = result * a; result = result / a; result = result % a; result += a; result -= a; result *= a; result /= a; result %= a; 변수 result 에 a 를더해서저장합니다변수 result 에 a 를빼서저장합니다변수 result 에 a 를곱해서저장합니다변수 result 를 a 로나누고저장합니다변수 result 를 a 로나눈나머지를저장합니다 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 61

c. 비교 크거나작거나같거나를가지고참과거짓을판별한다. x == y // x 가 y 와같다. 만약 x 와 y 가같은값이라면이결과는 " 진실 " 이되고, x 와 y 가다른값이라면 이결과는 " 거짓 " 이된다. 이외에다음과같은비교가가능하다. x > y // x 가 y 보다크다. x >= y // x 가 y 보다크거나같다. x < y // x 가 y 보다작다. x <= y // x 가 y 보다작거나같다. x!= y // x 와 y 가다르다. 62-3 장. 아두이노프로그램을위한쉬운 C 언어문법

d. 논리 비교와함께자주사용된다. if ( (x > 0) && (x < 10) ) // x 가 0 보다크다그리고 x 가 10 보다작다 && : 논리곱, 오른쪽과왼쪽이모두참일때결과는참이된다. : 논리합, 오른쪽또는왼쪽, 둘중하나라도참이면결과는참이다.! : 부정, 참이면거짓이, 거짓이면참이된다. ( x>0 && x<5 ) // x 가 0 와 5 사이일때참 ( x>10 x <5 ) // x 가 10 보다크거나 5 보다작을때참 (!x ) // x 가참이면거짓이, 거짓이면참이된다. 비교 와 논리 는보통조건문과함께사용된다. if 또는 for 문등과함께 사용된다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 63

5. 상수 변수와달리상수는항상그대로있는수를말합니다. 보통변해서는안돼는수를 미리지정해두는식으로사용됩니다. #define SIZE 1024 #define 문을사용, 프로그램의가장앞부분에서사용할수있습니다. 보통은가장 많이사용되는방법입니다. 또는 const 변수를사용할수있습니다. 기존의변수앞에 const 를추가하면그 변수는읽을수는있지만쓸수없는상수가됩니다. const int SIZE 1024; 이렇게 const 를붙여서만들수도있습니다. 보통상수는변수와다르다는것을나타내기위해이름을대문자로사용합니다. SIZE 라는변수는상수 1024를저장합니다. 그리고 SIZE 는읽을수만있지쓸수는없습니다. 즉, 값이 1024 는변경되지않는값입니다. 변수대신상수를이용해서프로그램을하는이유는실수로상수를다른값으로변경시키는것을방지하기위해서입니다. 함께프로그램을하는다른사람일수도있고, 혹은어떤함수에서변수를이용하면서값을변경시킬수도있습니다. 이러한실수를미연에방지하기위해변수대신상수를사용합니다. 64-3 장. 아두이노프로그램을위한쉬운 C 언어문법

6. 참과 거짓 (a == 12) 는 a 의값을읽어와서그것이 12 인지를비교해봅니다. 12 라면참을 12 가아니라면거짓을보냅니다. 참은 1 이되고, 거짓은 0 이됩니다. if ( a == 12 ) { 할일 ; a 가 12 일때 (a==12) 는참 (1) 이되고, 그래서 " 할일 " 을하게됩니다. if ( a == 12 ) { Serial.println( Great! A=12 ); 프로그램안에위코드를넣어주면 a 값이 12 가될때화면에 Great! A=12 라는문구를보여줍니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 65

7. HIGH / LOW 아두이노에서 HIGH 는 1 을의미하고이는 ON 또는 5V 나 3.3V 의전원이들어가는것을의미합니다. 반대로 LOW 는 0 을의미하고, OFF 나 0V 즉, GND 에연결되었다는것을뜻합니다. 즉, 1 대신 HIGH를사용하고 0 대신 LOW를사용할수있습니다. digitalwrite(13, HIGH); // 13 번핀에서 5V( 또는 3.3V) 를내보냅니다. digitalwrite(13, LOW); // 13 번핀이 GND(0V) 에연결됩니다. digitalwrite(13, 1); // 13 번핀에서 5V( 또는 3.3V) 를내보냅니다. digitalwrite(13, 0); // 13 번핀이 GND(0V) 에연결됩니다. 위의예에서보듯이 HIGH 와 1 은동일하고 LOW 와 0 도동일합니다. 1 과 0 대신 HIGH 와 LOW 를써서이유는사람이보기쉽게알아볼수있도록합니다. 66-3 장. 아두이노프로그램을위한쉬운 C 언어문법

8. if 조건문 a. if 문 if 조건문은조건이참일때만실행합니다. if (a==13) // 조건부분 { // 조건이참이면이부분을실행합니다. int condition =0; // 전역변수를만들고값을 0으로만든다. void setup(){ Serial.begin(9600); void loop(){ condition ++; // 전역변수의값을 1 증가 if ((condition % 5)==0) { // 전역변수를 5로나눈나머지가 0일때만아래조건실행 Serial.print("condition = "); Serial.println(condition); // 값을화면에프린트 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 67

b. if, else 문 if 문과함께조건이거짓일때만실행되는 else 도있습니다. if ( 조건 ) { // 조건이참일때실행 else { // 조건이거짓일때실행 나머지연산자를사용해서 13 번 LED 를켜고끄는프로그램을예로들어보겠습니다. 68-3 장. 아두이노프로그램을위한쉬운 C 언어문법

1int condition =0; 2 void setup(){ 3 Serial.begin(9600); 4 pinmode(13, OUTPUT); 5 6 7 8 9 10 11 12 13 14 void loop(){ condition ++; if ((condition % 10) >4) { digitalwrite(13,high); Serial.println("LED ON"); delay(100); else { digitalwrite(13,low); Serial.println("LED OFF"); delay(100); if 와 else if 를사용해서 [ 만약 ~ 이면 ]... [ 그렇지않고만약 ~ 이면 ]... 의구문을 만들수있습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 if (inputvalue <=500) { 첫번째조건을만족할때할일들 ; else if (inputvalue > 1000) { 두번째조건을만족할때할일들 ; else { 첫번째, 두번째조건을모두만족시키지못할때할일들 ; 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 69

9. for 반복문 다음과같은구문으로일정횟수만큼명령을반복합니다. for ( 초기화 ; 조건 ; 증감표현 ) { 반복할일들 ; 초기화는변수를만들어서초기화시킬수도있고, 외부에서만들어진변수를사용할수도있습니다. 조건은변수를사용해서조건에맞을때만아래블록안에있는내용을실행합니다. 증감표현은블록안의내용을끝까지실행시킨다음실행됩니다. 실행순서는다음과같습니다. 초기화 조건 참이면 A 로, 거짓이면 B 로 A : 반복할일들수행 B : 블럭외부로나감 증감표현 조건 으로돌아감 70-3 장. 아두이노프로그램을위한쉬운 C 언어문법

아두이노 13 번핀에에붙어있는 LED 를 20 번반복해서깜박이는프로그램을 짜보면다음과같습니다. 1 2 3 4 5 6 7 8 for (int i = 0; i<20 ; i++) { digitalwrite(13, HIGH); delay(500); digitalwrite(13, LOW); delay(500); 위의 for 문을포함한아두이노전체코드는다음과같습니다. 1 2 3 4 5 6 7 8 9 10 11 12 void setup(){ pinmode(13, OUTPUT); for (int i =0; i<20 ; i++) { digitalwrite(13, HIGH); delay(500); digitalwrite(13, LOW); delay(500); void loop(){ loop() 을쓰지않고 setup() 에넣어 20 번만반복하게프로그램했습니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 71

10. while 반복문 a. while 문 while 반복문은조건이만족되는한무한히반복됩니다. while ( i > 3 ) { 명령문 1; 명령문 2; 명령문 3; 변수 i 가 3 보다크면 { 내부의명령문 1,2,3 이반복적으로실행됩니다. 명령문 3 이실행된다음 ( i > 3 ) 의조건을만족하는지판단한후만족하면다시 명령문 1 부터실행됩니다. ( i > 3 ) 이거짓이라면 while 문블록을벗어납니다. 72-3 장. 아두이노프로그램을위한쉬운 C 언어문법

b. do, while 문 while ( 조건 ) { 명령문 ; 위와같은 while 문은조건이거짓이면블럭내부의명령문은한번도실행되지 않습니다. 명령문을최소한한번실행시키기위해서조건을뒤로보내는 do... while ( 조건 ) 이있습니다. do { 명령문 ; while( 조건 ); 아날로그센서의값을읽은뒤 x 가 100 보다작으면계속해서센서를읽게하는 예제는다음과같습니다. 1 2 3 4 5 do { x = readsensors(); // 센서값을읽어서 x 에저장한다. delay(50); // 50ms 동안기다린다. while(x<100); // x 가 100 보다작으면반복한다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 73

11. 아두이노 내부 함수들 a. INPUT / OUTPUT 아두이노는핀을통해외부에서아두이노안으로신호가들어올수도있고, 아두이노에서바깥으로신호가나갈수도있습니다. 들어오도록할때 INPUT 을쓰고, 나가도록할때 OUTPUT 을씁니다. INPUT 과 OUTPUT 은 pinmode() 라는함수에서각핀의번호와연결되어서입력으로사용할지, 출력으로사용할지를결정할때사용됩니다. pinmode(13, OUTPUT); // 13 번핀을 OUTPUT ( 출력 ) 으로사용합니다. 74-3 장. 아두이노프로그램을위한쉬운 C 언어문법

b. pinmode(pin, mode) void setup() 안에서특정핀의입력과출력을지정하기위해사용됩니다. pinmode(13, OUTPUT); // 13 번핀을출력으로지정한다. pinmode(12, INPUT); // 12 번핀을입력으로지정한다. pinmode(11, INPUT_PULLUP); // 11 번핀을입력으로지정한다. 풀업된다. 여기서풀업, INPUT_PULLUP 의의미는내부적으로 20kΩ 저항이핀과 VCC (5V) 사이에들어간다는것을의미합니다. OUTPUT 으로지정해서출력으로만들었을때핀은최대 40mA 까지전류를흘려보낼수있습니다. 이전류는 LED 를밝게하기에는충분하지만릴레이나모터등을작동시키기에는부족합니다. 외부장치와출력핀이바로연결된때과도한전류가흐르게되면아두이노의 ATMEGA MCU가손상될수있습니다. OUTPUT 으로지정된핀에는일반적으로 360 Ω 에서 1 kω 정도의저항을직렬로연결해주는것이좋습니다. V = I x R 5(V) = I(A) x 360(Ω) I = 5/360 = 14mA 전압, 전류, 저항의관계를 오옴의 법칙 이라고합니다. 오옴의법칙에서전압은전류와저항의곱으로나타납니다. 5V 의전압이걸린곳에 360Ω 저항을달면전류는왼쪽의공식에따라 0.014A 즉, 14mA 가나옵니다. 이정도면 LED 의불을켜서전기가흐르는지, 신호가들어오는지확인하기에는적당합니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 75

c. digitalread( 핀 ) 아두이노입력으로설정된핀의디지털값을읽습니다. 일반적으로핀에걸린전압이 VCC 이면 1 을, GND 이면 0 을반환합니다. value = digitalread(12); // 12 번핀을읽어서 value 변수에저장 단, digitalread() 를쓰기전에 pinmode() 를사용해서핀의출력을설정해 두어야합니다. pinmode(12, INPUT); value = digitalread(12); // 12 번핀을읽어서 value 변수에저장 // value 에는 0 또는 1 이저장됨 76-3 장. 아두이노프로그램을위한쉬운 C 언어문법

d. digitalwrite( 핀, 값 ) 아두이노출력핀에정해진값을출력합니다. 값은 0 과 1 둘중의하나입니다. digitalwrite(11, 1); // 11 번핀에 1(+5V) 을출력한다. // 이것을다음으로쓸수있다. digitalwrite(11, HIGH); // HIGH 는 1 과같고, LOW 는 0 과같다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 77

e. analogread( 핀 ) 아날로그값을읽습니다. value = analogread(a0); // 핀 A0 에연결된값을읽어온다. // value 에저장되는값은최소 0 에서최대 1023 사이정수이다. 아두이노에서아날로그값을읽는것은 0V 에서 5V 사이의어떤전압값을읽는것입니다. 아두이노는 10 개의비트로값을분해합니다. 10개의비트는 2 의 10 승을의미하고이는총 1024 가됩니다. 즉, 최소값은 0 이고최대값은 1023 이됩니다. 아두이노아날로그입력을받을때주의할것은아날로그입력핀에들어오는전압이 0V에서 5V 사이가되어야합니다. 이값을벗어난전압이들어올경우아두이노내부회로가망가질수있습니다. 0 0 0 0 0 0 0 0 0 0 = 0 0 0 0 0 0 0 0 0 0 1 = 1 0 0 0 0 0 0 0 0 1 0 = 2... 1 1 1 1 1 1 1 1 1 0 = 1022 1 1 1 1 1 1 1 1 1 1 = 1023 2 10 = 1024 ADC 라고불리는아날로그 -디지탈변환장치는변환시킬수있는정도와시간에따라분류됩니다. 변환시킬수있는정도를보통비트 (bits) 로표시하고, 변환에걸리는시간을 Hz 로표시합니다. 아두이노 ADC 샘플링시간은다른작업에걸리는시간을모두최소화할때 9kHz 정도가됩니다. 1초에 9,000번까지가능합니다. ADC 10 비트는총 1024 ( 1000) 단계로입력된아날로그값을변환합니다. 이경우 0.0048828V( 0.005V) 즉, 4.89mV 단계로입력되어지는전압값을구별할수있습니다. 78-3 장. 아두이노프로그램을위한쉬운 C 언어문법

TIP ADC 를거친후아두이노에서받는값 실제아날로그값 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 79

TIP 실 0.20199859, 등셀수없는많은값이존재합니다. 그러한 제아날로그값은 0 과 1 사이를무한히나눌 수있습니다. 0V 와 1V 사이는무수히많은 값들이있습니다. 0.1, 0.2, 0.2012549, 값을모두읽어들일수있으면좋겠지요. 하지만실제로측정할수있는방법이없습니다. 읽을수있는가능한범위가있을뿐입니다. 아두이노에있는 ATMEL 칩은 10 비트단위의정밀도를가지고아날로그값을디지털로변환합니다. 즉, 위에있는그래프처럼아날로그는 1V 와 1.005V 사이에무한한연속적인값을가집니다. 하지만아두이노에서는 1V 와 1.005V 사이에는다른값이없습니다. 입력되는아날로그값이 1V 와 1.005V 사이라면아두이노에서인식되는값은 1V 가됩니다. 그다음단계인 1.005V 와 1.010V 사이의아날로그값이입력되면아두이노에서인식되는값은 1.005V 가됩니다. 이렇게총 1024 단계 (=2 10 ) 를가집니다. 아두이노보드와연결해서사용할수있는 16비트 ADC 보드입니다. 16비트로 ADC를사용하기때문에 2의 16승인 65536 단계로나눠집니다. 아두이노가 1024 단계였던것과비교하면 64배 (=2 6 ) 큰것입니다. 80-3 장. 아두이노프로그램을위한쉬운 C 언어문법

f. analogwrite( 핀, 값 ) 핀에아날로그값을씁니다. 이때핀은 pwm 출력이가능한핀만가능합니다. pwm 은보드에서번호옆에 ~ 표시가있는핀만사용할수있습니다. UNO 의경우 3,5,6,9,10,11 핀이 pwm 이가능하고, analogwrite() 로값을쓸수있습니다. analogwrite(3,127); // 아날로그출력핀 3 번에 127 의값인 2.5V 를출력 쓸수있는값은 0 부터 255 까지로분해능이 8 비트입니다. 최대 256 단계까지 가능합니다. pwm 은 2ms 의시간안에서 256 단계로나누어일부는 1 을, 나머지는 0 을출력하는방식입니다. 이것을 2ms 의주기로반복합니다. PWM 이란 Pulse Width Modulation 의약자로펄스의폭을조절하는것입니다. 아두이노에서는 2ms 즉, 0.002 초안에서 ON 과 OFF를나눠서나가는출력을조절합니다. 그래서엄밀하게는 Digital Analog Converter 가아니지만모터를제어하거나온도를제어하거나 LED 의빛의세기를제어할때는 PWM을 DAC 로사용할수있습니다. 아두이노보드에있는핀번호옆에물결 (~) 표시가있는핀이 PWM 출력이가능한핀입니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 81

g. delay( 시간 ) delay 는주어진시간만큼아무것도하지않고기다립니다. 시간의단위는 ms 이고, 1000ms 는 1 초가됩니다. delay(1000); // 1000ms 즉 1 초동안기다림 delay() 함수를쓸경우주의할점은함수실행중인시간동안다른작업을하지못한다는것입니다. 만약스위치입력을받아야한다면 delay() 함수의사용을잘고려해서써야합니다. delay() 되는시간에스위치작동을시키면아두이노에서는스위치입력을인식하지못할수도있습니다. 82-3 장. 아두이노프로그램을위한쉬운 C 언어문법

h. millis() 현재시간을반환합니다. 현재시간은아두이노에전원이들어온뒤로흐른시간을 의미합니다. 시간의단위는 ms 입니다. milis() 함수를사용해서시간을저장할때는 unsigned long 타입의변수를사용합니다. unsigned long value; value = milis(); milis() 함수를사용해서아두이노가중간에정지하지않는 delay(1000) 을만들수 있습니다. 아래소스를분석해보시면 delay() 를사용하지않고도동일한효과를내는 방법을알수있습니다. 1 2 3 4 5 6 7 8 unsigned long previousmillis = 0; unsigned long currentmillis = millis(); if (currentmillis - previousmillis >= 1000) { previousmillis = currentmillis; if (ledstate == LOW) { ledstate = HIGH; else { ledstate = LOW; 소스분석은이책에서다루고자하는범위를넘어섭니다. 따로홈페이지에 올려두겠습니다. 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 83

12. 다양한 수학 함수들 mix(x,y) : 둘중작은수를반환한다. max(x,y) : 둘중큰수를반환한다. randomseed(value) : random() 함수의시작지점을결정할때사용합니다. 보통 value 로오픈된상태의 analogread() 값을사용합니다. random(max); 0 과 max 사이의값중하나를무작위로만든다. random(min,max); min 과 max 사이의값중하나를무작위로만든다. int number; randomseed(analogread(a0)); // random() 초기화 number = random(1000); // 0 과 1000 사이의값을무작위 (random) 로만듭니다. number = random(50,200); // 50 과 200 사이의값을무작위 (random) 로만듭니다. analogread(a0) 는 A0 핀에들어오는아날로그값 (0V ~ 5V) 입니다. A0 에아무것 도연결하지않은상태에서무작위의값이들어오면그값으로 random() 함수를초 기화시킵니다. 84-3 장. 아두이노프로그램을위한쉬운 C 언어문법

13. 디버깅 Serial.begin(rate) : setup() 함수의내부에시리얼통신속도를설정합니다. void setup() { Serial.begin(9600); // 속도는 9600 Serial.print(data) : 데이터를시리얼포트로전송합니다. 일반적으로 아두이노보드에있는어떤값 ( 문자열 ) 을 PC 쪽으로보낼때사용합니다. Serial.println() 은 Serial.print() 를보낸후마지막에줄바꿈신호를 덧불입니다. 즉, Serial.println() 을쓰면문자를시리얼통신창에쓴다음줄을바꾸고 새줄의첫번째칸으로커서가이동한다. void setup(){ Serial.begin(9600); // 속도는 9600 void loop(){ Serial.print(analogValue); // analogvalue 에들어있는값을시리얼통신전송 Serial.println(" 전송하는문자열 "); // 문자열을시리얼통신으로전송 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 85

아두이노같은 MCU를프로그램할때는프로그램이제대로되었는지아닌지확인할필요가있습니다. 이런확인작업을 디버깅 한다고말합니다. JTAG 와같은디버깅에사용되는용어와장비들이있습니다. 하지만이러한장비들과프로그램은매우가격이비쌉니다. 오른쪽사진은 STM32 시리즈 MCU 에사용된는디버깅장비입니다. 그래서프로그램초기에하던방식으로매우간단하면서저렴한방식을아두이노에서채택했습니다. 그것이시리얼통신을이용한모니터링방식입니다. 물론 JTAG 등의전문적인장비나프로그램을가지고프로그램하는것과비교하면매우성능도낮습니다. 하지만가격이따로발생하지않기때문에아두이노와같은복잡하지않은프로그램에서사용하기는적당합니다. 아두이노는 Serial.print(), Serial.println() 같은문자열을화면에보여주는함수를사용해서필요한정보를 PC 에보낼수있습니다. 이렇게전달되는정보를화면으로보며어디까지실행되었는지를확인할수있습니다. 일반적으로특별한변수의값을보여주거나혹은어떤부분이실행이되었는지아닌지의여부를보여주는용도로사용됩니다. 86-3 장. 아두이노프로그램을위한쉬운 C 언어문법

int pushbutton =2; void setup() { Serial.begin(9600); pinmode(pushbutton, INPUT_PULLUP); pinmode(13, OUTPUT); void loop() { int buttonstate = digitalread(pushbutton); Serial.print("buttonState = "); Serial.println(buttonState); if (buttonstate) { digitalwrite(13, HIGH); Serial.println("Push SW ON"); else { digitalwrite(13, LOW); Serial.println("Push SW OFF"); delay(1); Serial.begin(9600); 으로 PC 와 RS232 시리얼통신을할수있도록합니다. Serial.print("buttonState = "); Serial.println(buttonState); buttonstate 값을화면에보여줍니다. buttonstate 가 1 이면 Serial.println("Push SW ON"); 를실행, 화면에 Push SW ON 을보여줍니다. buttonstate 가 0 이면 Serial.println("Push SW OFF"); 를실행, 화면에 Push SW OFF 을보여줍니다. 디버깅을위해서 Serial.println() 등의함수를쓸때는프로그램의실행순서를머릿속으로따라가면서의심이 드는장소에사용합니다. >> 혹시버튼에이상이있지않을까? >> buttonstate 값을출력해서확인합니다. 버튼이고장이거나선이단선 ( 겉으로는연결되었지만 속은끊어진상태 ) 되었거나혹은연결이잘안되어있는지등을확인할수있습니다. >> 혹시 LED 가고장인가? >> buttonstate 가 1 이어서 Push SW ON 이화면에나왔는데 LED 가켜지지않는다면 LED 이상이거나연결된저항에문제가있거나전선연결에문제가있는등의다양한문제를점검해봐야합니다. >> if 조건문작동은잘되는가? >> buttonstate 값에따라서 if 와 else 구문이제대로작동하고있는가? 3 장. 아두이노프로그램을위한쉬운 C 언어문법 - 87

4 장. 아두이노 프로그램 기본구조 1. 디지털출력 아두이노의가장기초프로그램으로핀하나의출력을 ON 또는 OFF 로합니다. 13번핀을출력으로설정하고 1초간격으로 ON 과 OFF 를반복합니다. 1 2 3 4 5 6 7 8 9 10 int ledpin = 13; void setup() { pinmode(ledpin, OUTPUT); void loop(){ digitalwrite(ledpin, HIGH); delay(1000); digitalwrite(ledpin, LOW); delay(1000); 88-4 장. 아두이노프로그램기본구조

2. 디지털입력 디지털핀 2번을입력으로설정하고스위치를연결합니다. 연결된스위치가 ON 일때 13번 LED 가 1초간격으로깜박이게합니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 int ledpin = 13; int switchpin = 2; void setup(){ pinmode(ledpin, OUTPUT); pinmode(switchpin, INPUT); void loop(){ if (digitalread(switchpin)==high){ digitalwrite(ledpin, HIGH); delay(1000); digitalwrite(ledpin, LOW); delay(1000); 4 장. 아두이노프로그램기본구조 - 89

3. 대전류 출력 40mA 이상의출력이필요하면 MOSFET 등을사용합니다. DC 모터는회전하다정지할때역기전력이발생합니다. 역기전력을상쇄시키기위해역방향으로다이오드를부착합니다. IRF510 을사용한 DC 모터사용예제는다음과같습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 int outpin = 5; void setup(){ pinmode(outpin, OUTPUT); void loop(){ for (int i=0; i<=5; i++) { digitalwrite(outpin, HIGH); delay(250); digitalwrite(outpin, LOW); delay(250); delay(1000); 90-4 장. 아두이노프로그램기본구조

4. PWM 출력 디지탈출력의경우 OFF 인 0 과 ON 인 1 로구분됩니다. OFF 는전압이 0V 인 경우를나타내고 ON 은 1 2 3 4 5 6 7 8 9 10 11 int ledpin = 9; void setup() { void loop(){ for (int i=9; i<=255; i++) { analogwrite(ledpin, i); delay(100); for (int i=255; i>=0; i--) { analogwrite(ledpin, i); delay(100); 들어오는전압 VCC 가나가는것을의미합니다. PWM 은짧은시간속에 ON 과 OFF 를반복하는것입니다. 아두이노에서 PWM은 2ms 주기신호안에 ON 과 OFF 를일정비율로넣습니다. PWM 출력에는 analogwrite() 함수를사용합니다. 예제는 PWM 으로 LED 의 불빛의밝기를조절한것입니다. PWM 출력이가능한핀은아두이노보드의핀번호 옆에물결표시 (~) 로표시되어있습니다. 4 장. 아두이노프로그램기본구조 - 91

5. 아날로그값 입력받기 1 2 3 4 5 6 7 8 9 10 11 12 int potpin = A0; int ledpin = 13; void setup(){ pinmode(ledpin, OUTPUT); void loop(){ digitalwrite(ledpin, HIGH); delay(analogread(potpin)); digitalwrite(ledpin, LOW); delay(analogread(potpin)); 아두이노에는아날로그값을읽어들이는 ADC가있습니다. ADC는아날로그값을디지탈로변환해서그값을읽어들입니다. 0V 에서기준전압까지를총 1024 단계로나누어그단계값을계산합니다. analogread() 함수를사용하여가변저항을 +5V 와 GND(0V) 사이에연결하고그중간부분에위치한전압값을읽어들입니다. 92-4 장. 아두이노프로그램기본구조

5 장. 하드웨어 연결 아 두이노와같은 MCU 는 PC 프로그램과달리입력과출력을특징지워 주어야합니다. 쉽게말해서 PC 는키보드와마우스라는입력장치가 기본적으로달려있습니다. 출력도모니터와프린터라는출력장치가 있습니다. 이렇게기본입력장치와출력장치가이미붙어있기때문에 PC 프로그램을 하는사람들은입, 출력장치에대해서크게신경을쓰지않습니다. 대부분 OS 수준에서 알아서입, 출력장치가처리가됩니다. 하지만아두이노같은 MCU 는입력과출력을잘지정해주어야합니다. 이를테면스위치를붙인다고하더라도디지털 13번에붙일것인지, 디지털 2번에붙일것인지, 아니면디지털핀이모자라서아날로그입력으로주로사용되는 A0 에붙일것인지를결정하고, 그에따라서스위치와센서등을아두이노와제대로연결해주어야합니다. 센서나모터등을연결할때주의할것을몇가지이장에서는알려드리도록 하겠습니다. 5 장. 하드웨어연결 - 93

1. 센서 연결 입력장치인센서를연결할때주의할점은다음과같습니다. 아두이노와 센서의 GND 를 연결합니다. 센서에서나오는값이아두이노로들어가야합니다. 그러기위해서아두이노와센서는동일한전압기준을가져야합니다. 이것을 GND 라고이름을붙입니다. 그리고대부분의경우 GND 는 0V 가됩니다. 센서가제대로동작하기위해서센서에전원즉, 전기가들어가야합니다. 아두이노에사용되는대부분의센서는 5V 전원을필요로합니다. 아두이노에서나오는 5V를사용하거나혹은다른 SMPS 에서 5V를만들어서사용해도됩니다. 그리고센서와아두이노의 GND 는서로연결해둡니다. 그리고센서에서나오는값과센서의핀, 아두이노에연결되어들어가는핀을꼭확인해둡시다. 종종다른사람이짠프로그램을그대로적용시키면서하드웨어는고치지않아서프로그램이잘못된것같다고소스코드만질문게시판에올리는초보자들이있습니다. 꼭기억하세요. 하드웨어연결상태를확인하지않고소스코드만고쳐달라고해서는안됩니다. 아두이노는하드웨어와프로그램소스모두가중요합니다. 94-5 장. 하드웨어연결

2. 출력 연결 작은 전류만 허용되는 출력 일 반적으로가장많이사용되는 LED 연결을예로들어보겠습니다. LED 는 위에서언급했듯이 20mA 정도의전류를흐르게하는것이적절합니다. 그보다많으면 LED 가고장날수있습니다. 너무적은전류는빛이 약해서켜진상태인지꺼진상태인지잘분간이안될수도있습니다. LED 와같이작은전류만허용되는출력을사용할경우저항을꼭함께사용해야만합니다. 오옴의법칙을이용해서전압, 전류, 저항관계식으로허용전류이상이출력으로나오지않게하셔야합니다. 이를테면 LED를하나켜고끈다고할때, V = I R 을쓰면, 5 장. 하드웨어연결 - 95

(5-2)V = 0.02A x R LED 의전압강하가 2V 정도됩니다. R = 3V / 0.02A = 150 계산된저항값은 150이나옵니다. 150 Ω 저항을사용하면 20mA 정도의전류가 LED를흐릅니다. 보통은조금안전하게이보다약간큰저항을사용합니다. 200Ω에서 400Ω 정도의저항을사용하면됩니다. 큰 전류가 필요한 출력 모 터와같은어떤동작을하는출력장치를액추에이터라고통칭해서 부릅니다. 이런종류의출력장치는상당히큰전력과전류를필요로 합니다. 이런출력장치를아두이노에바로연결하게되면아두이노는 내부에서출력할수있는전원이상을끌어낼수없기때문에프로세서가정지해 버립니다. 리셋이되는현상이발생합니다. 이런종류의출력을트랜지스터를이용하거나릴레이를이용해서출력을증폭시킵니다. 4장 3항의대전류출력예제는트랜지스터 (MOSFET) 을스위치로이용해서모터를구동시킵니다. 트랜지스터를이용한증폭으로도어려울때는릴레이를사용합니다. 릴레이역시도사용가능한정도가있습니다. 그이상의큰장치를사용할때는그에맞는별도의전기지식이필요합니다. 이경우 M.C. 라고불리는 Magnetic Contactor 또는 Magnetic Switch 를 사용합니다. M.C. 사용은전기쪽일로 3 상 AC 모터를사용할일이있을때주로쓰게 됩니다. 일반적으로아두이노로작업을할때는 DC 모터를사용하므로 M.C. 까지신경 96-5 장. 하드웨어연결

쓸필요는없습니다만이것을말씀드리는이유는사용하는출력장치에따라다양한 전력이필요하고큰전력과전류를사용해야만하는출력장치에는별도의출력증폭용 장치가필요하다는것을말씀드리기위해서입니다. 5 장. 하드웨어연결 - 97

6 장. 프로그램 방법 막 상아두이노를배우면이것저것많은함수들을배우게됩니다. 그리고 다양한예제들이있습니다. 예제들을보고필요한것들을끼워서붙이면 프로그램이된다고설명하는글이많습니다. 틀린말은아닙니다만조금 생각할부분이있습니다. 한국어를하든, 영어를하든, 일본어나중국어를하든말에는법칙이있습니다. 문법이라고하지요. 문법뿐아니라글을쓸때 기 - 승 - 전 - 결 이라는일반적인흐름이 있습니다. 프로그램도그와비슷합니다. 아주쉽게세가지단계로프로그램을하는방법을소개합니다. 복잡한프로그램은 이렇게하기는어렵겠지만우선아두이노로처음하는프로그램이라면이방법을익혀 두시면앞으로많이도움이될겁니다. 단계 1 [ 입력 ] 센서를통한입력값을받는다. 단계 2 [ 연산 ] 받은값을사용해서필요한정보를계산한다. 단계 3 [ 출력 ] 최종계산결과를출력한다. 98-6 장. 프로그램방법

이게끝입니다. 물론조금복잡하게프로그램을하다보면단계 3 의출력값이다른 단계 1 의입력값이되기도합니다. 단계1 에서는주로아두이노와연결된센서의값을읽어들입니다. 아두이노에서사용하는디지털센서는 0과 1의조합으로된값이나오고, 아날로그센서는 0V에서 5V 사이의전압값이나옵니다. 이값의범위를벗어나면이범위에들어맞도록값을고쳐줘야합니다. 단계2에서는들어온값을가지고필요한계산을수행합니다. 이를테면온도센서의값으로 0V에서 5V사이의값을가져왔다면그값을실제우리가알수있는섭씨나화씨온도로변환시킵니다. 계산식은센서에서나오는값과우리가얻고자하는값사이의관계식을만들어서씁니다. 보통센서를만드는회사에서이러한내용을문서를만들어서제공하고이런기술문서도데이터시트에포함됩니다. 단계3에서는들어온값으로계산이끝난값을가지고출력을결정합니다. 출력은다양한방법이사용됩니다. 간단하게는 LED 의불빛을켜고끄는것도가능하고, PC와시리얼통신으로연결해서 PC 모니터상에값을보여줄수도있습니다. 별도로마련된 LCD 모니터에값을보여줄수도있고, 따로연결된모터를작동시키거나릴레이를작동시켜서집의보일러를켜고끌수도있습니다. 이러한모든것이출력이됩니다. 6 장. 프로그램방법 - 99

1. 입력 아두이노에서주로사용되는입력은 digitalread() 와 analogread() 입니다. 입력에사용되는함수를쓰기위해서먼저 pinmode() 함수로어떤핀을어떤 입력으로쓸것인지결정해주어야합니다. 2. 연산 입력된값을가지고원하는결과를얻을수있도록다양한연산을수행합니다. 이 과정에서다양한수학함수들과문자열함수들, 그리고 for, if 문등이사용됩니다. 3. 출력 아두이노에서주로사용되는출력은 Serial.print(), Serial.println(), digitalwrite(), analogwrite() 함수입니다. 물론이외에도 SD 카드에저장하거나 LCD 창에글자나그림을쓰는등의출력도가능합니다. 하지만이런다양한출력들도내부를잘살펴보면위의 4가지함수를조합해서사용하는경우가대부분입니다. 100-6 장. 프로그램방법

Project : 아두이노의 2번핀에스위치를연결하고스위치를 ON상태로했을때때 9번핀에연결된 LED 가켜지고, 스위치를 OFF 상태로했을때 LED 가꺼지게하라. [ 입력 ] 스위치디지털입력값을 PIN 2 로받음 [ 연산 ] >> PIN 2 의값을 buttonstate 에저장 >> buttonstate 값을반전시킴 [ 출력 ] buttonstate 의값을 PIN 9 LED 로출력 int buttonstate; void setup() { pinmode(2, INPUT_PULLUP); pinmode(9, OUTPUT); void loop() { buttonstate =!(digitalread(2)); digitalwrite(9, buttonstate); delay(1); 6 장. 프로그램방법 - 101

주요함수 [ 입력 ] digitalread(2) 필요한설정 pinmode(2, INPUT_PULLUP); [ 연산 ] buttonstate =!digitalread(2) delay(1); [ 출력 ] digitalwrite(9, buttonstate); pinmode(9, OUTPUT); 입력, 연산, 출력관련주요함수를순서대로넣어주면프로그램은완성입니다. 먼저 [ 입력 ] 함수를씁니다. digitalread(2) 그런데이문장을사용하려면먼저이함수를사용할수있도록 2번핀을디지털입력으로설정해주어야합니다. 그리고설정은한번만하면됩니다. 한번만하면되는것은 setup() 에넣어줍니다. 그리고 digitalread(2) 는계속하는것이니까 loop() 에넣어줍니다. 102-6 장. 프로그램방법

void setup() { pinmode(2, INPUT_PULLUP); void loop() { digitalread(2); 이제 [ 입력 ] 부분이끝났으니 [ 연산 ] 부분으로넘어갑니다. 연산에서는읽은값을 반전시켜 buttonstate 에저장합니다. digitalread(2) 를반전시켜서저장합니다. buttonstate =!(digitalread(2)); 그리고 loop() 함수를한번씩실행할때마다 1ms 씩멈추도록합니다. delay(1); 여기까지한것을모아보면다음과같습니다. 6 장. 프로그램방법 - 103

void setup() { pinmode(2, INPUT_PULLUP); void loop() { buttonstate =!(digitalread(2)); delay(1); 이제마지막으로 [ 출력 ] 부분을프로그램합니다. 출력은 buttonstate 의값을 13 번 핀으로그대로내보냅니다. digitalwrite(9, buttonstate); 13 번핀을출력으로사용하려면먼저 13 번핀을출력으로쓰겠다고아두이노에 알려줘야합니다. pinmode(9, OUTPUT); 출력부분을포함해서전체프로그램을완성시켜봅시다. 104-6 장. 프로그램방법

void setup() { pinmode(2, INPUT_PULLUP); pinmode(9, OUTPUT); void loop() { buttonstate =!(digitalread(2)); delay(1); digitalwrite(9, buttonstate); 설정에필요한 pinmode() 함수는모두 1번만처음에실행시키면되는것이므로모두 setip() 안에넣습니다. 그리고 digitalwrite(9, buttonstate) 는입력값을받고연산을거친다음에출력이이루어져야하기때문에 loop() 함수의맨아래쪽에넣습니다. 이렇게프로그램이완성되었습니다. 6 장. 프로그램방법 - 105

http://winduino.co.kr 2016년 5월 10일, 아직찾지못한 9명의세월호실종자를기억하며, 바람 이이책으로아두이노를공부하는모든분들을응원합니다. FORGET-416-NOT

이 책에서 배울 내용은... 아두이노 IDE 기본설치아두이노프로그램을위한 C 언어기초하드웨어와소프트웨어의관계프로그램방법 누구나 따라하는 아두이노 프로그래밍 서점에가보면아두이노관련서적이넘쳐납니다. 그중어떤 것을보면좋을까요? 만약당신이프로그램경험이있다면하드웨어에관한책을 살펴보면됩니다. 8051 이나 AVR 같은책을보고그다음 아두이노관련문서를인터넷에서찾아보면됩니다. 만약당신에이전에 8051 이나 AVR 같은 MCU를다뤄본경험이있다면아두이노는굳이공부할필요가없습니다. 그냥인터넷 arduino.cc 사이트로가서자료를다운받아사용하면됩니다. 만약당신이프로그램경험이없고, MCU 가무엇인지모른다면이책을손에드시면됩니다. 이책은아무런기초지식없이아두이노를접하고경험하려는사람을위해쓰여졌습니다. 아두이노를처음접하고어떻게시작해야할지를알려주기위한책입니다.