목차 Chapter 1. Arduino... 2 1.1. Arduino에대해서... 2 1.2. Arduino 핀종류... 6 Chapter 2. 아두이노를다루기위한기본지식... 7 2.1. 프로그래밍... 7 2.2. 전기전자기초... 10 Chapter 3. 개발환경구축... 13 3.1. Arduino Software 설치... 13 3.2. 프로그램작성및컴파일... 25 3.3. 이미지로딩및디버그... 31 Chapter 4. 다양한센서들을다뤄보자... 35 4.1. 디지털센서류... 35 4.2. 아날로그센서류... 71 4.3. 아두이노라이브러리... 107 4.4. 라이브러리활용... 111 1
Chapter 1. Arduino 1.1. Arduino에대해서 1.1.1. 아두이노 (Arduino) 란? 2005년이탈리아에서누구나쉽게마이크로컨트롤러 (Micro Controller) 를쉽게교육받기위해아두이노 ( 이하 Arduino와동일한표현 ) 를만들었습니다. 오픈소스와통합개발환경 (IDE) 을사용하여마이크로컨트롤러를보다편리하게하드웨어를구성하고동작시킬수있습니다. 또한아두이노보드는아두이노사에서제작된보드들, 그기기들과호환되는제품들을말합니다. 아두이노보드는하드웨어와소프트웨어구조가모두개방된오픈소스플랫폼이기때문에정품뿐만아니라기능이나성능, 제조사, 가격등에따라다양한보드들이존재합니다. 여기에서는동일한아두이노 IDE를사용해서개발할수있고기본적으로많이사용되는본교재에서는 Arduino Uno R3 모델을사용합니다. 2
정품보드 호환보드 아두이노우노는세계에서가장많이사용되는기본적인아두이노보드입니다. 이보드의핀배일거의표준과같이사용됩니다. 아두이노나노는우노와거의동일한구성을가지고있습니다. 브레드보드에서실험을할수있도록작은크기와핀배열을가집니다. 1.1.2. Arduino Uno R3 3
프로세서로는 ATMega328을사용하고있으며 0 ~ 13번의 14개의디지털입출력핀을가지고있어외부의이진신호를읽어들이거나또는이진신호를내보낼수있습니다. 이진신호란 ON/OFF나 0/1과같이상태값이두가지만을가지는신호라는의미입니다. 이디지털핀을이용해서 LED를켜고 / 끄거나외부의스위치가눌러져있는지아닌지등을검출할수있습니다. 구체적으로 0V와 5V 두전압중하나의값을가지며이것으로프로그램을제어할수있습니다. 1.1.3. Arduino 특징현재많은마이크로컨트롤러및물리적컴퓨팅에해당하는마이크로컨트롤러플랫폼이있습니다. Netmedia의 BX-24, Phidgets, MIT의 HandyBoard, 그리고많은다른유사한기능을제공합니다. 이러한툴은모두마이크로컨트롤러프로그래밍의지저분한세부사항을가지고사용하기쉬운패키지로감싸고있습니다. 아두이노는마이크로컨트롤러와함께작동하는과정을단순화하였지만다른시스템을통해교사, 학생, 관심있는아마추어를위한아래와같은몇가지이점을제공합니다. 저렴한가격 - 아두이노보드는다른마이크로컨트롤러플랫폼에비해상대적 으로저렴합니다. arduino 의모듈의가장저렴한버전은손에의해조립될수 있고, 심지어는미리조립된모듈의 Arduino 모듈은 50 달러미만입니다. 크로스컴파일플랫폼 - 대부분의마이크로컨트롤러시스템은윈도우운영체제 로제한이되지만아두이노소프트웨어는윈도우, 매킨토시 OSX, 리눅스운영체 제에서실행됩니다. 단순명확한프로그래밍환경 - 아두이노프로그래밍환경은초보자를위해사용하기쉬운, 그러나고급사용자들도활용하기쉽도록설계됬습니다. 언어는 C++ 라이브러리를통해확장할수있고, 기술적으로세부사항을이해하고자하는사람들은아두이노를통해 AVR C 프로그래밍언어에도약할수있습니다. 만약사용자가원한다면아두이노프로그램에 AVR C코드를추가할수있습니다. 오픈소스및확장가능한하드웨어 - 아두이노는 Atmel 사의 ATMEGA8 과 AT- MEGA168 을기반으로하는마이크로컨트롤러입니다. 모듈에대한계획은경험 많은회로설계자가직접개선하여자신의버전을만들수있습니다. 크리에이티 4
브커먼즈라이선스 (CCL) 로배포됩니다. 그렇다하더라도상대적으로경험이없는사용자가어떻게작동하는지이해하고비용을절감하기위해모듈의브레드버전을구축할수있습니다. 1.1.4. Arduino의응용현재 Arduino는여려방면에서사용되고있습니다. 사용사례를보면원래의목적인학생들의교육을위해기본보드를기초로하여외부기기들제어하는용도로사용되고있으며또한다양한 IT전시회에서 Arduino를이용한핸드폰웹개발및예술가들이디지털화된작품들을만들때많이응용된다. 아래그림들은 Arduino의응용사례들입니다. 5
1.2. Arduino 핀종류 1.2.1. 디지털입출력핀 (0번 ~ 13번핀 ) 0번과 1번핀은시리얼통신에사용된. USB로 PC와통신을할수있습니다. 2번과 3번핀은인터럽트기능을갖습니다. 3, 5, 6, 9, 10, 11번핀은 PWM 기능을가지며아날로그출력을흉내낼수있습니다. 1.2.2. 아날로그입력핀 6개 (A0~A5) 센서와연결하여센서의아날로그입력값을읽어들이는데사용합니다. 아날로그신호는디지털신호와달리연속값을의미하며이것은예를들어서온도, 빛의세기등이있고이것을물리량이라합니다. 물리량을센서가전기신호로변환하며이것을이아날로그핀으로읽어들일수있습니다 센서를통해읽은전압값은 0~1023사이의숫자로변환합니다. 기준전압은 5V이지만 1.1V의내부전압이사용될수있습니다. AREF핀으로기준전압을직접인가할수도있습니다. 디지털입 / 출력핀으로도사용이가능합니다. 1.2.3. 아날로그출력핀 6개 (3, 5, 6, 9, 10, 11번핀 ) 디지털출력핀은 0V/5V 두가지값만을가질수있습니다. 아날로그출력핀은 0V~5V사이의전압값 (256단계) 를가질수있습니다. 정확히이야기하면 PWM방식으로동작하므로순수아날로그방식은아닙니다. 1.2.4. 인터럽트 (2, 3번핀 ) 2번과 3번핀은인터럽트기능을가집니다. 인터럽트처리라는이벤트를처리하는사용되는기능으로서특정한신호가발생했을때정해진동작을수행하여야하는경우사용되는방식입니다. 1.2.5. 그외의기능들 SPI 통신 : ICSP 헤더핀 TWI(I2C) 통신 : A0, A1 핀 6
Chapter 2. 아두이노를다루기위한기본지식 2.1. 프로그래밍 2.1.1. 프로그래밍이란? 프로그래밍은프로그램을만드는과정을말하며프로그램은일의순서또는과정을말합니다. 위와같은과정또한프로그램이라할수있습니다. 우리가스마트폰이나컴퓨터에서사용 하는인터넷, 게임등의프로그램은컴퓨터를통해제작하는 컴퓨터프로그램 이며, C 언 어, 파이썬, 자바, 등의프로그래밍언어를사용하여만들수있습니다. 7
2.1.2. 프로그래밍언어프로그래밍언어는사람과디바이스 ( 컴퓨터, 아두이노등 ) 가의사소통을가능하게해주는언어입니다. 우리가키보드로 A 를입력하지만사실컴퓨터는 0 과 1 로이루어진기계어로표현합니다. 0 과 1 만을사용하는컴퓨터에서기계어를사용하여프로그램을제작하기란쉽지않습니다. 그렇기때문에만들어진것이 C, C++, JAVA 등과같은프로그래밍언어입니다. 즉, 프로그래밍언어는사람이사용하는언어를컴퓨터가사용하는기계어로바꿔주는언어입니다. 아두이노는 C, C++ 를사용합니다. C 언어에대해설명을드리자면세계적으로많이쓰이는영어와같이대부분의컴퓨터시스템에사용할수있는프로그래밍언어입니다. 절차지향적언어로빠른연산속도를자랑하며, 운영체제및디바이스드라이버, 마이크로컨트롤러임베디드프로그래밍등에사용되고있습니다. 8
2.1.3. 프로그래밍을왜배워야할까? 스티브잡스는이렇게말했습니다. 이나라모든사람들은컴퓨터프로그래밍을배워야하는이유는사고하는법을배워야하기때문이다. 기본적으로뭘모르는지모르는것과, 뭘모르는지아는것은하늘과땅만큼의차이를가지고있습니다. 즉, 뭘모르는지모른다면그것은개선의의지가없다는것이지만뭘모르는지아는것은개선을할수있다는것입니다. 그리고컴퓨터를기반으로한응용프로그램활용능력이달라집니다. 만약어떤학교의학생들의반평균과학년평균을구하는경우이것을엑셀과같은프로그램으로순식간에끝낼지, 아니면계산기나암산을통해서일일이사칙연산을하는지는시간적으로나비용적으로나충분히우리에게코딩의중요성을일깨워줍니다. 4차산업혁명에선빅데이터분석, 인공지능, 로봇공학, 사물인터넷, 무인운송수단, 3차원인쇄, 나노기술과같은 6대분야에서새로운기술혁명입니다. 이들분야에선컴퓨터는빼놓을수는없을것입니다. 즉, 프로그래밍을모른다면살아가는게힘들것입니다 2.1.4. 아두이노프로그래밍아두이노사에서무상으로제공되는아두이노통합개발환경 (IDE) 은아두이노의모든기능을사용할수있도록지원하는컴파일러이며, C언어기반의프로그래밍언어를입력하여프로그램을만들수있습니다. 기존의 C언어는굉장히광범위하며어려운언어이지만, C언어를바탕으로재구성된아두이노언어는비교적쉽게익혀서사용할수있습니다. 그외에도아두이노보드는스크래치나엔트리와같은프로그램과도사용할수있습니다 9
2.2. 전기전자기초 2.2.1. 전기에대한이해전기에너지는화력, 원자력등의발전소에서만들어진후재가공을거쳐가정이나공장등으로공급이됩니다. 집에서흔히볼수있는콘센트나여러가지건전지, 배터리들을통해전기에너지를공급받아사용합니다. 2.2.2. 직류전기와교류전기 전기는크게직류전기와교류전기로나뉩니다. 그렇다면직류전기와교류전기는무엇 이다를까요? 다음그림을보고설명하겠습니다. 직류전기는시간에관계없이항상일정하게음극에서양극으로한뱡향으로만흐르는전기입니다. 건전지가이방식에해당합니다. 멀리떨어진곳으로전기를송전하기위해서는전압을고압으로승압시켜야하지만직류는고압으로의승압이어렵기때문에일반가정에보급하기가힘듭니다. 교류전기는전압, 전류극성의방향이함께바뀝니다. 그리고일정시간에몇번바뀌는지에따라서주파수가정해집니다. 우리가가정에서사용하고있는콘센트는 220VAC 입니다. 2.2.3. 전기의원리전기는원자안의자유전자가외부로이동하여생기는에너지의한형태입니다. 원자는원자핵을기준으로전자와원자핵의인력을덜받는자유전자가회전하고있습니다. 자유전자는원자의외부로벗어날수있으며, 이러한현상을 전기가흐른다 고표현할수있습니다. 10
2.2.4. 전기의성질전기의성질은전압, 전류, 저항을통해정의할수있으며, 이는물이흐르는성질에비유하여나타낼수있습니다. 전압은수압에비유할수있고저항은물의흐름을방해하는지형지물과같습니다. 또한전류는물의흐름입니다. 2.2.5. 옴의법칙전자기학의법칙중하나인옴의법칙은게오르크옴의이름을딴것입니다. 도체의두지점사이에나타나는전위차에의해흐르는전류가일정한법칙에따르는것을말합니다. 두지점사이의도체에일정한전위차가존재할때, 도체의저항의크기와전류의크기는반비례합니다. 전류 (I) 는도선에흐르는단위로암페어 (A), 전압 (V) 은도체에양단에걸리는전위차로단위는볼트 (V), 그리고저항 (R) 은도체의전기저항으로단위는옴 (Ω) 입니다. I=V/R으로표현하는데전류는전압에비례하고저항에반비례한다고합니다. 2.2.6. 전압분배법칙전압분배법칙은전기회로안에다수의저항기가있을경우저항기를지날때마다전압이사용되어전압이떨어지는현상을가지고어떤회로나부품에서필요로하는전압을만들어줄때사용합니다. 즉, 12V의입력전압을가지고 5V의 LED를켜려고하면 LED 는고장이납니다. 그렇기때문에저항기를추가하여 12V의전압을 5V로낮춰 LED를켤수있습니다아날로그신호와디지털신호 11
전기신호는아날로그신호와디지털신호로나뉘며, 우리가사용하는아두이노우노보드 는디지털신호와아날로그신호를사용하여부품들을제어및센싱할수있습니다. 12
Chapter 3. 개발환경구축 3.1. Arduino Software 설치 3.1.1. Arduino Software 다운로드 Arduino는 Arduino 홈페이지 (www.arduino.cc/) 에서제공하고있으며무료로다운받아설치할수있습니다. 다운로드방법은홈페이지에접속후 SOFTWARE - DOWNLOADS 탭을클릭합니다. 다운로드페이지에서중간에 Download the Arduino IDE 를보면 ARDUINO1.8.6 이라고버 전이표시되어있고우측을보면각운영체제나버전별로구분이되어있습니다. 13
우리가사용할버전은 Windows Installer, for Windows XP and up 을클릭하면다음화면으 로넘어가게된다. 그러면 JUST DOWNLOAD 를누르면다운로드가시작됩니다. 14
15
3.1.2. Arduino IDE 설치 다운이완료되면 Install 파일을눌러설치를시작합니다. 동의 설치할컴포넌트를선택해줍니다. 다선택하면됩니다. 16
설치할위치를설정해줍니다. 설치가진행중입니다. 17
설치중간에드라이버설치를묻는데설치해줍니다. 설치가완료되면다음과같은폴더의구조로이루어진아두이노프로그램을볼수있습 니다. 위과정을거치면아두이노소프트웨어설치가완료됬습니다. 아래그림과같이 PC 와아 두이노를 USB 케이블로연결합니다. 18
3.1.3. Arduino driver 설치 연결을했을때다음그림과같이장치관리자에들어가서포트에 Arduino Uno(COM4) 와 같은형식이있다면드라이버까지잘잡힌것입니다. 19
만약드라이버가잡히지않았거나설치가안됐을경우다음의방법으로시도해보기시 바랍니다. 20
21
22
23
위그림과같은과정을거치면 Driver 설치가완료됩니다. 이제 Arduino 프로그램에서코 드작성후컴파일된이미지파일을보드에업로딩하고코드에서출력하는 debug 메 시지를확인할수있는조건이갖추어진것이다. 24
3.2. 프로그램작성및컴파일 3.2.1. 프로그램작성코드작성에필요한준비가완료되었으니실제로아두이노프로그램에는어떠한기능이있고어떻게사용하는지알아보도록합니다. 우선아두이노프로그램을실행하면아래그림과같은프로그램실행화면을확인할수있습니다. 프로그램을보면위에 5개의메뉴와그아래 6개의아이콘들이있다. 각각의아이콘들을살펴보면다음과같습니다. 1: 컴파일 -> 작성된프로그램을컴파일합니다. 2: 컴파일및업로드 -> 작성된프로그램을컴파일후보드에업로딩합니다. 3: 새파일 -> 새로운스케치파일을생성합니다. 4: 열기 -> 저장된스케치파일을엽니다. 25
5: 저장 -> 스케치파일을저장합니다. 6: 시리얼모니터 -> 코드상에서 Serial Data 전송및출력합니다. 아이콘들의기능입니다. 이기능들을숙지하고다음과같이타이핑하여기본적인소스코 드를작성해보세요. 소스코드를설명하자면 13 이라는값을가지는 int 형변수 led 를선언해서출력핀으로설 정하고 1 초마다 HIGH 와 LOW 값을가지는소스입니다. 다음에설명할 Blink 예제와같은 소스입니다. 26
3.2.2. 파일열기 프로그램의메뉴에서파일 -> 예제 ->01.Basics->Blink 를선택합니다. Blink 를선택아래의그림처럼코드가작성된새로운스케치가생성됩니다. 27
주석으로처리된구문이있는데예제에대한설명과언제, 누가수정했는지에대한설명 이나옵니다. 여기서는이예제에대한설명이나와있는데우리가사용하는우노보드에 선 LED_BUILTIN 는 13 번핀으로설정돼있다정도만알면됩니다. 소스코드를설명하자면 Setup() 함수에서 LED와연결된핀 (13번) 을 pinmode() 라는 api 함수를통해출력으로설정하고 loop() 함수는출력으로설정된 LED Pin을 digital- Write() 함수를통해 HIGH 을출력으로내보내고 1000ms 즉 1초후에다시 LED pin에 LOW를출력하는소스코드입니다. 동작으로본다면 1초 LED ON 1초 LED OFF의동작을한다. 여기서 setup 함수는스케치가실행되면서처음에한번실행되는함수이고주로외부디바이스와연결된포트설정및 Serial을초기화합니다. loop() 함수는스케치가실행되면처음 setup 함수를실행한다음 board가멈추기전까지계속해서 loop() 함수를실행합니다. 28
3.2.3. 컴파일방법 blink 스케치에대해알아보았고소스가확인되었으므로컴파일한다. 컴파일은메뉴의 스케치 -> 확인 / 컴파일을누르거나아이콘에서 아이콘 ( 확인 ) 을클릭합니다. 29
컴파일버튼을클릭하면위그림처럼진행바가나타나고진행바가끝까지가게되면컴 파일이완료됩니다. 만약에러가있을경우에는주황색메시지로에러메시지를표출하게 됩니다. 30
3.3. 이미지로딩및디버그 3.3.1. 이미지로딩위에서컴파일까지진행했습니다. 이컴파일된이미지를보드에업로딩하는방법을알아보고또한디버그방법은어떻게하는지알아보겠습니다. 보드에이미지업로딩을위해서는 2가지설정이완료되어야합니다. 첫번째설정은 " 보드 " 설정입니다. 아두이노프로그램은제공하는보드에대한 ISP설정이각기기별로되어있어그것을선택해주기만하면업로딩은아주쉬운구조로돼있습니다. 선택하는방법은메뉴에서툴-> 보드->" 보드선택 " 선택하여설정합니다. 아두이노보드가여러종류가있기때문에자신의보드에맞게선택합니다. 보드설정이완료되었다면두번째로설정해야할것이시리얼포트설정입니다 +. 아두이노프로그램은이미지를업로딩할때 USB포트를통해이루어지기때문에 USB가연결된포트를설정해야만합니다. 설정방법은도구-> 시리얼포트->" 연결된포트 " 를선택합니다. 31
시리얼포트까지완료되었다면이미지업로딩준비가끝났습니다. 보드에업로딩은 -> 모양의 Icon 을클릭하여이루어집니다. 업로딩이완료되면보드의 LED(PIN13 에연결된 LED) 가 1 초 ON, 1 초 OFF 동작하는것 을확인육안으로확인할수있습니다. 32
3.3.2. 디버그방법위의 Blink 예제처럼 LED를제어하여육안으로확인이가능하다면코드가돌아간다는것을확인할수있습니다. 하지만코드중간에에러가나거나코드가어느흐름으로이루어지는지알고싶을경우에일일이 LED를제어할수는없습니다. 이럴때이용하는것이 Serial 모니터기능을이용하여 debug 메시지를출력하여확인할수있습니다. Serial 모니터기능사용하기위해서는우선 setup 함수에 Serial을사용할수있도록초기화하고 loop() 함수가동작시원하는위치에 print() 함수를이용하여메시지를출력합니다. 이렇게되면코드가원하는방향으로흘러가는지및원하는 data가나오는지를확인할수있어 debugging시상당한도움됩니다. blink예제에 Serial을초기화하고 LED제어후 println메시지를출력해보도록합니다. 33
위그림에서빨간색으로네모칸쳐진곳이 Blink 예제에서추가된부분입니다. 설명을첨부한다면 setpup() 함수에서 Serial을 115200의 baud rate 의속도로초기화한것이고 loop() 함수에서 LED를제어후 Pirint 할 Data를 Serial로보내고있습니다. 이것을컴파일후업로딩하여시리얼모니터로확인할수있습니다. 위그림처럼코드에서작성한 LED ON, OFF print 문이시리얼모니터창에표시되는 것을확인할수있습니다. 이렇게 Serial debugging 을사용하여손쉽게 debuging 이 가능합니다. 34
Chapter 4. 다양한센서들을다뤄보자 센서란무엇인가를감지하기위한장치입니다. 온도나습도, 밝기, 소리, 움직임등다양한요소에대해측정되거나혹은감지된데이터를물리적인수치값으로출력합니다. 센서는성능, 크기, 가격등에따라여러가지종류로나뉘며센서마다사용방법이다릅니다. 이장에서는여러가지센서모듈을이용하여실습해보면서센서들이어떠한기능을하는지알아보고이를통하여다양한프로젝트에서센서들을응용할수있습니다. 4.1. 디지털센서류 센서는디지털신호를통해입력과출력의결과를나타내는종류가있습니다. LOW 와 HIGH 를통해센서를동작할수있습니다. 4.1.1. 7 컬러플래시 LED 모듈 색이 7 가지로변하는 LED 모듈입니다. 디지털신호로제어할수있고간단한조명 장식등에활용이가능합니다. 센서사진및핀연결 아두이노 D11 GND LED S 35
회로연결 소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 int Color = 11; // 11번핀을사용 void setup() { pinmode(color, OUTPUT); // 출력모드설정 void loop() { digitalwrite(color, HIGH); // LED on delay(500); // 0.5초대기 digitalwrite(color, LOW); // LED off delay(500); // 0.5초대기 36
4.1.2. 피에조부저모듈전원이입력되었을압전효과에의해음향을출력하는부저모듈입니다. 디지털신호입력으로소리를출력합니다. 알람, 멜로디, 경고음장치등에응용할수있습니다. 센서사진및핀연결 아두이노 D11 GND 피에조부저 S 회로연결 37
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int buzzer = 11; // 11번핀을사용 void setup () { pinmode (buzzer, OUTPUT); // 출력모드로설정 void loop () { digitalwrite(buzzer, HIGH); // Buzzer on delay(500); // 0.5초대기 digitalwrite(buzzer, LOW); // Buzzer off delay(500); // 0.5초대기 38
4.1.3. 수동부저모듈전원과신호가입력되었을때신호에따라음을출력하는수동형부저모듈입니다. Tone 함수를사용하여음의주파수에맞는신호가입력될경우간단한음악을재생할수있고알람, 멜로디, 경고음장치등에도응용할수있습니다. 센서사진및핀연결 아두이노 D11 GND 수동부저 S 회로연결 39
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 int buzzer = 11; // 11번핀을사용 void setup () { pinmode (buzzer, OUTPUT); // 출력모드로설정 void loop () { tone(buzzer,261.6); // 음계 ' 도 ' 출력 delay(500); // 0.5초대기 tone(buzzer,311.1); // 음계 ' 레 ' 출력 delay(500); // 0.5초대기 tone(buzzer,329.6); // 음계 ' 미 ' 출력 delay(500); // 0.5초대기 40
4.1.4. 레이저발광모듈 전원이입력되면레이저를발광하는모듈입니다. 디지털신호를통하여제어하고특 정지점을가르키는레이저포인터등에응용할수있습니다. 센서사진및핀연결 아두이노 D11 VCC GND 레이저 S 회로연결 41
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int Laser = 11; // 11번핀을사용 void setup() { pinmode (Laser, OUTPUT); // 출력모드로설정 void loop() { digitalwrite (Laser, HIGH); // 레이저 on delay (1000); // 1초대기 digitalwrite (Laser, LOW); // 레이저 off delay (1000); // 1초대기 42
4.1.5. 릴레이전기신호를통해전원을스위칭할수있는스위치모듈입니다. 보통낮은전압으로높은전압을제어하기위한용도로사용됩니다. AC 200V, DC 30V까지입력할수있고 DC 5V로제어가가능합니다.. 센서사진및핀연결 아두이노 D10 VCC GND 릴레이 S 회로연결 43
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 int relay = 10; // 10번핀을사용 void setup() { pinmode(relay, OUTPUT); // 출력모드로설정 void loop() { digitalwrite(relay,high); // 릴레이연결 delay(1000); // 1초대기 digitalwrite(relay,low); // 릴레이연결해제 delay(1000); // 1초대기 44
4.1.6. 푸시버튼모듈 버튼을누르면출력핀을통하여디지털신호를출력하는푸시버튼모듈입니다. 각 종동작버튼, 스위칭을해야할때활용됩니다. 센서사진및핀연결 아두이노 D11 VCC GND 푸시버튼 S 회로연결 45
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int Led = 13; // 13번핀을 led 제어에사용 int Button = 11; // 11번핀을 button 제어에사용 int Value; // 상태값을저장하기위한변수 void setup() { pinmode(led,output); // 출력모드로설정 pinmode(button,input); // 입력모드로설정 void loop() { Value=digitalRead(Button); // 버튼의상태를읽어들임 if(value==high) { // 버튼이눌러진상태일경우 digitalwrite(led, HIGH); // Led on else { // 눌러진상태가아닐경우 digitalwrite(led, LOW); // Led off 46
4.1.7. 기울기센서센서내부의볼이기울기에따라움직이는위치에따라디지털신호를출력하여기울기여부를판단하는센서입니다. 기울임이없어야하거나기울어짐에따라동작하는상황에활용할수있습니다. 센서사진및핀연결 아두이노 D11 VCC GND 기울기센서 S 회로연결 47
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 int Tilt = 11; // 11번핀을사용 int Led = 13; // 13번핀을 led제어에사용 int TiltState; // Tilt 상태를읽는변수 void setup() { pinmode(led, OUTPUT); // 출력모드설정 pinmode(tilt, INPUT); // 입력모드설정 void loop() { TiltState = digitalread(tilt); // Tilt 기울기상태를읽어들임 // Tilt의기울기감지상태에따라 LED On, Off if (TiltState == HIGH) { digitalwrite(led, HIGH); else { digitalwrite(led, LOW); 48
4.1.8. 수은기울기센서유리내부수은의기울기와움직이는위치에따라디지털신호를출력하여기울기여부를판단하는센서입니다. 기울임이없어야하거나기울어짐에따라동작하는상황에활용할수있습니다. 센서사진및핀연결 아두이노 D11 VCC GND 수은기울기센서 S 회로연결 49
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 int Tilt = 11; // 11번핀을사용 int Led = 13; // 13번핀을 led제어에사용 int TiltState; // Tilt 상태를읽는변수 void setup() { pinmode(led, OUTPUT); // 출력모드설정 pinmode(tilt, INPUT); // 입력모드설정 void loop() { TiltState = digitalread(tilt); // Tilt 기울기상태를읽어들임 // Tilt의기울기감지상태에따라 LED On, Off if (TiltState == HIGH) { digitalwrite(led, HIGH); else { digitalwrite(led, LOW); 50
4.1.9. 디지털홀센서자기장의세기에따라전압이변하는센서로자기장의세기가일정수준이되면디지털신호를출력합니다. 모터나자석과같은자기장이발생하는것들을감지하는데활용됩니다. 센서사진및핀연결 아두이노 D11 VCC GND 디지털홀센서 S 회로연결 51
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 int sensor = 11; // 11번핀을사용 int Led = 13; // 13번핀을 led제어에사용 int State; // 상태값을저장하기위한변수 void setup() { pinmode(led, OUTPUT); // 출력모드설정 pinmode(sensor, INPUT); // 입력모드설정 void loop() { State = digitalread(sensor); // 자기장센싱값을읽어들임 if(state == HIGH) { // 자기장발생을감지했을때 digitalwrite(led, HIGH); // LED on else { // 자기장이없을때 digitalwrite(led, LOW); // LED off 52
4.1.10. 디지털리드센서자기장이가까워졌을때연결되고, 멀어지면연결이해제되는센서로자기장으로인해리드부분이자기장을통해접점과연결되어디지털신호를출력합니다. 모터나자석과같은자기장이발생하는것들을감지하는데활용됩니다. 센서사진및핀연결 아두이노 D11 VCC GND 리드센서 S 회로연결 53
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int Reed = 11; // 11번핀을사용 int Led = 13; // 13번핀을 led제어에사용 int State; // 상태값을저장하기위한변수 void setup() { pinmode (Led, OUTPUT); // 출력모드설정 pinmode (Reed, INPUT); // 입력모드설정 void loop() { State = digitalread(reed); // 자기장센싱값을읽어들임 // 자기장상태에따라 Led on / off if (State == HIGH) { digitalwrite(led, HIGH); else { digitalwrite(led, LOW); 54
4.1.11. 적외선장애물감지센서 적외선을발사하여주위에물체가있는지없는지를확인하는센서입니다. 측정부가 수평방향이며각종로봇의바닥에장착하여흑 / 백감지에도사용할수있습니다. 센서사진및핀연결 아두이노 D11 VCC GND 센서 out 회로연결 55
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int Led = 13 ; // 13번핀을 LED제어에사용 int Sensor = 11; // 11번핀을사용 int val ; // 센서의상태를저장하기위해사용 void setup () { pinmode (Led, OUTPUT) ; // 출력모드설정 pinmode (Sensor, INPUT) ; // 입력모드설정 void loop () { val = digitalread (Sensor) ; // 센서값을입력받음 if (val == HIGH) { // 물체가가까이접근하면 digitalwrite (Led, LOW); //Led on else { // 물체가멀어지면 digitalwrite (Led, HIGH); // Led off 56
4.1.12. 트래킹센서적외선을발사하여주위에물체가있는지없는지를확인하는센서입니다. 측정부가수직방향이며물체의유무, 라인트레이서로봇의흑색선감지용으로사용할수있습니다. 센서사진및핀연결 아두이노 D11 VCC GND 트래킹센서 S 회로연결 57
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int Led = 13 ; // 13번핀을 LED제어에사용 int Sensor = 11; // 11번핀을사용 int val ; // 센서의상태를저장하기위해사용 void setup () { pinmode (Led, OUTPUT) ; // 출력모드설정 pinmode (Sensor, INPUT) ; // 입력모드설정 void loop () { val = digitalread (Sensor) ; // 센서값을입력받음 if (val == HIGH) { // 물체가가까이접근하면 digitalwrite (Led, LOW); //Led on else { // 물체가멀어지면 digitalwrite (Led, HIGH); // Led off 58
4.1.13. 터치센서자성, 금속성을가진물체가센서를터치할때출력이발생하여터치를감지하는센서입니다. 아날로그와디지털신호를출력할수있으며, 가변부를조정하여터치감도를조절할수있습니다. 센서사진및핀연결 아두이노 D11 VCC GND 센서 D0 회로연결 59
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int Led = 13; // 13번핀을 led 제어에사용 int Sensor = 11; // 11번핀을사용 int State; // 상태값을저장하기위한변수 void setup() { pinmode(led,output); // 출력모드로설정 pinmode(sensor,input); // 입력모드로설정 void loop() { State=digitalRead(Sensor); // 터치상태를읽어들임 if(state==high) { // 터치된상태일경우 digitalwrite(led, HIGH); // Led on else { // 터치상태가아닐경우 digitalwrite(led, LOW); // Led off 60
4.1.14. 노크센서 네모케이스안의스프링이외부충격을받아흔들릴때내부의센서에닿아디지털 신호를출력하여충격이나진동을감지할수있는센서입니다. 센서사진및핀연결 아두이노 D11 VCC GND 노크센서 S 회로연결 61
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int Led = 13 ; // 13번핀을 LED제어에사용 int Sensor = 11; // 11번핀을사용 int State ; // 센서의상태를저장하기위해사용 void setup () { pinmode (Led, OUTPUT) ; // 출력모드설정 pinmode (Sensor, INPUT) ; // 입력모드설정 void loop () { State = digitalread (Sensor) ; // 센서값을입력받음 if (State == HIGH) { // 센서에충격이감지되면 digitalwrite (Led, HIGH); //Led on else { // 아무런충격이없을떄 digitalwrite (Led, LOW); // Led off 62
4.1.15. 충격센서센서내부에있는금속구가외부충격에의해움직일때디지털신호를출력하여터치나충격, 진동등을감지하는센서입니다. 충돌이나흔들림을감지하는대에활용됩니다. 센서사진및핀연결 아두이노 D11 VCC GND 충격센서 S 회로연결 63
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int Led = 13 ; // 13번핀을 LED제어에사용 int Sensor = 11; // 11번핀을사용 int State ; // 센서의상태를저장하기위해사용 void setup () { pinmode (Led, OUTPUT) ;// 출력모드설정 pinmode (Sensor, INPUT) ; // 입력모드설정 void loop () { State = digitalread (Sensor) ; // 센서값을입력받음 if (State == HIGH) { // 센서에충격이감지되면 digitalwrite (Led, HIGH); //Led on else { // 아무런충격이없을떄 digitalwrite (Led, LOW); // Led off 64
4.1.16. 포토인터럽트 U자형으로마주한발광소자와수광소자사이에빛의차단여부를통해물체의유무를감지할수있는센서입니다. 인코더를장착한모터의 RPM을측정하는데활용됩니다. 센서사진및핀연결 아두이노 D11 VCC GND 포토인터럽트 S 회로연결 65
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int Led = 13 ; // 13번핀을 LED제어에사용 int Sensor = 11; // 11번핀을사용 int State ; // 센서의상태를저장하기위해사용 void setup () { pinmode (Led, OUTPUT) ; // 출력모드설정 pinmode (Sensor, INPUT) ; // 입력모드설정 void loop () { State = digitalread (Sensor) ; // 센서값을입력받음 if (State == HIGH) { // 빛이차단되었을때 digitalwrite (Led, HIGH); //Led on else { // 빛이차단되지않았을떄 digitalwrite (Led, LOW); // Led off 66
4.1.17. 초음파거리센서초음파를전방으로발사하여반사되어돌아오는반사파를받을때까지의시간을확인하여거리를측정하는센서입니다. 거리를측정하여장애물이나벽에닿지않도록하는로봇등에활용할수있습니다. 센서사진및핀연결 아두이노 D11 D10 VCC GND 센서 Trig Echo 회로연결 67
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 int Echo = 10; int Trig = 11; void setup() { Serial.begin (9600); // 시리얼통신시작 pinmode(trig, OUTPUT); // Trig핀출력모드설정 pinmode(echo, INPUT); // Echo핀입력모드설정 void loop() { int duration, distance; // 반사파가돌아오는주기와거리를계산하기위한변수 digitalwrite(trig, HIGH); // 초음파발사 delaymicroseconds(1000); // 1초대기 digitalwrite(trig, LOW); // 초음파발사중지 // Echo로돌아오는반사파의시간과거리를계산 duration = pulsein(echo, HIGH); distance = (duration/2) / 29.1; if (distance >= 200 distance <= 0) { // 제한거리를벗어날경우 Serial.println("Out of range"); else { // 제한거리이내일경우거리출력 Serial.print(distance); Serial.println(" cm"); delay(1000); // 1초대기 68
4.1.18. 로터리인코더회전축의회전량을확인하는센서입니다. 신호가출력되는핀의패턴과펄스를확인하여회전방향이나속도를측정할수있습니다. 모터의회전을확인하는데활용됩니다. 센서사진및핀연결 아두이노 D9 D10 D11 VCC GND 로터리인코더 SW DT CLK 회로연결 69
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 int Right = 11; int Left = 10; int Pos = 9; int RightLast = LOW; int n = LOW; void setup() { pinmode (Right,INPUT); // 입력모드설정 pinmode (Left,INPUT); Serial.begin (9600); // 시리얼통신시작 void loop() { n = digitalread(right); // Right값을 n에저장 if ((RightLast == LOW) && (n == HIGH)) { if (digitalread(left) == LOW) { // Left쪽으로동작하면 Pos--; // Pos 감소 else { // 그렇지않고 Right쪽으로동작하면 Pos++; // Pos 증가 Serial.println (Pos); // 현재값출력 RightLast = n; // 현재값은이전값으로기억하기위해저장 70
4.2. 아날로그센서류아날로그센서는아날로그값을통하여입력, 출력을할수있는센서모듈입니다. 아날로그값수치를조정하여센서를동작할수있습니다. 일부센서는디지털핀의 PWM을통한아날로그값제어가가능합니다. PWM은 Pulse Width Modulation의약자로펄스의폭을컨트롤하는주기제어방법입니다. 출력값을디지털로나타내지만 0V와 5V 사이의아날로그값으로도표현가능합니다. 4.2.1. 듀얼컬러 LED 모듈 (3mm) 3mm 지름의소자로두가지의색상과밝기를조절가능한 LED 모듈입니다. 입력전 압에따라밝기가변하고 PWM 출력으로밝기및색상을제어할수있습니다. 센서사진및핀연결 아두이노 D11 D10 GND LED Y R G 71
회로연결 소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int Red = 10; // 10번핀사용 int Green = 11; // 11번핀사용 void setup () { pinmode (Red, OUTPUT); // 출력모드설정 pinmode (Green, OUTPUT); void loop () { analogwrite (Red, 255); // Red 컬러밝기최대 analogwrite (Green, 0); // Green 컬러밝기 0 delay (3000); // 3초대기 analogwrite (Red, 0); // Red 컬러밝기 0 analogwrite (Green, 255); // Green 컬러밝기최대 delay (3000); // 3초대기 72
4.2.2. 듀얼컬러 LED 모듈 (5mm) 5mm 지름의소자로두가지의색상과밝기를조절가능한 LED 모듈입니다. 입력전 압에따라밝기가변하고 PWM 출력으로밝기및색상을제어할수있습니다. 센서사진및핀연결 아두이노 D11 D10 GND 센서 Y R G 회로연결 73
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 int Red = 10; // 10번핀사용 int Green = 11; // 11번핀사용 int val; // 밝기조절을위한변수 void setup () { pinmode (Red, OUTPUT); // 출력모드설정 pinmode (Green, OUTPUT); void loop () { for (val = 255; val > 0; val --) { // 반복문 255에서 0으로감소 analogwrite (Red, val); // red는점점흐려짐 analogwrite (Green, 255-val); //green은점점밝아짐 delay (10); // 0.01초대기 for (val = 0; val < 255; val ++) { // 반복문 0에서 255까지증가 analogwrite (Red, val); // red는점점밝아짐 analogwrite (Green, 255-val); // green은점점흐려짐 delay (10); // 0.01초대기 74
4.2.3. RGB LED 모듈 세가지의색상과밝기를조절가능한 LED 모듈입니다. 입력전압에따라밝기가변 하고 PWM 출력으로밝기및색상을제어할수있습니다. 센서사진및핀연결 아두이노 D9 D10 D11 GND RGB LED R G B 회로연결 75
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 int Red = 9; // 9번핀사용 int Green = 10; // 10번핀사용 int Blue = 11; // 11번핀사용 void setup () { pinmode (Red, OUTPUT); // 출력모드설정 pinmode (Green, OUTPUT); pinmode (Blue, OUTPUT); void loop () { analogwrite (Red, 255); // Red 컬러밝기최대 analogwrite (Green, 128); // Green 컬러밝기중간 analogwrite (Blue, 0); // Blue 컬러밝기 0 delay (3000); // 3초대기 analogwrite (Red, 0); // Red 컬러밝기 0 analogwrite (Green, 128); // Green 컬러밝기중간 analogwrite (Blue, 255); // Blue 컬러밝기최대 delay (3000); // 3초대기 76
4.2.4. RGB LED SMD 모듈 SMD 타입의소자로세가지의색상과밝기를조절가능한 LED 모듈입니다. 입력전 압에따라밝기가변하고 PWM 출력으로밝기및색상을제어할수있습니다. 센서사진및핀연결 아두이노 D9 D10 D11 GND RGB LED R G B 회로연결 77
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 int Red = 9; // 9 번핀사용 int Green = 10; // 10 번핀사용 int Blue = 11; // 11 번핀사용 int val; // 밝기조절을위한변수 void setup() { pinmode(red, OUTPUT); // 출력모드설정 pinmode(green, OUTPUT); pinmode(blue, OUTPUT); void loop() { for(val=255; val>0; val--) { // 반복문 255 에서 0 으로감소 analogwrite(red, val); // red 는점점흐려짐 analogwrite(blue, 255-val); // blue 는점점밝아짐 analogwrite(green, 128-val); // green 은중간밝기에서점점밝아짐 delay(10); //0.01 초대기 for(val=0; val<255; val++) { // 반복문 0 에서 255 까지증가 analogwrite(red, val); // red 는점점밝아짐 analogwrite(blue, 255-val); // blue 는점점흐려짐 analogwrite(green, 128-val); // green 은중간밝기에서점점흐려짐 delay(10); 78
4.2.5. 리니어홀센서자기장의세기에따라전압이변하는센서입니다. 아날로그와디지털신호를입력하여상태를확인할수있습니다. 자기장이가까울수록높은값을출력합니다. 모터나자석등을감지할수있습니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 A0 회로연결 79
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int sensor = A0; // A0번핀사용 int val = 0; // 상태값을담기위한변수 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { val = analogread(sensor); // 센서가읽어들인값을저장 Serial.println(val); // 결과값출력 delay(500); // 0.5초대기 80
4.2.6. 아날로그홀자기센서자기장의세기에따라전압이변하는센서입니다. 아날로그로상태를확인할수있으며자기장이가까울수록낮은값을출력합니다. 모터나자석등을감지할수있습니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 A0 회로연결 81
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int sensor = A0; // A0번핀사용 int val = 0; // 상태값을담기위한변수 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { val = analogread(sensor); // 센서가읽어들인값을저장 Serial.println(val); // 결과값출력 delay(500); // 0.5초대기 82
4.2.7. 아날로그리드스위치자기장이가까워졌을때연결되고, 멀어지면연결이해제되는센서로아날로그와디지털신호입력으로상태를확인할수있습니다. 모터나자석과같은자기장이발생하는것들을감지하며가까울수록낮은값을출력합니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 S 회로연결 83
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int sensor = A0; // A0번핀사용 int val = 0; // 상태값을담기위한변수 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { val = analogread(sensor); // 센서가읽어들인값을저장 Serial.println(val); // 결과값출력 delay(500); // 0.5초대기 84
4.2.8. 불꽃감지센서적외선 LED를통해빛의파장을감지하여불꽃을감지하는센서입니다. 파장을감지하여아날로그혹은디지털신호를출력하며화재감지와관련된곳에활용이가능합니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 A0 회로연결 85
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int sensor = A0; // A0번핀사용 int val = 0; // 상태값을담기위한변수 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { val = analogread(sensor); // 센서가읽어들인값을저장 Serial.println(val); // 결과값출력 delay(500); // 0.5초대기 86
4.2.9. 심박센서 적외선이신체를투과하여심장박동속도와횟수를측정하는센서입니다. 두개의 다이오드사이에손가락을넣으면적외선이투과하여심박을측정합니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 S 회로연결 87
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 int sensor = A0; double alpha = 0.75; // 심박수계산을위한초기값설정 void setup() { Serial.begin(9600); void loop() { static double oldvalue; int rawvalue = analogread(sensor); // 심박수측정값 // 심박수계산 double value = alpha * oldvalue + (1 - alpha) * rawvalue; Serial.print(rawValue); // 측정값출력 Serial.print(","); Serial.println(value); // 계산값출력 oldvalue = value; delay(1000); 88
4.2.10. 워터센서물에서도전기가통하는원리를이용하여전류를흘려보내서전류의흐름을측정하여물의깊이를측정하는센서입니다. 물에깊이담길수록전류가많이흐를것이고얕을수록전류는적게흐를것입니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 S 회로연결 89
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int sensor = A0; // A0번핀사용 int val = 0; // 상태값을담기위한변수 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { val = analogread(sensor); // 센서가읽어들인값을저장 Serial.println(val); // 결과값출력 delay(500); // 0.5초대기 90
4.2.11. 토양수분센서토양내수분함량에따른저항의변화를측정하는센서입니다. 토양내수분과구성입자의크기등에영향을받으며, 수분함량이많으면저항값이작아지고, 수분함향이적으면저항값이커집니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 S V G 회로연결 91
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int sensor = A0; // A0번핀사용 int val = 0; // 상태값을담기위한변수 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { val = analogread(sensor); // 센서가읽어들인값을저장 Serial.println(val); // 결과값출력 delay(500); // 0.5초대기 92
4.2.12. CDS 조도센서빛의양에따라저항값이바뀌어빛의세기를측정하는센서입니다. 주변빛의밝기가어두울수록. 높은값을출력하고밝을수록낮은값을출력합니다. 가로등이나취침등과같은곳에활용이가능합니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 S 회로연결 93
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 int cds = A0; int led = 13; int cdsvalue = 0; // 측정값을저장하기위한변수 void setup() { pinmode(led, OUTPUT); // 출력모드설정 void loop() { cdsvalue = analogread(cds); // 조도값측정 if (cdsvalue > 50) { // 조도센서로부터측정된밝기값이 50보다높을경우, LED ON digitalwrite(led, HIGH); else { // 조도센서로부터측정된밝기값이 50보다낮을경우, LED OFF digitalwrite(led, LOW); delay(500); // 0.5초대기 94
4.2.13. 고감도사운드센서주변소리의크기를감지할수있는센서입니다. 소리의크기에따라아날로그신호를출력합니다. 가변부를조정하여감도를조절할수있습니다. 큰마이크가장착되어넓은감도를측정할수있습니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 A0 회로연결 95
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int sensor = A0; // A0번핀사용 int val = 0; // 상태값을담기위한변수 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { val = analogread(sensor); // 센서가읽어들인값을저장 Serial.println(val); // 결과값출력 delay(100); // 0.1초대기 96
4.2.14. 마이크로폰사운드감지센서 주변소리의크기를감지할수있는센서입니다. 소리의크기에따라아날로그신호 를출력합니다. 가변부를조정하여감도를조절할수있습니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 A0 회로연결 97
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int sensor = A0; // A0번핀사용 int val = 0; // 상태값을담기위한변수 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { val = analogread(sensor); // 센서가읽어들인값을저장 Serial.println(val); // 결과값출력 delay(100); // 0.1초대기 98
4.2.15. 아날로그온도센서 주변온도에따라저항값이달라지는온도센서입니다. 가변부를조정하여출력감도 를조절할수있고온도가높으면높은아날로그값을출력합니다. 센서사진및핀연결 아두이노 A0 VCC GND 센서 A0 회로연결 99
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 int sensor = A0; // A0번핀사용 int val = 0; // 상태값을담기위한변수 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { val = analogread(sensor); // 센서가읽어들인값을저장 Serial.println(val); // 결과값출력 delay(500); // 0.5초대기 100
4.2.16. 써미스터온도센서 주변온도에따라저항이변하는써미스터가장착된온도센서입니다. 온도가높으면 높은아날로그값을출력합니다 센서사진및핀연결 아두이노 A0 VCC GND 센서 S 회로연결 101
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 int Atemp = A0; int Value = 0; void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { Value = analogread(atemp); // 온도값읽어들임 Serial.print(Thermister(Value)); // 읽어들인값을변환하여온도출력 Serial.println(" "); delay(500); // 0.5초대기 double Thermister(int RawADC) { // 온도값을계산하는함수 double Temp; Temp = log(10000.0 / (1024.0 / RawADC - 1)); Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp ); Temp = Temp - 273.15; // Convert Kelvin to Celcius return Temp; 102
4.2.17. 매직라이트컵모듈 기울기센서의출력값에따라 LED 를동작시키는모듈입니다. 2 개의모듈을함께기울 이면불빛을다른쪽으로이동시킬수있습니다. 센서사진및핀연결 아두이노매직라이트컵 A 매직라이트컵 B D5 D6 S L D10 D11 S L VCC GND G G 회로연결 103
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 int LedA = 5; int LedB = 10; int SensorA = 6; int SensorB = 11; // 각수은스위치상태를저장하는변수와 LED밝기를저장하는변수선언. int StateA, StateB, light = 0; void setup() { pinmode(leda, OUTPUT); pinmode(ledb, OUTPUT); pinmode(sensora, INPUT); pinmode(sensorb, INPUT); void loop() { StateA = digitalread(sensora); // A 센서의수은스위치측정값 // A 모듈의수은스위치가 OFF이고밝기가최대치가아니면밝기가밝아짐 if (StateA == HIGH && light!= 255) { light ++; StateB = digitalread(sensorb); // B 센서의수은스위치측정값 // B 모듈의수은스위치가 OFF이고불이꺼져있지않으면밝기가흐려짐 if (StateB == HIGH && light!= 0) { light -- ; analogwrite(leda, light); // 각 LED에밝기값을설정 analogwrite(ledb, 255 - light); delay(25); 104
4.2.18. PS2 조이스틱모듈 X, Y 좌표검출과푸시버튼기능이내장된조이스틱모듈입니다. 두개의가변저항과하나의푸시버튼으로구성되어있고, X, Y좌표는아날로그신호가출력되며푸시버튼은디지털신호로출력됩니다. 센서사진및핀연결 아두이노 A0 A1 D10 VCC GND 로터리인코더 VRx VRy SW 회로연결 105
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 int x = A0; int y = A1; int sw = 10; int value; // 상태값을담기위한변수 void setup() { pinmode(sw, INPUT); // 입력모드설정 Serial.begin(9600); // 시리얼통신시작 void loop() { value = analogread(x); // 0~1023 까지의범위를 x 좌표로읽음 Serial.print("X:"); Serial.print(value, DEC); // 좌표값출력 value = analogread(y); // 0~1023 까지의범위를 y 좌표로읽음 Serial.print(" Y:"); Serial.print(value, DEC); // 좌표값출력 value = digitalread(sw); // 버튼상태를읽음 Serial.print(" Button:"); Serial.println(value, DEC); // 좌표값출력 delay(200); // 0.2초대기 106
4.3. 아두이노라이브러리라이브러리는어떠한기능을사용하기위한코드를미리작성해놓아서사용자간에공유하여사용할수있는방법입니다. 아두이노에서는센서의프로그래밍을좀더쉽게할수있도록도와주는라이브러리를제공합니다. 오픈소스를기반으로한아두이노개발환경의한부분으로내장모듈및외장의각종부가장치를제어하는함수들로구성되어있습니다. 라이브러리파일은스케치파일 (.ino) 로만구성된경우또는소스코드 (.cpp) 와헤더파일 (.h) 이포함된경우로구성되어있습니다. 4.3.1. 라이브러리의종류라이브러리는아두이노에서기본적으로제공하는표준라이브러리가있고사용자들이다른수많은하드웨어들을사용하기위해직접작성하고배포한사용자라이브러리가있습니다. 표준라이브러리는아두이노에서기본적으로제공하기때문에별도로추가할작업이없지만제공되지않는라이브러리를사용하여야할때에는인터넷매체를통하여다운로드받아라이브러리를추가하여야사용가능합니다. 107
4.3.2. 라이브러리사용방법 표준라이브러리의경우스케치 라이브러리포함하기에서확인및사용이가능합니 다. 하지만사용자라이브러리사용시에는간단한라이브러리추가작업이필요합니다. 여기서는 DHT11 이라는라이브러리를사용하기위해먼저라이브러리를다운로드받은 후압축을풀어줍니다. 108
그리고압축을푼파일을 Ardiono libraries 폴더안에위치해주어야합니다. 아두이노를새롭게실행하여스케치 라이브러리포함하기를확인하면 DHT11 라이브 러리가추가된것을확인할수있습니다. 109
라이브러리를추가하여사용시에컴파일과정에서아래그림과같은에러메시지가발생 할경우에는라이브러리파일을찾을수없어서에러가발생한경우이므로라이브러리가 정상적으로추가되었는지확인해야합니다. 110
4.4. 라이브러리활용센서들중에는아두이노에서제공하는라이브러리를사용하여좀더쉽게센서를동작할수있습니다. 아두이노에서기본적으로제공하지않는라이브러리는인터넷매체를통하여다운로드하여사용하여야합니다. 4.4.1. 디지털온도센서 디지털신호를통해온도를측정하는센서모듈입니다. 라이브러리를통하여간단히 사용가능합니다. 센서사진및핀연결 아두이노 D10 VCC GND 센서 S 회로연결 111
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // 디지털온습도측정을위한라이브러리파일사용 #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 10 // 10번핀을사용 OneWire onewire(one_wire_bus); DallasTemperature sensors(&onewire); void setup(void) { Serial.begin(9600); // 시리얼통신시작 sensors.begin(); // 라이브러리실행 void loop(void) { // 라이브러리를통해측정된값이변환되어출력 sensors.requesttemperatures(); Serial.print(sensors.getTempCByIndex(0)); Serial.println(" "); delay(500); 112
4.4.2. 디지털온습도센서온도와습도를측정하는센서모듈입니다. 전력소모가적으며온도보상및보정된디지털신호를제공합니다. 측정범위는 0~50, 20~90% 입니다. 라이브러리를통하여간단히사용가능합니다. 센서사진및핀연결 아두이노 D10 VCC GND 센서 S 회로연결 113
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <DHT11.h> // DHT11을사용하기위한라이브러리 int Sensor = A0; DHT11 dht11(sensor); // 라이브러리에서사용하기위한핀번호변수설정 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { int res; // 결과값을가질변수 float temp, humid; // 온도, 습도값을저장할변수 // 라이브러리를통하여측정된온도, 습도값을읽어들여저장 res = dht11.read(humid, temp); if(res == 0 ) { // 온도, 습도가측정되어 res값이 0이되면값이출력됨 Serial.print("Temperature : "); Serial.print(temp); Serial.print(" Humidity : "); Serial.print(humid); Serial.println(); delay(dht11_retry_delay); // DHT11전용딜레이값설정 114
4.4.3. 적외선발신모듈 적외선신호를보낼수있는모듈입니다. 적외선수신모듈과같이사용할수있으며 라이브러리를통하여간단히사용가능합니다. 센서사진및핀연결 아두이노 D3 VCC GND 센서 S 회로연결 115
소스코드 1 2 3 4 5 6 7 8 9 10 11 #include<irremote.h> // IRremote 라이브러리사용 IRsend send; // 적외선신호를송신하기위한객체설정 void setup() { Serial.begin(9600); // 시리얼통신시작 void loop() { send.sendsony(0xa90, 12); // 신호송신 delay(50); // 0.05초대기 116
4.4.4. 적외선수신모듈 적외선신호를수신할수있는모듈입니다. 적외선발신모듈과같이사용할수있으 며라이브러리를통하여간단히사용가능합니다. 센서사진및핀연결 아두이노 D11 VCC GND 센서 S 회로연결 117
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include<irremote.h> // IRremote 라이브러리사용 int sensor = 11; // 11번핀을사용 int data; // 수신된신호의정보를담기위한변수 IRrecv irrecv (sensor); // IRremote의객체설정 decode_results res; // 수신된데이터저장공간 void setup() { Serial.begin(9600); // 시리얼통신설정 irrecv.enableirin(); // 적외선신호수신 void loop() { if(irrecv.decode(&res)) { // 신호가수신되었을경우 data = res.value; // 수신된신호를저장 Serial.println(data, HEX); // 수신된 data를 16진수로출력 irrecv.resume(); // 계속수신받기위함 118