뻔뻔한아두이노매뉴얼 Ver. 1 메카솔루션 ( 뻔뻔한아두이노 예제 1. [ 시작하기 ] 아두이노소프트웨어설치및브레드보드이용하기 2. [ 출력1] LED 깜빡이기 3. [ 출력2] 시리얼모니터에텍스트출력하기 4. [ 출력3] PWM

Similar documents
뻔뻔한아두이노매뉴얼 Ver. 2-1 메카솔루션 ( 목차. 1. 아두이노의특징및종류설명 2. 아두이노소프트웨어설치및브레드보드이용하기 3. 라이브러리추가하기 4. 센서류 A. 근접물체감지하기 (QRD1114) B. 온도센서로온도감지하

Microsoft PowerPoint - es-arduino-lecture-03

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

시프트 레지스터 Shift Resistor 자, 이제 LED MATRIX 8x8 Board를 마이크로컨트롤러에 연결된 3개의 선으 로 제어해 보자. 이는 마이크로컨트롤러의 포트를 확장함과 동시에 프로그램 으로 제어를 더 쉽게 한다는 장점이 있다. 물론 포트를 절약하게

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

실험 5


Motor

Microsoft Word - src.doc

PowerPoint 프레젠테이션

1

Microsoft Word doc

Microsoft PowerPoint - ch07 - 포인터 pm0415

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

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

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

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

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

PowerPoint Template

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

ISP and CodeVisionAVR C Compiler.hwp

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

chap 5: Trees

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

Studuino소프트웨어 설치

Microsoft PowerPoint - chap01-C언어개요.pptx

Install stm32cubemx and st-link utility

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Visual Basic 반복문

<4D F736F F D D31312D30312D53572D30312DBBE7BFEBC0DABCB3B8EDBCAD5FBFDCBACEB9E8C6F7BFEB2E646F63>

Windows 8에서 BioStar 1 설치하기

PowerPoint 프레젠테이션

JDK이클립스

PowerPoint Presentation

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

Microsoft PowerPoint - e pptx

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

Microsoft Word - PEB08_USER_GUIDE.doc

슬라이드 1

Microsoft PowerPoint - chap06-1Array.ppt

슬라이드 1

Microsoft PowerPoint - Java7.pptx

(SW3704) Gingerbread Source Build & Working Guide

PowerPoint 프레젠테이션

아날로그입력 Analog Input 작품이외부세계에관한정보를아날로그형태로읽어들이는경우. 센서를이용하는여러프로젝트들이이에속한다. 이를테면작품앞에있는사람의몸무게는어느정도인지, 방안의 조명은얼마나밝은지등을알고자하는경우가이에속한다. 예 ) 다양한센서들

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

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

Chapter 4. LISTS

PowerPoint Presentation

<4D F736F F F696E74202D203131C1D6C2F7202D E6FB8A620C0CCBFEBC7D120C4B3B8AFC5CD204C43442C C1A6BEEEC7CFB1E2205

PowerPoint 프레젠테이션

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

Microsoft PowerPoint - [2009] 02.pptx

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

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

슬라이드 1

1. 제품규격및특징 구분 규격및특징 입력전압 DC 12~30V 모터구동방식 Bipolar 방식 최대모터전류 Max 3.0A 초기설정정지전류 :4(0.46A), 구동전류 :18(1.75A) 분주비 0(x256), 1(x128), 2(x64), 3(x32), 4(x16),

Microsoft PowerPoint - es-arduino-lecture-09

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

슬라이드 제목 없음

PowerPoint 프레젠테이션

PowerPoint Template

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

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

PowerPoint 프레젠테이션

슬라이드 1

API 매뉴얼

RVC Robot Vaccum Cleaner

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

Microsoft PowerPoint - chap06-2pointer.ppt

슬라이드 1

PowerPoint Presentation

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

BY-FDP-4-70.hwp

SBR-100S User Manual

실험 5

Endpoint Protector - Active Directory Deployment Guide

[8051] 강의자료.PDF

adfasdfasfdasfasfadf

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

K&R2 Reference Manual 번역본

Arduino- 서보모터 서울과학기술대학교기계시스템디자인공학과 교수김성환

API 매뉴얼

KMC.xlsm

Mango-IMX6Q mfgtool을 이용한 이미지 Write하기

Microsoft Word - LKP-RTD 사용자 설명서

11장 포인터

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

C# Programming Guide - Types

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

Java ...

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

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Microsoft PowerPoint - additional01.ppt [호환 모드]

PowerPoint 프레젠테이션

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

윈도우시스템프로그래밍

*Revision History 날짜 내용 최초작성 Tel Fax [2] page

Transcription:

뻔뻔한아두이노 예제 1. [ 시작하기 ] 아두이노소프트웨어설치및브레드보드이용하기 2. [ 출력1] LED 깜빡이기 3. [ 출력2] 시리얼모니터에텍스트출력하기 4. [ 출력3] PWM을이용한 LED 밝기조절 5. [ 출력4] 여러개 LED 동시에제어하기 6. [ 출력5] 쉬프트레지스터 (74HC595) 7. [ 출력6] 서보모터구동하기 8. [ 출력7] H-Bridge를이용한 DC 모터방향제어하기 9. [ 입력1] 키보드로문자입력받아아두이노에전송하기 10. [ 입력2] 스위치사용하여 LED 컨트롤 11. [ 입력3] 근접물체감지하기 (QRD1114) 12. [ 입력4] 온도센서로온도감지하기 (TMP36) 13. [ 입력5] MPU-6050 이용각속도 / 가속도 / 온도측정하기 14. [ 입력6] Flex 센서를이용한구부림측정하기 15. [ 입력7] FSR 압력센서를이용한압력측정하기 16. [ 응용1] 밝기에따른 DC 모터속도제어 17. [ 응용2] 장애물감지후모터의방향제어 18. [ 응용3] 손가락으로모터제어하기 19. [ 응용4] 압력에따른 LED의밝기제어 1

20. [ 응용 5] 키보드로모터방향제어하기 21. [ 응용 6] Visual Studio Express C# 와아두이노인터페이스 22. [ 응용 7] 매틀랩을이용한센서값디스플레이 2

1. [ 시작하기 ] 아두이노소프트웨어설치및브레드보드이용하기 1) 아두이노소프트웨어다운로드 아두이노소프트웨어는일반적으로스케치라고부르며이스케치는 arduino.cc/en/main/software 에서다운로드받으실수있다. 주소창에위의주소를입력하면다음과같이다운로드페이지가열린다. Windows, Mac OS X, Linux 등의플랫폼에맞는스케치를다운로드받을수있으며, 이번매뉴얼은많은분들이사용하시는윈도우를기반으로작성되었기에윈도우용스케치를다운받겠다. 아두이노스케치다운로드페이지 사용하는 OS가윈도우가아니면, 위에서사용할플랫폼에맞게다운로드받을수있다. 그리고다운로드받은플랫폼은저장하고싶은위치에저장하면된다. 아두이노스케치는별도의설치가필요없으며, 다음의아두이노아이콘을이용하여소프트웨어를실행할수있다. Mac을사용한다면, 아두이노다운로드는디스크이미지 (.dmg) 로제공되며, 다운로드가완료된후파일을두번클릭하면이미지가마운트된다. 리눅스는리눅스버전에따라달라지기때문에자세한정보는아두이노위키 (http://www.arduino.cc/playground/learning/linux) 를참조하거나메카솔루션의기술상담게시판을이용할수있다. 다운로드및설치가끝나고폴더를열어서아두이노아이콘을더블클릭하면다음과같이스케치가열리며처음에는시간이약간걸릴수있기때문에기다리도록하자. 3

아두이노실행폴더 : 위의아이콘을더블클릭하면아두이노스케치가열린다. 아두이노스케치초기화면 4

아두이노소프트웨어를오픈하였을때보이는창이다. 현재, 아두이노는 Arduino Pro Mini로설정되어있고, 시리얼포트는 COM5 설정되어있음이오른쪽하단에표기되어있다. 우리가사용할아두이노우노와적합한시리얼포트를설정하기위해아두이노우노드라이버가잘설치되었는지확인한다. 2) USB 로아두이노와컴퓨터연결 만약, USB를이용하여아두이노에연결하기전과연결한후의시리얼포트인식변화가없다면, 아두이노의드라이버가설치되어있지않은것이다. 아두이노소프트웨어에서도구 > 시리얼포트를클릭한다. 만약, 회색톤으로시리얼포트가활성화되어있지않다면, 아두이노드라이버가연결되어있지않은것이다. 또한, USB를꼽았다가빼었다를하면서시리얼포트에변화가없다면이또한, 아두이노드라이버를인식하지못한것이기때문에, 아두이노드라이버를매뉴얼로설정해준다. 시리얼포트가설정되지않은상황 : 드라이버를설치해야한다. 3) 드라이버설치 장치관리자에들어가기위해왼쪽아래에있는실행버튼을누르고프로그램및파일검색이라는조그만검색창에 devmgmt.msc 를입력하고검색한다. 그럼, 다음과같은장치관리자가나타나게된다. 혹은시작버튼 제어판 시스템및보안 시스템 장치관리자를이용해서 5

