아두이노코딩및프로젝트실습 v2.0 김영준저 공학박사, 목원대학교겸임교수 前 Microsoft 수석연구원 헬로앱스 http://www.helloapps.co.kr
목차 01. 아두이노코딩및프로젝트준비작업 1 02. LED 점멸하기 29 03. 절전기능 LED 후레쉬 47 04. 틱톡스위치만들기 61 05. 토글스위치를활용하는프로젝트 73 06. 스마트헤드라이트 86 07. 동체인식및경보음실행장치만들기 104 08. 차량후방감지기및멜로디연주장치 125 09. 컬러 LED바예술창작작품만들기 141 10. 컬러무드등만들기 161 11. 나만의로봇제어함수만들기 169 12. 로봇조종기만들기 190 13. 자율주행로봇 204 14. 블루투스원격제어하기 213 - II -
01 아두이노코딩및프로젝트준비작업 학습목표 아두이노프로젝트활동에필요한 H/W 및 S/W 설치작업을완료한다. 아두이노의역사와기능에대해이해한다. 실습개요 아두이노의용도와기능에대해살펴한다. 아두이노 S/W 개발툴을설치한다. USB 드라이버를설치한다. 아두이노연결상태를확인한다. - 3 -
준비물 아두이노보드, 올인원쉴드, USB 연결케이블 아두이노우노보드 올인원쉴드 - 4 -
1.1 아두이노 (Arduino) 란? 아두이노탄생배경 아두이노는 2003 년이탈리아의 Interaction Design Institute Ivrea (IDII) 학생들의수업을위해개발이시작된오픈소스프로젝트의결과물이다. 초기프로젝트팀에는 Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino와 David Mellis 등이참여하였으며이들이프로젝트모임을위해만난장소는이탈리아 Ivrea에있는술집인데, 이술집의이름이 Arduin of Ivrea 이었다. Arduin of Ivrea 은 1002 년부터 1014 년까지이탈리아 Ivrea 지역을통 치한후작 (Margrave) 의이름으로서, 이러한이유때문에아두이노가이탈 리아왕의이름을의미한다고도알려져있다. 아두이노 (Aruino) 라는공식상표는 5명의아두이노참여팀원들이 2008년 Arduino LLC라는회사를설립하면서만들어졌으나, 미국이외의지역에서의아두이노상표권은 Arduino SRL이라는회사가가져감으로써, 미국이외의지역에서 Arduino 라는상표를사용하지못하는문제가발생을하였다. 이로인해 Genuino 라는새로운상표를만들어서사용하기시작을하였다. 하지만이두회사는 2016년합병을하게됨으로써, Arduino 와 Genuino로분리되어있던아두이노상표권문제는결국마무리되었다. - 5 -
아두이노에대한오해 구글검색에서 Arduino라는단어로검색을하면아래의사진에있는제품이가장많이표시되는것을볼수있다. 이제품은수많은아두이노지원보드제품중에서가장많이알려져있는아두이노우노 (Arduino Uno) 제품으로서, 단지아두이노지원보드중에서가장보편적인보드일뿐아두이노그자체를정의하는것이아니다. 일반인들에게대표적으로알려져있는아두이노우노보드 - 6 -
아두이노의구성요소 그렇다면, 아두이노의정체는무엇일까? 아두이노는크게 3 가지종류의구 성요소로이루어져있으나, 핵심은 SW 라이브러리를의미한다. 구성요소 SW 라이브러리개발툴 (IDE) 하드웨어보드 설명 Arduino.h 라는이름으로사용되는 SW 라이브러리로서, 복잡한 AVR 명령어기능들을쉬운 C언어기반의함수로정의해놓은것이다. 실제아두이노프로젝트의가장핵심적인결과물이며, 아두이노그자체라고도부를수있다. 흔히스케치코드라고부르는아두이노코드를작성하는개발툴이다. 이툴은아두이노프로젝트팀에서개발한것이아니라 MIT에서 C언어교육용으로개발하여배포하고있는프로세싱이라는교육용 SW 개발툴을가져다사용한것이다. 아두이노우노보드와같은아두이노라이브러리를지원하는하드웨어보드를의미한다. 다양한아두이노 H/W 보드종류들 - 7 -
아두이노와라즈베리파이의차이점 아두이노보드와라즈베리파이보드는일반인이보기에비슷한것처럼보 이지만아주큰차이점을가진다. 라즈베리파이는컴퓨터로분류되지만아두이노는컴퓨터가아닌마이크로 컨트롤러 ( 일명마이컴이라부름 ) 로분류되기때문이다. 아두이노 라즈베리파이 마이크로컨트롤러이다. OS가없으며, 메모리에저장된하나의프로그램이바로실행된다. 키보드나마우스같은입출력장치를연결할수없다. 비전문가를위한임베디드장치개발용으로만들어졌다. 임베디드기반창작작품이나 C언어교육용으로활용된다. 컴퓨터이다. OS( 리눅스, Windows 10) 를설치할수있다. 키보드나마우스같은입출력장치가연결된다. 개발도상국에저렴한비용의컴퓨터를보급하기위해만들어졌다. OS나보안, 네트워크교육용으로주로활용되고있다. - 8 -
4 차혁명시대를대비한아두이노활용직무훈련의필요성 기업형태의변화 ( 직장형태및직장에서의역할의변화 ) 기존의기업형태 다가올미래에서의기업형태 많은인원이모여규모화된기업활동 역할전문화및세분화 개인또는소수인원의네트워크화 개인이개발의전과정역량보유요구 기획 / 설계 / 개발 / 테스트 / 생산전과정에대한프로젝트형체험및실습필요 시장의요구에민첩하게대응할수있는훈련및생산역량필요 C 언어 / 전자회로 / 납땜등개별적인 기술지식및훈련위주의교육 아이디어도출 / 프로젝트기획 / 자료수집 / 디자인 / 설계 / 개발 / 테스트 / 생산전과정에대한프로젝트수행교육 아두이노활용프로젝트형수행교육은미래시대를대비하기위한가장효과적인직무개발및직무교육과정으로활용될수있음 - 9 -
1.2 초보자용아두이노코딩 SW 설치 코딩 SW 의종류 아두이노코딩을하기위해서는아두이노라이브러리를사용할수있는개 발환경이필요하다. 아두이노라이브러리는기본적으로 C 언어로작성되어있다 ( 엄밀히말하면 AVR C++ 언어로작성되어있음 ). C 언어로라이브러리가작성되어있긴하지만여전히일반인이사용하기에 는어려운문제점이있으며, 이를해소하기위해다양한보완툴들이계속 만들어지고공급되고있다. 아두이노공식홈페이지에서 배포하는 IDE 툴 헬로앱스에서배포하는 초보자용코딩 SW 툴 - 10 -
무료 C/C++ 언어로만개발 코드공유기능없음아두이노공식홈페이지에서배포하는 IDE 툴 유료 ( 무료체험판사용가능 ) 블록 / 스크립트 /C언어/C++ 언어지원 사용자수준별로언어선택가능 블록이나스크립트코딩시실시간 C언어생성기능지능 교사와학생간코드공유기능지원 아두이노시뮬레이터기능지원헬로앱스에서배포하는초보자용코딩 SW 툴 초보자용코딩 SW 설치 초보자용아두이노코딩 SW 는아래의페이지에서다운로드가능하다. http://www.helloapps.co.kr/download/ - 11 -
아래의페이지에서오른쪽에있는다운로드아이콘을클릭하여최종버전 의아두이노코딩 SW 를다운로드받는다. 다운로드받은설치파일을마우스로클릭하여설치를진행한다. 특별히선 택할사항은없으며, 다음버튼을계속눌러주면설치가마무리된다. - 12 -
USB 드라이버설치 모든아두이노보드들은컴퓨터에연결하기전에반드시 USB 드라이버가 설치되어있어야하며, 매번설치할필요없이맨처음한번만설치해주 면된다. 초보자용코딩 SW가설치되고나면, 바탕화면에 SPL 폴더가만들어진다. SPL 폴더에서맨아래에있는 아두이노우노보드 USB 드라이버 (64bit) 파일을클릭하여설치를진행한다. 만약컴퓨터의 OS가 32비트라면오류가발생할것이다. 이경우에는 아두이노우노보드 USB 드라이버 (32bit) 파일을클릭하여설치를진행해주면된다. 주의사항 USB 드라이버설치전에아두이노보드를컴퓨터에연결하면않된다. 반드 시 USB 드라이버를먼저설치한후에아두이노보드를컴퓨터에연결해주 어야설치작업이마무리될수있다. - 13 -
아두이노보드연결하기 아두이노우노보드를 USB 케이블을이용하여컴퓨터와연결해준다. 아두이노보드가컴퓨터에맨처음연결되는순간, 컴퓨터에서남아있는 USB 드라이버설치작업이자동으로진행되며, 10 초 ~ 20 초정도시간이 지나면설치작업이마무리된다. 주의사항 USB 드라이버를컴퓨터에연결한후, 진행되는 USB 드라이버설치마무리작업은따로눈에보이지않는다. 설치작업이끝나면조그만팝업창으로준비되었다는메시지창이보일수도있고그렇지않을수도있기때문에, USB 케이블연결후, 잠시기다렸다가프로그램을실행시켜주어야한다. - 14 -
코딩 SW 실행하기 아두이노 USB 설치및케이블연결작업이끝나고나면, 이제아두이노용코딩 SW를실행시켜보자. 바탕화면의 SPL 폴더를살펴보면 SPL for 아두이노 항목이보일것이다. 이항목을클릭하여프로그램을실행시킨다. 제품키를입력하는창이표시되면체험판으로활성화버튼을클릭하거나 제품키를입력하고제품활성화버튼을클릭한다. - 15 -
코딩편집기에명령어를한글로표시할지아니면영어로표시할지선택하 는창에서영어로표시를선택한다. - 16 -
참고자료 SPL은 EPL (Educational Programming Language) 의한종류로서, Simple Programming Language의약자이다. C언어를 BASIC 언어처럼사용하기쉽게정의한언어로서, 아래의표는기존 C언어코드를 SPL 언어로표시한예를보여준다. C 언어 SPL 언어 int a = 0; for (int i = 0; i < 10; i++) a = a + 1; a = 0 for (i = 0; i < 10; i++) a = a + 1 아두이노연결상태확인하기 프로그램실행후, 아두이노보드가정상적으로인식되었다면, 다음과같이 프로그램상단에아두이노보드종류와 COM 포트가표시되어있어야한 다. - 17 -
주의사항 아두이노보드가 Arduino Uno 로선택되어있는지반드시확인한다. 보 드종류가다르면프로그램이아우이노보드로정상적으로업로드되지않 는다. COM 포트를눌러서 COM 포트에여러포트들이표시될경우, 맨마지막에있는포트가선택되어있는지확인한다. 만약아두이노프로그램업로드시아두이노보드에정상적으로업로드가되지않는다면, COM 포트를다른포트로변경해보기바란다. 스크립트나 C 언어입력모드 프로그램을새로작성하거나기존프로그램을불러올경우, 코드의내용을 블록또는스크립트 (C 언어포함 ) 모드로열어서보거나편집할수있다. 블록으로개발된코드를스크립트로볼수있으며, 반대로스크립트나 C 언 어로개발된코드를블록으로열어서볼수도있다. - 18 -
프로그램실행하기 아두이노개발환경은실질적으로 C언어이다. 사용자가블록코딩이나스크립트형태로개발하든결과물은반드시 C언어로변환된후, 컴파일되어야한다. SPL 코딩 SW는블록코딩이나스크립트로개발된코드를자동으로 C언어로변환을시킨다. 개발된 C 언어는컴파일과정을거쳐바이너리파일 (HEX 파일 ) 로생성되 며, 이파일을아두이노보드에업로드시키면아두이노보드에서실행되 게된다. 현재상태의비어있는기본프로그램을다음과같이실행버튼을클릭하여 업로드해보자. - 19 -
업로드결과확인하기 아두이노코딩툴의상단메뉴에서실행버튼을클릭한후, 다음과같이콘 솔창이뜨면서조금기다리면, 많은라인의결과들이화면에표시된다. 주의사항 콘솔창이표시된후, 콘솔창내부에위와같이메시지가표시되지않고다 르게표시된다면, 업로드가진행되지못한경우이다. 업로드실패원인 1 스크립트오류발생 ) 작성한프로그램에오류가있는경우에는위와달리 error: 라는단어가표시된문자열이표시된다. 콘솔창의메시지에 error: 표시가있다면프로그램에오류가있는경우이므로반드시오류를수정한후, 업로드하기바란다. - 20 -
업로드실패원인 2 아두이노보드미연결 ) 아두아노보드가연결되지않았습니다 라고메시지가뜨는경우는해당컴포트를인식하지못하였거나실제로아두이노보드와컴퓨터가연결되지않은경우이다. USB 케이블을연결하거나케이블을뺐다가다시연결한후, 업로드를실행해보기바란다. 업로드실패원인 3 아두이노보드선택오류 ) 콘솔창에서오랜시간이경과된후, 메시지가표시되는경우인데, 아두이노보드를다른종류로선택하여실행을한경우이다. 아두이노보드종류가 Arduino Uno로되어있는지다시한번확인해보기바란다. 업로드실패원인 4 COM 포트선택오류 ) 실패원인 3과비슷한경우로서, 아두이노보드의종류가정상적으로선택되어있다면, COM 포트에 COM 포트가여러개가있는지화인해보아야한다. 보통맨마지막에있는 COM 포트를선택하여진행하면정상적으로잘진행되는데, COM 포트를다른것을변경한후, 업로드를진행해보기바란다. - 21 -
1.3 전문가용아두이노코딩 SW 설치 아두이노 IDE 다운로드 전문가용아두이노코딩 SW는아두이노홈페이지에서다운로드받을수있다. 이툴은아두이노 IDE (Integrated Development Environment) 라고불리며, IDE 툴로만들어진소스코드를우리가보통스케치라고부른다. 따라서통상스케치개발툴이라고도불린다. 스케치코드를개발하는아두이노 IDE 툴은 MIT에서개발한프로세싱 (http://www.processing.org) 이라는 C언어교육용 SW에서사용중인개발툴로서, 아두이노그룹이이개발환경을가져다사용하고있다. 프로세싱에서만든소스코드도동일하게스케치라고불리기때문에스케치코드는아두이노에서만사용되는것이아니라는것에유의하기바란다. 아래의경로에접속하여아두이노 IDE 툴을다운로드받는다. https://www.arduino.cc/en/main/software - 22 -
Arduino IDE 다운로드화면에서두번째항목인 Windows ZIP file for non admin install 항목을클릭한다. Windows 용설치파일의비교 Windows Installer USB 드라이버까지자동으로설치해준다. PC 에관리자권한이있는경우에만설치가능 Windows ZIP file for non admin install 설치과정없이압축을아무폴더에나풀기만하면실행가능 USB 드라이버를따로설치해주어야한다. PC에관리자권한이없어도설치가가능하다. - 23 -
JUST DOWNLOAD 링크를클릭한다. 다른이름으로저장항목을클릭한후, 파일을저장하고자하는아무폴더 나지정한다. - 24 -
다운로드받은 zip 파일의압축을푼다. 주의사항 다운로드받은 zip 파일을더블클릭하지말고, 반드시압축을푼후에압축이풀린폴더로이동하여프로그램을실행해야한다. 압축을풀지않고 zip 파일을더블클릭하는경우에도 zip 파일의내용이폴더에보이게되는데, 사용자가이상태에서아두이노편집기파일을실행하게되면정상적으로실행되지않는다. USB 드라이버를설치하기전에는아두이노보드를아직 PC 에연결시키지 말고분리시켜놓는다. - 25 -
USB 드라이버설치 압축이풀린폴더로이동하면다음과같이파일들이보일것이다. 이목록 에서 drivers 라는폴더로이동한다. 윈도우 OS 종류에맞게해당 USB 드라이버설치파일을실행해준다. - 26 -
아두이노보드연결하기 아두이노우노보드를 USB 케이블을이용하여컴퓨터와연결해준다. 아두이노보드가컴퓨터에맨처음연결되는순간, 컴퓨터에서남아있는 USB 드라이버설치작업이자동으로진행되며, 10 초 ~ 20 초정도시간이 지나면설치작업이마무리된다. 주의사항 USB 드라이버를컴퓨터에연결한후, 진행되는 USB 드라이버설치마무리작업은따로눈에보이지않는다. 설치작업이끝나면조그만팝업창으로준비되었다는메시지창이보일수도있고그렇지않을수도있기때문에, USB 케이블연결후, 잠시기다렸다가프로그램을실행시켜주어야한다. - 27 -
프로그램실행하기 이전폴더로돌아가면아두이노압축이풀린폴더에 arduino.exe 라는실 행파일을볼수있을것이다. 이 exe 파일을실행한다. 툴 -> 보드 -> Arduino Uno 보드를선택한다. - 28 -
포트를선택한다. 포트가여러개인경우, 마지막포트를선택하거나 Arduio 라고표시된포트를선택한다. 예제실행하기 파일 -> 예제 -> 01.Basic -> Blink 예제를오픈한다. - 29 -
예제파일의내용을확인해본다. 왼쪽위에있는아이콘메뉴중에서다음그림과같이오른쪽화살표아이콘을클릭하여프로그램을아두이노보드에업로드해준다. 정상적으로업로드가완료되고나면화면아래콘솔창에업로드완료라는메시지가표시된다. - 30 -
02 LED 점멸하기 학습목표 디지털쓰기명령어 (DigitalWrite) 의활용방법을이해하고응용할수있다. 실습개요 아두이노의디지털쓰기 (DigitalWrite) 명령어로 LED를제어한다. 기다리기함수를이용하여 LED의점멸간격을조절해본다. setup() 과 loop() 함수의차이점을이해할수있다. 일정한시간후에자동으로꺼지는장치를구현해본다. - 29 -
2.1 아두이노쉴드및핀정보 아두이노쉴드 아두이노보드위에적층식으로쌓아나가는전자회로모듈을쉴드 (Shield) 라고부른다. 보통기능이복잡하거나연결되는핀수가많은모듈을별도로쉴드로개발하는경우가많다. 브레드보드가필요없는올인원쉴드 (All-In-One Shield) 는센서연결시브레드보드없이 3핀또는 4핀으로되어있는모듈을바로아두이노에연결할수있도록도와주는보드로서, 아두이노작품개발시시간을단축시켜주고아두이노의편리성을최대한활용하는보드이다. - 30 -
아두이노핀정보 아두이노는디지털핀 14 개와아날로그핀 6 개를가지고있다. 디지털핀과아날로그핀에는핀번호가 0 번부터부여된다. 디지털핀번호 (14개) 아날로그핀번호 (6개) D0 ~ D13 A0 ~ A5-31 -
디지털핀 디지털핀들은 GND ( 검정 ), 5V ( 빨강 ), Data 선 ( 초록 ) 등 3 개의핀으로 구성되어있으며, 부품을연결할때방향을맞추어연결해주어야한다. 디지털부품연결시케이블의색상또는각케이블이극성을확인하여연 결한다. 디지털 0 번 (Rx) 과 1 번 (Tx) 은시리얼통신에사용되기때문에실제로 D2 부 터부품을연결할수있다. 핀정보 GND 5V Data 케이블색상검정빨강초록 - 32 -
아두이노아날로그핀 아날로그핀들은 GND ( 검정 ), 5V ( 빨강 ), Data 선 ( 파랑 ) 등 3 개의핀으로 구성되어있으며, 부품을연결할때방향을맞추어연결해주어야한다. 아날로그 4 번 (A4) 과아날로그 5 번 (A5) 은 I2C 와같은다른용도로도사용되 기때문에아날로그부품을연결할때에는 A0 부터연결한다. 핀정보 GND 5V Data 케이블색상검정빨강파랑 - 33 -
2.2 준비하기 준비물 아두이노보드, 올인원쉴드, 디지털 LED 모듈 1 개 아두이노우노보드 올인원쉴드 디지털 LED 소자 - 34 -
H/W 연결하기 디지털 LED 소자를디지털 13 번에연결한다. 주의사항 센서및소자연결시케이블의색상을올인원쉴드의핀색상에맞게연결 해준다. - 35 -
2.3 디지털쓰기명령어 (DigitalWrite) 디지털쓰기명령어 LED 는디지털소자로서 0 과 1 또는 HIGH 와 LOW 등 2 가지상태중에한 가지상태의값을가진다. 디지털소자값의범위 0 또는 LOW : 꺼짐 1 또는 HIGH : 켜짐 디지털쓰기명령어 (DigitalWrite) 디지털소자에값을전달하기위한명령어는다음과같이 DigitalWrite 명 령어를사용한다. 핀번호와상태값을인수로전달한다. 디지털소자에값을쓰는명령어 DigitalWrite(13, LOW) : 디지털 13 번핀의값을끔 DigitalWrite(13, HIGH) : 디지털 13 번핀의값을켬 주의사항 디지털핀은 2 번부터 13 번핀까지총 12 개를사용할수있으나, 디지털 4, 5, 6, 7 번은자동차의모터를제어할때사용되므로, 해당핀을제외한 다른핀들에소자또는센서를연결해주어야한다. - 36 -
2.4 LED 켜기 LED 소자켜기 디지털 13 번에연결된 LED 소자를켜기위해서는아래와같이 DigitalWrite 명령어를사용하고, 핀번호 13, 그리고값을 HIGH 로설정해 준다. SPL 스크립트 스케치코드 // 디지털 13번핀에연결된 LED를켠다. DigitalWrite(13, HIGH) //1초간기다린다. Delay(1000) // 디지털 13번핀을쓰기모드로지정 pinmode(13, OUTPUT); // 디지털 13번핀에연결된 LED를켠다. digitalwrite(13, HIGH); //1초간기다린다. delay(1000); 실습 켜진 LED 를끄는기능으로프로그램을수정해보기바란다. - 37 -
참고자료 ) 상수와변수 프로그램에서상수는변경할수없는값을저장해놓은저장소이며, 이 와반대로변수는값을변경할수있는저장소이다. - 상수 : 값을변경할수없다. const int a = 10; - 변수 : 값을변경할수있다. int a = 10; 상수는자료형앞에 const 라는단어가더추가된다. 위의예에서사용된 HIGH 나 LOW 와같은단어는프로그램의내부에서 상수로정의된이름이다. 즉다음과같이내부에정의되어있다. const int HIGH = 1; const int LOW = 0; DigitalWrite 명령어에서상수대신에다음과같이직접값을사용해도 된다. DigitalWrite(13, 1) DigitalWrite(13, 0) - 38 -
참고자료 ) 자료형 C 언어에서는변수를정의할때변수이름앞에자료형을표기해주어야 한다. 저장하고자하는값이어떠한종류인지를설명해주는것이다. 변수의자료형에는다음과같은종류들이있다. 자료형 int float byte char String boolean 설명 정수형 (Integer) 0, -50, 300 등의정수형숫자를저장한다. 실수형 (float) 0.5, -50.5, 303.345 등의실수형숫자를저장한다. 바이트형 (byte) 0 ~ 255 사이의숫자를저장한다. 문자형 (char) 알파벳문자나기호를저장한다. 문자열형 (String) 여러문자데이터를하나로이어서저장한다. 논리형 (Boolean) true 또는 false와같이논리형값을저장한다. int a = 10; 이라는의미는정수형값을저장하는변수 a 에 10 을저장 하라는의미이다. - 39 -
실습 앞에서소개된코드중에서상수로정의된부분을찾아본다. 아래제시된각각의자료형에대해사례가되는코드를작성해본다. 자료형 사례 int int a = 255; float float a = 123.56; byte byte a = 25; char char c = A ; String String s = Hello ; boolean boolean b = true; 참고자료 ) C 언어는명령어뒤에 ; 로끝난다. 앞에서제시된예제에서스크립트와 C 언어를비교해봄으로써 C 언어사 용시어떠한특징들이있는지살펴보자. 다음은 SPL 스크립트와 C 언어의차이점이다. SPL 명령어스케치코드 (C 언어 ) DigitalWrite(13, HIGH) Delay(1000) digitalwrite(13, HIGH); delay(1000); C 언어문법에서는각명령어가 ; 로끝나는것에유의하기바란다. - 40 -
참고자료 ) 아두이노명령어가소문자로시작하는이유 모든스크립트코딩에서변수나함수등의이름을부여할때크게 4 가 지표기법중에한가지를따른다. 다음은 4 가지표기법의차이점을설명한것이다. 변수및함수표기법 설명변수나함수이름시작을자료형을나 타내는알파벳을붙인다. 헝가리안표기법 예 ) int inum = 10; 변수나함수이름이대문자로시작한 다. 파스칼언어나 C# 언어, SPL 등이 파스칼표기법 이표기법을따른다. 예 ) DigitalWrite(13, HIGH) 시작은소문자로하고중간에있는단 어는대문자로시작한다. Java 나아두 카멜표기법 이노함수등이이에해당한다. 예 ) digtalwrite(13, HIGH) 변수단어사이에 _ 를붙여서단어를 구분한다. 언더바표기법 예 ) digital_write(13, HIGH) 변수나함수이름이표기법은정답이있는것은아니고개발자의취향에 따라서달라지며, 자신이이해하기쉬운표기법을정해서프로그램전 체적으로일관되게적용하기만하면된다. - 41 -
2.5 LED 점멸시키기 LED 소자점멸시키기 디지털 LED 소자를점멸시키기위한코드는아래와같다. 프로그램을작성 한후 LED 점멸상태를확인해보기바란다. SPL 스크립트 스케치코드 // 디지털 13번핀에연결된 LED를켠다. DigitalWrite(13, HIGH ) //1초간기다린다. Delay(1000) // 디지털 13번핀에연결된 LED를끈다. DigitalWrite(13, LOW ) // 디지털 13번핀을쓰기모드로지정 pinmode(13, OUTPUT); // 디지털 13번핀에연결된 LED를켠다. digitalwrite(13, HIGH ); //1초간기다린다. delay(1000); // 디지털 13번핀에연결된 LED를끈다. digitalwrite(13, LOW ); //1 초간기다린다. Delay(1000) //1 초간기다린다. delay(1000); 실습 LED 의점멸주기를각각 500 밀리초, 100 밀리초, 50 밀리초, 20 밀리초등으 로수정하여점멸되는결과를확인해본다. - 42 -
2.6 setup() 함수와 loop() 함수 setup 과 loop 아두이노기본프로그램은다음과같이 setup() 함수와 loop() 기본함수가 자동으로만들어진상태에서시작한다. 아두이노프로그램을실행하면내부적으로다음과같이 main() 함수가만 들어진다. ; ; int main() setup(); while(true) loop(); return 0; - 43 -
위의 main 함수를살펴보면 setup() 함수의내용이먼저실행되고, 그다 음으로는 loop() 함수만계속실행된다. setup() 함수는맨처음한번만실행된다. loop() 함수는 setup() 함수가실행된이후에실행되며, 아두이노에전원에 들어와있는동안에는무한히반복하여실행된다. - 44 -
2.7 일정한시간후에자동으로꺼지는 LED 등만들기 설계하기 일정한시간동안 LED 가켜진후, 그이후에는 LED 가계속꺼져있게하 려고한다. LED 를켜고끄는명령어를 setup() 함수와 loop() 함수중어 느곳에입력해야이기능을구현할수있을지생각해본다. 구현하기 아래의코드를일정한시간후에자동으로꺼지는기능이다. 아래의코드들 을 setup() 함수와 loop() 함수중어느곳에추가해야할지생각해보고 기능을완성해본다. SPL 스크립트 스케치코드 DigitalWrite(13, HIGH) Delay(3000) DigitalWrite(13, LOW) digitalwrite(13, HIGH); delay(3000); digitalwrite(13, LOW); 아래의코드를실행한후결과를확인해본다. digitalwrite(13, HIGH); delay(3000); digitalwrite(13, LOW); - 45 -
setup() 함수에코드를추가하게되면한번만실행되게된다. setup() 함수에있는명령어들을다시실행시키려면아두이노보드에업로드된프로그램을처음부터다시실행시켜야주어야하는데, 이렇게아두이노프로그램을처음부터다시실행하기위해서는아두이노보드를리셋시켜주면된다. 아래그림과같이아날로그핀옆에있는리셋스위치를눌러서아두이노프로그램이처음부터다시실행되는지확인해보기바란다. 실습 앞의활동에서작성한코드중에서직접값을사용하지않고상수로선언 하여사용할수있는부분이어느부분이있는지생각해보고상수를정의 하여프로그램을수정해본다. - 46 -
03 절전기능 LED 후레쉬 학습목표 아두이노의디지털버튼작동방법을이해하고다양한용도로활용할수있다. 문자와문자라인출력문을이용하여아두이노내부의값을컴퓨터화면에출력할수있다. 실습개요 문자라인출력문을이용하여값을출력해본다. 문자출력문과문자라인출력문을조합하여구구단을출력해본다. 디지털읽기 (DigitalRead) 명령어로버튼값을인식해본다. 버튼눌림상태를이용하여 LED가켜져있는시간을지정할수있다. - 47 -
3.1 준비하기 준비물 아두이노보드, 올인원쉴드, 디지털 LED 모듈 1 개, 디지털버튼모듈 1 개 아두이노우노보드 올인원쉴드 디지털 LED 소자 디지털버튼 - 48 -
H/W 연결하기 디지털버튼을디지털 2 번핀에연결한다. 디지털 LED 소자를디지털 13 번에연결한다. - 49 -
3.2 문자및문자라인출력하기 문자라인출력하기 아두이노에서콘솔화면에문자열을한줄씩출력하는명령어는다음과같 이 PrintLine 또는 Serial.println 명령어를사용한다. SPL 스크립트 스케치코드 PrintLine( Hello ) PrintLine(12345) Serial.println( Hello ) Serial.println(12345) 1 씩증가하는숫자출력하기 콘솔화면에 1 씩증가하는숫자를출력해보자. SPL 스크립트 스케치코드 // 시리얼통신속도를설정해준다. Serial.begin(115200); a = 0 int a = 0; a = a + 1 PrintLine(a) Delay(1000) a = a + 1; Serial.println(a); delay(1000); - 50 -
주의사항 Print 명령어는같은줄에값을이어서출력하고 PrintLine 명령어는값을 출력한후, 줄을바꾸게된다. PrintLine 명령어를사용해야할곳에 Print 명령어를사용하지않도록주의를기울인다. Print 명령어또는 PrintLine 명령어를코드에사용할경우에는반드시 100밀리초이상의값을가지는 delay 명령이반드시사용되어야한다. 만약 delay 명령어없이 Print나 PrintLine 명령어를사용하게되면엄청난크기의데이터가 PC로전달되어 PC의시리얼포트가다운되는문제가발생한다. PC의시리얼포트가다운되면아두이노프로그램업로드가실패하는상황이발생한다. 이경우에는일단아두이노보드의 USB 케이블을제거한후, 아두이노코딩 SW를종료한다. 그다음, 아두이노보드를 PC에연결한후코딩 SW를다시실행한후, 프로그램에 delay(100) 명령어를추가한다음업로드하면프로그램이정상적으로업로드될수있다. - 51 -
구구단출력하기 Print 명령어와 PrintLine 명령어를조합하여사용하면화면에필요한정보를보기좋게생성하여표시할수있다. Print 명령어는값을옆으로이어서출력하는기능이있으므로, 구구단의문자열을프로그램으로생성하여표시할수있다. SPL 스크립트 //7단을출력해본다. for (i = 1; i < 10; i++) Print( 7 x ) Print(i) Print( = ) PrintLine(i * 7) 스케치코드 Serial.begin(115200); //7단을출력해본다. for (int i = 1; i < 10; i++) Serial.print( 7 x ); Serial.print(i); Serial.print( = ); Serial.println(i * 7); - 52 -
실습 다중 for 반복문을이용하여구구단전체를출력해본다. SPL 스크립트 for (i = 1; i < 10; i++) for (j = 1; i < 10; j++) Print(i) Print( x ) Print(j) Print( = ) PrintLine(i * j) 스케치코드 Serial.begin(115200); for (int i = 1; i < 10; i++) for (int j = 1; i < 10; j++) Serial.print(i); Serial.print( x ); Serial.print(j); Serial.print( = ); Serial.println(i * j); - 53 -
3.3 DigitalRead 명령어로버튼값읽어오기 DigitalRead 아두이노의디지털핀에서값을읽어오는명령어는다음과같다. 변수 = DigitalRead( 핀번호 ) SPL 스크립트 스케치코드 d2 = DigitalRead(2) int d2 = digitalread(2); DigitalRead() 함수로읽은값은정수형변수에저장되며, 값은 0 (LOW) 또는 1 (HIGH) 중에하나가된다. - 54 -
디지털버튼값출력하기 디지털 2 번핀에연결되어있는디지털버튼의값을읽어와서화면에출 력하는코드이다. 핀번호와변수이름을확인한후아래의코드를작성해 본다. SPL 스크립트 스케치코드 d2 = DigitalRead( 2 ) PrintLine(d2) Delay(100) pinmode(2, INPUT); Serial.begin(115200); int d2 = digitalread( 2 ); Serial.println(d2); delay(100); 콘솔창에표시되는값을확인해보면, HIGH 나 LOW 가아닌 0 또는 1 숫자 로표시되는것에유의한다. - 55 -
3.4 버튼으로 LED 켜기 if 조건문 C 언어에서 if 조건비교명령어는괄호안에있는조건이참이면 if 블록안 에있는명령어를실행하게된다. if ( 조건이 true 이면 ) // 이곳에있는명령어들이실행된다. 예 ) if ( d2 == HIGH ) PrintLine( Button Pressed ) 조건이만족하지않는경우에명령어를실행하려면 else 블록을추가한다. if ( d2 == HIGH ) PrintLine( Button Pressed ) else PrintLine( Button Up ) - 56 -
if 조건문으로 LED 켜기 버튼의상태를 0.1 초간격으로읽어와서버튼의상태가 HIGH 이면 13 번 LED 를켜고그렇지않으면 13 번 LED 를끄는코드를작성해보자. 아래의예제에서 if 조건문에유의하여코드를작성해본다. SPL 스크립트 d2 = DigitalRead(2) if ( d2 == HIGH ) DigitalWrite(13, HIGH) else DigitalWrite(13, LOW) 스케치코드 pinmode(2, INPUT); pinmode(13, OUTPUT); int d2 = digitalread(2); if ( d2 == HIGH ) digitalwrite(13, HIGH); else digitalwrite(13, LOW); Delay(100) delay(100); - 57 -
3.5 버튼을누르고있는횟수측정하기 전역변수 버튼이눌려져있는횟수를저장하기위해전역변수를정의한다. 함수내부 에정의된변수는로컬변수또는지역변수라하고, 함수외부에정의된변 수는글로벌변수또는전역변수라고한다. 전역변수는프로그램전체에영향을미치지만지역변수는함수안에서만 사용할수있다. SPL 스크립트 스케치코드 cnt = 0 int cnt = 0; d2 = DigitalRead(2) if ( d2 == HIGH ) cnt = cnt + 1 PrintLine(cnt) Delay(100) pinmode(2, INPUT); Serial.begin(115200); int d2 = digitalread(2); if ( d2 == HIGH ) cnt = cnt + 1; Serial.println(cnt); delay(100); 위의코드에서 cnt = 0 선언명령어를 loop() 함수안으로옮길경우결과 가어떻게달라지는지확인해본다. - 58 -
3.6 절전기능후레쉬만들기 설계하기 버튼이눌려져있는횟수는 cnt 라는이름의전역변수에저장되어있다. LED를버튼을누르고있는시간에비례하여켜지도록기능을구현하려고한다. 예를들어버튼을 1초간누르고있으면 LED는 5초간켜지고, 버튼을 10초간누르고있으면 LED가 50초동안켜져있다가꺼지도록하려고한다. 필요한기능을설계해본다. 버튼이눌릴때마다 cnt 변수의값을 5 씩증가시켜준다. cnt 변수의값이 0 보다크면 cnt 변수의값을 1 씩감소시켜주고 LED 를 켜준다. cnt 변수의값이 0 과같으면 LED 를꺼준다. - 59 -
구현하기 원하는기능을구현하기위해프로그램을설계한후아래의코드를작성해 본다. SPL 스크립트 스케치코드 cnt = 0 int cnt = 0; d2 = DigitalRead(2) if ( d2 == HIGH ) cnt = cnt + 5 if (cnt > 0) cnt = cnt - 1 DigitalWrite(13, HIGH) else DigitalWrite(13, LOW) Delay(100) pinmode(2, INPUT); pinmode(13, OUTPUT); int d2 = digitalread(2); if ( d2 == HIGH ) cnt = cnt + 5; if (cnt > 0) cnt = cnt - 1; digitalwrite(13, HIGH); else digitalwrite(13, LOW); delay(100); - 60 -
실습 버튼을 1 초간누르고있으면 LED 가 10 초간켜지고, 버튼을 10 초간누르고 있으면 LED 가 100 초동안켜져있다가꺼지도록기능을수정해본다. LED 가꺼지기 10 초전에 LED 를점멸하여 10 초후에 LED 가꺼진다는정 보를사용자에게알리고자한다. 어떠한기능을추가해야할지생각해보고 기능을완성해본다. 기능개선사항 LED 가꺼지기 10 초전에점멸로정보를주어사용자가 다시버튼을눌러 LED 가켜져있는시간을늘릴수있 도록기능을개선시켜본다. - 61 -
04 틱톡스위치만들기 학습목표 버튼의눌림상태를감지할수있는기능을구현할수있다. 버튼이눌리거나눌림이해제될때틱톡소리가나는기능을구현할수있다. 실습개요 전역변수를이용하여버튼이눌려져있는지감지하는기능을구현한다. 버튼이눌려지거나올라오는순간을감지하는기능을구현한다. 톤 (tone) 명령어를이용하여버튼이눌리거나올라올때다른소리가나도록한다. - 61 -
4.1 준비하기 준비물 아두이노보드, 올인원쉴드, 디지털버튼모듈, 스피커 아두이노우노보드 올인원쉴드 스피커 디지털버튼 - 62 -
H/W 연결하기 디지털버튼을디지털 2 번핀에연결한다. 스피커를디지털 3 번핀에연결한다. - 63 -
4.2 소리를발생시키는명령어 톤 (tone) 명령어 아두이노에서스피커를통해소리를발생시키는명령어는톤 (tone) 명령어 이다. Tone( 핀번호, 진동수, 소리지속시간 ) 디지털 3 번핀에연결된스피커를통해 1 초 (1000 밀리초 ) 동안 700 헤르츠 (Hz) 의소리가발생하도록설정하는명령어는다음과같다. SPL 스크립트 스케치코드 Tone(3, 700, 1000) Delay(1000) tone(3, 700, 1000); delay(1000); - 64 -
소리를끄는방법 위의예제를실행하면계속삐소리가연주되면서시끄러운상황이만들어 진다. 스피커의소리를끄려면다음과같이빈프로그램을생성후실행하 여아두이노에서실행중인프로그램을지워버리면된다. SPL 스크립트 스케치코드 - 65 -
삐삐소리만들기 1초시간중에서 0.5초는삐소리가나고, 0.5초는소리가나지않도록하기위해서는다음과같이간단히 tone 명령어의세번째인수값을 500으로줄여주기만하면된다. delay 명령어에서 1000 밀리초간기다리는동안 0.5초간만소리가나기때문에나머지 0.5초동안에는소리가나지않는다. SPL 스크립트 스케치코드 Tone(3, 700, 500) Delay(1000) tone(3, 700, 500); delay(1000); 주의사항 tone 명령어에는 delay 기능이없기때문에 tone 명령어의소리가나는시간동안에는 tone 명령이다시실행되면안된다. 이러한이유때문에 tone 명령어뒤에 delay 명령어를두어 tone 명령어가일정시간이지난후에다시실행되도록해주어야한다. - 66 -
4.3 틱톡소리만들기 0.1 초간격으로소리만들기 틱톡소리를만들기위해다음과같이소리가발생하도록로직을완성해 본다. SPL 스크립트 스케치코드 Tone(3, 700, 100 ) Delay( 1000 ) tone(3, 700, 100 ); delay( 1000 ); Tone(3, 500, 100 ) Delay( 1000 ) tone(3, 500, 100 ); delay( 1000 ); - 67 -
4.4 버튼의눌림상태를전역변수로저장하기 pressed 변수선언 버튼이현재눌려져있는지아니면그렇지않은지상태를저장하고있는 전역변수를다음과같이추가해보자. SPL 스크립트 스케치코드 pressed = false boolean pressed = false; pinmode(2, INPUT); Serial.begin(115200); d2 = DigitalRead(2) if ( d2 == HIGH ) pressed = true else pressed = false int d2 = digitalread(2); if ( d2 == HIGH ) pressed = true; else pressed = false; PrintLine(pressed) Delay(100) Serial.println(pressed); delay(100); - 68 -
4.5 버튼이눌려지는순간과올라오는순간을감지하기 버튼의상태변화감지 버튼이눌려지는순간에한번 Down 이라는메시지를출력하고, 버튼이 올라오는순간에한번 Up 이라는메시지를출력하려고한다. 버튼의상태가변하는순간을감지하기위해서는버튼의상태를저장하고있는전역변수의값을비교해야한다. 이전활동에서사용한 pressed와같은역할의전역변수값을비교하여버튼이눌려지거나올라오는순간을감지할수있다. - 69 -
버튼의상태변화감지코드 버튼이눌려지는순간과올라오는순간을감지하여메시지를표시하는코 드는다음과같다. SPL 스크립트 스케치코드 pressed = false boolean pressed = false; pinmode(2, INPUT); Serial.begin(115200); d2 = DigitalRead(2) if ( d2 == HIGH ) if (pressed == false) PrintLine( Down ) int d2 = digitalread(2); if ( d2 == HIGH ) if (pressed == false) pressed = true Serial.println( Down ) else pressed = true; if (pressed == true) PrintLine( Up ) else if (pressed == true) pressed = false Serial.println( Up ); pressed = false; Delay(100) delay(100); - 70 -
4.6 틱톡스위치구현하기 소리기능추가하기 이전활동의코드들을활용하여버튼이눌리는순간 0.1 초동안 틱 소리 (700Hz) 가나고버튼이올라오는순간 톡 소리 (500Hz) 가나오도록 tone 명령어를추가하려고한다. 프로그램실행결과흫확인해본다. pressed = false SPL 스크립트 d2 = DigitalRead(2) if ( d2 == HIGH ) if (pressed == false) Tone(3, 700, 100) PrintLine( Down ) pressed = true else if (pressed == true) Tone(3, 500, 100 ) PrintLine( Up ) pressed = false Delay(100) 스케치코드 boolean pressed = false; pinmode(2, INPUT); Serial.begin(115200); int d2 = digitalread(2); if ( d2 == HIGH ) if (pressed == false) Tone(3, 700, 100); Serial.println( Down ); pressed = true; else if (pressed == true) Tone(3, 500, 100); Serial.println( Up ); pressed = false; delay(100); - 71 -
실습 tone 명령어에사용된진동수값을다른값으로변경하여다른틱톡소리 가나오도록버튼의효과음을다양하게변경해보자. - 72 -
05 토글스위치를활용하는프로젝트 학습목표 디지털버튼의중복눌림방지를위한기능을구현할수있다. 디지털버튼의중복눌림방지기능및전역변수를활용하여 LED 전등이계속켜질수있도록토글스위치기능을구현할수있다. 차량의방향지시등과비상등기능을구현할수있다. 실습개요 버튼의중복눌림감지를방지하는기능을구현한다. 버튼눌림상태를이용하여토글기능을구현하다. 한번의버튼눌림으로 LED 등을켜거나끌수있는편리한전등을구현해본다. 토글기능으로취침시간을설정할수있는취침등을제작해본다. 토글기능으로차량의방향지시등과비상등기능을구현해본다. - 73 -
5.1 준비하기 준비물 아두이노보드, 올인원쉴드, 디지털버튼모듈, 스피커, LED 모듈 아두이노우노보드 올인원쉴드 스피커 디지털버튼 LED 모듈 - 74 -
H/W 연결하기 디지털버튼을디지털 2 번핀에연결한다. 스피커를디지털 3 번핀에연결한다. 디지털 LED 소자를디지털 13 번에연결한다. - 75 -
5.2 버튼의눌림횟수를표시하는장치만들기 눌림횟수체크장치 버튼을눌러 1 씩증가하는장치를만들어학생들의인원수를세려고한다. 버튼이눌릴때마다 1 씩증가시켜화면에출력하는기능을구현해본다. 이전활동에서작성한프로그램에기능을추가하여버튼이눌려졌다가올 라오는순간에 1 씩증가하도록기능을구현해본다. SPL 스크립트 스케치코드 pressed = false cnt = 0 d2 = DigitalRead(2) if ( d2 == HIGH ) pressed = true else if (pressed == true) cnt = cnt + 1 Tone(3, 500, 100) PrintLine(cnt) pressed = false Delay(100) boolean pressed = false; int cnt = 0; pinmode(2, INPUT); Serial.begin(115200); int d2 = digitalread(2); if ( d2 == HIGH ) pressed = true; else if (pressed == true) cnt = cnt + 1; tone(3, 500, 100); Serial.println(cnt); pressed = false; delay(100); - 76 -
5.3 토글기능구현하기 토글기능 이전활동에서사용된 cnt 전역변수값이버튼이눌릴때마다 0 과 1 값으로반복해서변경되도록해보자. 즉버튼이처음눌리면 cnt 값이 0에서 1로바뀌고, 버튼이다시눌리면 cnt 값이 1에서 0으로다시변경되도록기능을구현해본다. 버튼이눌릴때마다 cnt 값이 0 또는 1 이되도록하기위해서어떠한기 능이필요할지생각해보고코드를완성해보자. SPL 스크립트 스케치코드 pressed = false cnt = 0 d2 = DigitalRead(2) if ( d2 == HIGH ) pressed = true else if (pressed == true) cnt = cnt + 1 Tone(3, 500, 100) if (cnt == 1) cnt = 0 else boolean pressed = false; int cnt = 0; pinmode(2, INPUT); Serial.begin(115200); int d2 = digitalread(2); if ( d2 == HIGH ) pressed = true; else if (pressed == true) cnt = cnt + 1; tone(3, 500, 100); if (cnt == 1) cnt = 0; - 77 -
cnt = 1 PrintLine(cnt) pressed = false Delay(100) else cnt = 1; Serial.println(cnt); pressed = false; delay(100); - 78 -
5.4 토글기능으로 LED 작동시키기 토글 LED 이전활동에서는 LED 를켜기위해버튼을계속누르고있어야하는번거 로움이있었다. 이러한번거로움을없애기위해서버튼을한번누르면 LED 등이켜지고, 다시한번누르면 LED 등이꺼지도록하려고한다. LED 등을제어하는명령어를추가하여기능을완성해보기바란다. SPL 스크립트 스케치코드 pressed = false cnt = 0 d2 = DigitalRead(2) if ( d2 == HIGH ) pressed = true else if (pressed == true) cnt = cnt + 1 Tone(3, 500, 100) if (cnt == 1) cnt = 0 DigitalWrite(13, LOW ) else cnt = 1 DigitalWrite(13, HIGH ) boolean pressed = false; int cnt = 0; pinmode(2, INPUT); pinmode(13, OUTPUT); Serial.begin(115200); int d2 = digitalread(2); if ( d2 == HIGH ) pressed = true; else if (pressed == true) cnt = cnt + 1; tone(3, 500, 100); if (cnt == 1) cnt = 0; digitalwrite(13, LOW ); else - 79 -
PrintLine(cnt) cnt = 1; digitalwrite(13, HIGH ); pressed = false Serial.println(cnt); Delay(100) pressed = false; delay(100); - 80 -
실습 저절로꺼지는취침등 버튼을한번씩누를때마다 LED 가켜져있는시간이 10 초씩늘어나도록 하려고한다. 예를들어, 버튼을 3 번누르면 30 초간 LED 등이켜진후다시꺼지도록 하는기능을기존코드에추가하여저절로꺼지는취침등을구현해보자. 힌트 LED가켜져있어야하는시간을저장하기위한전역변수를정의한다. 전역변수는기존예제에서정의된 cnt 값을이용한다. 버튼이눌려졌다가올라갈때마다 cnt 값을 100씩증가시킨다. loop 함수는 0.1초마다반복되므로, 100번반복하면 10초가된다. cnt 값이 0보다크면 1씩감소시켜주고 LED를켠다. cnt 값이 0과같으면 LED를꺼준다. - 81 -
pressed = false cnt = 0 d2 = DigitalRead(2) SPL 스크립트 if ( d2 == HIGH ) pressed = true else if (pressed == true) cnt = cnt + 100 Tone(3, 500, 100) PrintLine(cnt) pressed = false 스케치코드 boolean pressed = false; int cnt = 0; pinmode(2, INPUT); pinmode(13, OUTPUT); Serial.begin(115200); int d2 = digitalread(2); if ( d2 == HIGH ) pressed = true; else if (pressed == true) cnt = cnt + 100; tone(3, 500, 100); Serial.println(cnt); if ( cnt > 0 ) cnt = cnt - 1 DigitalWrite(13, HIGH ) else DigitalWrite(13, LOW ) Delay(100) pressed = false; if ( cnt > 0 ) cnt = cnt - 1; digitalwrite(13, HIGH ); else digitalwrite(13, LOW ); delay(100); - 82 -
팀프로젝트실습 차량방향지시등 활동 1) 자동차에쓰이는방향지시등기능을버튼과 LED 를이용하여구현 하려고한다. 버튼을한번누르면 LED 가틱톡소리와함께점멸하고, 버튼 을다시한번누르면 LED 점멸이멈추도록한다. 활동 2) 위의기본기능이완성된후에는버튼과 LED 를추가하여왼쪽과 오른쪽방향지시등기능을모두완성해본다. 이실습에서는버튼 2 개, LED 2 개, 스피커 1 개가사용된다. 활동 3) 또다른버튼을추가하여비상등기능을구현해본다. 3 번째버튼을 추가하면양쪽의 LED 가틱톡소리와함께같이점멸되도록한다. 이실습 에서는버튼 3 개, LED 2 개, 스피커 1 개가사용된다. 활동 4) 로봇자동차키트에 LED 와스피커, 버튼을장착하여방향지시등기 능을시현해본다. - 83 -
pressed = false cnt = 0 d2 = DigitalRead(2) SPL 스크립트 if ( d2 == HIGH ) pressed = true else if (pressed == true) cnt = cnt + 1 if (cnt == 1) cnt = 0 else cnt = 1 PrintLine(cnt) 스케치코드 boolean pressed = false; int cnt = 0; pinmode(2, INPUT); pinmode(13, OUTPUT); Serial.begin(115200); int d2 = digitalread(2); if ( d2 == HIGH ) pressed = true; else if (pressed == true) cnt = cnt + 1; if (cnt == 1) cnt = 0; else cnt = 1; pressed = false Serial.println(cnt); // 이곳에방향지시등기능을추가한다. if ( cnt == 1 ) DigitalWrite(13, HIGH) Tone(3, 700, 100) Delay(500) DigitalWrite(13, LOW) Tone(3, 500, 100) Delay(500) Delay(100) pressed = false; // 이곳에방향지시등기능을추가한다. if ( cnt == 1 ) digitalwrite(13, HIGH); tone(3, 700, 100); delay(500); digitalwrite(13, LOW); tone(3, 500, 100); delay(500); delay(100); - 84 -
주의사항 C 언어에서 if 나 else 조건문에서해당조건문이블록에속하는명령어가 하나인경우에는 와 괄호가생략될수있다. 아래의 2가지코드는동일한기능을수행하는코드로서 C언어문법을준수하는코드이다. 아래코드에서사용된 if 조건문을살펴보면 와 사이에오는명령어가한줄일경우, 와 괄호가생략될수있으나, 명령어가 2줄이상인경우에는생략할수없음에유의하기바란다. 중괄호를사용하는경우 a = 10 b = 20 if ( a == 10 ) DigitalWrite(13, HIGH) else DigitalWrite(13, LOW) if ( b == 10 ) DigitalWrite(13, HIGH) PrintLine( On ) else DigitalWrite(13, LOW) PrintLine( Off ) 중괄호가생략된경우 a = 10 if ( a == 10) DigitalWrite(13, HIGH) else DigitalWrite(13, LOW) if ( b == 10 ) DigitalWrite(13, HIGH) PrintLine( On ) else DigitalWrite(13, LOW) PrintLine( Off ) - 85 -
06 스마트헤드라이트 학습목표 아두이노의아날로그명령어를이해하고활용할수있다. 조도센서의작동원리를이해하고활용할수있다. 어두워지면저절로켜지는장치를구현하여자동차의헤드라이트와같은분야에응용할수있다. 아두이노의 PWM 핀을활용하여 LED의밝기를조절할수있다. 실습개요 아두이노의아날로그센서값을읽어와서화면에표시한다. 임계치를결정하여어두워지면저절로켜지는장치를구현하다. LED 의밝기를조절해본다. - 86 -
6.1 준비하기 준비물 아두이노보드, 올인원쉴드, 아날로그조도센서, LED 모듈 아두이노우노보드 올인원쉴드 디지털 LED 모듈 아날로그조도센서 - 87 -
H/W 연결하기 디지털 LED 소자를디지털 13 번에연결한다. 아날로그조도센서를아날로그 0 번핀에연결한다. - 88 -
설계하기 LED 를헤드라이트대신사용한다. 밝기를측정하기위해조도센서를사용한다. 제어보드로아두이노보드를사용한다. - 89 -
6.2 조도센서값확인하기 아날로그센서값읽기 아날로그조도센서를활용하기위해서는첫번째절차로서아날로그센서 인조도센서의값을확인해보는단계이다. 아날로그센서는다음과같이 1024 크기의값의범위를가진다. 아날로그센서값의범위 0 ~ 1023 아날로그센서의값을읽기위해서는다음과같이 AnalogRead 명령어를 이용한다. SPL 스크립트 스케치코드 a0 = AnalogRead( 핀번호 ) int a0 = analogread( 핀번호 ); - 90 -
조도센서값읽기 조도센서가어떠한특성으로작동하는지확인하기위해다음의코드를실 행하여결과를기록해본다. SPL 스크립트 스케치코드 Serial.begin(115200); // 아날로그 0번핀에서값을읽어서 // 변수에저장한다. a0 = AnalogRead(0) // 한라인씩값을콘솔에출력한다. PrintLine(a0) // 아날로그 0번핀에서값을읽어서 // 변수에저장한다. int a0 = analogread(0); // 한라인씩값을콘솔에출력한다. Serial.println(a0); //0.1 초씩기다린다. Delay(100) //0.1 초씩기다린다. delay(100); 위의코드를아두이노보드에업로드한후, 조도센서를손으로빛을가려 가면서어둡게하거나밝게해보기바란다. 콘솔창에서다음과같이변화 되는값을확인할수있다. - 91 -
실행결과 )... 967 854 843 784 721 687 655 544 344 210... 밝기가밝을수록출력되는숫자값이크고, 어두워질수록값이작아지는 것을볼수있다. - 92 -
6.3 헤드라이트가켜지는조건 LED 가켜지기위한조건 자동차의헤드라이트역할은아두이노에서 LED 가대신한다. 본실습에서는 어두워지는조건을만족하면 LED 가자동으로켜지도록기능을구현하려고 한다. 아래의순서도는어두워지는조건을정의하는것으로서, 아날로그조도센 서의값이일정한값이하이면 LED 가켜지도록하는과정을정의한것이 다. 빈칸에어떠한숫자가들어가야할지생각해보고값을입력해본다. - 93 -
6.4 헤드라이트를자동으로켜는기능구현하기 LED 를자동으로켜기 자동차의헤드라이트를외부밝기에따라어두우면자동으로켜기위한코 드를다음과같이구현해보자. SPL 스크립트 a0 = AnalogRead(0) PrintLine(a0) if (a0 < 500 ) // 이곳에 LED를켜는명령어를추가한다. DigitalWrite(13, HIGH ) else // 이곳에 LED를끄는명령어를추가한다. DigitalWrite(13, LOW ) Delay(100) 스케치코드 pinmode(13, OUTPUT); Serial.begin(115200); int a0 = analogread(0); Serial.println(a0); if (a0 < 500 ) // 이곳에 LED를켜는명령어를추가한다. digitalwrite(13, HIGH ); else // 이곳에 LED를끄는명령어를추가한다. digitalwrite(13, LOW ); delay(100); 주의사항 조도센서는센서마다약간씩차이가날수있다. LED 를켜기위한기준 값은센서값을확인해보고, 최대값과최소값의중간정도값으로설정 해보도록한다. - 94 -
6.5 밝기가조절되는헤드라이트 디지털 PWM 핀 이번에는헤드라이트의밝기를조절하는기능을구현해본다. 아두이노의 디지털핀중에서 3, 5, 6, 9, 10, 11 핀의경우에는다른핀들과달리 256 단계로출력값을설정하는기능이가능하다. 이핀들은 PWM (Pulse Width Modulation) 핀이라고부른다. 아두이노보드의디지털핀중에서 PWM 핀에는 ~ 표시가붙어있다. - 95 -
PWM 의작동원리 아두이노보드의 PWM 은필요한전압을 0 과 1 의간격을조절하여생성한 다. 0 ~ 255 사이의값을 PWM 핀에입력하면 0V ~ 5V 사이의가상전압이 만들어진다. - 96 -
AnalogWrite PWM 핀에값을쓸때에는 AnalogWrite 명령어를사용한다. SPL 스크립트 스케치코드 AnalogWrite( 핀번호, 값 ) analogwrite( 핀번호, 값 ); 기존의 DigitalWrite 명령어는 0 과 1 또는 HIGH 와 LOW 상태로만값을출 력시킬수있지만, AnalogWrite 명령어를사용하면 0 ~ 255 사이의값을 디지털핀에출력시킬수있다. AnalogWrite 명령어사용법 AnalogWrite(11, 0) : LED 를끔 AnalogWrite(11, 255) : LED 를가장밝게켬 AnalogWrite(11, 120) : 중간밝기로 LED 를켬 주의사항 AnalogWrite 명령어는비록 Analog라는단어가붙어있긴하지만실질적으로는디지털명령어이다. 기존 AnalogRead 명령어에서읽은값은 0 ~ 1023 사이의값을가지는반면에 AnalogWrite 명령어에서는 256 단계의값만사용할수있다. - 97 -
구현하기 디지털 13 번에연결되어있는 LED 소자를디지털 11 번으로옮겨서연결한 다. 아래의코드는 LED 의밝기를 256 단계로변화를주는과정을보여준다. 구 현해야할기능에대해생각해본후코드를완성해본다. SPL 스크립트 스케치코드 for (i = 0; i < 256; i++) // 이곳에 LED의밝기를 256단계로 // 변화시키는명령어를추가한다. AnalogWrite(11, i ) for (int i = 0; i < 256; i++) // 이곳에 LED의밝기를 256단계로 // 변화시키는명령어를추가한다. analogwrite(11, i ); Delay(10) delay(10); for 반복문은반복되는횟수를지정할수있는반복문으로서, 반복조건문 에사용되는변수값이증가및감소조건에따라값이변화된다. - 98 -
실습 LED 의밝기가서서히밝아졌다가서서히어두워지도록기능을수정해본 다. 디지털 10번에또다른 LED를연결한후, 2개의 LED의밝기변화가서로대칭이되도록기능을수정해본다. 한쪽 LED가서서히밝아질때다른쪽 LED는서서히어두워지도록하고, 각각의 LED가이과정을반복하도록기능을구현해본다. - 99 -
6.6 외부밝기에따라자동반응하는헤드라이트 자동감응헤드라이트 이전활동에서실습한내용을기반으로외부의밝기에따라차량의헤드라 이트밝기가자동으로조절되는기능을작성해보자. 다음과같은기능에대해생각해보고, 필요한로직을완성해본다. 외부조도에반응하는헤드라이트 외부의밝기가밝으면헤드라이트의밝기가약해지고, 외부가어 두워질수록헤드라이트의밝기는세진다. 구현하기 아래의코드는조도센서의값을 LED 의밝기값으로변환하여조도센서 값에따라상대적으로 LED 의출력값이조절되는기능을추가한과정을 보여준다. - 100 -
SPL 스크립트 스케치코드 Serial.begin(115200); a0 = AnalogRead(0) int a0 = analogread(0); // 조도센서값을 LED 출력값으로변환한다. b = 1023 a0 // 조도센서값을 LED 출력값으로변환한다. int b = 1023 a0; // 값을 4 로나누어 0 ~ 255 사이의 // 값으로변환한다. b = b / 4 // 값을 4 로나누어 0 ~ 255 사이의 // 값으로변환한다. b = b / 4; PrintLine(b) Serial.println(b); AnalogWrite(11, b ) analogwrite(11, b ); Delay(100) delay(100); - 101 -
6.7 매핑함수 map() 함수 이전예제에서는읽은센서의값을 PWM 에전달하기위한용도로변환하 기위해 2 번정도계산과정을거쳤다. 그리어려운과정은아니지만, 수 식의내용을한번에이해하기어려운문제점이발생을한다. 아두이노에서는값을다른범위로한번에변환시킬수있는유용한함수를 제공한다. 함수이름은 map() 으로서다음과같이사용할수있다. 변환값 = map( 원본값, 원본시작값, 원본끝값, 변환대상시작값, 변환대상끝값 ) 이전예제에서변환되는과정을 map 함수를이용하면다음과같이적용할 수있다. // 조도센서값을 LED 출력값으로변환한다. b = 1023 a0 map 함수를사용하지않을경우 // 값을 4 로나누어 0 ~ 255 사이의 // 값으로변환한다. b = b / 4 map 함수를사용할경우 b = map(a0, 0, 1023, 255, 0) a0 값은 0 ~ 1023 범위를가지는값인데, 이를 255 ~ 0 범위로값을매핑 시키라는의미입니다. 값의범위가작아지면서반대로뒤집히는효과를한 번에얻을수있습니다. - 102 -
실습 map() 함수를이용하여, 이전활동의예제를수정해본다. map() 함수를활용하는다양한사례를제시해본다. - 103 -
07 동체인식및경보음실행장치만들기 학습목표 아날로그 PSD 거리센서를이해하고활용할수있다. 동체인식장치의작동원리를이해하고구현할수있다. 경보음소리를발생시킬수있으며, 침입탐지장치에적용할수있다. 실습개요 PSD 센서의특징을확인한다. 디지털거리계장치를구현한다. 동체인식장치를구현해본다. tone 명령어를이용해경보음소리를구현해본다. 침입탐지및경보장치를구현해본다. - 104 -
7.1 준비하기 준비물 아두이노보드, 올인원쉴드, 아날로그 PSD 센서, LED 모듈, 스피커 아두이노우노보드 올인원쉴드 디지털 LED 모듈 아날로그 PSD 거리센서 스피커 - 105 -
H/W 연결하기 디지털 LED 소자를디지털 13 번에연결한다. 스피커를디지털 3 번에연결한다. 아날로그 PSD 거리센서를아날로그 0 번핀에연결한다. - 106 -
7.2 PSD 거리센서값확인하기 아날로그 PSD 거리센서값 아날로그 PSD 거리센서를활용하기위해서는첫번째절차로서아날로그 센서인 PSD 센서의값을확인해보는단계이다. 아날로그센서는다음과 같이 1024 크기의값의범위를가진다. 아날로그센서값의범위 0 ~ 1023 아날로그 PSD 거리센서의값을읽기위해서는다음과같이 AnalogRead 명령어를이용한다. SPL 스크립트 스케치코드 a0 = AnalogRead( 핀번호 ) int a0 = analogread( 핀번호 ); - 107 -
PSD 센서값읽기 PSD 거리센서가어떠한특성으로작동하는지확인하기위해다음의코드 를실행하여결과를기록해본다. SPL 스크립트 스케치코드 Serial.begin(115200); // 아날로그 0번핀에서값을읽어서 // 변수에저장한다. a0 = AnalogRead(0) // 한라인씩값을콘솔에출력한다. PrintLine(a0) // 아날로그 0번핀에서값을읽어서 // 변수에저장한다. int a0 = analogread(0); // 한라인씩값을콘솔에출력한다. Serial.println(a0); //0.1 초씩기다린다. Delay(100) //0.1 초씩기다린다. delay(100); 위의코드를아두이노보드에업로드한후, PSD 센서앞에서손을움직여 보기바란다. - 108 -
주의사항 PSD 센서는유효측정거리가 10cm ~ 80cm 이다. 따라서손을너무가까 이접근시키지말고 10cm 에서 80cm 사이를움직여본다. PSD 센서는대상물체와의거리가멀수록값이작고가까울수록값이커 지는특성이있으므로이값의특성에유의하기바란다. 센서앞에대상물체가없는경우는 100 이하의작은값이읽혀지며, 대상 물체가센서쪽으로가까이접근할수록 900 이상의값으로점차증가한 다. - 109 -
7.3 디지털거리계만들기 구현하기 map() 함수를이용하면 PSD 센서값을간단히거리값으로변환시킬수있 다. 정확도는낮지만거리계처럼유사한값을출력시킬수있다. SPL 스크립트 a0 = AnalogRead(0) a0 = Map(a0, 0, 1023, 800, 100) Print(a0) PrintLine("mm") Delay(100) 스케치코드 pinmode(13, OUTPUT); Serial.begin(115200); int a0 = analogread(0); a0 = map(a0, 0, 1023, 800, 100); Serial.print(a0); Serial.println( mm ); delay(100); 위의코드에서 map 함수는 0 ~ 1023 범위로읽혀지는 PSD 센서값을 800 ~ 100mm 거리로변환시키는기능을수행한다. - 110 -
7.4 동체인식장치구현하기 움직임이감지되면 3 초간 LED 켜기 아파트현관이나엘리베이터앞에는동체인식장치가천장에부착되어있 어사람들의움직임이감지되면자동으로등이켜지는기능이작동한다. PSD 센서를이용해이와유사한기능을구현할수있는데, PSD 센서앞 에움직임이감지되면 LED 가 3 초간켜져있도록하는기능을구현해보 자. SPL 스크립트 a0 = AnalogRead(0) PrintLine(a0) // 움직이는대상을감지한다. if (a0 > 100 ) //LED를켠다 DigitalWrite(13, HIGH) //3초간기다린다. Delay(3000) //LED를끈다. DigitalWrite(13, LOW) Delay(100) 스케치코드 pinmode(13, OUTPUT); Serial.begin(115200); int a0 = analogread(0); Serial.println(a0); // 움직이는대상을감지한다. if (a0 > 100 ) //LED를켠다 digitalwrite(13, HIGH); //3초간기다린다. delay(3000); //LED를끈다. digitalwrite(13, LOW); delay(100); - 111 -
위의코드에서빈칸에들어갈조건에대해생각해보고기능을완성해본 다. 위의코드가실제실행된다면어떠한문제점이발생할지예측해보자. 주의사항 실생활에적용되는모든센서는아주짧은시간간격으로계속감지되어야 한다. 위의예제에서는중간에 delay(3000) 이라는아주큰시간만큼실행을멈 추는기능이들어가있다. 3 초만큼의시간동안센서감지가멈추어있게 되는문제가발생한다. 실생활에적용되기위한프로그램을작성할때에는프로그램중간에위와같이큰시간동안실행을멈추는 delay 명령어를사용하는것을가급적자제해야한다. delay 명령어는프로그램맨아래에아주짧은간격으로가능한한한번정도사용해주면된다. - 112 -
7.5 움직임을계속감지하는동체인식장치 움직이는동안에는계속 LED 가켜져있도록하기 이번에는기능을보완하여 LED 가켜져있는동안에도 PSD 센서앞에서 대상물체가움직이면 LED 가계속켜져있도록한다. 즉, 대상물체가 PSD 센서앞에서계속움직일경우에는 LED 가계속켜 져있고, 센서앞에대상물체가없을경우에는마지막감지이후 3 초후 에 LED 가꺼지도록한다. delay 명령어는프로그램아래에 delay(100) 명령어한번만오도록기능을 설계해본다. 나누어서기능을수행하기 만약 3 초간어떠한기능을수행해야한다면, 이를 0.1 초간격으로 30 번수 행하면동일한결과를얻을수있다. 즉 LED 를 3 초간켜기위해서 delay(3000) 대신에 delay(100) 을 30 번반복 하면동일한효과가발생을하는것이다. - 113 -
loop() 반복을이용해 LED 를 3 초간겨기 아래의코드는 loop() 함수가반복되는특성을이용해 LED 가 3 초간켜져 있도록하는프로그램을보여준다. SPL 스크립트 스케치코드 cnt = 30 if ( cnt > 0) cnt = cnt - 1 //LED를켠다. DigitalWrite(13, HIGH) else //LED를끈다. DigitalWrite(13, LOW) int cnt = 30; pinmode(13, OUTPUT); if ( cnt > 0) cnt = cnt - 1; //LED를켠다. digitalwrite(13, HIGH); else //LED를끈다. digitalwrite(13, LOW); //0.1 초를기다린다. Delay(100) //0.1 초를기다린다. delay(100); cnt 값은 30 으로초기화되어있고 loop 함수가실행되면값이 1 씩감소 한다. 결국 30 번정도반복하면값이 0 이되며, LED 가꺼지게된다. 0.1 초를 30 번반복하는효과를 cnt 변수를통해서구현한것이다. 주의사항 cnt 변수이름은다른이름으로수정하여사용해도된다. 단지 count 라는 의미의단어를줄여서사용한것이다. - 114 -
구현하기 아래프로그램의기능을완성해본다. SPL 스크립트 스케치코드 cnt = 0 int cnt = 0; pinmode(13, OUTPUT); a0 = AnalogRead(0) int a0 = analogread(0); // 움직이는대상을감지한다. if (a0 > 100 ) cnt = 30 // 움직이는대상을감지한다. if (a0 > 100 ) cnt = 30 ; if ( cnt > 0) cnt = cnt - 1 if ( cnt > 0) cnt = cnt - 1; //LED를켠다. DigitalWrite(13, HIGH) else //LED를끈다. DigitalWrite(13, LOW) //LED를켠다. digitalwrite(13, HIGH); else //LED를끈다. digitalwrite(13, LOW); //0.1 초를기다린다. Delay(100) //0.1 초를기다린다. delay(100); - 115 -
실습 동체인식장치를통해움직임이감지되면 5 초간 LED 가켜져있도록한다. 이때마지막 2 초동안은 LED 가점멸하여잠시후꺼질수있음을사용자에 게전달할수있는기능을구현해본다. - 116 -
7.6 경보음소리발생시키기 tone 명령어로경보음소리발생시키기 tone 명령어에서진동수값을아주빠르게증가시켜주거나감소시켜주면 사이렌소리나경보음소리와같은효과를발생시킬수있다. 다음의코드를실행하여어떠한소리가발생하는지확인해본다. SPL 스크립트 스케치코드 for (i = 0; i <100; i++) f = i * i tone(3, f, 100) delay(10) for (int i = 0; i <100; i++) int f = i * i; tone(3, f, 100); delay(10); - 117 -
실습 delay 간격을수정하여다른소리가발생하도록시도해본다. 진동수값이증가하다가감소하는기능을추가하여다양한경보음소리패 턴을구현해본다. - 118 -
7.7 경보음소리기능을함수로만들기 함수만들기 반복적으로사용되는기능은함수로분리해놓으면프로그램의길이가줄 어들고재사용성이높아진다. 함수는다음과같은규칙으로생성한다. 넘겨주는값이없는경우 넘겨주는값이있는경우 void 함수이름 () // 이곳에명령어들을추가한다. 자료형함수이름 () // 이곳에명령어들을추가한다. return 결과값 ; 함수를만드는예는다음과같다. 넘겨주는값이없는경우 넘겨주는값이있는경우 void LEDBlink() DigitalWrite(13, HIGH) int Sum(int a, int b) c = a + b delay(1000) return c DigitalWrite(13, LOW) delay(1000) - 119 -
경보음소리함수만들기 아래코드는이전활동에서작성한코드에서경보음소리발생부분을함 수로변환한예를보여준다. SPL 스크립트 스케치코드 void PlayAlert() for (i = 0; i <100; i++) f = i * i tone(3, f, 100) delay(10) void PlayAlert() for (int i = 0; i <100; i++) int f = i * i; tone(3, f, 100); delay(10); PlayAlert() PlayAlert(); - 120 -
7.8 보안경보장치만들기 침입탐지장치 PSD 센서와경보음소리발생기능을이용하여 PSD 센서앞에대상물체 가감지되면경보음소리가 3 초간실행되는기능을구현해보자. SPL 스크립트 스케치코드 void PlayAlert() for (i = 0; i <100; i++) f = i * i tone(3, f, 100) delay(10) void PlayAlert() for (int i = 0; i <100; i++) int f = i * i; tone(3, f, 100); delay(10); a0 = AnalogRead(0) int a0 = analogread(0); // 움직이는대상을감지한다. if (a0 > 100 ) for (i = 0; i < 3; i++) PlayAlert() // 움직이는대상을감지한다. if (a0 > 100 ) for (int i = 0; i < 3; i++) PlayAlert(); delay(100) delay(100); - 121 -
7.9 경광등기능이추가된보안경보장치 설계하기 이전활동에서구현한보안감지장치는소리만발생한다. 대상물체가감지 되면소리뿐만이아니라 LED 도같이점멸하도록기능을추가해보자. 전체코드중에서어느위치에 LED 를점멸하는기능을추가해야할지생 각해보고적당한위치를찾아보자. 만약, PlayAlert() 함수에 LED 를점멸하는기능을추가시키려고한다면함 수의내용을어떻게수정해야하는가? - 122 -
힌트 PlayAlert() 함수내에있는 for 반복문은 0.01 초간격으로 100 번실행된 다. 총실행시간은 1 초가된다. 1 초의시간중에서 0.5 초는 LED 를켜고, 0.5 초는 LED 가꺼져있도록조건 을추가해본다. SPL 스크립트 스케치코드 void PlayAlert() for (i = 0; i <100; i++) f = i * i tone(3, f, 100) void PlayAlert() for (int i = 0; i <100; i++) int f = i * i; tone(3, f, 100); //500 밀리초로 LED 동작을나눈다. if ( i < 50 ) DigitalWrite(13, HIGH) else DigitalWrite(13, LOW) //500 밀리초로 LED 동작을나눈다. if ( i < 50 ) digitalwrite(13, HIGH); else digitalwrite(13, LOW); delay(10) delay(10); - 123 -
08 차량후방감지기및멜로디연주장치 학습목표 아날로그 PSD 거리센서를활용하여차량후방감지장치를구현할수있다. tone 명령어를이용하여다양한멜로디를연주할수있다. 실습개요 PSD 센서값을소리의높낮이정보로변환해본다. PSD 센서값을소리의점멸정보로변환해본다. tone 명령어로멜로디를연주해본다. 배열을이용하여멜로디를연주해본다. - 125 -
8.1 준비하기 준비물 아두이노보드, 올인원쉴드, 아날로그 PSD 센서, LED 모듈, 스피커 아두이노우노보드 올인원쉴드 스피커 아날로그 PSD 거리센서 - 126 -
H/W 연결하기 스피커를디지털 3 번에연결한다. 아날로그 PSD 거리센서를아날로그 0 번핀에연결한다. - 127 -
8.2 거리정보를소리의높낮이로바꾸기 기본기능구현하기 PSD 거리센서의정보를 tone 명령어의진동수값으로활용하면거리정 보를소리의높낮이정보로표현할수있다. 아래코드의기능을완성해본다. SPL 스크립트 스케치코드 a0 = AnalogRead(0) int a0 = analogread(0); tone(3, a0, 100 ) tone(3, a0, 100 ); Delay(100) delay(100); - 128 -
소리높낮이변환하기 이번에는센서값을그대로전달하지않고값을다양하게변환하여진동수 값으로전달해보자. SPL 스크립트 스케치코드 a0 = AnalogRead(0) int a0 = analogread(0); f = a0 * a0 f = a0 * a0 ; tone(3, f, 100 ) tone(3, f, 100 ); Delay(100) delay(100); 위의코드에서먼저 f = a0 * a0 와같이원래의값이제곱이되도록값 을변환하면어떠한결과가나오는지확인해본다. delay 값을더작게또는더크게변경할경우소리가어떻게달라지는지 확인해본다. - 129 -
8.3 간단한멜로디연주하기 음계표 다음음계표는각옥타브별진동수를정의한표이다. 아래예제는도음을한박자 (500 밀리초 ) 연주한예를보여준다. tone(3, 262, 480) delay(500) 아래예제는레음을반박자 (250 밀리초 ) 연주한예를보여준다. tone(3, 294, 480) delay(500) - 130 -
아래예제는미음을한박자 (500 밀리초 ) 연주한후, 한박자를쉬는예 를보여준다. delay 에서사용된 1000 밀리초는총 2 박자길이인데, 이중 450 밀리초만소리가나고나머지시간에는소리가나지않게된다. tone(3, 330, 480) delay(1000) 소리가나지않게하는또다른방법은진동수부분을값을 0 으로하는것 이다. tone(3, 0, 480) delay(500) 도레미파솔라시도 위의음계표를참고하여도레미파솔라시도를연주해본다. - 131 -
주의사항 tone 명령어의세번째값은 delay에있는값보다 20밀리초정도작게설정하는것이음을구분할때도움이된다. 가령아래와같이 미 미 두음을이어서연주할경우 tone의세번째값과 delay 값이같으면두음이이어서하나의긴음처럼연주된다. tone(3, 330, 500) delay(500) tone(3, 330, 500) delay(500) 위의경우에서 미 미 음이서로구분되어연주되도록하려면다음과같 이살짝소리가나지않는시간을만들어주어야한다. tone(3, 330, 480) delay(500) tone(3, 330, 480) delay(500) - 132 -
8.4 동요연주하기 악보 아래의악보를참고하여간단한동요를아두이노로연주해본다. - 133 -
8.5 거리센서로연주하기 거리센서건반 거리센서값을그대로 tone 명령어에대입하게되면정확한음계로연주 되는것이아니라서제대로연주하기가거의불가능하다. 거리센서값을 map() 함수를이용하여음계로대입한다면어느정도간단 한멜로디음을연주할수있다. 아래는거리센서의값을음계정보로변 환하여연주하는과정을보여준다. SPL 스크립트 스케치코드 a0 = AnalogRead(0) int a0 = analogread(0); //8 음계로변환 f = map(a0, 0, 1023, 1, 8) //8 음계로변환 int f = map(a0, 0, 1023, 1, 8); if (f == 1) tone(3, 262, 230) else if (f == 2) tone(3, 294, 230) if (f == 1) tone(3, 262, 230); else if (f == 2) tone(3, 294, 230); // 나머지음계도추가한다. // 나머지음계도추가한다. delay(250) delay(250); - 134 -
실습 A4 종이에피아노건반그림을그린후, PSD 센서를이용하여종이피아 노건반을연주하는장치를만들어보자. SPL 스크립트 스케치코드 a0 = AnalogRead(0) int a0 = analogread(0); if (a0 > 100 && a0 <= 200) tone(3, 262, 230) else if (a0 > 200 && a0 <= 300) tone(3, 294, 230) else if (a0 > 300 && a0 <= 400) tone(3, 330, 230) else if (a0 > 400 && a0 <= 500) tone(3, 349, 230) if (a0 > 100 && a0 <= 200) tone(3, 262, 230); else if (a0 > 200 && a0 <= 300) tone(3, 294, 230); else if (a0 > 300 && a0 <= 400) tone(3, 330, 230); else if (a0 > 400 && a0 <= 500) tone(3, 349, 230); // 나머지음계도추가한다. // 나머지음계도추가한다. delay(250) delay(250); - 135 -
8.6 배열로멜로디연주하기 배열선언 아두이노에서도배열을사용할수있다. 아래의예는정수형값과문자들을 배열로선언한예를보여준다. 자료형배열이름 [] = 값, 값, 값,... 값 ; int f[] = 262, 294, 330, 349, 392, 440, 494; char a[] = 'A', 'B'; - 136 -
배열로멜로디연주하기 음의높낮이와음의길이를각각배열로선언하면음의길이가길어도코 드의길이가늘어나지않는다. SPL 스크립트 int f[] = 262, 294, 330, 349, 392, 440, 494 int d[] = 500, 250, 250, 500, 500, 250, 250 스케치코드 int f[] = 262, 294, 330, 349, 392, 440, 494 int d[] = 500, 250, 250, 500, 500, 250, 250 for (i = 0; i < 7; i++) tone(2, f[i], d[i] - 20) delay(d[i]) for (int i = 0; i < 7; i++) tone(2, f[i], d[i] - 20); delay(d[i]); tone 명령어에서세번째인수의값인 d[i] 에 20 일빼준이유에대해설 명해보자. - 137 -
8.7 차량후방감지기만들기 거리를소리의점멸정보로표현하기 그동안의활동에서는거리정보를소리의높낮이로변환하여멜로디로표 현하였다. 요즘대부분의자동차에는후방장애물감지기가장착되어있다. 후방에있 는장애물이가까이접근하면소리의점멸간격이더짧아지고장애물이 멀면소리의점멸간격이더길어진다. 아래의코드에서는진동수는 1000Hz 로고정되고, 소리가나는지속시간과 delay 값에센서의거리값을대입하였다. SPL 스크립트 스케치코드 a0 = AnalogRead(0) int a0 = analogread(0); tone(3, 1000, a0 / 2) tone(3, 1000, a0 / 2); delay(a0) delay(a0); 위의코드를실행해보면일반적인후방감지기와달리거리에반비례하여 작동되는것을볼수있을것이다. 이문제를보완해보자. - 138 -
가까워지면점멸간격이짧아지도록개선하기 map() 함수를이용하여센서값을적절히조절해주면점멸간격이이전 예제와달리거리값에비례하여작동시킬수있다. 프로그램의기능을완성해본다. SPL 스크립트 스케치코드 a0 = AnalogRead(0) int a0 = analogread(0); // 이곳에서 a0 값을변환해준다. a0 = map(a0, 0, 1023, 1023, 0) // 이곳에서 a0 값을변환해준다. a0 = map(a0, 0, 1023, 1023, 0); tone(3, 1000, a0 / 2) tone(3, 1000, a0 / 2); delay(a0) delay(a0); - 139 -
실습 이전코드는 PSD 센서앞에대상물체가없는경우에도항상소리가발생하는문제점이있다. if 조건문을추가하여이문제를해결해보도록한다. 즉, PSD 센서앞에대상물체가없는경우에는점멸소리가발생하지않도록기능을보완한다. PSD 센서에대상물체가가깝게접근할경우에는연속적으로삐소리가 나도록기능을개선해보기바란다. - 140 -
09 컬러 LED 바예술창작작품만들기 학습목표 컬러 LED 바의제어명령어를이해하고활용할수있다. 컬러 LED 바로다양한조형예술창작작품을만들수있다. 실습개요 컬러 LED바의색상을제어해본다. 컬러 LED바의색상위치를제어해본다. 랜덤함수를활용하여임의의색상을생성해본다. 랜덤함수를활용하여소리와색상을융합해본다. 다양한애니메이션패턴을생성해본다. - 141 -
9.1 준비하기 준비물 아두이노보드, 올인원쉴드, 컬러 LED 바, PSD 거리센서, 스피커 아두이노우노보드 올인원쉴드 스피커 아날로그 PSD 거리센서 컬러 LED 바 - 142 -
H/W 연결하기 컬러 LED 바를디지털 2 번에연결한다. 스피커를디지털 3 번에연결한다. 아날로그 PSD 거리센서를아날로그 0 번핀에연결한다. - 143 -
9.2 컬러 LED 바이해하기 컬러 LED 바 컬러 LED 바는 8 개의컬러 LED 셀로구성되어있으며, 한쪽에있는연장 핀을통해계속 8 개씩확장시켜나갈수있다. 하나의디지털핀에서최대 256 개의컬러 LED 셀을제어할수있다. 컬러 LED 바는 8 개를연결한것이 8x8 매트릭스이며, 64 개의컬러 LED 가 연결되어있다. - 144 -
컬러 LED 바의셀위치 컬러 LED 바에있는각컬러 LED 셀은위치값으로각각을제어할수있 다. 아두이노보드에가장가까운 LED 셀부터자동으로 0 번, 1 번순으로 부여된다. 컬러 LED 바를연장하여연결할경우, 자동으로위치는이어진다. 컬러 LED 바의색상 컬러 LED 바의각색상은 R (Red), G (Green), B (Blue) 3 원색조합을통 해색상을표현한다. - 145 -
9.3 컬러 LED 바켜기 컬러 LED 바를켜기위한사전작업 컬러 LED 바를켜기위해서는몇가지사전명령어들을프로그램에추가해 주어야한다. 아래코드는컬러 LED 바를켜기위한사전작업들을보여준다. SPL 스크립트 //2번핀에 8개의 LED 셀이연결되어있음 NSBegin(8, 2) //LED 셀을모두끔 NSClear() // 이곳에명령어를추가함 delay(1000) 스케치코드 #include <NS_Rainbow.h> //2번핀에 8개의 LED 셀이연결되어있음 NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); //LED 셀을모두끔 ns_stick2.clear(); // 이곳에명령어를추가함 delay(1000); SPL 스크립트와스케치코드의결과물이크게다른것에유의하기바란다. - 146 -
첫번째 LED 셀켜기 첫번째컬러 LED 셀을빨강색으로켜보자. 컬러 LED 셀에색상을지정하는명령어는다음과같다. 총 4 개의인수를 필요로하는데, 첫번째인수는 LED 셀의위치이며, 그다음 3 개는 Red, Green, Blue 색상값이다. SPL 스크립트 // 위치, R, G, B NSSetColor(0, 255, 0, 0) NSShow() 스케치코드 // 위치, R, G, B ns_stick2.setcolor(0, 255, 0, 0); ns_stick2.show(); - 147 -
각색상값은 0 ~ 255 사이의숫자값으로구성된다. 첫번째 LED 를빨간 색으로켜는코드는다음과같다. SPL 스크립트 //2번핀에 8개의 LED 셀이연결되어있음 NSBegin(8, 2) //LED 셀을모두끔 NSClear() // 첫번째 LED셀을빨간색으로켜기 NSSetColor(0, 255, 0, 0) NSShow() 스케치코드 #include <NS_Rainbow.h> //2번핀에 8개의 LED 셀이연결되어있음 NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); //LED 셀을모두끔 ns_stick2.clear(); delay(1000) // 첫번째 LED 셀을빨간색으로켜기 ns_stick2.setcolor(0, 255, 0, 0); ns_stick2.show(); delay(1000); 실습 두번째 LED 셀을초록색으로켜보자. 7 개의 LED 셀에무지개색상을표현해본다. - 148 -
9.4 신호등만들기 초록 -> 노랑 -> 빨강신호등 컬러 LED 바의앞 3 개의 LED 셀을활용하여 1 초간격으로변하는신호등 을구현해보자. 신호등은초록 -> 노랑 -> 빨강의순으로 1 초씩순차적으로켜지도록한 다. SPL 스크립트 스케치코드 NSBegin(8, 2) // 첫번째 LED셀을초록색으로켜기 NSClear() NSSetColor(0, 0, 255, 0) NSShow() delay(1000) // 두번째 LED셀을노란색으로켜기 NSClear() NSSetColor(1, 255, 255, 0) NSShow() delay(1000) // 세번째 LED셀을빨간색으로켜기 NSClear() NSSetColor(2, 255, 0, 0) NSShow() delay(1000) #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); // 첫번째 LED셀을초록색으로켜기 ns_stick2.clear(); ns_stick2.setcolor(0, 0, 255, 0); ns_stick2.show(); delay(1000); // 두번째 LED셀을노란색으로켜기 ns_stick2.clear(); ns_stick2.setcolor(1, 255, 255, 0); ns_stick2.show(); delay(1000); // 세번째 LED셀을빨간색으로켜기 ns_stick2.clear(); - 149 -
ns_stick2.setcolor(2, 255, 0, 0); ns_stick2.show(); delay(1000); 9.5 반복문으로하나씩켜기 LED 를순차적으로켜기 for 반복문을이용하여 LED 를순차적으로켜보자. SPL 스크립트 스케치코드 NSBegin(8, 2) NSClear() for (i = 0; i < 8; i++) NSSetColor( i, 0, 255, 0) NSShow() delay(100) #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); ns_stick2.clear(); for (int i = 0; i < 8; i++) ns_stick2.setcolor( i, 0, 255, 0); ns_stick2.show(); delay(100); - 150 -
LED 를순차적으로하나씩만켜기 이전예제는 LED 가계속누적하여켜지는과정을보여주었다. 만약한개 씩만순차적으로 LED 가켜지도록하려면이전코드의어떠한부분을수정 해주어야하는가? SPL 스크립트 스케치코드 NSBegin(8, 2) NSClear() for (i = 0; i < 8; i++) NSClear() NSSetColor( i, 0, 255, 0) NSShow() delay(100) #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); ns_stick2.clear(); for (int i = 0; i < 8; i++) ns_stick2.clear(); ns_stick2.setcolor( i, 0, 255, 0); ns_stick2.show(); delay(100); - 151 -
9.6 LED 전체켜기 LED 를전체를특정색상으로켜기 8 개의 LED 전체를 R, G, B 색상으로지정하여켜기위한명령어는다음과 같다. 기존 NSSetColor 명령어대신에 NSSetAllColor 명령어를사용하면 되며, 위치인수가필요없다. SPL 스크립트 //R, G, B NSSetAllColor(255, 0, 0) NSShow() 스케치코드 //R, G, B ns_stick2.setallcolor(0, 255, 0, 0); ns_stick2.show(); 아래의코드는후레쉬용도로사용하기위해 LED 전체를흰색으로켜기 위한과정을보여준다. SPL 스크립트 스케치코드 NSBegin(8, 2) NSSetAllColor(255, 255, 255) NSShow() delay(1000) #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); ns_stick2.setallcolor(255, 255, 255); ns_stick2.show(); delay(1000); - 152 -
실습 컬러 LED 바전체의색상이 1 초간격으로빨강, 초록, 파랑의순서대로변 경되도록기능을작성해본다. SPL 스크립트 스케치코드 NSBegin(8, 2) NSSetAllColor(255, 0, 0) NSShow() delay(1000) NSSetAllColor(0, 255, 0) NSShow() delay(1000) NSSetAllColor(0, 0, 255) NSShow() delay(1000) #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); ns_stick2.setallcolor(255, 0, 0); ns_stick2.show(); delay(1000); ns_stick2.setallcolor(0, 255, 0); ns_stick2.show(); delay(1000); ns_stick2.setallcolor(0, 0, 255); ns_stick2.show(); delay(1000); - 153 -
9.7 랜덤함수 임의의정수값을발생시키는 random() 함수 아두이노에서는임의의정수값을생성시키는용도로 random() 이라는아 주유용한함수를제공한다. 함수의사용방법은 2 가지가있는데각각의사용방법은다음과같다. a = random(100) 인수가 1 개인경우 인수가 2 개인경우 a = random(50, 100) 위의변수 a에는 0 ~ 99까지의임의의값이저장된다. 100은절대나오지않는다. random 함수에사용된인수보다항상 1 작은값까지만생성된다. 위의변수 a에는 50 ~ 99까지의임의의값이저장된다. 100은절대나오지않는다. random 함수에사용된두번째인수보다항상 1 작은값까지만생성된다. - 154 -
9.8 임의의색상생성하기 임의의색상으로 LED 켜기 random() 함수를이용하여 0.3 초간격으로 LED 전체색상을임의의색상 으로변경하려고한다. 아래의코드를완성해보기바란다. SPL 스크립트 스케치코드 NSBegin(8, 2) r = random( 256 ) g = random( 256 ) b = random( 256 ) NSSetAllColor(r, g, b) NSShow() #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); int r = random( 256 ); int g = random( 256 ); int b = random( 256 ); delay(300) ns_stick2.setallcolor(r, g, b); ns_stick2.show(); delay(300); - 155 -
9.9 임의의위치에있는 LED 를임의의색상으로켜기 랜덤 LED 켜기 random() 함수를이용하여 0.1 초간격으로 8 개의 LED 중에서특정 LED 만임의의색상으로켜려고한다. 아래의코드를완성해보기바란다. SPL 스크립트 스케치코드 NSBegin(8, 2) p = random( 8 ) r = random( 256 ) g = random( 256 ) b = random( 256 ) NSClear() NSSetColor(p, r, g, b) NSShow() delay(100) #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); int p = random( 8 ); int r = random( 256 ); int g = random( 256 ); int b = random( 256 ); ns_stick2.clear(); ns_stick2.setcolor(p, r, g, b); ns_stick2.show(); delay(100); - 156 -
실습 임의의진동수를발생시켜 LED 셀이켜질때스피커에임의의소리도같 이연주되도록기능을수정해본다. - 157 -
9.10 이퀄라이저효과만들기 이퀄라이저효과 오디오에자주사용되는이퀄라이저효과를컬러 LED 바로구현해본다. 컬러 LED 바에 LED 가표시되는길이가랜덤하게변경되도록기능을구현 해본다. - 158 -
구현하기 for 반복문을활용하여임의의위치까지 LED 셀을켜는기능을구현한다. SPL 스크립트 스케치코드 NSBegin(8, 2) p = random( 8 ) r = random( 256 ) g = random( 256 ) b = random( 256 ) NSClear() for (i = 0; i < p ; i++) NSSetColor( i, r, g, b) NSShow() delay(100) #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); int p = random( 8 ); int r = random( 256 ); int g = random( 256 ); int b = random( 256 ); ns_stick2.clear(); for (int i = 0; i < p ; i++) ns_stick2.setcolor( i, r, g, b); ns_stick2.show(); delay(100); NSShow() 명령어의위치에대해유의하기바란다. - 159 -
실습 LED 셀이켜지는길이만큼소리의높낮이가높아지도록소리를발생시키는기능을추가하여이전활동의예제에추가해보자. 즉, 이퀄라이저표시막대바의길이가길수록더높은음의소리가같이연주되도록기능을구현하면된다. - 160 -
10 컬러무드등만들기 학습목표 컬러 LED바의제어명령어를이해하고활용할수있다. 컬러 LED바로센서값을시각적으로표시할수있는컬러게이지바를만들수있다. 컬러무드등을제작할수있다. 실습개요 거리정보를컬러막대바로표시한다. 거리정도를컬러게이지바로구현해본다. 색상이부드럽게변화되는컬러무드등을제작해본다. - 161 -
10.1 준비하기 준비물 아두이노보드, 올인원쉴드, 컬러 LED 바, PSD 거리센서, 스피커 아두이노우노보드 올인원쉴드 스피커 아날로그 PSD 거리센서 컬러 LED 바 - 162 -
H/W 연결하기 컬러 LED 바를디지털 2 번에연결한다. 스피커를디지털 3 번에연결한다. 아날로그 PSD 거리센서를아날로그 0 번핀에연결한다. - 163 -
10.2 거리센서의값을막대그래프로표시하기 거리센서를막대그래프로표시하기 PSD 거리센서의값을컬러 LED 바에막대그래프로표시해보자. map 함수를이용하여거리정보를컬러바의 LED 셀개수로변환해보자. SPL 스크립트 스케치코드 NSBegin(8, 2) a0 = AnalogRead(0) p = map(a0, 0, 1023, 7, 0 ) r = 0; g = 255 b = 0 NSClear() for (i = 0; i < p ; i++) NSSetColor( i, r, g, b) NSShow() delay(100) #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); int a0 = analogread(0); int p = map(a0, 0, 1023, 7, 0 ); int r = 0; int g = 255; int b = 0; ns_stick2.clear(); for (int i = 0; i < p ; i++) ns_stick2.setcolor( i, r, g, b); ns_stick2.show(); delay(100); - 164 -
10.3 거리센서값의강도를색상으로표시하기 초록과빨강으로그래프표시하기 이전활동의코드에서, 컬러 LED 바에막대그래프를그릴때 LED 셀의 개수가증가할수록 LED 셀의색상이초록에서빨간색으로변화되어가면 서표시되도록기능을추가해본다. map() 함수를이용해컬러매핑하기 map() 함수를이용하면변화되는색상들의중간값을아주쉽게계산할수 있다. 아래의예는 a0 값에따라서초록에서빨간색으로변화되는값을얻 는과정을보여준다. r = map(a0, 0, 1023, 0, 255) g = map(a0, 0, 1023, 255, 0) b = 0-165 -
구현하기 아래코드의빈간을작성하여프로그램을완성해본다. SPL 스크립트 스케치코드 NSBegin(8, 2) a0 = AnalogRead(0) p = map(a0, 0, 1023, 7, 0 ) r = map(a0, 0, 1023, 0, 255 ) g = map(a0, 0, 1023, 255, 0 ) b = 0 NSClear() for (i = 0; i < p ; i++) NSSetColor( i, r, g, b) NSShow() delay(100) #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); int a0 = analogread(0); int p = map(a0, 0, 1023, 7, 0 ); int r = map(a0, 0, 1023, 0, 255 ); int g = map(a0, 0, 1023, 255, 0 ); int b = 0; ns_stick2.clear(); for (int i = 0; i < p ; i++) ns_stick2.setcolor( i, r, g, b); ns_stick2.show(); delay(100); - 166 -
10.4 컬러무드등만들기 임의의색상으로부드럽게변화하기 빨간색영역의값에대해서임의의시작값과끝값을생성한후, 해당값 의범위를 256 단계로서서히변화시켜보다. map 함수를이용하여변환되는값을계산해보자. SPL 스크립트 스케치코드 NSBegin(8, 2) r1 = random(256) r2 = random(r1, 256) for (i = 0; i < 256; i++) r = map(i, 0, 255, r1, r2) NSSetAllColor(r, 0, 0) NSShow() delay(10) #include <NS_Rainbow.h> NS_Rainbow ns_stick2 = NS_Rainbow(8,2); ns_stick2.begin(); int r1 = random(256); int r2 = random(r1, 256); for (int i = 0; i < 256; i++) int r = map(i, 0, 255, r1, r2); ns_stick2.setallcolor( r, 0, 0); ns_stick2.show(); delay(10); - 167 -
실습 이전활동의코드는빨간색영역만서서히변화시키는기능을제공하고있 다. 이코드에초록색과파란색영역도임의로생성한후 3 가지의 R, G, B 색상이서서히 256 단계로변화되도록이전코드의기능을개선해본다. - 168 -
11 나만의로봇제어함수만들기 학습목표 PWM으로로봇모터를제어하는명령어를이해하고활용할수있다. 로봇주행을제어하는나만의함수를만들수있다. 아두이노라이브러리를등록하고활용하는방법을익힐수있다. 실습개요 PWM 함수로모터의속도를제어해본다. 모터의회전방향을제어해본다. 나만의로봇모터제어함수를만들어본다. 아두이노라이브러리로내가만든함수를등록하고활용해본다. - 169 -
11.1 준비하기 준비물 아두이노보드, 올인원쉴드, 모바일로봇플랫폼 아두이노우노보드 올인원쉴드 모바일로봇플랫폼 - 170 -
H/W 연결하기 왼쪽모터의케이블을 MOTOR1 단자에연결한다. 오른쪽모터의케이블을 MOTOR2 단자에연결한다. - 171 -
주의사항 로봇을활용한실습에서는로봇이갑자기책상에서움직일수있으며, 이 경우자칫하면로봇이책상아래로떨어져파손될수있다. 로봇실습시로봇이갑자기이동하는것을방지하기위해서는다음과같이 로봇의앞쪽을아래방향으로해서세워놓고실습을진행해야한다. 즉, 바퀴가공중에떠있어야안전하게실습할수있다. - 172 -
주의사항 로봇실습시업로드결과는반드시아래와같아야한다. 만약위와다르게결과가표시된다면업로드가실패한것이다. 업로드가실 패하는이유는로봇의모터가순간적으로전원을많이사용하기때문에 PC 에서 USB 연결을차단하였기때문이다. 문제를해결하기위해서는아래의절차대로진행한다. 절차1) 아두이노보드의 USB 케이블을 PC에서제거한다. 절차2) 코딩 SW를종료한다. 절차3) 아두이노보드를 PC에다시연결한다. 절차4) 코딩 SW를다시실행한다. - 173 -
11.2 모터제어에대한이해 모터구동에필요한부품 일반적인아두이노우노보드에서는모터를직접적으로제어할수없다. 로봇의모터를구동시키기위해서는모터드라이브라고하는별도의전자 회로가필요한데, 올인원쉴드에는이미모터드라이브회로가내장되어 있다. - 174 -
모터드라이브연결핀 아래그림은모터드라이브회로에연결된모터와아두이노디지털핀들에 대한연결정보이다. 위의그림에서보이듯이모터드라이브회로는아두이노디지털 4 번, 5 번, 6 번, 7 번등총 4 개의핀을내부적으로사용한다. 디지털 5 번과 6 번은각각 PWM 핀으로서 AnalogWrite 명령을이용하여 256 단계로생성되는전압을조절할수있다. 예를들어, 모터 1 의경우 AnalogWrite(5, 255) 를실행하게되면가장빠른 속도로모터가회전하게된다. 디지털 4 번과 7 번은모터의회전방향즉, 전압의방향을결정짓는핀이다. 예를들어디지털 4 번에 DigitalWrite(4, LOW) 를실행하게되면, 모터 1 의 전압이반대로걸리게되어모터 1 의회전방향이반대가된다. - 175 -
11.3 모터 1 제어하기 AnalogWrite 명령으로모터제어하기 디지털 5 번에연결되어있는모터 1 을제어해보자. 아래코드는 2 초간모 터를 200 정도의파워값으로작동시키고다시 2 초간정지시키는예제이 다. SPL 스크립트 스케치코드 AnalogWrite(5, 200) delay(2000) analogwrite(5, 200); delay(2000); AnalogWrite(5, 0) delay(2000) analogwrite(5, 0); delay(2000); - 176 -
모터속도제어하기 AnalogWrite 함수의두번째인자는 0 ~ 255 사이의값을가질수있으 며, 0 이면모터가멈추고 255 이면최대속도로회전한다. 하지만모터의 특성상 0 ~ 150 사이의값을지정하면모터가작동하지않는다. 아래의코드는모터의속도를반복문을이용해제어해보는과정을보여준 다. SPL 스크립트 스케치코드 for (int i = 0; i < 255; i++) AnalogWrite(5, i) delay(50) for (int i = 0; i < 255; i++) analogwrite(5, i); delay(50); - 177 -
모터의회전방향제어하기 모터 1 의회전방향은디지털 4 번핀의값을설정하기에따라달라진다. HIGH 값으로설정하면 + 전압이발생하지만, LOW 값으로설정하면 전 압이발생한다. 아래의코드는모터 1 의회전방향을전진 -> 정지 -> 후진 -> 정지의순 서로회전시키는과정을보여준다. SPL 스크립트 스케치코드 // 정방향회전 DigitalWrite(4, HIGH) AnalogWrite(5, 200) delay(2000) AnalogWrite(5, 0) delay(1000) // 역방향회전 DigitalWrite(4, LOW) AnalogWrite(5, 200) delay(2000) pinmode(4, OUTPUT); // 정방향회전 digitalwrite(4, HIGH); analogwrite(5, 200); delay(2000); analogwrite(5, 0); delay(1000); // 역방향회전 digitalwrite(4, LOW); analogwrite(5, 200); delay(2000); AnalogWrite(5, 0) delay(1000) analogwrite(5, 0); delay(1000); - 178 -
11.4 모터를제어하는함수만들기 모터제어용함수만들기 모터를제어하는기능을로봇에서계속사용되는명령어이기때문에가급 적함수로만들어놓고사용해야한다. 다음과같이 RobotWrite() 라는이름으로나만의모터제어용함수를만들 어보자. 함수의인수로는모터파워값을받도록하며, + 값이면모터가앞으로회전 하고, - 값이면모터가반대로회전하도록설계한다. 즉, 모터파워값은 255 ~ 255 사이의값을넘겨받도록한다. SPL 스크립트 스케치코드 void RobotWrite(int left) left_power = abs(left) AnalogWrite(5, left_power) void RobotWrite(int left) int left_power = abs(left); analogwrite(5, left_power); if (left >= 0) DigitalWrite(4, HIGH) else DigitalWrite(4, LOW) if (left >= 0) digitalwrite(4, HIGH); else digitalwrite(4, LOW); 위의함수에서사용된 abs() 함수는수학함수로서절대값을넘겨주는함수 이다. - 179 -
통합된코드 기존예제를함수로변경한결과이다. SPL 스크립트 스케치코드 void RobotWrite(int left) left_power = abs(left) AnalogWrite(5, left_power) void RobotWrite(int left) int left_power = abs(left); analogwrite(5, left_power); if (left >= 0) DigitalWrite(4, HIGH) else DigitalWrite(4, LOW) if (left >= 0) digitalwrite(4, HIGH); else digitalwrite(4, LOW); // 정방향회전 RobotWrite(200) delay(2000) RobotWrite(0) delay(1000) // 역방향회전 RobotWrite(-200) delay(2000) RobotWrite(0) delay(1000) pinmode(4, OUTPUT); // 정방향회전 RobotWrite(200); delay(2000); RobotWrite(0); delay(1000); // 역방향회전 RobotWrite(-200); delay(2000); RobotWrite(0); delay(1000); - 180 -
11.5 2 개의모터를동시에제어하는함수만들기 양쪽모터모두제어하는함수 로봇의주행을제어하기위해서는양쪽모터를동시에제어해주어야한다. 모터 1 과모터 2 를동시에제어하기위해다음과같이 RobotWrite 함수에 모터 2 에대한제어기능을추가해놓는다. SPL 스크립트 스케치코드 void RobotWrite(int left, int rght) left_power = abs(left) right_power = abs(right) void RobotWrite(int left, int right) int left_power = abs(left); int right_power = abs(right); AnalogWrite(5, left_power) AnalogWrite(6, right_power) analogwrite(5, left_power); analogwrite(6, right_power); if (left >= 0) DigitalWrite(4, HIGH) else DigitalWrite(4, LOW) if (left >= 0) digitalwrite(4, HIGH); else digitalwrite(4, LOW); if (right >= 0) DigitalWrite(7, HIGH) else DigitalWrite(7, LOW) if (right >= 0) digitalwrite(7, HIGH); else digitalwrite(7, LOW); - 181 -
11.6 로봇주행제어하기 간단한로봇주행제어하기 이전활동에서제작한함수를이용하여다음과같이로봇이동작하도록기 능을완성해보자. 1 초간전진 -> 0.5 초간후진 -> 1 초간회전 이전활동에서작성한 RobotWrite() 함수는프로그램맨위에추가해놓는 다. SPL 스크립트 스케치코드 void RobotWrite(int left)... void RobotWrite(int left)... RobotWrite(200, 200) delay(1000) RobotWrite(-200, -200) delay(500) RobotWrite(-200, 200) delay(1000) pinmode(4, OUTPUT); pinmode(7, OUTPUT); RobotWrite(200, 200); delay(1000); RobotWrite(-200, -200); delay(500); RobotWrite(-200, 200); - 182 -
delay(1000); 실습 나만의로봇주행패턴을만들어본다. - 183 -
11.7 라이브러리로분리시키기 함수만분리하기 RobotWrite() 함수를다른프로그램에서도사용하려면해당함수를별도의 파일로분리시켜놓아야한다. 새로운파일을생성한후, 소스의모든내용을삭제한다. 그다음, RobotWrite() 함수의내용만해당파일에복사해놓는다. 스케치코드 #include<arduino.h> void RobotWrite(int left, int right) int left_power = abs(left); int right_power = abs(right); analogwrite(5, left_power); analogwrite(6, right_power); if (left >= 0) digitalwrite(4, HIGH); else digitalwrite(4, LOW); if (right >= 0) digitalwrite(7, HIGH); else digitalwrite(7, LOW); - 184 -
함수를라이브러리로분리하기위해서는함수의내용이모두 C 언어문법으 로작성되어있어한다. 위의코드는 RobotWrite() 함수를분리시킨결과 를보여준다. 위의코드위쪽을살펴보면아래의명령어가추가되어있는것을볼수있 을것이다. 추가된이유는이라이브러리에서사용하는아두이노명령어들 이 Arduino.h 파일에있는명령어들을사용하기때문이다. #include<arduino.h> 화면상단에서라이브러리로저장메뉴를클릭한다. 기본적으로 C:\ 사용자 \ 로그인이름 \ 문서 \Arduino\Libraries 폴더가표시 된다. 기본폴더경로를수정하지말고현재표시된경로에서작업을해야한다. 파일을저장하는창이표시되면, 폴더에서 RobotWrite 라는이름으로폴더 를새로생성한다. 새로생성된폴더로이동한후에, RobotWrite.h 이름으로현재의라이브러 리함수를파일로저장한다. - 185 -
- 186 -
11.8 라이브러리사용하기 RobotWrite 라이브러리사용하기 이전단계에서라이브러리로만들어놓은 RobotWrite 함수를다른프로그 램에서사용해보자. 새로운프로그램을생성한후에, 아래의명령어를프로그램맨위에추가한 다. #include<robotwrite.h> 로봇의주행을제어하는기능을 loop() 함수안에추가해준다. SPL 스크립트 스케치코드 #include<robotwrite.h> #include<robotwrite.h> RobotWrite(200, 200) delay(1000) RobotWrite(-200, -200) delay(500) RobotWrite(-200, 200) delay(1000) pinmode(4, OUTPUT); pinmode(7, OUTPUT); RobotWrite(200, 200); delay(1000); RobotWrite(-200, -200); delay(500); RobotWrite(-200, 200); delay(1000); - 187 -
11.9 SPL 편집기에있는로봇주행제어명령어 DriveWrite() 함수 SPL 편집기에는사용자가로봇함수를만들지않아도동일하게사용할수있는로봇주행제어용명령어가있다. 내장명령어에서 2번째그룹에있는 DriveWrite 함수를이용하면 RobotWrite 함수를만들지않아도동일하게로봇을제어할수있다. - 188 -
DriveWrite 함수로로봇제어하기 아래의코드는 SPL 편집기에내장된 DriveWrite 함수를사용하여별도의 라이브러리추가없이로봇을제어하는과정을보여준다. SPL 스크립트 DriveWrite(200, 200) delay(1000) DriveWrite(-200, -200) delay(500) 스케치코드 #include<spllib.h> pinmode(4, OUTPUT); pinmode(7, OUTPUT); DriveWrite(200, 200); delay(1000); DriveWrite(-200, 200) delay(1000) DriveWrite(-200, -200); delay(500); DriveWrite(-200, 200); delay(1000); - 189 -
12 로봇조종기만들기 학습목표 아날로그키패드센서를활용할수있다. 키패드센서를이용하기위한함수를만들수있다. 키패드센서로로봇조종기를제작할수있다. 실습개요 키패드센서의특성을확인해본다. 키패드센서용함수를작성한다. 키패드센서용함수를이용하여오르간연주장치를구현해본다. 키패드함수를이용해로봇조종기를구현한다. - 190 -
12.1 준비하기 준비물 아두이노보드, 올인원쉴드, 키패드센서, 모바일로봇플랫폼 아두이노우노보드 올인원쉴드 아날로그키패드센서 모바일로봇플랫폼 - 191 -
H/W 연결하기 왼쪽모터의케이블을 MOTOR1 단자에연결한다. 오른쪽모터의케이블을 MOTOR2 단자에연결한다. 아날로그키패드센서를아날로그 0 번핀에연결한다. - 192 -
12.2 키패드센서값읽기 키패드센서값확인하기 키패드센서는 5 개의버튼으로구성되어있으며, 각버튼을누를때마다 센서값이달라진다. SPL 스크립트 스케치코드 a0 = AnalogRead(0) PrintLine(a0) delay(100) Serial.begin(115200); int a0 = analogread(0); Serial.println(a0); delay(100); 각버튼이눌려질때콘솔창에표시되는값을아래에기록한다. 측정값에오차가있으므로측정값에서 +10 또는 10 을계산한값을같이 기록한다. 버튼 측정값 측정값-10 측정값 +10 노랑빨강흰색초록 파랑 - 193 -
12.3 키패드버튼의번호를리턴하는기능 키패드버튼의번호리턴하기 키패드센서의버튼을누르면버튼에해당하는번호를출력하는기능을구 현해본다. - 194 -
아래의코드에서 if 조건문의값을자신이측정한센서값에맞추어수정해 준다. SPL 스크립트 pin = 0 a = AnalogRead(pin) if (608 < a && a < 628) PrintLine(1) else if (797 < a && a < 816) PrintLine(2) else if (a> 895 && a<915) PrintLine(3) else if (a> 666 && a<686) PrintLine(4) else if (a> 724 && a<744) PrintLine(5) Delay(100) 스케치코드 Serial.begin(115200); int pin = 0; int a0 = analogread(0); if (608 < a && a < 628) Serial.println(1); else if (797 < a && a < 816) Serial.println(2); else if (a> 895 && a<915) Serial.println(3); else if (a> 666 && a<686) Serial.println(4); else if (a> 724 && a<744) Serial.println(5); delay(100); - 195 -
12.4 키패드버튼의번호를리턴하는함수 키패드버튼의번호리턴함수 이전활동에서작성한코드를다른프로그램에서사용하기위해함수로분 리해본다. SPL 스크립트 a = KeyPad(0) PrintLine(a) delay(100) int KeyPad(int pin) res = -1 a = AnalogRead(pin) if (608 < a && a < 628) res = 1 else if (797 < a && a < 816) res = 2 else if (a> 895 && a<915) res = 3 else if (a> 666 && a<686) res = 4 else if (a> 724 && a<744) res = 5 return res 스케치코드 Serial.begin(115200); int a = KeyPad(0); Serial.println(a) delay(100); int KeyPad(int pin) int res = -1; int a = analogread(pin); if (608 < a && a < 628) res = 1; else if (797 < a && a < 816) res = 2; else if (a> 895 && a<915) res = 3; else if (a> 666 && a<686) res = 4; else if (a> 724 && a<744) res = 5; return res; - 196 -
12.5 키패드함수를라이브러리로등록하기 함수만분리하기 키패드함수를다른프로그램에서도사용하려면해당함수를별도의파일 로분리시켜놓아야한다. 새로운파일을생성한후, 소스의모든내용을삭제한다. 그다음, 키패드 함수의내용만해당파일에복사해놓는다. 스케치코드 #include<arduino.h> int KeyPad(int pin) int res = -1; int a = analogread(pin); if (608 < a && a < 628) res = 1; else if (797 < a && a < 816) res = 2; else if (a> 895 && a<915) res = 3; else if (a> 666 && a<686) res = 4; else if (a> 724 && a<744) res = 5; return res; - 197 -
함수를라이브러리로분리하기위해서는함수의내용이모두 C 언어문법으 로작성되어있어한다. 위의코드는키패드함수를분리시킨결과를보여 준다. 위의코드위쪽을살펴보면아래의명령어가추가되어있는것을볼수있 을것이다. 추가된이유는이라이브러리에서사용하는아두이노명령어들 이 Arduino.h 파일에있는명령어들을사용하기때문이다. #include<arduino.h> 화면상단에서라이브러리로저장메뉴를클릭한다. 기본적으로 C:\ 사용자 \ 로그인이름 \ 문서 \Arduino\Libraries 폴더가표시 된다. 기본폴더경로를수정하지말고현재표시된경로에서작업을해야한다. 파일을저장하는창이뜨는표시된폴더에서 KeyPad 라는이름으로폴더 를새로생성한다. 새로생성된폴더로이동한후에, KeyPad.h 이름으로현재의라이브러리 함수를파일로저장한다. - 198 -
- 199 -
12.6 라이브러리사용하기 KeyPad 라이브러리사용하기 이전단계에서라이브러리로만들어놓은 KeyPad 함수를다른프로그램에 서사용해보자. 새로운프로그램을생성한후에, 아래의명령어를프로그램맨위에추가한 다. #include<keypad.h> 버튼의번호가정상적으로출력되는지다음과같이확인해본다. SPL 스크립트 스케치코드 #include<keypad.h> #include<keypad.h> a = KeyPad(0) PrintLine(a) delay(100) Serial.begin(115200); int a = KeyPad(0); Serial.println(a) delay(100); - 200 -
12.7 오르간연주장치만들기 키패드건반으로연주하기 디지털 3 번핀에스피커를연결한후, 키패드버튼을이용해도레미파솔 까지의음계를연주해보자. SPL 스크립트 스케치코드 #include<keypad.h> #include<keypad.h> a = KeyPad(0) if (a == 1) tone(3, 262, 200) else if (a == 2) tone(3, 294, 200) else if (a == 3) tone(3, 330, 200) else if (a == 4) tone(3, 349, 200) else if (a == 5) tone(3, 392, 200) Serial.begin(115200); int a = KeyPad(0); if (a == 1) tone(3, 262, 200); else if (a == 2) tone(3, 294, 200); else if (a == 3) tone(3, 330, 200); else if (a == 4) tone(3, 349, 200); else if (a == 5) tone(3, 392, 200); delay(100) delay(100); - 201 -
12.8 로봇조종기만들기 키패드버튼으로로봇조종하기 5 개의키패드버튼을활용하여다음과같이로봇의동작을제어해보자. 버튼번호동작명령어 2 전진 DriveWrite(200, 200) 1 좌회전 DriveWrite(0, 200) 3 정지 DriveWrite(0, 0) 5 우회전 DriveWrite(0, 200) 4 후진 DriveWrite(-200, -200) - 202 -
아래의코드를완성해본다. SPL 스크립트 스케치코드 #include<keypad.h> a = KeyPad(0) if (a == 1) DriveWrite( 0, 200) else if (a == 2) DriveWrite( 200, 200) else if (a == 3) DriveWrite( 0, 0) else if (a == 4) DriveWrite( -200, -200) else if (a == 5) DriveWrite( 0, 200) delay(100) #include<keypad.h> #include<spllib.h> pinmode(4, OUTPUT); pinmode(7, OUTPUT); int a = KeyPad(0); if (a == 1) DriveWrite( 0, 200); else if (a == 2) DriveWrite( 200, 200); else if (a == 3) DriveWrite( 0, 0); else if (a == 4) DriveWrite( -200, -200); else if (a == 5) DriveWrite( 0, 200); delay(100); - 203 -
13 자율주행로봇 학습목표 PSD 거리센서를활용하여사람의접근에반응하는로봇을구현할수있다. 장애물을회피하는자율주행로봇을구현할수있다. 실습개요 사람의접근을회피하는로봇을구현한다. 사람에게다가서는로봇을구현한다. 장애물을회피하는기능을구현한다. - 204 -
13.1 준비하기 준비물 아두이노보드, 올인원쉴드, 컬러 LED 바, PSD 거리센서, 스피커, LED, 모바일로봇플랫폼 아두이노우노보드 올인원쉴드 아날로그 PSD 거리센서 모바일로봇플랫폼 - 205 -
H/W 연결하기 왼쪽모터의케이블을 MOTOR1 단자에연결한다. 오른쪽모터의케이블을 MOTOR2 단자에연결한다. 아날로그 PSD 거리센서를아날로그 0번핀에연결한다. 아날로그 PSD 거리센서를로봇의전방에고정시킨다. - 206 -
13.2 사람이접근하면도망가는로봇 구현하기 사람이로봇에접근하면아래의동작을구동하도록기능을구현해본다. 후진 (1 초 ) -> 회전 (0.5 초 ) -> 전진 (1 초 ) 아래프로그램을완성해본다. SPL 스크립트 스케치코드 a0 = AnalogRead(0) if (a0 > 200 ) DriveWrite( -200, -200 ) delay(1000) DriveWrite( 200, -200 ) delay(500) DriveWrite( 200, 200 ) delay(1000) #include<spllib.h> pinmode(4, OUTPUT); pinmode(7, OUTPUT); int a0 = analogread(0); if (a0 > 200 ) DriveWrite( -200, -200 ); delay(1000); DriveWrite( 200, -200 ); delay(500); DriveWrite( 0, 0 ) DriveWrite( 200, 200 ); delay(1000); delay(100) DriveWrite( 0, 0 ) delay(100); - 207 -
13.3 사람에게점점더다가오는로봇 구현하기 사람이로봇에접근하면사람쪽으로빠르게다가오는기능을구현한다. 사람과의거리가가까울수록더빠르게다가온다. 아래프로그램을완성해본다. SPL 스크립트 스케치코드 a0 = AnalogRead(0) #include<spllib.h> pinmode(4, OUTPUT); pinmode(7, OUTPUT); s = a0 / 4 DriveWrite( s, s ) int a0 = analogread(0); delay(100) int s = a0 / 4; DriveWrite( s, s ); delay(100); - 208 -
13.4 장애물을회피하는자율주행로봇 구현하기 자율주행을하다가장애물을만나면아래의동작을수행한다. 후진 (1 초 ) -> 회전 (1 초 ) -> 전진 SPL 스크립트 스케치코드 a0 = AnalogRead(0) #include<spllib.h> pinmode(4, OUTPUT); pinmode(7, OUTPUT); if (a0 > 200 ) DriveWrite( -200, -200 ) delay(1000) DriveWrite( 200, -200 ) delay(1000) int a0 = analogread(0); if (a0 > 200 ) DriveWrite( -200, -200 ); delay(1000); DriveWrite( 200, 200 ) delay(100) DriveWrite( 200, -200 ); delay(1000); DriveWrite( 200, 200 ); delay(100); - 209 -
13.5 LED 를점멸하는로봇 구현하기 로봇이움직일때 LED 가 0.5 초간격으로점멸하는기능을구현해본다. 전역변수를활용하여 0.1 초간격으로 loop() 함수가실행되면서동시에 LED 가점멸하도록기존코드에기능을추가해본다. SPL 스크립트 스케치코드 cnt = 0 #include<spllib.h> a0 = AnalogRead(0) pinmode(4, OUTPUT); pinmode(7, OUTPUT); int cnt = 0; if (a0 > 200 ) DriveWrite( -200, -200 ) delay(1000) DriveWrite( 200, -200 ) delay(1000) int a0 = analogread(0); if (a0 > 200 ) DriveWrite( -200, -200 ); delay(1000); DriveWrite( 200, 200 ) cnt = ( cnt + 1 ) % 10 if (cnt < 5 ) DigitalWrite(13, HIGH) else DigitalWrite(13, LOW) DriveWrite( 200, -200 ); delay(1000); DriveWrite( 200, 200 ); cnt = ( cnt + 1 ) % 10; - 210 -
delay(100) if (cnt < 5 ) digitalwrite(13, HIGH); else digitalwrite(13, LOW); delay(100); 13.6 후진시삐삐경보소리연주하기 구현하기 로봇이뒤로움직일때 0.4 초간격으로삐삐삐삐소리가나도록한다. SPL 스크립트 스케치코드 cnt = 0 #include<spllib.h> a0 = AnalogRead(0) pinmode(4, OUTPUT); pinmode(7, OUTPUT); int cnt = 0; if (a0 > 200 ) for (int i = 0; i < 4; i++) tone(3, 1000, 200) DriveWrite( -200, -200 ) delay(400) DriveWrite( 200, -200 ) delay(1000) int a0 = analogread(0); if (a0 > 200 ) for (int i = 0; i < 4; i++) tone(3, 1000, 200); DriveWrite( -200, -200 ); delay(400); - 211 -
DriveWrite( 200, 200 ) cnt = ( cnt + 1 ) % 10 if (cnt < 5 ) DigitalWrite(13, HIGH) else DigitalWrite(13, LOW) delay(100) DriveWrite( 200, -200 ); delay(1000); DriveWrite( 200, 200 ); cnt = ( cnt + 1 ) % 10; if (cnt < 5 ) digitalwrite(13, HIGH); else digitalwrite(13, LOW); delay(100); 실습 컬러 LED 바를로봇에장착하여회전시방향지시등의역할을하도록기능 을추가해본다. 후진시컬러 LED 바가비상등의역할을하도록기능을추가해본다. 전진시에는차량의미등과같이컬러 LED 바에약한빛이켜지도록기능을 추가해본다. - 212 -
14 블루투스원격제어하기 학습목표 시리얼데이터수신명령어를이해하고활용할수있다. 블루투스통신을통해스마트폰으로아두이노를제어할수있다. 실습개요 콘솔창의키패드버튼을이용한시리얼데이터읽기기능을구현한다. 시리얼읽기기능으로 LED를제어한다. 시리얼읽기기능으로로봇을제어한다. 스마트폰의블루투스통신기능을이용하여아두이노를제어해본다. - 213 -
14.1 준비하기 준비물 아두이노보드, 올인원쉴드, 모바일로봇플랫폼, 블루투스모듈, LED 모 듈, 스마트폰 아두이노우노보드 올인원쉴드 블루투스모듈 모바일로봇플랫폼 - 214 -
H/W 연결하기 왼쪽모터의케이블을 MOTOR1 단자에연결한다. 오른쪽모터의케이블을 MOTOR2 단자에연결한다. LED 모듈을디지털 13 번에연결한다. - 215 -
블루투스모듈 블루투스모듈은디지털핀 0 번과 1 번에연결되어야하는데, 블루투스모 듈이아두이노보드에연결되어있으면프로그램이업로드가되지못한다. 따라서블루투스모듈은아두이노보드에업로드가완료된후에연결을해 주어야한다. - 216 -
14.2 시리얼데이터읽기 SerialRead() 명령어 지금까지사용해온 PrintLine() 함수는아두이노보드에서 PC 로데이터를 보내는명령이다. 반대로 PC 에서보낸데이터를아두이노보드에서읽으려면 SerialRead() 명령어를사용해주어야한다. 아래의코드를업로드한콘솔창의확인해본다. SPL 스크립트 스케치코드 s = SerialRead() PrintLine(s) delay(100) Serial.begin(115200); int s = Serial.read(); Serial.println(s); delay(100); - 217 -
14.3 콘솔창에서데이터보내기 데이터전송하기 콘솔창의우측하단을보면 8 개의키패드버튼이있다. 각각의버튼을클 릭하면버튼에쓰여진번호가바이트값으로아두이노보드로전송된다. 블루투스모듈을통해아두이노로값을전송하는경우에도위의콘솔창에 서버튼을눌러값을전송하는것과동일한값이전송된다. 스마트폰이없는경우는위의콘솔창을이용해블루투스를이용하는시나 리오를동일하게테스트할수있다. - 218 -
14.4 시리얼통신으로 LED 제어하기 구현하기 콘솔창의키패드버튼으로아두이노보드에값을전송하고, 이값을이용하 여 LED 를제어하는기능을작성해본다. SPL 스크립트 스케치코드 s = SerialRead() if (s == 1) DigitalWrite(13, HIGH) else if (s == 2) DigitalWrite(13, LOW) delay(100) Serial.begin(115200); pinmode(13, OUTPUT); int s = Serial.read(); if (s == 1) digitalwrite(13, HIGH); else if (s == 2) digitalwrite(13, LOW); delay(100); - 219 -
14.5 시리얼통신으로로봇제어하기 구현하기 콘솔창의키패드버튼으로아두이노보드에값을전송하고, 이값을이용하 여로봇을제어하는기능을작성해본다. SPL 스크립트 s = SerialRead() 스케치코드 #include<spllib.h> pinmode(4, OUTPUT); pinmode(7, OUTPUT); Serial.begin(115200); if (s == 1) DriveWrite( 200, 200 ) else if (s == 2) DriveWrite( -200, 200 ) else if (s == 3) DriveWrite( 0, 0 ) else if (s == 4) DriveWrite( 200, -200 ) else if (s == 5) DriveWrite( -200, -200 ) delay(100) int s = Serial.read(); if (s == 1) DriveWrite( 200, 200 ); else if (s == 2) DriveWrite( -200, 200 ); else if (s == 3) DriveWrite( 0, 0 ); else if (s == 4) DriveWrite( 200, -200 ); else if (s == 5) DriveWrite( -200, -200 ); delay(100); - 220 -
14.6 블루투스모듈연결하기 블루투스모듈연결하기 아두이노보드에프로그램이정상적으로업로드가되었다면, 이제블루투스 모듈을연결할수있다. 블루투스모듈이아두이노보드에미리연결되어있다면프로그램이업로 드되지못하므로반드시업로드할때에는블루투스모듈을아두이노보드 로부터제거해놓아야한다. 블루투스모듈은다음과같이연결한다. - 221 -
블루투스모듈은다음과같이 4 핀으로구성되어있다. 블루투스모듈이연결된결과는다음과같다. - 222 -
14.7 스마트폰용앱설치하기 앱설치 아두이노의블루투스모듈에무선으로값을전송하기위해서는스마트폰을 활용하는방법이있다. 블루투스가지원되는스마트폰에앱을설치한후, 스마트폰의앱을통해아 두이노보드로값을전송해보자. 먼저, Play 스토어를실행시킨다. - 223 -
먼저, Play 스토어를실행시킨다. 검색창에서 helloapps 단어를입력한다. SPL-Duino Lite 앱을선택한다. - 224 -
블루투스를켠후, SPL Example 4 를실행한다. - 225 -
블루투스모듈뒷면에있는번호를찾아서페어링을진행한다. - 226 -
페어링화면에서숫자 0000 또는 1234 를입력한다. - 227 -
스마트폰의화면에서버튼을눌러로봇이제어되는지확인한다. - 228 -