April 28, 2017

디바이스마트 미디어:

[29호] 너무 쉬운 아두이노 DIY – ① 3색 신호등 만들기

29 아두이노 신호등MA

           글 ㅣ 신상석 ssshin@jcnet.co.kr

 

  여러분, 안녕하세요. 앞으로 1년에 걸쳐(6번 정도) [너무 쉬운 아두이노 DIY(Do It Yourself)] 강의를 진행할 강사 신상석입니다.
제 소개 간단히 드립니다.
· 서울대 제어계측공학과(학사) →, KAIST 전산과(석사) → KAIST 전산과(박사 수료)
· ETRI 책임연구원 → 해동정보통신 연구소장 → 욱성전자 연구소장 → (현재) 제이씨넷 연구소장, 상명대학교 컴퓨터시스템공학과 겸임교수, 임베디드홀릭 카페(http://cafe.naver.com/lazydigital) 부매니저, 아두이노 / AVR 강사
· 자격증 : 전자계산기 기술사
· 취미 : 영화보기, 바둑두기, 책읽기, 글쓰기(?), 여행하기, 이야기하기
· 연락처 : ssshin@jcnet.co.kr, 있는그대(cafe.naver.com/lazydigital) 

이 강의는 아두이노를 가지고 간단하게 생활에 필요한 용품을 만들어 보는 강의입니다. 뚝딱뚝딱 뭔가 자신만의 DIY 용품을 만들어 보는 쏠쏠한 재미가 있는 강의라고나 할까요? 이미 주변에 아두이노와 관련한 많은 책이 출간되었고 카페나 블로그를 통하여 강의가 진행된 경우도 꽤나 많이 있는데도 불구하고, 이 지면을 통하여 강의를 개설한 이유는 다음과 같습니다.

1. 아두이노의 초보자들을 위한 쉽고 재미있는 강의가 거의 없는 것 같아, 가능하면 초등학생(?)까지도 함께 해 볼 수 있는 그런 강의를 한 번 해보고 싶어서…
2. 아두이노를 가지고 뭔가 조금은 다른, 자신만의 창의적인(?) DIY를 할 수 있는 자리를 만들어주고 싶어서…
3. 디바이스마트매거진은 임베디드와 관련된 독자들이 많고, 발행 부수도 많아, 저와 제가 속한 회사(제이씨넷) 그리고 임베디드홀릭 카페의 홍보에 도움이 될 것 같아서…

아두이노 계획표  현재 구상하고 있는 회차별 내용을 간략하게 정리해 보면 다음과 같습니다. (변경될 수 있습니다.)  앞으로 즐겁고 알찬 강의가 될 수 있도록 최선을 다할 것을 약속 드리며, 이 강의를 보는 독자들도 메일이나 카페를  통하여 Q&A(Question & Answer)나 피드백을 주셔서, 함께 정감을 나눌 수 있는 계기가 되기를 기대해 봅니다.

 

   아두이노가 뭔가요?   

   자, 그럼 시작해 보겠습니다. 요렇게 생긴 물건을 보신 적이 있나요?

29 아두이노 신호기 00   예. 요 물건의 이름이 아두이노인데요, 조금 더 정확하게 이야기하면 아두이노 UNO R3입니다. 파란색 플라스틱처럼 보이는 PCB(Printed Circuit Board) 판에 조그만 컴퓨터에 해당하는 마이크로콘트롤러(마이크로프로세서) 칩(IC, Integrated Circuit)이 장착되어 있어서 이것으로 계산 등 여러가지 일을 처리합니다. 전기는 +5V를 공급해주어야 하는데 이것은 USB 커넥터에 USB 케이블을 연결하여 공급합니다. 아두이노는 또한 입출력커넥터를 가지고 있는데, 여기에 전선을 꼽아서 LED(Light Emitted Diode, 발광다이오드)도 연결하여 불도 켰다 껐다 하고, 버저나 모터 등 여러 가지 다른 전자 부품도 연결하여 소리도 내고 움직이게 할 수도 있습니다.

   참, 아두이노(arduino)라는 이름은 이탈리아어로 ‘친한 친구’라는 뜻이라네요, 이 아두이노를 처음 고안해 낸 사람들이 이탈리아 사람들이어서 이름도 이탈리아어인데, 발음하기 편하고 입에 짝 달라붙는 정겨운 이름인 것 같습니다.

  ■ 아두이노로 뭘 할 수 있나요?   

   이 아두이노로 뭘 할 수 있을까요? 앞으로 하나씩 DIY(Do It Yourself)로 만들어보겠지만, 아두이노로는 전등도 켤 수 있고, 음악도 연주할 수 있고, 장난감 로봇도 조정할 수 있고, 이것 저것 아주 많은 것을 할 수 있습니다. 유튜브(http://www.youtube.com)에서 볼 수 있는 실례를 몇 개만 소개해 보겠습니다. 가능하면 여러분이 직접 방문하여 동영상을 보면 더욱 좋겠네요.

아두이노로 만든 종이 피아노

아두이노 UNO를 활용해서 만든 초음파 레이더

WALL-E  로봇 아두이노

   예로 든 것이 조금은 복잡한 것일 수 있겠지만, 작은 것부터 하나씩 공부하다 보면 나중에는 여러분도 위와 같은 작품을 DIY로 만들 수 있답니다! 자신감을 가지세요!

  ■ 그러면 준비를 해 봅시다!   

   아두이노를 이용하여 뭔가를 만들어 보려면, 일단 약간의 준비가 필요합니다. 꼭 필요한 것 먼저 확인해 봅시다.

 

1.  아두이노 보드 : 오리지널 보드는 물론 OK이구요. 값이 싼 중국산 호환 보드나 블루투스 통신이나 모터 드라이버 등의 기능을 추가로 내장한 아두이노 보드도 OK

* 아두이노 오리지널 보드: http://www.devicemart.co.kr/34404

* 아두이노 호환 보드 (예 : 뉴티씨 제품) : http://www.devicemart.co.kr/1137923

* 아두이노 호환 부가 기능 내장 보드 (예 : 제이씨넷 제품) : http://www.devicemart.co.kr/1137972

 

2. PC 또는 노트북 (아무거나 OK)

3. 아두이노와 PC(노트북)을 연결할 USB 케이블 (한쪽은 USB-A 타입, 다른 한쪽은 USB-B 타입의 케이블, 보통 아두이노 구입시 함께 제공됨)

 

4. 아두이노 프로그램 (이것의 이름도 아두이노입니다.)

4번은 소프트웨어이므로 인터넷에서 설치프로그램을 찾아 이를 PC에 설치하여야 합니다. 스마트폰으로 뭔가 재미있는 것을 하려면 앱을 설치해야 하는 것과 마찬가지지요.

설치 순서는 다음과 같습니다.

 1. 아두이노 공식 홈페이지(http://arduino.cc) 방문

29 아두이노 신호기 04

 

2. 위쪽 메뉴 [Download]를 누르고 → 나타나는 창의 조금 아래 부분에 [Arduino 1.0.6]을 찾아 클릭 → [Windows Installer]를 클릭하면, [arduino-1.0.6-windows.exe]가 다운로드 됨

 

3. 다운받은 arduino-1.0.6-windows.exe 파일 실행

29 아두이노 신호기 05

[실행] 클릭

29 아두이노 신호기 06

[I Agree] 클릭

29 아두이노 신호기 07

[Next] 클릭

29 아두이노 신호기 08

 [Install] 클릭

29 아두이노 신호기 09

 기다립니다.

29 아두이노 신호기 10

 [V]표시를 클릭하고 [설치]클릭

29 아두이노 신호기 11

 설치완료 후 [Close] 클릭

4. PC 바탕화면에  29 아두이노 신호기 12  이런 아이콘이 생겼으면 설치가 잘 된 것입니다.

그러면, 내친김에 얼른 실행시켜 볼까요?

1. 아두이노와 PC를 USB 케이블로 연결

29 아두이노 신호기 26

2. 전원 LED에 녹색으로 불이 들어오면 일단 OK!!! 구요.

PC 화면에서 29 아두이노 신호기 12 아이콘 클릭하여 아래와 같은 화면이 나타나면 설치도 일단 OK!!! 네요.

29 아두이노 신호기 13

내 아두이노가 준비되었고 나와 아두이노와 이야기를 나눌 아두이노 앱(App. 응용프로그램)이 준비되었으니 가장 기본적인 주거환경은 만들어진 것이네요.

  ■ 프로그램을 짜서 실행시켜 보기   

   잠시 쉬었으니까, 이제 첫번째 DIY 프로젝트로 빨강-노랑-녹색 불이 반짝 반짝 켜졌다 꺼지는 3색 신호등을 한 번 만들어 보겠습니다.

   걸음마도 못하는 아기가 뭐 벌써 만드냐구요? 뭐, 일단 목표를 세우고 만들어가는 과정에서 필요한 것은 차근차근 하나씩 배우고 익히면 되겠지요. 힘들면 쉬었다 가고, 재미있는 것이 나오면 조금 놀다 가고…

   “배우고 익힌다!”는 구절은 제가 아주 좋아하는 구절인데요. 논어의 가장 첫번째 장에 이런 구절이 있습니다. “學而時習之 不易說乎” (학이시습지 불역열호) – 배우고 때로 익히면 또한 기쁘지 아니한가! 나머지 2개도 멋있습니다. “有朋自遠方來 不亦樂乎” (유붕자원방래 불역낙호) – 벗이 있어 멀리서 찾아오면 또한 즐겁지 아니한가! “人不知而不溫 不易君子乎” (인불지이불온 불역군자호) 사람들이 알아주지 않는다 하여도 성내지 않으면 또한 군자(멋진 사람)가 아닌가! 옆 길로 잠시 샜는데…다시 원래 길로 돌아 갑니다.

   앞에서 아두이노는 마이크로콘트롤러가 들어있는 간단한 컴퓨터라고 이야기했습니다. 좀 더 쉽게 이해하기 위하여 아두이노를 그냥 “잘 훈련된 훈련견”이라고 생각하면 이해하기 쉬울 것 같습니다. 명령을 내리면 훈련견이 명령에 알맞은 동작을 취하듯, 아두이노에게 해야 할 명령을 내리면 아두이노가 실행하게 되는 것이지요. 여기서 명령이라는 것이 바로 프로그램인데, 훈련견이 정해진 명령어에만 반응하는 것처럼, 아두이노도 정해진 형식을 갖춘 정해진 명령어만 알아듣습니다.

   오우~ 그럼 명령어의 종류를 알아서 필요한 명령만 죽 연결해서 명령을 내리면 되겠네요.

   짝~짝~짝~

   예. 맞습니다. 너무 잘 하는데요?

29 아두이노 신호기 14

 

   그러면, 어떤 명령어가 있을까요? 마음이 급하니까 일단 제일 쉬운 명령어 두 세 개만 배워서 명령을 내려봅시다. 아래와 같이 진행해 볼까요?

 

1. 아두이노와 PC를 USB 케이블로 연결

2. PC에서 아두이노(앱, 엄밀하게는 IDE(Integrated Development Environment, 통합개발환경)) 실행

29 아두이노 신호기 15

 

3. 메뉴에서 [도구] -> [보드] ->[Arduino Uno] 선택

(아두이노는 사실 우노(UNO)뿐만 아니라 NANO, MEGA, MINI 등 다양한 종류가 있으나 UNO가 가장 많이 사용되고 있음)

4. 메뉴에서 [도구] -> [시리얼포트] -> [COMx] 선택 (단, x는 [시작] -> [제어판] -> [장치관리자] -> [포트] -> [Arduino Uno(COMx)]로 보이는 상태에서 x에 대응되는 숫자임) (아두이노는 USB로 연결되기 때문에 PC 입장에서는 USB 장치이므로 USB 드라이버가 필요하며 이 드라이버는 아두이노 프로그램 설치시 이미 함께 설치되었음. 만약 설치되지 않았다면 수동으로 설치하여야 함)

 

5. 흰색 창에 아래와 같은 프로그램을 입력

29 아두이노 신호기 16

 

6. 상단 메뉴에서 29 아두이노 신호기 17 생긴 아이콘을 찾아 클릭하면 아래쪽에 “스케치 컴파일” ▶ “업로딩” ▶ “업로딩 완료”로 제목이 나타나며 진행이 되고, 아래쪽 검정색 창에는 진행되는 내용이 스크롤되면서 디스플레이되며, 최종적으로는 아래의 형태가 나타납니다.(최종적으로 제목으로 “업로드 완료”가 나타나고 메시지 내용으로 “avrdude done. Thank you.”,가 나타나면 성공입니다.)

(29 아두이노 신호기 17 아이콘은 컴파일 및 업로드를 수행하라는 아이콘이며, 컴파일은 C, C++ 언어와 같은 프로그램언어를 마이크로콘트롤러가 직접 알아먹을 수 있는 좀 더 직접적인 기계어로 바꾸어주는 작업을 말하며, 업로드는 컴파일의 결과로 생긴 기계어를 마이크로콘트롤러에게 전달하여 이를 마이크로콘트롤러 내부에 실행할 수 있는 형태로 저장하는 작업을 말함.)

29 아두이노 신호기 18

 

7. 위와 같은 형태가 나오지 않고 “컴파일 에러”가 나오면 입력한 프로그램의 형식이 잘못된 것이고, 메시지 출력 부분에서 “Retry timeout ERROR” 등이 나타나면 USB 연결선이 잘못되었거나, 아두이노가 고장 난 경우 등등입니다. 만약, 정상적으로 업로드되지 않았다면 그 원인을 찾아내어 이를 해결한 후 다시 실행하여야 합니다.

 

   [ setup() 과 loop() ]

 

   아두이노에서 프로그램을 작성하는 것을 스케치(sketch)라고 합니다. 아두이노는 예술가와 같은 비전공자도 쉽게 사용할 수 있도록 간단한 인터페이스를 제공하는데, 원하는 것을 쉽게 쓱쓱 그려낸다는 의미를 담아 스케치라고 하였다네요.

   아두이노 프로그램의 기반은 C++이라는 컴퓨터 프로그래밍 언어(C++ 언어는 C언어에 기반을 둔 목적기반 언어)이며, 이 언어로 올바르게 작성된 프로그램만 아두이노가 명령어로 받아들이고 실행하게 됩니다. 그러므로, 아두이노에게 일을 시켜려면 이 언어에 대한 기본 형식과 구조 등에 대한 내용을 알아야만 합니다. 전체적인 내용을 모두 배우려면 시간이 많이 걸릴 수 있으므로, 우리는 DIY 작품을 만드는데 꼭 필요한 부분만 필요할 때마다 배우고 익히도록 해보지요. (다만, 이 강좌가 C 및 C++ 언어에 대한 강좌는 아니기 때문에, C 및 C++에 대하여는 최소한의 기초적인 내용은 알고 있다고 가정하고, 진행합니다.)

   일단, 위에서 작성한 프로그램을 보겠습니다.

   아두이노의 프로그램은 크게 두 부분으로 나누어집니다. 하나는 setup() 이라는 부분이고, 다른 하나는 loop()라는 부분입니다. 원래 C 프로그램은 main()이라는 함수의 형태를 취하도록 되어 있고, 이 main() 함수 내에서 필요한 명령을 순차적으로 작성하여 실행하게 되어 있습니다.

   아두이노 개발환경(IDE)은 사용자가 쉽게 프로그램할 수 있도록 항상 main() 프로그램을 공짜로 넣어주도록 되어있고, 이 main() 프로그램 안에서 첫번째로 setup()이라는 함수를 실행하고, 두번째로 loop()라는 프로그램을 반복적으로 실행하도록 이미 만들어져 있다고만 알아두면 되겠습니다.

   이렇게 실행이 되겠네요.

 

   setup()

   loop()

   loop()

   …

   Loop()

   …

   … (무한 실행)

 

   우리가 작성한 setup() 함수와 loop() 함수는 중괄호로 둘러싸인 부분의 내용이 하나도 없으므로, 이 프로그램은 아무 것도 안하고 그냥 다시 원위치로 돌아가는 프로그램이 되겠습니다. 하지만 우리는 이 프로그램이 잘 컴파일되고, 잘 업로드 되었다는 사실만으로도 이제부터 우리가 원하는 진짜 프로그램을 작성할 수 있는 준비를 끝낸 것이 됩니다.

  ■ 아두이노에 LED 연결하기   

   신호등을 만들어서 이것을 아두이노에 연결해서 불을 켜고 끄려면, 일단 아두이노가 이 신호등에 전기를 넣었다 끊었다 할 수 있어야 할 것 같은데… 이것은 어떻게 할 수 있을까요?

   보통 집에서 사용하는 전등이나 전열기 등은 콘센트를 꼽으면 전기가 통하고 뽑으면 전기가 끊어집니다. 또는 전등과 같이 미리 전원은 연결해 놓고 중간에 스위치를 넣어서 이것을 ON/OFF 위치로 이동하여서 껐다 켰다 할 수도 있겠지요.

   아두이노도 이러한 기능을 하는 전기선을 가지고 있는데 이러한 선이 바로 입출력 핀(커넥터)입니다. 전기를 공급하였다가 끊었다가 할 수 있는 선이지요. 아두이노는 프로그램에 의하여 각각의 입출력 전압을 ON(5V, High) 상태로 만들거나, OFF(0V(GND), Low) 상태로 만들 수 있는 능력이 있답니다. 이런 핀들이 아래와 같이 커넥터로 나와 있는데. 아두이노 UNO의 경우는 총 20개나 되지요.

29 아두이노 신호기 19

   물론, 집에 있는 콘센트는 220V의 교류(AC : Alternating Current) 전원이고, 아두이노의 입출력핀은 5V의 직류(DC : Direct Current)를 제공하는 점이 다르지만, 전기를 공급한다는 점에서는 비슷하답니다. 음, 그렇다면, 형광등이나 전등처럼 빛을 발산하는 것으로 5V의 전원으로 동작하는 부품을 찾아 이것을 연결하면 될 것 같은데, 이 부품은 뭘까요? 뭐, 모두 다 잘 아시리라 생각하는데… 이것이 바로 LED(Light Emitting Diode)랍니다. 요렇게 생겼지요. (심볼은 오른쪽 그림)

 아두이노1 자료

   2개의 다리를 가지고 있고, 색깔은 빨강, 파랑, 노랑, 녹색, 흰색이 있답니다. 크기는 지름이 3mm나 5mm 인 것이 보통이고, 형태는 둥근 것이 보통이나 사각형 형태도 있지요.

   LED를 그대로 번역해보면, Light(빛) + Emitting(발산) + Diode(다이오드)가 되어서 보통 ‘발광다이오드’라고 칭하는데, 다이오드여서 한쪽 방향으로만 전기가 통합니다. 즉, 순방향으로 전압을 가하면 전류가 잘 흘러서 불이 켜지고, 역방향으로 전압을 가하면 전류가 흐르지 않아 불이 꺼지게 되는 것이지요.

   가정용 전구와 LED의 연결을 비교해 보면 아래와 같습니다. (LED는 보통 200오옴 ~ 1K 오옴의 저항을 직렬로 연결해 주어야 하며, 이 저항이 전류의 양을 조절하여 빛의 밝기를 조절할 수 있게 해줍니다. 저항 없이 직접 연결하면 빛은 엄청 밝지만 수명은 매우 짧아지므로 주의 요망!)

   또한, 교류 전원은 방향이 없어서 콘센트를 아무쪽 방향으로 꽂아도 되지만, LED의 연결은 방향이 있어서 그림에서와 같이 입출력핀에서 순방향이 되도록(LED는 다리의 길이가 긴 쪽이 ‘+’ 임!) +5V 전원 ▶ 저항 ▶ LED ▶ GND로 연결하여야 합니다.

 29 아두이노 신호기 21

   이제 실전 DIY로 넘어가기 전에 잠깐 또 쉬겠습니다.

   10분간 휴식! 기지개도 좀 펴시고, 간단한 스트레칭도 해 봅시다. 헛! 둘! 헛! 둘!

  ■ LED 1개 켜기 / 끄기   

   자, 드디어 실전 DIY 시간입니다. 3개의 LED 켜기에 앞서 먼저 1개의 빨강 LED를 다뤄보지요. “뱁새가 황새 따라가다가는 가랑이가 찢어진다”는 속담과 “천리길도 한걸음부터”라는 속담을 새기면서 말이죠.

 

[실행 순서]

1. 아두이노를 준비하고, 브레드보드와 부품, 케이블을 이용하여 다음과 같이 연결. 즉, LED를 ‘2’ 핀(앞으로는 ‘D2’라고 이름하겠습니다. 여기서 ‘D’는 Digital의 의미)에 연결 (LED는 일반 5mm(또는 3mm) 빨강 LED, 저항은 200~1K 오옴)

29 아두이노 신호기 22

 

2. USB 케이블로 아두이노와 PC 연결

 

3. 메뉴에서 [도구] ▶ [보드] ▶ [Arduino Uno] 선택 (처음 한번 세팅되면 다음부터는 생략!)

 

4. 메뉴에서 [도구] ▶ [시리얼포트] ▶ [COMx] 선택 (단, x는 [시작] ▶ [제어판] ▶ [장치관리자] ▶ [포트] ▶ [Arduino Uno(COMx)]로 보이는 상태에서 x에 대항되는 숫자)

 

5. 아래의 스케치 프로그램 입력

void setup()

{

   pinMode(2, OUTPUT);                           // 2번핀을 출력으로 선언

}

void loop()

{

   digitalWrite(2, HIGH);                         // 2번핀에 High(1)를 출력

}

   setup() 함수는 한번만 실행이 되고 loop() 함수는 무한 반복으로 실행된다고 하였으니 실제 실행되는 내용은 아래와 같이 되겠네요.

        pinMode(2, OUTPUT);

        digitalWrite(2, HIGH);

        digitalWrite(2, HIGH);

        …

        digitalWrite(2, HIGH);

        …

   아두이노는 상당히 많은 라이브러리 함수를 제공하는데요. 이것 때문에 우리는 아두이노의 내부를 알 필요 없이, 그냥 아두이노가 제공하는 함수를 불러다 쓰면 되기 때문에 매우 편리합니다. pinMode() 함수와 digitalWrite() 함수도 아두이노가 제공하는 라이브러리입니다.

   그러면 이 라이브러리는 어떻게 동작하는 좀 더 자세히 알아보겠습니다.

   pinMode() 함수는 아두이노의 입출력핀을 입력으로 사용할 것이냐, 출력으로 사용할 것이냐를 정해주는 함수입니다. 어떤 핀? 입력?/출력? 을 결정해 주어야 하니까 2개의 값이 필요하겠네요. 즉, 어떤 핀?에 해당되는 값을 pin이라는 변수로, 입력?/출력?에 해당되는 값을 mode 형태로 전달하면 되므로 다음과 같은 형태가 됩니다.

pinMode(pin, mode)

pin : 입출력핀 번호에 해당하는 숫자

mode : 이 핀을 입력으로 사용하는 경우는 “INPUT”, 출력으로 사용하는 경우는 “OUTPUT” (INPUT이나 OUTPUT은 상수값인데요. 이것도 이미 아두이노에서 정해준 값이므로 그냥 이렇게 사용하면 됩니다.)

   우리는 LED를 D2핀에 연결하였고, 이 핀은 아두이노 입장에서 출력이므로 pinMode(2, OUTPUT)으로 프로그램합니다.

digitalWrite(pin, value)

pin : 입출력핀 번호에 해당하는 숫자

value : 이 핀을 HIGH 상태로 만들려면 “HIGH”, LOW 상태로 만들려면 “LOW”

   digitalWrite() 함수는 아두이노의 입출력핀에 출력으로 어떤 값을 내보낼 것인가, 즉, HIGH(ON, +5V) 또는 LOW(OFF, 0V)를 정해주는 함수입니다. 이 함수도 어떤 핀?을 HIGH?/LOW?로 만들 것인지를 결정해야 하므로 2개의 변수값이 필요하므로 digitalWrite(pin, value) 형태가 되겠습니다.

   이제 2개 함수를 종합적으로 이해해본다면, 위 프로그램은 D2핀을 출력으로 하고, 이 D2핀을 HIGH로 출력하는 것을 무한히 반복하는, 즉 LED가 항상 켜지는 프로그램이 되겠습니다!

   정말 그런지 얼른 실행해 봅시다.

6. 상단 메뉴에서 생긴 아이콘을 찾아 클릭하고 아래쪽에 “스케치 컴파일” ▶ “업로딩” ▶ “업로딩 완료” 및 “avrdude done. Thank you.”, 메시지가 나타나는지 확인!

7. 에러가 없는 경우 빨강색 LED가 켜지는지 확인!

29 아두이노 신호기 23

 

   켜졌다면 와우! 3번째 “축하축하”입니다. 이제 8부 능선에 도착했네요.

   정상이 코 앞에 다달았습니다. 여기서 다시 충분한 휴식을 취한 후에 정상 공격에 나서겠습니다. 10분간 또 휴식~~~ 그리고 막간을 이용해서 아래의 간단 과제 실행 실시! 윽!

[과제-3색신호등-1]

위의 LED를 끄는 스케치 프로그램을 작성하고 실행하여 실제로 꺼보세요!

  ■ 3색 신호등 연결하기    

   “시작이 반이다”라는 속담이 있는데 정말 시작이 반인 것 같다는 생각을 가끔 합니다. 실행하려면 미리 준비하여야 하는 것도 있고, 일단 시작하면 특별한 일이 없는 한 계속 가야 하는 것이어서 마음 먹는 것, 실행하는 것 자체가 반은 진행된 것이라는 느낌이지요.

   조금 전 첫 DIY로 빨강 LED 하나 달랑 켜는 것을 해 보았습니다. (참, LED 끄는 과제는 내드렸는데 다들 해보셨죠? 너무 너무 쉬었겠지만…) 어느새 우리는 간단한 중간 목표를 한 개 달성했습니다. 시작했다 싶었는데 벌써 결과가 나온 것이지요. LED를 한 개 켜보았으니, 3개(3색 신호등), 100개(전광판)도 켜고 끌 수 있고, LED가 아닌 것(버저, 모터 등)도 얼마든지 연결하면 동작시킬 수 있다는 가능성을 연 것입니다. 정말 “시작이 반이지요?” 또, 옆으로 샜는데… 다시 원위치로 돌아가, 정상 공격에 나서겠습니다.

   빨강색 LED 1개를 연결하는 것을 방금 배웠으니, LED 3개 연결하는 것도 이것을 그대로 응용하면 될 것 같습니다. LED 1개를 아두이노 입출력 포트 1개에 연결한 방법과 똑같이 LED 3개를 각각 다른 포트에 연결하면 되겠네요. 오~ 너무 쉽다.

   음. 그런데 어떤 핀에다 연결할까요? 입출력핀이 20개나 있으니까 아무데나 연결해도 괜찮긴 하지만, 기왕이면 순서대로 연결하도록 하지요. 이번에는 D4-빨강, D3-노랑, D2-녹색 LED를 연결하는 회로를 꾸며봅시다. 혼자서도 할 수 있겠지요? 이번 DIY가 3색 신호등이니까 당연히 LED는 빨강-노랑-녹색 순으로 브레드보드에 그럴듯하게 꽂아야 합니다. 자, 그럼 아래 그림 보기 전에 각자 회로 꾸미기 시작~~~~ 누가 누가 예쁘게 꾸미나~~~ (5분 줍니다.) (참, 브레드보드 내의 핀 연결은 어떻게 되는지 모두 알지요? 혹시 모르면 다음 그림 참조)

(1분)

(2분)

(3분)

(4분)

(5분)

   저는 요렇게 만들어 보았습니다. 실제로 장착할 때는 선 길이와 부품 모양이 달라서 요것과는 조금 다르게 보이겠지만요. 예쁜가요?

 29 아두이노 신호기 28

 

 

  ■ 3색 신호등 알고리즘    

   이제 연결은 끝났으니 프로그램을 작성하여 실행할 차례네요.

   그런데, 프로그램을 작성할 때는 항상 주어진 문제를 어떤 식으로 풀어갈 것인지를 먼저 생각하여야 합니다. 그냥 무작정 프로그램을 작성할 수도 없을뿐더러 별 생각없이 생각나는대로 아무렇게나 프로그램을 작성하다 보면 효율성도 떨어지고 해결책을 찾는 것도 뒤죽박죽이 되어 쉽지 않은 경우가 대부분이지요.

   그러면 어떻게 해야 할까요?

   “어떤 문제를 해결하기 위해 명확히 정의된 유한 개의 규칙과 절차의 모임”을 알고리즘(algorithm)이라고 하는데, 우리는 어떤 문제를 해결하려고 할 때 이러한 알고리즘을 먼저 작성한 후 이를 프로그램으로 바꾸는 방법을 사용하도록 하겠습니다. 뭐, 똑 떨어지게 꼭 이렇게 해야 한다는 법도 없고 실제로 일을 하다 보면 그렇게 되지도 않지만, 가능한(조금 부족하거나 모호한 경우가 있더라도) 알고리즘을 작성한 후에 프로그램을 하도록 하는 것이 정상적인 방법입니다. 완벽하지는 않더라도 어느 정도는 방향을 잡고 가야 한다는 이야기입니다.

  알고리즘을 기술하는 방식은 크게 아래와 같이 3가지가 있습니다.

1. 자연어를 이용하는 방법 : 말(글)로 자연스럽게 기술

2. 순서도(flow chart)를 이용하는 방법 : 미리 의미가 정해진 도형과 선을 이용하여 기술

3. 유사 코드(psudo code)를 이용하는 방법 : 프로그램 언어와 비슷하지만 문법에는 크게 얽매이지 않게 어느 정도 자유롭게 기술하는 방법

   저는 위 3가지를 혼합하여 이해하기 쉽게 표현하는 형태를 취하도록 하겠습니다.

   참, 알고리즘을 기술하려면, 이것에 앞서 일단 해결하고자 하는 목표(요구사항)를 정확하게 규정할 필요가 있습니다. 즉, 제작하려고 하는 것이 무엇인지? 기능이 무엇인지? 어떻게 동작하여야 하는지? 등이 명확하게 기술되어 있어야 실제로 구현을 어디까지 해야 하는지가 명확하게 되기 때문입니다. 보통 이것을 규격(스펙, SPEC, Specification)이라고 하는데, 우리의 목표인 3색 신호등 DIY를 위하여 기능적인 부분만 규격을 작성해 보기로 하지요.

 

[3색 신호등 기능 규격]

1. 처음 전원이 들어오면 빨강 LED에 불이 켜진다.

2. 불이 들어오는 순서는 빨강 → 노랑 → 녹색 → 빨강 → 노랑 → … 으로 무한 반복된다.

3. 불은 어떤 한 순간 1개만 켜져 있어야 한다.

4. 한 개의 불은 3초 동안 켜진 상태를 유지한다.

   위 기능을 만족하기 위한 프로그램을 작성하기 위하여 먼저 알고리즘을 기술해 봅시다.

   순서도 비슷하게 기술해 보면 다음과 같은 형태가 될 것 같네요.

 Cap 2015-07-16 15-59-13-417

 

 

  ■ 3색 신호등 코딩(cording)하기    

   프로그램을 작성하는 것을 보통 코딩(cording)한다고 합니다. 위의 알고리즘을 보면서 순서대로 알맞은 코딩을 하면 되겠네요. 우리는 이미 배워서 알고 있는 것은 그 방법을 사용하여 코딩하면 되고, 잘 모르는 것은 새로운 코딩 방법을 배워야 합니다. 새로운 코딩은 기존에 배웠던 것을 응용하거나 조합하여 만들어 내는 방법도 있지만, 일단 아두이노에서는 혹시 우리가 원하는 기능을 라이이브러리로 이미 만들어 놓았는지, 아니면 다른 몇 개의 기존 라이브러리를 응용하거나 조합하여 구현할 수 있는지를 확인해 보는 것이 중요합니다. (남들이 애써서 다 만들어 놓은 것을 내가 낑낑대면서 또 만들 필요가 없으니까요. “고맙습니다” 하면서 낼름 갔다 쓰는게 장땡!이고, 사실 아두이노는 이것이 가장 큰 장점 중의 하나입니다.) 하나씩 체크해 볼까요?

   LED를 켜고 끄는 것은 조금 전에 배웠으므로 그것을 이용하면 되고, 일정 시간(초) 동안 기다리는 기능이 있는데, 이것을 해결해 줄 수 있는 아두이노 라이브러리(들)이 있는지를 잘 찾아 봐야겠습니다.

   다행히, delay( )라는 함수가 있네요. 그럼 형태와 기능이 어떤지 살펴볼까요.

void delay(unsigned long ms)

                  // 1/1000초(millisec) 단위로 시간을 지연하는 함수

                  // “void”는 함수 실행 종료 후 리턴값(출력값)이 없음을 의미

                  // “unsigned long ms”는 함수 입력값은 ms이고

                  // 타입은 unsigned long임을 나타냄 (4바이트 크기, 최대 40억 정도까지 표현 가능)

   예를 들어 “delay(500);” 을 코딩하면 500ms = 0.5초가 지연되는(흘러가는) 것이 되겠습니다. Good~~~ 그렇다면, 이제 모든 부분이 해결되었으니까 여러분이 직접 코딩해 보겠습니다. 10분 기다리면 되겠지요? 참, 앞에서도 그랬지만 같이 해보기 전에 무조건 자신이 먼저 시도해 보는 것이 바람직합니다. (이래야 실력이 쑥쑥 늡니다.). 잘 안되면 그 때 아래에 제시한 내용을 보고 이해한 후, 다시 처음부터 혼자 힘으로 한 번 더 코딩해서 똑같은 결과를 얻어야만 자기 것이 되지요. 꼭~꼭~꼭~ 그렇게 해보세요!! 10분 기다립니다. 저도 하러 갑니다.

   모두(?) 잘(?) 되었죠? YES or NOT? 다음을 보시지요.

#define RED_LED 4           // “#define A B”은 이후 프로그램에서 A가 나오면 B로 치환

#define YELLOW_LED 3      // 프로그램에서 직접 숫자를 써도 되지만 이렇게 해놓으면

#define GREEN_LED 2        // 번호가 아닌 Label로 의미가 전달되므로 더 쉬움

void setup()                     // 초기에 한 번만 실행

{

 pinMode(RED_LED, OUTPUT);                     // 4번핀은 출력

 pinMode(YELLOW_LED, OUTPUT);                // 3번핀도 출력

 pinMode(GREEN_LED, OUTPUT);                  // 2번핀도 출력

 digitalWrite(RED_LED, HIGH);                     // 빨강 LED ON

}

void loop()                       // 무한 반복 루프

{

 delay(3000);                                            // 3초 대기

 digitalWrite(RED_LED, LOW);  digitalWrite(YELLOW_LED, HIGH);

                                                              // 빨강 LED OFF, 노랑 LED ON

  delay(3000);

 digitalWrite(YELLOW_LED, LOW);  digitalWrite(GREEN_LED, HIGH);

                                                              // 노랑 LED OFF, 녹색 LED ON

  delay(3000);

 digitalWrite(GREEN_LED, LOW);  digitalWrite(RED_LED, HIGH);

                                                               // 녹색 LED ON, 빨강 LED ON

}

   이제 아두이노 연결하고 스케치 프로그램 입력하고 실행하는 것은 다 아시니까 실행해 봅시다. 다들 잘 동작하나요?

   이 동영상처럼 3초마다 돌아가면서 빨강-노랑-녹색 LED가 잘 켜지면 되겠습니다. 성공입니다! 자축의 박수~ 짝! 짝! 짝!

   여러분, 오늘 모두모두 너무너무 수고하셨고 자랑스럽습니다.

   첫번째 단추를 잘 끼웠으니 여러분은 벌써 목표의 반은 이루신 것이지요.

   다음 시간에는 3색 LED를 가지고 “카멜레온 반지 만들기 DIY”에 도전해 보기로 하고, 오늘은 기쁜마음으로 여기에서 강의를 마치겠습니다.

   아래 과제는 시간 나실 때 해보시고, 다음 강의에서 건강한 얼굴로 뵙겠습니다. 모두모두 안녕~!

   감사합니다.

[과제-3색신호등-2]

LED 불의 움직임이 0.5초 간격으로 (녹색 → 노랑 → 빨강 → 녹색 → …)이 무한 반복되는 프로그램을 작성해 보세요.

 

[과제-3색신호등-3]

LED가 1초 간격으로 (빨강-노랑 → 빨강-녹색 → 녹색-노랑 → 빨강-노랑-녹색 → 모두 꺼짐 → …)이 무한 반복되는 프로그램을 작성해 보세요.

 

 

 

Leave A Comment

*