장치관리자에접근할수있다. 장치관리자가열리면다음과같이느낌표로드라이버설치를 요구하는아두이노를발견할수있고, 오른쪽마우스버튼을클릭하여드라이버소프트웨어 업데이트를클릭한다. 장치관리자화면과아두이노소프트웨어업데이트 드라이버소프트웨어업데이트 : 수동으로업데이트하기 그후, 컴퓨터에서드라이버소프트웨어찾아보기를클릭하여수동으로검색을한다. 찾아보기를클릭하여압축을푼아두이노폴더에들어가서 drivers라는폴더를지정한다. 그리고다음버튼을누르면드라이버가설치됩다. 가령 C:\Arduino에다운받은아두이노를압축풀었다면 C:\Arduino\arduino-1.0.3\drivers까지설정하고설치를하면된다. 설치가되지않으면메카솔루션의기술상담으로문의할수있다. 4) 아두이노보드와시리얼포트설정 6

설치된아두이노에몇번의시리얼 (COM 포트 ) 이입력되어있는지확인하기위해서 USB 를끼웠다 빼었다하면도구 시리얼포트에변화가생기는것을볼수있다. 변화가있는시리얼포트가 현재연결되어있는아두이노의시리얼포트입니다. 시리얼포트를클릭하여설정한다. 5) 브레드보드와익숙해지기. 일명빵판이라불리우는브레드보드는납땜없이테스팅을하기위해만들어져있다. 일반적인브레드보드는다음과같이연결되어있다. 브레드보드정면과내부케리커처 ( 출처 : SIK GUIDE, Sparkfun) 양쪽끝에있는파란색, 그리고빨간색의세로열은하나로연결되어있어서, VCC 및 GND 로 사용되고, 가로열은일반적으로 5-6 개의핀을하나로연결시킴으로서 5-6 개의핀에연결된 케이블및핀들이동일한신호를공유할수있도록해준다. 6) 프로그램을아두이노에업로드 앞으로설명될예제및여러분들이작성한프로그램들은다음과같은절차를거쳐아두이노 보드에업로드된다. 먼저, 1) 프로그램을작성혹은다운받고, 2) 프로그램을확인 (Verify) 를한 후, 3) 프로그램을업로드 (Upload) 한다. 이세단계가아두이노에서가장중요한스텝이다. 7

2. [ 출력 1] LED 깜빡이기 가장기본적인출력이면서동시에아두이노가제대로동작하는지를확인할수있다. 아두이노 우노는 13 번핀이 LED 에연결되어있는채출고되기때문에별다른연결없이 USB 케이블과 아두이노만으로 LED 깜빡이기예제를수행할수있다. 준비물 : 아두이노우노, USB 케이블 따라하기 : USB 를이용하여아두이노와컴퓨터의 USB 포트를연결하기. 아두이노소프트웨어의파일 예제 Basics Blink 를클릭. LED 깜빡이는예제가다음과같이열린다. 첫번째부분은변수선언파트로 13 번핀을 led 로사용하겠다는의미이며, 두번째 void setup() 는 아두이노에전원이공급되면한번실행되는메소드이며핀에대한입출력설정및시리얼함수 8

초기화등을한다. pinmode(led, OUTPUT) 이라는커맨드는 led 를출력으로사용하겠다는의미이다. 여기서 led 는핀번호를의미하기때문에 13 번핀을출력으로설정이라고생각하면된다. 그리고세번째 void loop() 는아두이노에전원이들어온후꺼질때까지계속반복해서실행되는메소드이며위의소스를보면 digitalwrite(led, HIGH) 라는커맨드에서 led(13번핀 ) 에출력을 HIGH(5V) 로출력하여 LED를켜고 delay(1000) 이라는함수로 1000ms(1초 ) 동안켠상태를유지한다. 그리고다시 digitalwrite(led, LOW) 라는커맨드로 led에출력을 LOW(0V) 로하여 LED를끄고 delay(1000) 이라는함수로 1000ms(1초 ) 동안끈상태를유지한다. 결과적으로 void loop() 는 LED가 1초에한번씩꺼졌다켜졌다를반복하는깜빡이는동작을하게한다. 왼쪽상단의확인 (Verify) 버튼을누른후, 완료가되면업로드버튼을눌러서 LED 깜빡이기프로그램을아두이노에올려보자. 확인이되었으면, delay(1000) 을 delay(100) 으로바꿔서 LED 가더빨리깜빡이는지도 확인해보자. 9

3. [ 출력 2] 시리얼모니터에텍스트출력하기 아두이노에는 USB 케이블을이용하여간단히컴퓨터와데이터를주고받을수있다. 특히, 시리얼모니터라는기능을유용하게이용할수있는데, 간단한예제를통해서시리얼데이터를 아두이노에서컴퓨터로보내본다. 준비물 : 아두이노우노, USB 케이블 따라하기 : 앞서 LED 깜빡이기예제를수행하였다면별다른하드웨어변경은필요없다. USB 케이블을이용하여아두이노와컴퓨터를연결한다. 다음의간단한프로그램을아두이노의스케치에복사한후, 확인 ( 컴파일 ) 그리고 업로드를한다. void setup() Serial.begin(9600); // 시리얼포트를사용하겠다는선언 void loop() Serial.println("Mechasolution"); // Mechasolution이라는텍스트를줄바꾸면서출력한다. 업로드후, 스케치의오른쪽상단에있는시리얼모니터아이콘을클릭하거나, 도구- 시리얼모니터, 혹은 Ctrl+Shift+M을눌러서시리얼모니터창을띄워본다. 10

4. [ 출력 3] PWM 을이용한 LED 밝기조절 LED 의밝기를조절하려면어떻게해야할까. PWM(Pulse Width Modulation) 이라는것을이용하여 LED 의밝기를조절할수있다. 위의그림에서와 PWM은신호의 On/Off의비율을변경시키는방법을통해높고낮은레벨의출력을할수있도록한다. 즉, Off의비율이많으면점점흐릿해지는 LED를출력하게되고, On의비율이많으면점점밝아지는 LED 출력을하게된다. 이 PWM은아날로그출력이라는함수를사용하게되는데이출력에사용할수있는핀의개수가제한되어있다. 아두이노우노에서는 3,5,6,9,10,11번의 6개핀을사용할수있고, 디지털핀쪽의물결표시 (~) 로확인할수있다. 준비물 : 아두이노우노, USB 케이블, 브레드보드, LED, 330 옴저항, 점퍼케이블 따라하기 : LED는애노드와캐소드라는두개의리드가있는반도체장치이다. 다리가긴쪽이애노드 (+) 이고, 다리가짧은쪽이캐소드 (-) 이다. 통상적으로 LED에필요한전압은 1.8~2.3V이므로 5V에서 3V가량을전압강하해야한다. 그리고 LED가끌어쓰는전류를감안해서약 330옴의저항을연결한다. 11

다음의소스를스케치에복사혹은타이핑을한후확인 - 업로드를해보자. int led = 3; int brightness = 0; int increment = 1; void setup() // analogwrite을통해구동되는핀은출력으로선언하지않아도된다. void loop() if(brightness > 255) increment = -1; // 255에도달하면값은낮춘다. else if(brightness < 1) increment = 1; // 0으로떨어지면값을높인다. brightness = brightness + increment; // 밝기 (brightness) 를증가혹은감소한다. analogwrite(led, brightness); // 밝기를출력한다 delay(10); 12

매번 LED 의밝기가밝아졌다가어두워졌다가하는것을확인할수있다. 아날로그신호를디지털 신호로읽기위해서는 analogread() 를사용하며 0~1023(10bit) 까지의값으로변환해서읽을수 있고, 이번예제에서사용한 analogwrite() 는 0~255(8bit) 까지변환하여출력할수있다. 13

5. [ 출력 4] 여러개 LED 동시에제어하기 LED 를깜빡이고, PWM 을이용한밝기조절을하였다면여러개의 LED 를제어하는것은어려운 일이아니다. 이번예제를통해 8 개의 LED 를순차적으로깜빡이는것을 for 루프와배열에 대하여공부도해보도록하자. for 루프 간략하게설명을하자면여러분이어떤코드를여러번실행해야할때, 사용하는매우유용한반복문의일종이다. 배열 배열 (array) 는여러개의변수를지정할때사용하며배열의인덱스를이용하여 그값을지정할수있고배열에들어있는값을요소 (element) 라한다. 다음의예를통하여 for 루프와배열에대하여알아보자. 먼저, LED 8개를 Digital핀 2번에서 9번까지 8개를연결할것을설정하였다. 각각의 LED에대하여 ledpin1에서 ledpin8이라고설정을했다. 그리고 setup() 메소드에서이 LED들을입력이아닌출력으로사용할것을 pinmode함수를통해지정하였다. 왼쪽의코드가잘못된것은전혀아니지만, for 루프와배열을이용하여좀더컴팩트한프로그램을구현해보도록하자. 오른쪽의코드는 intledpins[] 라는배열을선언했다. 8개의숫자가 ledpins라는배열에할당이된다. 아두이노에서배열은 0번이첫번째요소를지칭한다. 따라서, int ledpins[0] = 2; int ledpins[1] = 3, 그리고, int ledpins[7] 은 9가된다. 이 8개의 LED들을 OUTPUT으로설정하기위하여 for(int i=0; i<=7; i++) 라는 for 루프문을사용한다. 이는 i라는인덱스를이용하여 0에서 7까지 i를 1씩증가시키겠다는의미이다. 따라서 for 루프가시작되는처음에는 i=0, pinmode(ledpins[0], OUPUT); i를 1씩증가시켜다음에는 i=1이되고 pinmode(ledpins[1], OUTPUT); 그리고마지막으로 i=7; pinmode(ledpins[7], OUTPUT) 이되고 for 루프문은종료된다. int ledpin1 = 2; int ledpin2 = 3; int ledpin3 = 4; int ledpin4 = 5; int ledpin5 = 6; int ledpin6 = 7; int ledpin7 = 8; int ledpin8 = 9; void setup() int ledpins[] = 2,3,4,5,6,7,8,9; void setup() for(int i = 0; i <= 7; i++) pinmode(ledpins[i],output); 14

pinmode(ledpin1, OUTPUT); pinmode(ledpin2, OUTPUT); pinmode(ledpin3, OUTPUT); pinmode(ledpin4, OUTPUT); pinmode(ledpin5, OUTPUT); pinmode(ledpin6, OUTPUT); pinmode(ledpin7, OUTPUT); pinmode(ledpin8, OUTPUT); 기본적으로왼쪽의코드와오른쪽의코드는같다. 하지만, 왼쪽의코드는오른쪽의코드보다 50바이트정도사이즈가더크다. 한정된메모리를사용하는아두이노인만큼최적화된프로그램을위해배열과 for 루프를적절히사용하도록하자. 본격적으로 8 개의 LED 를제어해보자. 준비물 : 아두이노우노, USB 케이블, 브레드보드, LED 8 개, 330 옴저항 8 개, 점퍼케이블 따라하기 : LED는애노드와캐소드라는두개의리드가있는반도체장치이다. 다리가긴쪽이애노드 (+) 이고, 다리가짧은쪽이캐소드 (-) 이다. 통상적으로 LED에필요한전압은 1.8~2.3V이므로 5V에서 3V가량을전압강하해야한다. 그리고 LED가끌어쓰는전류를감안해서약 330옴의저항을연결한다. 330 옴을 LED 의짧은다리와 GND 에연결한다. 그리고, LED 의다리가긴쪽을아두이노의 디지털핀 2 번에서 9 번까지연결한다. ( 다음그림에서사용된저항이미지는임의로 사용되었기때문에 330 옴 ( 주황 - 주황 - 갈색 ) 을사용한다. 주황은 3 을갈색은 0 을의미함 ) 15

다음의소스를스케치에복사혹은타이핑을한후확인 - 업로드를해보자. int ledpins[] = 2,3,4,5,6,7,8,9; // 8 개의 LED 를 Digital2 번부터 Digital9 번까지사용함. void setup() for(int i = 0; i <= 7; i++) pinmode(ledpins[i],output); // 8개의 LED를출력으로설정. void loop() for(int i = 0; i <= 7; i++) 16

digitalwrite(ledpins[i], HIGH); // D2부터 D9에연결된 LED를순차적으로켬 delay(100); // 100ms(0.1초 ) 동안기다림. for(int i = 7; i >= 0; i--) digitalwrite(ledpins[i], LOW); // D9부터 D2에연결된 LED를순차적으로끔 delay(100); // 100ms(0.1초 ) 동안기다림. 17

6. [ 출력 5] 쉬프트레지스터 (74HC595) 만약, 여러개의 LED를제어해야하지만그만큼의사용가능한핀들이없다면 ( 많은핀들을모터및센서에할당한경우 ), 쉬프트레지스터를이용하여다수의 LED를제어할수있다. 쉬프트레지스터는 IC(integrated circuit) 의일종으로 3개의핀을이용하여 8개의각기다른출력을할수있다. 쉬프트레지스터는많은종류가있지만, 74HC595라는칩을사용하도록하자. 다음은 74HC595칩의핀배열및논리값이다. SER, SRCLK, RCLK는 74HC595의제어인풋이며아두이노에서값을받는다. 그리고 QA~QH까지는 74HC595의출력이며최대 8개의 LED에연결이가능하다. SER은 data핀, SRCLK는 Clock, RCLK는 latch 핀으로각각아두이노의디지털핀 2,3,4번에연결할수있다. 우리가사용할아두이노의핀은 D2, D3, D4이며이들은각각 data, clock, latch 핀이된다. 이번에는 bitwrite() 와 shiftout() 이라는함수를이용하여시리얼시프트함수를작성할것이다. bitwrite(): bitwrite 는숫자를 bit 로바꾸서기록하는함수이며 bitwrite(x,n,b) 와같이 사용된다. 여기서 x 는 bit 로바꿀숫자이며 n 은기록될디지털핀, 그리고 b 는 bit 에쓸 불리언수 (0 혹은 1) 을나타낸다. ( 참고 : http://arduino.cc/en/reference/bitwrite) shiftout(): shiftout은 1byte를한번에 1bit씩밀어내는시프트출력명령입니다. shiftout(datapin, clockpin, bitorder, value) 와같이사용되며 datapin은 74HC595의 SER과연결된핀, clockpin은 SRCLK에연결된핀을지정하면된다. bitorder는 MSBFIRST (Most Significant Bit First) 혹은 LSBFIRST (Least Significant Bit First) 중선택이가능한데이는쉬프트하는방향을의미한다. 그리고 value는쉬프트출력을하려는 data이다. 준비물 : 아두이노우노, USB 케이블, 74HC595, 브레드보드, LED 8 개, 330 옴저항 8 개, 점퍼 케이블 18

따라하기 : 먼저 74HC595 와아두이노, 그리고 8 개의 LED 와저항들을다음에보이는회로와같이 연결한다. 다음의소스를스케치에복사혹은타이핑을한후확인 - 업로드를해보자. int datapin = 2; int clockpin = 3; int latchpin = 4; byte data = 0; void setup() 19

pinmode(datapin, OUTPUT); pinmode(clockpin, OUTPUT); pinmode(latchpin, OUTPUT); void loop() for(int i = 0; i <= 7; i++) shiftwrite(i, HIGH); delay(100); for(int i = 7; i >= 0; i--) shiftwrite(i, LOW); delay(100); void shiftwrite(int desiredpin, boolean desiredstate) bitwrite(data,desiredpin,desiredstate); shiftout(datapin, clockpin, MSBFIRST, data); digitalwrite(latchpin, HIGH); digitalwrite(latchpin, LOW); 20

7. [ 출력 6] 서보모터구동하기 우리가사용할서보모터는내부에포텐쇼미터혹은볼륨이있어서모터가어느정도회전했는지센싱하고, 모터내부에있는컨트롤러를이용하여입력받은값만큼돌려주는기능을가지고있다. 대부분의서보모터는무한회전을하지않고 180도정도회전하는데, 아두이노의 PWM을이용하여각도를컨트롤할수있다. 또한, 아두이노의 delay함수를이용하여모터의회전속도도조절할수있다. 앞에서보았던 PWM을이용하여모터를회전할수있지만, 아두이노의강점인오픈라이브러리를이용하여서보모터를쉽게컨트롤해보자. 아두이노소프트웨어를다운받으면 Servo.h라는라이브러리가함께설치된다. 따라서별도의라이브러리추가를할필요없이그대로사용하면된다. Servo.h 라이브러리는다음의함수를포함한다. servo.attach(pin): 서보모터가연결될핀을지정한다. 서보모터는 PWM 으로제어되기 때문에디지털핀중물결표시가있는핀에연결하면된다. 우노의경우 3, 5, 6, 9, 10, 11 번을사용할수있다. servo.write(angle): 회전시킬각도를입력한다. 이함수가실행되면모터는 angle 만큼 회전한다. 준비물 : 아두이노우노, USB 케이블, 서보모터, 브레드보드, 점퍼케이블 따라하기 : 서보모터는일반적으로 3 개의선을가지고있다. VCC( 빨강 ), GND( 검정혹은갈색 ), 그리고신호선 ( 노랑혹은주황 ). VCC 와 GND 를아두이노에연결하고, 신호선을디지털 9 번 핀에연결한다. 21

다음의소스를스케치에복사혹은타이핑을한후확인 - 업로드를해보자. #include <Servo.h> // 서보라이브러리 Servo motor1; // 서보모터오브젝트 void setup() motor1.attach(9); // 서보모터를 9번에연결 void loop() for(int position = 0; position < 180; position += 2) // 0도에서 180까지 2도씩증가 22

motor1.write(position); // 모터를 position 만큼회전 delay(20); // 모터가돌때까지기다림. for(int position = 180; position >= 0; position -= 2)//180도에서 0도까지 2도씩감소 motor1.write(position); // 모터를 position만큼회전 delay(20); // 모터가돌때까지기다림. 23

8. [ 출력 7] H-Bridge 를이용한 DC 모터방향제어하기 SN754410은쉽고편리한 IC로 DC 모터의속도와방향을컨트롤할수있게한다. 이번예제를통해쉽고간단하게 DC모터의방향을제어해보자. 또한, 본예제와가속도센서를이용해세그웨이와같은밸런스로봇도제작할수있고, 모터를이용한여러가지애플리케이션을제작할수있다. 준비물 : 아두이노우노, USB 케이블, 브레드보드, SN754410, DC 모터, 점퍼케이블 배경지식 : SN754410을이용하여한개의 DC모터를컨트롤하기위해서는 1개의 PWM, 2개의디지털아웃풋이요구된다. 1개의 PWM은스피드를컨트롤하기위함이며, 2개의디지털아웃풋은모터의방향을결정하기위함이다. 다음의 SN754410 칩의함수테이블을보면 A가 H(high) 일때, 아웃풋 Y는 HIGH이고, A가 L(low) 일때, 아웃풋은 L이다. 모터컨트롤러를왜사용하는가생각할수있다. 아두이노에서나오는아날로그아웃풋을이용하여컨트롤할수도있고, 혹은트랜지스터와다이오드를이용하여컨트롤할수도있다. 하지만, 모터에서사용하는전류가보통 100mA이상이므로 40mA를출력하는아두이노에직접적으로연결하는것은옳지않으며간단히모터컨트롤러칩을사용함으로써두개의모터를제어하는편리함때문에이번예제에서는트랜지스터와다이오드를이용한모터컨트롤대신 SN754410을이용한모터컨트롤을하기로했다. SN754410의핀정보를보면총 4개의인풋이있다 1A, 2A, 3A, 4A. 이 4개의인풋을이용하여두개의모터방향을결정할수있다. 즉, 1A와 2A를이용하여 1Y, 2Y의값을컨트롤하고, 3A와 4A를이용하여 3Y, 4Y를컨트롤한다. 1Y, 2Y는첫번째모터에, 그리고 3Y, 4Y는두번째모터에각각연결된다. 그리고, 1,2EN핀과 3,4EN핀에 PWM 값을입력해주면서전압에따른모터의속도컨트롤이가능하다. 24

SN754410 의핀정보및함수테이블 : 모터의출력 Y, 회로다이어그램 따라하기 : 1 개의 DC 모터를컨트롤하기위해서다음의회로를구성해보자. SN754410 을 브레드보드에꼽는다. 아래회로에서왼쪽에있는작은홈이있는방향이 1 번핀이 시작되는방향이다. 25

모터에서나오는두개의신호선은 + 혹은 에대한정의가없으니, 임의로결정을한 후에브레드보드에끼워도무방하며방향은컨트롤러에서결정할수있다. 혹은 회전하는방향에따라모터에서나오는갈색과보라색의선을바꾸어끼워도된다. 회로를구성하였으면다음의프로그램을컴파일후업로드해보자. int speedpin = 3; // SN754410의 1,2EN 핀과 PWM핀에연결하였다. 속도제어용핀 int motor1apin = 6; // 1A int motor2apin = 7; // 2A int speed_value_motor1; // 모터스피드를위한변수 void setup() pinmode(speedpin, OUTPUT); pinmode(motor1apin, OUTPUT); pinmode(motor2apin, OUTPUT); void loop() 26

digitalwrite(motor1apin, LOW); // 1A에 LOW digitalwrite(motor2apin, HIGH); // 2A에 HIGH speed_value_motor1 = 127; // 0~255의수중선택가능함. 0: 속도제로, 255: 최고속도. analogwrite(speedpin, speed_value_motor1); // PWM 출력을하여정한속도만큼모터회전 위의코드에서 loop() 내에있는명령문중, digitalwrite(motor1apin, LOW) 와 digitalwrite(motor2apin, HIGH) 를다음과바꾸어보자. ditialwrite(motor1apin, HIGH), digitalwrite(motor2apin, LOW). 모터가반대방향으로도는것을확인할수있다. 또한, speed_value_motor1 = 127 의값을 255 로도바꾸어보자. 모터가더빨리회전하는 것을확인할수있을것이다. 27

9. [ 입력 1] 키보드로문자입력받아아두이노에전송하기 키보드를이용하여로봇을제어하거나, MIDI와같은장비와의인터페이스를구현하기위해, 아두이노의 Serial.read() 함수를이용하여컴퓨터와아두이노의통신을구현할수있다. 키보드로부터키를입력받아, 아두이노의시리얼모니터링창에입력하면, 그값을아두이노에전송되고, 아두이노는다시그값을컴퓨터에보냄으로확인이가능하다. 준비물 : 아두이노우노, USB 케이블 따라하기 : USB 케이블을이용하여아두이노와컴퓨터를연결한다. 보드와시리얼포트설정을한 후다음의프로그램을업로드해본다. byte KeyInput; void setup() Serial.begin(9600); void loop() if(serial.available() > 0) KeyInput = Serial.read(); Serial.write(KeyInput); 업로드후, 시리얼모니터를열고, 키를입력한후엔터를쳐서아두이노에전송해보자. 28

엔터를치면, 아두이노로부터값을출력받는다. 29

10.[ 입력 2] 스위치사용하여 LED 컨트롤 알고리즘으로 LED 를컨트롤할수도있지만, 다양한스위치를이용하여 LED 를컨트롤할수도 있다. 스위치는버튼스위치, 토글스위치등여러가지가있지만, 기본원리는회로를연결혹은 끊는것이다. 준비물 : 아두이노우노, USB 케이블, 마이크로스위치, 10k 저항, 브레드보드, 점퍼케이블 배경지식 : 위의회로를보면, 스위치가열려있을때, 아두이노의인풋 (PINx) 는 HIGH 인풋을받게된다. 하지만, 스위치가닫히게되면 PINx 는 GND 에연결이되어 LOW 인풋을받게된다. 따라하기 : 스위치를브레드보드에연결혹은필요에따라납땜을한다. 그리고스위치의한쪽에풀업저항을이용하여 5V에연결한다. 반대쪽의스위치핀은 GND에연결한다. 아두이노의디지털핀을스위치와저항이만나는점 ( 노드 ) 에연결한다. 이디지털핀은 digitalread() 라는함수를이용하여값을읽을것이다. 아두이노디지털핀 13 번에연결되어있는내장형 LED 를사용할것이나필요에따라서 앞서설명된 LED 예제들을참고할수있다. 30

int button1pin = 2; // 버튼스위치의 2 번핀 int ledpin = 13; // 아두이노에내장된 LED void setup() pinmode(button1pin, INPUT); // 버튼을인풋으로사용할것을설정 pinmode(ledpin, OUTPUT); // LED는아웃풋으로사용. void loop() int button1state; // 버튼의입력값을저장할변수 button1state = digitalread(button1pin); // 버튼으로부터받은 0 혹은 1의값을저장 if (button1state == LOW) // 버튼이 LOW(0) 이면 31

digitalwrite(ledpin, HIGH); // LED를켜고 Else // 그렇지않으면 digitalwrite(ledpin, LOW); // LED를끈다. 32

11. [ 입력 3] 근접물체감지하기 근접물체를감지하기위해서는여러가지센서가사용될수있지만, 저렴하면서작은 QRD1114를이용하여근접센싱을할수있다. 이 QRD1114는적외선 LED와포토트렌지스터가작은모듈에구현이되어있는것으로적외선 LED로부터발광된빛이사물에반사되어돌아오는빛의세기를포토트렌지스터로측정함으로센싱을할수있도록설계되어있다. 준비물 : 아두이노우노, USB 케이블, QRD1114, 10k 옴저항, 220 옴저항, 브레드보드, 점퍼케이블 배경지식 : 1번과 2번으로구성되어있는것은포토트렌지스터이고, 3번과 4번으로구성되어있는것은적외선 LED이다. 3번에서입력받은전원으로적외선 LED는발광하게되고, 사물에반사된적외선의세기를포토트렌지스터로센싱하게된다. 이때, 아두이노의디지털인풋은풀업저항에연결되어있기때문에사물이없을경우는센싱값이 HIGH(1) 을갖게되고, 물체가감지되었을경우에는값이 LOW(0) 을갖게된다. 시리얼모니터를이용하여확인할수있다. 따라하기 : QRD1114 의 4 개의다리를브레드보드에꼽고저항을연결하여다음과같이회로를 구성한다. 33

다음의프로그램을업로드한다. int signal = 4; // 디지털핀 4 번으로센서값 (0 혹은 1) 을읽을변수. int onoff; // 4 번핀에서읽은값이 High(1) 인지 Low(0) 인지저장할변수 void setup() Serial.begin(9600); // 시리얼통신을사용하여모니터링할수있다. void loop() onoff = digitalread(signal); // 불리언신호 (0 혹은 1) 을읽어서 onoff 에저장 34

Serial.println(onoff); // onoff 변수값을 Serial.println 을통해출력. 업로드후에시리얼모니터를이용하여센싱되는값을시리얼모니터를통해확인해볼 수있다. 시리얼모니터는스케치의오른쪽상단에있는아이콘을클릭하여볼수있다. 시리얼모니터링창이열리면센서를손으로막았다떼었다하면서값이변하는것을 체크해볼수있다. 35

12. [ 입력 4] 온도센서로온도감지하기 TMP36 온도센서는 -40 도에서 125 도까지온도를측정할수있는센서로약 ±2 도정도의정확도를 가지고있다. 세개의다리가있는데평평한곳을정면으로가정할때, 왼쪽다리는입력전원, 오른쪽은 GND, 그리고가운데다리를이용하여온도를측정할수있다. 비교적간단한회로이지만, 핀방향을잘숙지하고회로를구성하도록하자. 준비물 : 아두이노우노, USB 케이블, TMP36 온도센서, 브레드보드, 점퍼케이블 배경지식 : 일반적으로센서를사용하여실제적인물리량 (ex. 온도 ) 을측정하기위해서는변환공식이필요하다. TMP36에인가해주는전원은 5V이다. 그리고아두이노가센서로부터읽는방법은 analogread() 라는함수를이용한다. 이 anlogread() 함수는센서로부터나오는아날로그전압값 (0~5V) 를디지털값으로변환하여읽게되는데그범위는 10bit, 즉 0에서 1023 사이의값이다. 따라서 5V는 1023에매칭이되고, 5V/1024*analogRead를이용하여전원값을읽을수있다. 그리고, 데이터시트에서기재된센서의특징에서전압과온도의관계를생각할수있다. 36

위의표에서사용된 TMP36 을보면 Offset Voltage(V) 는 0.5 이고, Output Voltage Scaling 은 0.01V/C 이다. 즉, 1 도에 0.01V 씩증가한다는의미이다. V( 전압 ) 과 C( 온도 ) 와의관계를생각해보면, V = 0.01*C + 0.5 가되고, 이를온도에대하여다시 풀면, C = 100*(V 0.5) 가된다. 따라하기 : TMP36 의가운데신호다리를아날로그 0 번에연결하고전원과 GND 를아두이노에 다음과같이연결한다. 37

다음의프로그램을업로드하고시리얼모니터를통해온도의변화를측정해보자. int temperaturepin = 0; float V; float C; void setup() Serial.begin(9600); void loop() V = analogread(temperaturepin) * 5/1024; C = 100*(V - 0.5); Serial.print("voltage: "); Serial.print(V); Serial.print(" deg: "); Serial.print(C); delay(1000); 38

13.[ 입력 5] MPU-6050 을이용하여각속도 / 가속도 / 온도측정하기 MPU-6050 은 9 축모션퓨전알고리즘을지원하는가속도, 자이로센서보드로서디지털로출력되는 온도센서기능도가지고있다. I2C 라는통신프로토콜을이용하여다수의센서데이터들을소수의 핀을이용하여수집할수있도록한다. MPU-6050 지금까지다루었던센서들은아날로그핀을이용하여값을읽었다. 이번에다룰 MPU-6050은아날로그핀이아닌두개의디지털핀을이용하여 3축각속도, 3축가속도, 그리고온도를측정할수있다. 준비물 : 아두이노우노, USB 케이블, MPU-6050, 브레드보드, 점퍼케이블 배경지식 : I2C(Inter-Integrated Circuit) 는저속의주변기기간 SCL(serial clock) 과 SDA(serial data) 2개의커넥션을가지고있다. 표준아두이노보드는클럭시그널을제공하는 SCL을위해아날로그핀 5을사용하고데이터전송을위한 SDA을위해서는아날로그핀 4을사용한다. (Mega는 SDA는디지털핀 20 그리고 SCL은핀 21을사용한다.) 따라서, MPU-6050의 SCL은아두이노의 A5, SDA는아두이노의 A4를사용한다. 따라하기 : 아두이노의 3.3V, GND, A4, A5 를 MPU-6050 의 VCC, GND, SDA, SCL 에각각연결한다. 39

다음의프로그램을업로드하고시리얼모니터링을통해값을확인한다. #include <Wire.h> #define MPU6050_ACCEL_XOUT_H 0x3B // R #define MPU6050_PWR_MGMT_1 0x6B // R/W #define MPU6050_PWR_MGMT_2 0x6C // R/W #define MPU6050_WHO_AM_I 0x75 // R #define MPU6050_I2C_ADDRESS 0x68 typedef union accel_t_gyro_union struct uint8_t x_accel_h; uint8_t x_accel_l; uint8_t y_accel_h; uint8_t y_accel_l; uint8_t z_accel_h; uint8_t z_accel_l; uint8_t t_h; uint8_t t_l; uint8_t x_gyro_h; 40

; uint8_t x_gyro_l; uint8_t y_gyro_h; uint8_t y_gyro_l; uint8_t z_gyro_h; uint8_t z_gyro_l; reg; struct int x_accel; int y_accel; int z_accel; int temperature; int x_gyro; int y_gyro; int z_gyro; value; void setup() int error; uint8_t c; Serial.begin(9600); Wire.begin(); // default at power-up: // Gyro at 250 degrees second // Acceleration at 2g // Clock source at internal 8MHz // The device is in sleep mode. // error = MPU6050_read (MPU6050_WHO_AM_I, &c, 1); Serial.print(F("WHO_AM_I : ")); Serial.print(c,HEX); Serial.print(F(", error = ")); 41

Serial.println(error,DEC); // According to the datasheet, the 'sleep' bit // should read a '1'. But I read a '0'. // That bit has to be cleared, since the sensor // is in sleep mode at power-up. Even if the // bit reads '0'. error = MPU6050_read (MPU6050_PWR_MGMT_2, &c, 1); Serial.print(F("PWR_MGMT_2 : ")); Serial.print(c,HEX); Serial.print(F(", error = ")); Serial.println(error,DEC); // Clear the 'sleep' bit to start the sensor. MPU6050_write_reg (MPU6050_PWR_MGMT_1, 0); void loop() int error; double dt; accel_t_gyro_union accel_t_gyro; Serial.println(F("")); Serial.println(F("MPU-6050")); // Read the raw values. // Read 14 bytes at once, // containing acceleration, temperature and gyro. // With the default settings of the MPU-6050, // there is no filter enabled, and the values // are not very stable. error = MPU6050_read (MPU6050_ACCEL_XOUT_H, (uint8_t *) &accel_t_gyro, sizeof(accel_t_gyro)); Serial.print(F("Read accel, temp and gyro, error = ")); 42

Serial.println(error,DEC); // Swap all high and low bytes. // After this, the registers values are swapped, // so the structure name like x_accel_l does no // longer contain the lower byte. uint8_t swap; #define SWAP(x,y) swap = x; x = y; y = swap SWAP (accel_t_gyro.reg.x_accel_h, accel_t_gyro.reg.x_accel_l); SWAP (accel_t_gyro.reg.y_accel_h, accel_t_gyro.reg.y_accel_l); SWAP (accel_t_gyro.reg.z_accel_h, accel_t_gyro.reg.z_accel_l); SWAP (accel_t_gyro.reg.t_h, accel_t_gyro.reg.t_l); SWAP (accel_t_gyro.reg.x_gyro_h, accel_t_gyro.reg.x_gyro_l); SWAP (accel_t_gyro.reg.y_gyro_h, accel_t_gyro.reg.y_gyro_l); SWAP (accel_t_gyro.reg.z_gyro_h, accel_t_gyro.reg.z_gyro_l); // Print the raw acceleration values Serial.print(F("accel x,y,z: ")); Serial.print(accel_t_gyro.value.x_accel, DEC); Serial.print(F(", ")); Serial.print(accel_t_gyro.value.y_accel, DEC); Serial.print(F(", ")); Serial.print(accel_t_gyro.value.z_accel, DEC); Serial.println(F("")); // The temperature sensor is -40 to +85 degrees Celsius. // It is a signed integer. // According to the datasheet: // 340 per degrees Celsius, -512 at 35 degrees. // At 0 degrees: -512 - (340 * 35) = -12412 Serial.print(F("temperature: ")); dt = ( (double) accel_t_gyro.value.temperature + 12412.0) / 340.0; Serial.print(dT, 3); 43

Serial.print(F(" degrees Celsius")); Serial.println(F("")); // Print the raw gyro values. Serial.print(F("gyro x,y,z : ")); Serial.print(accel_t_gyro.value.x_gyro, DEC); Serial.print(F(", ")); Serial.print(accel_t_gyro.value.y_gyro, DEC); Serial.print(F(", ")); Serial.print(accel_t_gyro.value.z_gyro, DEC); Serial.print(F(", ")); Serial.println(F("")); delay(500); int MPU6050_read(int start, uint8_t *buffer, int size) int i, n, error; Wire.beginTransmission(MPU6050_I2C_ADDRESS); n = Wire.write(start); if (n!= 1) return (-10); n = Wire.endTransmission(false); if (n!= 0) return (n); // hold the I2C-bus // Third parameter is true: relase I2C-bus after data is read. Wire.requestFrom(MPU6050_I2C_ADDRESS, size, true); i = 0; while(wire.available() && i<size) buffer[i++]=wire.read(); 44

if ( i!= size) return (-11); return (0); // return : no error int MPU6050_write(int start, const uint8_t *pdata, int size) int n, error; Wire.beginTransmission(MPU6050_I2C_ADDRESS); n = Wire.write(start); // write the start address if (n!= 1) return (-20); n = Wire.write(pData, size); // write data bytes if (n!= size) return (-21); error = Wire.endTransmission(true); // release the I2C-bus if (error!= 0) return (error); return (0); // return : no error int MPU6050_write_reg(int reg, uint8_t data) int error; error = MPU6050_write(reg, &data, 1); return (error); 45

아래보이는시리얼모니터링의창처럼, error = 0 이고, 3 축의가속도, 온도, 그리고 3 축의 자이로값이출력되는것을확인할수있다. 46

14.[ 입력 6] Flex 센서를이용한구부림측정하기 웨어러블수트가등장하면서각광받은 Flex 휨센서는구부러진정도를측정할수있는센서이다. FSR 압력센서와마찬가지로저항의일종인 Flex 휨센서는구부러진정도에따라저항값이바뀌는 특징을이용한다. 준비물 : 아두이노우노, USB 케이블, 10k 옴저항, Flex 센서, 브레드보드, 점퍼케이블 배경지식 : Flex 센서는다음과같이구부러진정도가커지면저항값이커진다. 따라하기 : Flex 센서와저항을이용하여다음과같은회로를구성한다. 47

다음의프로그램을업로드한후시리얼모니터링을통하여값의변화를체크해보자. int flexpin = 0; // 센서값을읽기위해아날로그핀 0 번을 flexpin 에지정한다. void setup() Serial.begin(9600); // 센서값을읽기위해시리얼모니터를사용할것을설정. void loop() int flexval; // 센서값을저장할변수 flexval = analogread(flexpin); // 아날로그를입력받음 (0~1023) Serial.print("sensor: "); // sensor: 라는텍스트를프린트한다. Serial.println(flexVal); // println은줄바꿈명령이다. flexval의값을출력한다. 48

시리얼모니터링에서데이터가빠르게진행되서값을체크하기어렵다면 delay() 함수를 사용해볼수있다. Serial.println(flexVal); 다음줄에 delay() 를사용해보자. (ex. delay(200);) 49

15.[ 입력 7] FSR 압력센서를이용한압력측정하기 FSR(Force Sensing Resistor) 는얇은필름방식으로제작된압력센서로서간단한접촉의압력측정이가능하다. 굽힘센서와마찬가지로저항의일종이며 10k옴저항을사용하여값을측정할수있다. 정밀한압력및힘의측정에는로드셀을사용할수있으나, 비교적저렴하면서쉽게구현이가능하기때문에널리사용되고있다. 준비물 : 아두이노우노, USB 케이블, 10k 옴저항, FSR, 브레드보드, 점퍼케이블 배경지식 : 데이터시트에서제공된실험결과를보면저항값과힘의관계가그래프에표현되어있다. V O V I = R FSR R 1 + R FSR 여기서 V I =5V, 즉 1023 이고, R 1 =10000 옴이라고하면, V O 와 R FSR 의관계식은다음과같이된다. R FSR = 9.78 V O 1 ( V O 1023 ) V O 는아두이노의 analogread() 함수를이용하여센서값을얻고, 위공식을바탕으로 FSR 의 저항값을측정할수있다. 그리고, 측정된저항값 (R FSR ) 을아래저항과힘의관계그래프를통하여 가해진힘을확인할수있다. 따라하기 : FSR 과저항을이용하여다음과같은회로를구성한다. 50

다음의프로그램을업로드한후시리얼모니터링을통하여값의변화를체크해보자. int FSRpin = 0; // FSRpin을아날로그0(A0) 에연결 int Vo; // 센서값을저장할변수 float Rfsr; void setup() Serial.begin(9600); // 센서값을읽기위해시리얼모니터를사용할것을설정. void loop() Vo = analogread(fsrpin); // 아날로그를입력받음 (0~1023) Rfsr = ((9.78 * Vo)/(1-(Vo/1023.0))); Serial.print("Rfsr: "); // sensor: 라는텍스트를프린트한다. Serial.println(Rfsr); // println은줄바꿈명령이다. Rfsr의값을출력한다. 51

시리얼모니터링에서데이터가빠르게진행되서값을체크하기어렵다면 delay() 함수를 사용해볼수있다. Serial.println(Rfsr); 다음줄에 delay() 를사용해보자. (ex. delay(200);) 52

16.[ 응용 1] 밝기에따른 DC 모터속도제어 조도센서는 CdS라는광전도셀을이용하여가시광선이없는곳에서는절연체와같이전류가흐르지않다가가시광선이닿으면도체와같이전류가잘흐르는성질을가지고있다. 빛을감지하여회로를 ON/OFF하거나센서및방범용모듈등에많이사용된다. 이번예제에서는조도센서를이용하여빛의세기를측정하고, 그세기에따라 DC모터의속도를제어하는프로그램을실행해보자. 준비물 : 아두이노우노, USB 케이블, 10k 옴저항, 조도센서, SN754410, DC 모터, 브레드보드, 점퍼케이블 따라하기 : Flex 센서, FSR 과같이조도센서도두개의다리를가지고있는일종의저항이다. 여기에 앞서다루었던 DC 모터방향제어하기예제를응용하여다음의회로를구성한다. 53

다음의프로그램을업로드한다. int sensorpin = 0; // 조도센서가연결될 A0핀 int speedpin = 3; // SN754410의 1,2EN 핀과 PWM핀에연결하였다. 속도제어용핀 int motor1apin = 6; // 1A int motor2apin = 7; // 2A int speed_value_motor1; // 모터스피드를위한변수 int lightlevel; // 조도센서로부터읽은값을저장할변수 void setup() pinmode(speedpin, OUTPUT); pinmode(motor1apin, OUTPUT); pinmode(motor2apin, OUTPUT); void loop() lightlevel = analogread(sensorpin); // 센서로부터읽은값을저장 (0~1023) digitalwrite(motor1apin, LOW); // 1A에 LOW digitalwrite(motor2apin, HIGH); // 2A에 HIGH lightlevel = map(lightlevel, 0, 1023, 0, 255); // PWM 출력레벨 (8bit) 로센서값을맵핑 analogwrite(speedpin, lightlevel); // 밝기에따라모터회전속도출력 54

17.[ 응용 2] 장애물감지후모터의방향제어 앞에서소개된 QRD1114 는 1cm 내에있는사물을감지하는데유용하게쓰이는센서이다. 이 센서를이용하여소형로봇의장애물감지를할수있으며모터의방향도제어할수있다. 보다 먼거리의사물을감지하기위해서는적외선센서혹은초음파센서를이용할수있다. 준비물 : 아두이노우노, USB 케이블, QRD1114, 10k 옴저항, 220 옴저항, SN754410, DC 모터, 브레드보드, 점퍼케이블 따라하기 : 앞서다루었던 QRD1114 예제와 DC 모터제어예제를이용하여다음의회로를구성한다. 55

QRD1114 가사물을감지했을때, 모터의방향을바꾸는예제를 if 명령어를이용하여 다음과같이프로그램을작성할수있다. 프로그램을업로드한후, QRD1114 센서를 손가락으로막았다떼었다하면서모터의회전방향을체크할수있다. int speedpin = 3; // SN754410의 1,2EN 핀과 PWM핀에연결하였다. 속도제어용핀 int signal = 4; // 디지털핀4번으로센서값 (0 혹은 1) 을읽을변수. int onoff; // 4번핀에서읽은값이 High(1) 인지 Low(0) 인지저장할변수 int motor1apin = 6; // 1A int motor2apin = 7; // 2A int speed_value_motor1; // 모터스피드를위한변수 void setup() pinmode(speedpin, OUTPUT); pinmode(motor1apin, OUTPUT); pinmode(motor2apin, OUTPUT); void loop() onoff = digitalread(signal); // 불리언신호 (0 혹은 1) 을읽어서 onoff에저장 if(onoff == 1) digitalwrite(motor1apin, LOW); // 1A에 LOW digitalwrite(motor2apin, HIGH); // 2A에 HIGH else digitalwrite(motor1apin, HIGH); // 1A에 LOW digitalwrite(motor2apin, LOW); // 2A에 HIGH speed_value_motor1 = 127; // 0~255의수중선택가능함. 0: 속도제로, 255: 최고속도. analogwrite(speedpin, speed_value_motor1); // PWM 출력을하여정한속도만큼모터회전 56

18. [ 응용 3] 손가락으로서보모터제어하기 손가락에 Flex 센서를연결하여굽힌정도에따라서보모터를제어할수있다. 앞에서다룬 Flex 센서예제와서보모터예제를통하여손가락으로서보모터제어를구현해보자. 준비물 : 아두이노우노, USB 케이블, Flex 센서, 10k 옴저항, 서보모터, 브레드보드, 점퍼케이블 따라하기 : 앞서다루었던 QRD1114 예제와서보모터구동예제를이용하여다음의회로를 구성한다. 57

다음의프로그램을업로드하여손가락의굽힌정도에따라서보모터가회전하는지체크해보자. 매 0.2초마다값을읽기때문에모터의속도가느리다면모터가회전하는중간에센서값을읽을수도있다. 테스트를하면서 delay() 함수를변경하여부드러운컨트롤을할수있다. #include <Servo.h> // 서보라이브러리 Servo motor1; // 서보모터오브젝트 int flexpin = 0; // 센서값을읽기위해아날로그핀 0번을 flexpin에지정한다. 58

int motorangle; void setup() motor1.attach(9); // 서보모터를 9번에연결 void loop() int flexval; // 센서값을저장할변수 flexval = analogread(flexpin); // 아날로그를입력받음 (0~1023) motorangle = map(flexval, 0, 1023, 0, 180); motor1.write(motorangle); // 모터를 position만큼회전 delay(200); // 모터가돌때까지기다림. 59

19.[ 응용 4] 압력에따른 LED 의밝기제어 FSR( 압력센서 : Force Sensing Resistor) 을이용하여쉽게 LED 의밝기를조절할수있다. 앞서 PWM 을이용한 LED 밝기조절예제와 FSR 을이용한압력측정예제를통하여이를구현할수 있다. 준비물 : 아두이노우노, USB 케이블, FSR 센서, 10k 옴저항, LED, 브레드보드, 점퍼케이블 따라하기 : FSR 과저항 (10k 옴 ) 을이용하여압력을측정하는예제를구현하고, LED 를 PWM 핀에 연결한다. 다음의회로를참고한다. 60

압력에따른 LED 밝기제어프로그램을업로드한다. int led = 3; int brightness = 0; int increment = 1; int FSRpin = 0; // FSRpin을아날로그0(A0) 에연결 int Vo; // 센서값을저장할변수 float Rfsr; void setup() // analogwrite을통해구동되는핀은출력으로선언하지않아도된다. void loop() Vo = analogread(fsrpin); // 아날로그를입력받음 (0~1023) brightness = map(vo, 0, 1023, 0, 255); analogwrite(led, brightness); // 밝기를출력한다 delay(10); 61

20.[ 응용 5] 키보드로모터방향제어하기 키보드로부터입력받은값을이용하여 DC 모터의회전방향을제어할수있다. 이번예제에서는 A 를입력받으면정방향회전, B 를입력받으면역방향회전, 그리고, C 를입력받으면정지하는 시스템을구현하였다. 준비물 : 아두이노우노, USB 케이블, SN754410, DC 모터, 브레드보드, 점퍼케이블 따라하기 : 다음과같이회로를구성하고, 아래의프로그램을업로드한다. int speedpin = 3; // H-bridge enable pin for speed control int motor1apin = 6; // H-bridge leg 1 int motor2apin = 7; // H-bridge leg 2 int ledpin = 13; // status LED int speed_value_motor1; // value for motor speed 62

byte KeyInput; void setup() // set digital i/o pins as outputs: pinmode(speedpin, OUTPUT); pinmode(motor1apin, OUTPUT); pinmode(motor2apin, OUTPUT); pinmode(ledpin, OUTPUT); Serial.begin(9600); void loop() digitalwrite(ledpin, HIGH); // status LED is always on KeyInput = Serial.read(); if(keyinput == 'A') // put motor in forward motion digitalwrite(motor1apin, HIGH); // set leg 1 of the H-bridge low digitalwrite(motor2apin, LOW); // set leg 2 of the H-bridge high else if(keyinput == 'B') digitalwrite(motor1apin, LOW); // set leg 1 of the H-bridge low digitalwrite(motor2apin, HIGH); // set leg 2 of the H-bridge high else if(keyinput == 'C') digitalwrite(motor1apin, LOW); // set leg 1 of the H-bridge low digitalwrite(motor2apin, LOW); // set leg 2 of the H-bridge high speed_value_motor1 = 127; // half speed analogwrite(speedpin, speed_value_motor1); // output speed as 시리얼모니터창을열어서 A, B, 혹은 C 를타이핑한후엔터입력을하여모터의 회전방향을체크할수있다. 63

. 64

21.[ 응용 6] Visual Studio Express C# 와아두이노인터페이스 Microsoft의 Visual Studio Express C# 은무료개발툴로서 Microsoft홈페이지에서다운로드가가능하다. C# 이란, C++ 의연산력 (computing power) 과 Visual Basic의편의성 (convenience) 을결합하기위한목적으로마이크로소프트사에서개발한객체지향프로그래밍언어이다. C++ 가기반이며, 자바랑비슷한특징을지니고있다. 준비물 : 아두이노우노, USB 케이블, 10k 옴저항, FSR 센서 따라하기 : 다음의링크에서 Visual C# 2010 Express 를다운로드받는다. http://www.microsoft.com/visualstudio/kor/downloads#d-express-windows-desktop 지금설치버튼을누르면, vcs_web.exe 파일이다운로드되고, 이를더블클릭하여 실행한다. 다음을클릭 65

다음을클릭 다음을클릭 66

저장할폴더를설정한후설치클릭 67

설치완료 설치된 Microsoft Visual C# Express 2010 을실행하면위의창이열린다. 68

새프로젝트를클릭하여 Window Forms 응용프로그램을클릭후이름을 ArduinoInterface 라하고확인을클릭한다. 69

위와같은창이열리며왼쪽에숨겨있는도구상자를클릭한후, 자동숨기기 버튼 ( 압정모양의버튼 ) 을클릭하여도구상자를아래그림과같이펼친다. 왼쪽의도구상자에서 SerialPort 를드래그하여오른쪽의 Form1 에놓는다. 도구상자에서버튼을클릭하여 Form1 에두개의버튼을넣어준다. 그리고마우스 오른쪽버튼을클릭한후속성에들어가서 button1 과 button2 의이름 (Text) 를 LED ON, LED OFF 로바꾸어준다. 70

71

라벨을이용하여 Sensor Value 라는텍스트를넣어주고, RichTextBox 를이용하여센서값이 출력될빈텍스트상자를넣어준다. 이때, Form1 을더블클릭하면다음과같이소스코드창으로넘어가게된다. Form1 을 더블클릭하였기때문에 Form1_load 라는함수가생겼다. 마찬가지로두개의 LED ON, LED OFF 버튼을더블클릭하여소스코드에버튼클릭함수를넣어주자. 이번예제에서구현할 1) C# 에서버튼으로 LED 컨트롤하기, 2) FSR 센서값 C# 에 디스플레이를하기위해, 다음의회로를구성한다. 72

아두이노에다음의프로그램을업로드한다. int FSRpin = 0; // FSRpin을아날로그0(A0) 에연결 int Vo; // 센서값을저장할변수 float Rfsr; void setup() pinmode(13, OUTPUT); Serial.begin(9600); // 센서값을읽기위해시리얼모니터를사용할것을설정. void loop() if(serial.available()) 73

int c = Serial.read(); if (c == '1') digitalwrite(13,high); else if (c == '0') digitalwrite(13,low); Vo = analogread(fsrpin); // 아날로그를입력받음 (0~1023) Rfsr = ((9.78 * Vo)/(1-(Vo/1023.0))); Serial.println(Rfsr); // println은줄바꿈명령이다. Rfsr의값을출력한다. C# 과아두이노인터페이스를구성하기위해시리얼포트를설정해야한다. 시리얼포트를설정하기위해서는 Baudrate과포트번호를아두이노와동일하게설정하여야한다. Serial.begin(9600) 에서 9600bps를사용하였기때문에 9600으로입력하고, COM10을사용하였기때문에, 다음과같이입력한다. 여러분이사용하고있는포트번호를입력한다. 다음의 C# 코드를앞서 Visual Studio C# 에치환한다. C# 코드 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace ArduinoInterface public partial class Form1 : Form 74

string sensorval; public Form1() InitializeComponent(); serialport1.portname = "COM10"; serialport1.baudrate = 9600; serialport1.open(); private void Form1_Load(object sender, EventArgs e) private void button1_click(object sender, EventArgs e) serialport1.write("1"); button1.enabled = false; button2.enabled = true; private void button2_click(object sender, EventArgs e) serialport1.write("0"); button1.enabled = true; button2.enabled = false; private void serialport1_datareceived(object sender, SerialDataReceivedEventArgs e) sensorval = serialport1.readline(); this.invoke(new EventHandler(DisplayText)); private void DisplayText(object sender, EventArgs e) richtextbox1.appendtext(sensorval); richtextbox1.scrolltocaret(); 75

상단의디버깅시작버튼혹은 F5 를누르면프로그램이실행되고다음의창이열린다. LED ON 버튼을누르면아두이노의 LED 가켜지고, LED OFF 버튼을누르면 LED 가꺼지는 것을확인할수있다. 센서값도실시간으로업데이트가되는것을확인할수있다. 76

22.[ 응용 7] 매틀랩을이용한센서값디스플레이 매틀랩 (MATLAB) 은 Mathworks사에서개발된수치해석및프로그래밍환경을제공하는공학용프로그램이다. 많은공학도들이매틀랩을이용한과제및연구를하고있기에이번예제에서는실시간으로변하는센서값을매틀랩에서보여주는기본적인프로그램을작성하겠다. 앞서소개된 FSR을이용한회로도를다시구성해보도록하겠다. 준비물 : 아두이노우노, USB 케이블, 10k 옴저항, FSR 센서 따라하기 : FSR 과 10k 옴저항을이용하여다음의회로를구성한다. 아두이노에다음의프로그램을업로드한다. int FSRpin = 0; // FSRpin을아날로그0(A0) 에연결 int Vo; // 센서값을저장할변수 float Rfsr; 77

void setup() Serial.begin(9600); // 센서값을읽기위해시리얼모니터를사용할것을설정. void loop() Vo = analogread(fsrpin); // 아날로그를입력받음 (0~1023) Rfsr = ((9.78 * Vo)/(1-(Vo/1023.0))); Serial.println(Rfsr); // println은줄바꿈명령이다. Rfsr의값을출력한다. 매틀랩을실행한다. 매틀랩초기시작화면 78

매틀랩스크립트를열어서다음의코드를작성한다. instrreset serialobj = serial('com10','baudrate',9600); fopen(serialobj); i=1; while(1) a = str2num(fscanf(serialobj)); plot(i,a,'*'); hold on drawnow i=i+1; end 그리고, 실행을하면, 다음과같이센서값이실시간으로출력되는것을확인할수있다. 79

이때, while(1) 이라는무한루프에서빠져나오기위해서 Ctrl + C 이용할수있다. 80