원문 주소 : https://unity3d.com/kr/learn/tutorials/topics/performance-optimization/profiler-window

도입

프로파일링 툴은 우리의 게임이 어떻게 동작하는지에 대한 자세한 정보를 줍니다. 만약 우리 게임에 낮은 프레임율(framerate)이나 높은 메모리 사용과 같은 문제가 있다면, 프로파일링 툴을 통해서 무엇이 이러한 문제를 일으키는지 확인할 수 있고, 이러한 문제를 해결하는데 도움이 될 수 있습니다.

프로파일러 창(Profiler window)은 유니티에 내장되어 있는 강력한 프로파일링 툴입니다. 이 글은 프로파일러 창이 무엇이고 어떻게 사용하는지에 대한 가이드가 되어줄 것 입니다. 일단 이 글을 읽고 프로파일러 창의 레이아웃과 기능에 익숙해지고나면, 다른 종류의 성능 문제를 분석하기 위해서 프로파일러 창을 어떻게 사용하는 지를 배우게 될 것 입니다.

프로파일러 창은 우리 게임의 다른 부분들이 어떻게 돌아가고 있는지에 대한 심도있는 정보를 보여줍니다.
그림 1 : 프로파일러 창
[그림 1 : 프로파일러 창]

프로파일러 창을 사용해서, 게임에서 메모리가 어떻게 사용되는지, 다른 작업들을 진행하는데에 얼마나 많은 CPU 시간이 소비되는지, 그리고 물리 계산이 얼마나 자주 이뤄지는지 등과 같이 게임 성능과 관련된 여러가지 면을 배울 수 있습니다. 가장 중요하게는, 이 데이터가 우리의 게임에서의 성능 문제에 대한 원인을 찾고, 그러한 문제를 해결하는 시도가 얼마나 영향을 미칠 수 있는지 측정하는데에 도움이 되도록 사용할 수 있다는 것입니다.

우리 게임에 성능 문제가 있다면, 그것을 고치려고 하기 이전에 성능 문제가 발생하는 원인을 먼저 아는 것이 필수적입니다. 다른 문제는 다른 해결책을 필요로 하기 때문이죠. 만약 우리 프로젝트가 느리게 동작하고 있고, 이 문제의 진짜 원인이 과도하게 복잡한 물리를 사용한 것이라면, 그래픽 렌더링을 개선하는 것은 전혀 도움이 되지 않습니다! 같은 이치로, 성능 문제를 해결하기 위한 시도가 얼마나 효과를 발휘했는지를 측정하는 것은 매우 중요합니다. 프로파일링 데이터를 효율적으로 사용한다는 것은 단순히 어떤 것을 변경하고나서 최고의 결과를 바라는 것이 아닌, 진짜 최적화를 할 수 있음을 의미합니다.

프로파일러 창의 레이아웃

게임의 데이터를 모으기 위해 프로파일러 창을 사용하기 전에, 먼저 프로파일러 창을 열고 레이아웃에 익숙해져봅시다.

  • 상단의 메뉴 바에서 Window > Profiler를 선택하여 프로파일러 창을 엽니다.
    그림 2 : 프로파일러 창 레이아웃
    [그림 2 : 프로파일러 창 레이아웃]

프로파일링 데이터가 기록되어야만 프로파일러 창에서 정보를 볼 수 있음을 꼭 기억하십시오. 우리가 처음 프로파일러 창을 열면, 실행 중인 게임으로부터 프로파일링 데이터를 기록하기 전까지는 특정 영역은 비어있습니다.

프로파일러(Profilers)

프로파일러 창의 왼쪽 열(column)에 프로파일러가 종류별로 있습니다. 각 프로파일러는 게임의 특정 부분에 대한 정보를 보여주고 있습니다. CPU 사용, GPU 사용, 렌더링, 메모리 사용, 오디오, 물리, 네트웍과 같은 프로파일러들로 구분되어 있죠.
그림 3 : 프로파일러 열
[그림 3 : 프로파일러 열]

프로파일링 데이터가 기록되면, 프로파일러 창의 위쪽 반에 각 프로파일러의 데이터를 시간 단위로 볼 수 있습니다. 성능은 시간에 따라 달라질 수 있고, 한 프레임 이상의 성능을 보는 데에 유용합니다. 어떤 문제는 지속적으로 발생할 수도 있고, 어떤 문제는 오직 한 프레임에만 발생할 수도 있고, 또 어떤 문제는 시간이 지날수록 점점 더 좋아지거나 점점 더 나빠질 수도 있습니다.
그림 4 : 프로파일러 데이터
[그림 4 : 프로파일러 데이터]

프로파일러 창의 아래쪽 반에는 현재 선택된 프로파일러의 현재 프레임에 대한 데이터에 대한 상세 정보를 볼 수 있습니다.
그림 5 : 프로파일러 상세정보
[그림 5 : 프로파일러 상세정보]

여기에 표시되는 데이터는 현재 어떤 프로파일러가 선택되었냐에 따라 다르게 보여집니다. 예를들어, 메모리 사용 프로파일러가 선택되었다면, 이 영역에는 어떤 에셋이 가장 많은 메모리를 사용하는지, 또 총 메모리 사용량은 얼마인지와 같은 정보들이 보여집니다. 만약 렌더링 프로파일러가 선택되었다면, 이 영역에는 렌더링되고 있는 오브젝트의 갯수나 수행되고 있는 렌더링 오퍼레이션의 갯수와 같은 통계가 보여질 것 입니다.

프로파일러는 많은 자세한 정보를 제공하지만, 우리는 프로파일링할 때마다 그러한 모든 정보가 다 필요한 것은 아닙니다; 사실, 대게는 한개나 두개 정도의 프로파일러만 사용하게 될 것 입니다. 예를들어, 느리게 돌아가는 게임이 있다면 CPU 사용 프로파일러를 보고 조사를 시작할 것 입니다.
그림 6 : CPU 사용 프로파일러
[그림 6 : CPU 사용 프로파일러]

CPU 사용 프로파일러는 우리 게임의 어떤 부분이 가장 많은 CPU 시간을 사용하는지에 대한 개요를 보여줍니다. 우리는 그 정보를 가지고 어떤 다른 프로파일러를 살펴봐야할지 결정할 수 있죠. 예를들어, 만약 물리 함수가 실행 시 긴 시간을 사용한다면, 물리 성능에 대한 상세 정보를 얻기 위해 물리 프로파일러를 사용하겠죠.

관심없는 정보를 보지 않기 위해, 특정 프로파일러를 숨길 수도 있습니다. 각 프로파일러의 오른쪽 상단에 있는 X아이콘을 클릭해서 프로파일러를 숨길 수 있습니다.
그림 7 : 프로파일러 숨기기
[그림 7 : 프로파일러 숨기기]

또한 프로파일러 창의 왼쪽 상단에 있는 Add Profiler를 클릭해서 프로파일러를 추가할 수도 있습니다.
그림 8 : 프로파일러 추가
[그림 8 : 프로파일러 추가]

프로파일러를 숨기거나 추가한다고 해서 이미 모은 데이터가 사라지는 것은 아닙니다. 단순히 표시하고 있는 데이터만 보였다가 숨겼다가 하는 것이지, 실제 데이터를 삭제하는 것은 아닙니다.

컨트롤(Controls)

화면 상단 바에는 프로파일러 창의 컨트롤들이 있습니다.
그림 9 : 상단 바 컨트롤
[그림 9 : 상단 바 컨트롤]

이 컨트롤들을 이용해서 프로파일링을 시작하거나 정지할 수도 있고, 프로파일링 특징들을 활성화 또는 비활성화할 수도 있으며, 프로파일러가 모은 데이터 사이를 이동하는데에도 사용할 수 있습니다.

이러한 컨트롤의 전형적인 사용은, 성능 문제를 포착하기 위해 적절한 시점에 프로파일링을 시작하고 원하는 데이터를 충분히 모았다면 프로파일링을 멈추는 것입니다. 그러고나서는 타임라인 컨트롤을 이용해서 성능 문제라고 보여지는 프레임으로 이동합니다. 그러면 화면 아래쪽 반에 해당 프레임의 데이터가 표시될 것입니다.

프로파일러 창을 이용해서 게임 프로파일링 데이터 기록하기

이제 우리는 프로파일러 창에 대해서 조금 더 이해하게 되었으니, 게임 데이터를 어떻게 기록하고, 게임이 어떻게 수행되는지를 이해하기 위해서 데이터를 어떻게 읽는지 배워봅시다.

프로파일러 창에서 데이터를 기록하는데에 약간의 비용이 든다는 것을 이해하는 것은 중요합니다. 이는 모든 프로파일링 툴에서 공통적인 부분입니다; 이러한 약간의 오버헤드없이 데이터를 기록하고 표시하는 것은 불가능한 일입니다. 이는 게임이 동작하는데에 있어서 중대한 변화를 초래하지는 않지만, 프로파일러 창이 기록을 하는동안 아주 약간의 성능에 영향을 미칠 수는 있습니다.

우리의 게임을 프로파일하는 방법은 2가지가 있습니다 : 첫번째는 유니티 에디터 상에서 프로파일링하는 방법이고, 두번째는 개발 빌드(development build)를 해서 유니티 에디터 밖에서 실행시키는 방법입니다. 개발 빌드는 일반적인 빌드와는 두가지 측면에서 다릅니다 : 첫번째는 개발 빌드는 게임이 실행될 때 프로파일러 창에 연결할 수 있다는 것이고, 두번째는 개발 빌드에 디버깅을 가능하게 하는 파일들이 포함된다는 것입니다.

거의 대부분의 경우에 유니티 에디터에서보다는 개발 빌드로 프로파일링하는 것이 좋습니다. 여기에는 두가지 이유가 있습니다. 첫번째 이유는, 유니티 에디터에서보다 독립된(standalone) 개발 빌드가 성능과 메모리 사용에 대한 데이터에서 더 정확하기 때문입니다. 프로파일러 창은 유니티 에디터에서 데이터를 기록하는데, 이는 결과를 왜곡시킬 수 있습니다. 두번째 이유는, 가능하다면 타겟 기기에서 게임을 테스트하는 것이 좋기 때문입니다; 예를들어, 만약 우리 게임이 안드로이드 게임이라면 당연히 안드로이드 기기에서 테스트를 해야하는 것입니다. 특정 성능 문제는 오직 특정 하드웨어나 특정 OS에서만 발생하기 때문에, 유니티 에디터에서만 테스트를 한다면 이러한 문제를 발견하지 못할 것입니다.

그렇긴 해도, 유니티 에디터에서 프로파일링하는 것이 유용할 때도 있습니다. 아주 정확한 결과보다는 대략적인 성능 문제를 빨리 파악하기 위해서 필요한 경우가 있죠. 예를들어, 어떤 게임 오브젝트가 성능 문제를 발생시키는지를 파악하기 위해서 런타임에 대량의 게임 오브젝트를 활성화하거나 비활성화할 수 있을 것입니다. 유니티 에디터에서 이런 부분을 테스트하는 것이 여러 개의 빌드를 만드는 것보다 훨씬 빠를 것입니다. 일단 대략적으로 어떤 부분에서 문제가 발생하는지 파악된다면, 저 정확한 문제 원인을 파악하고 해결하기 위해 개발 빌드를 프로파일링할 수 있을 것입니다.

유니티 에디터에서 프로파일링하기

유니티 에디터에서 우리 게임의 데이터를 프로파일링하기 위해서는, 다음 차례를 따라야합니다.

  • 프로파일링하고 싶은 프로젝트를 유니티에서 엽니다.
  • 상단 메뉴 바의 Window > Profiler 메뉴를 선택해서 프로파일러 창을 엽니다.
  • 프로파일러 창 상단의 툴 영역에서 Record를 선택합니다.
  • Play Mode로 들어갑니다.

이렇게하면, 게임에서 상호작용하는 동안 실시간으로 프로파일링 데이터를 모으고 표시해줄 것입니다.

게임을 개발 빌드로 프로파일링하기

타겟 디바이스에서 우리 게임의 프로파일링 데이터를 기록하기 위해서, 우리 게임의 개발 빌드를 만들고 프로파일러 창에 연결해야 합니다. 이는 타겟 플랫폼에 따라 어떻게 해야할지가 달라지게 됩니다.

Windows, OSX, Linux 그리고 WebGL

Windows, OSX, Linux 그리고 WebGL에서 개발 빌드를 실행하기 위해서는 다음과 같은 순서로 진행해야 합니다:

  • 프로파일링하고 싶은 프로젝트를 유니티에서 엽니다.
  • 상단 메뉴 바에서 Window > Profiler 를 선택해서 프로파일러 창을 엽니다.
  • 프로파일러 창의 툴 영역에서, Record를 선택합니다.
  • 상단 메뉴에서 빌드 설정(Build Settings) 창을 엽니다.(File > Build Settings).
  • Development Build를 체크하십시오.
  • Autoconnect Profiler를 체크하십시오.
  • Build and Run을 클릭하십시오.

그림 10 : 빌드 설정 창
[그림 10 : 빌드 설정 창]

게임이 타겟 디바이스에서 실행될 것입니다. 게임이 실행되면, 여러분이 게임과 상호작용하는 것이 유니티 에디터의 프로파일러 창에 표시될 것입니다.

iOS와 Android에 개발 빌드를 프로파일링하기

iOS와 Android에 개발 빌드를 프로파일러 창에 연결하는 것은 조금 더 복잡합니다. 왜냐하면 디바이스를 위한 빌드를 해야하고, 이 디바이스를 유니티 에디터에 연결해야하기 때문입니다.

iOS와 Android의 개발 빌드를 프로파일러 창에 연결하는 순차적인 방법은 유니티 매뉴얼의 문서를 참고하시기 바랍니다.

문제를 분석하기 위해서 프로파일러 창을 사용하기

이제 프로파일러 창이 어떻게 동작하는지에 대해 이해했으니, 이제 프로파일러 창을 이용해서 문제를 파악하는 방법과 어떻게 하면 이러한 문제를 해결하는데에 도움이 될 수 있는지를 알아야 합니다.

만약 우리 게임이 느리게 동작하거나, 프레임이 튀거나, 멈춤 현상이 발생한다면, 이 글이 프로파일러 창을 어떤게 사용하는지와 이러한 문제의 원인을 어떻게 찾는지에 대한 이야기를 해줄 것입니다.

더 읽어볼거리

Unity Learn: Introduction to the profiler

Unity Learn: Profiler overview for beginners

Unity Manual: Profiler

Unity Manual: The CPU Profiler

Unity Manual: The GPU Profiler

Unity Manual: The Rendering Profiler

Unity Manual: The Memory Profiler

Unity Manual: The Audio Profiler

Unity Manual: The Physics Profiler

Unity Script Reference: Profiler

원문 : https://blogs.unity3d.com/kr/2016/12/02/unity-expands-2d-offerings-with-anima2d/

유니티에서 우리는 개발자들을 도울 수 있는 방법과 가능한 최고의 툴을 제공할 수 있는 새로운 방법들을 항상 모색하고 있습니다. 그 목적을 당성하기 위해서, 유명한 뼈대 애니메이션 소프트웨어인 Anima2D가 2017년 1월에 무료로 유니티 개발자 커뮤니티에 올라오게 됩니다! 이 강력한 툴과 이 툴의 개발자 중 한명인 Sergi Valls를 우리 2D 팀에 맞이하게 된 것을 환영합니다.

2D 제작 경험의 개선

우리는 개발의 민주화에 대한 목표를 위해 공헌하고 있고, Anima2D는 우리의 툴셋과 2D 공간에서의 작업에 초점을 맞추고 있는 개발자들을 위한 워크플로우를 개선하는 데에 중요한 한 부분이 될 것 입니다. Sergi의 경험과 결합된 Anima2D의 2D 애니메이션과 2D 캐릭터 툴에 대한 독특한 접근 방식은 이러한 노력의 중추적인 부분이 될 것 입니다.

Anima2D

Anima2D 특징

  • 2D Bones
  • Sprite를 메쉬로 변환
  • SpriteMesh 에디터
  • 자동 weights
  • Inverse Kinematics
  • 자세를 저장 / 로드
  • 아틀라스 호환성
  • Animation을 Bones으로 굽기
  • Onion Skin
  • Avatar Masks 생성

유니티로 작업

이 에셋을 더 개선하기 위한 노력으로써, 12월에는 에셋 스토어에서 Anima2D를 일시적으로 내릴 것 입니다. 그리고 2017년 1월에 Unity 커뮤니티에 무료로 선보이게 되고, 이 때 문서에 수정이 있을 것이며 개발자들이 최고의 프로젝트를 만들 수 있도록 도와주기 위해 필수 지원을 할 예정입니다. 우리는 이것의 가치를 믿고, 여러분이 가능한 최대로 Anima2D를 활용할 수 있도록 도와드리고 싶기 때문에 이런 일을 하고 있습니다.

이 에셋에 대한 전체 문서를 보고 싶으시면, Anima2D User Guide 문서를 참고하세요.

Anima2D를 유니티 개발자 커뮤니티에 가져오는데에 있어서 Mandarina Games의 Joaquim Virgili와 Sergi Valls에게 감사를 표합니다.

안녕하세요. 오늘은 팁을 하나 소개해 드리려고 합니다.

예제를 따라하다보면 가끔씩 아두이노 보드에 업로드가 잘 안될 때가 있습니다.
스케치도 문제없이 잘 컴파일이 되는데, 이상하게 업로드를 하려고하면 아두이노 소프트웨어가 에러를 뿜어내는 경우 말이죠.
이러한 경우에 무엇을 체크해봐야 되는지 살펴보겠습니다.

1. 포트

그림 1 : 포트 설정
[그림 1 : 포트 설정]

아두이노 소프트웨어의 [Tools-Port] 메뉴에 들어가보면 그림 1과 같이 여러 개의 포트 목록을 볼 수 있습니다.
저 같은 경우에는 /dev/cu.Bluetooth-Incoming-Port/dev/cu.usbmodem1411 (Arduino/Genuino Uno) 이렇게 2개의 포트 목록을 볼 수 있습니다.
이 중 우리는 USB로 연결을 할 것이기 때문에 두번째 포트인 usbmodel 포트를 선택합니다.

만약 usb 포트가 보이지 않는다면 아두이노 보드와 USB 연결선이 제대로 접속되어 있는지 꼭 확인하시고, 메뉴를 껐다가 다시 Tools-Port 메뉴를 들어가 보면 확인하실 수 있습니다.


2. 언어 설정

그 다음으로 확인할 부분이 언어 설정입니다. 우리는 한국인이라서 아마 이 글을 읽는 대부분은 시스템 언어가 한글로 설정되어 있을 것 입니다.
그런데, 정확히 무슨 이유인지는 몰라도 아두이노 소프트웨어의 언어가 한글로 되어 있으면 업로드 에러가 굉장히 빈번히 발생하는 것 같습니다.

그래서 언어를 바꿔줘야하는데요, 그림 2와 같이 Arduino-Preferences 메뉴를 눌러서 Preferences 다이얼로그를 엽니다.

그림 2 : Preferences 메뉴
[그림 2 : Preferences 메뉴]

그러면 그림 3과 같은 다이얼로그를 확인할 수 있습니다.
여기에서 에디터 언어(Editor Language) 설정 부분을 보시면 기본적으로는 시스템 기본 언어(System Default)로 설정되어 있을텐데, 이 부분을 영어(English)로 바꿔 줍니다.

그림 3 : Preferences 다이얼로그
[그림 3 : Preferences 다이얼로그]

언어 설정의 경우 아두이노 소프트웨어를 껐다가 다시 켜야 적용이 된다는 점 참고하시기 바랍니다.

안녕하세요. 오늘은 수위 센서를 사용하는 방법에 대해 알아보고자 합니다.
앞에서 배웠던 다른 센서들과 마찬가지로 수위 센서도 굉장히 간단한 센서에 속합니다.

그림 1 : 수위 센서
[그림 1 : 수위 센서]

그림 1에서 볼 수 있듯이 수위 센서에는 3개의 핀이 있습니다.
먼저 S라고 적혀있는 핀은 물의 높이를 입력으로 보내주는 핀입니다.
그 옆에 있는 + 핀은 전원(5V)을 연결하는 핀입니다.
가장 오른쪽에 있는 - 핀은 그라운드(GND)에 연결하는 핀입니다.

아래의 표 1에 아두이노 보드와 수위 센서에 연결되는 각 핀의 대응 관계를 나타냈습니다.

아두이노 보드 핀 수위 센서 핀
아날로그 0번 핀 신호 입력 핀(S)
5V +
GND -

[표 1 : 아두이노 보드와 연결되는 수위 센서 핀]

1. 회로 연결

표 1에 적혀 있듯이 각 핀을 연결해줍니다. 이 정도는 너무 간단하니 빵판(bread board)없이 작업하겠습니다.

그림 2 : 아두이노 보드와 수위 센서 연결
[그림 2 : 아두이노 보드와 수위 센서 연결]

2. 스케치

수위 센서의 값을 입력으로 받아서, 시리얼 모니터로 출력하는 스케치를 작성해보겠습니다.
시리얼 모니터가 생소하다면, 이 글을 참조하시기 바랍니다.

const int WATER_SENSOR_PIN = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorVal = analogRead(WATER_SENSOR_PIN);

  Serial.print("sensor value = ");
  Serial.println(sensorVal);

  delay(500);
}
  • 1 줄 : 수위 센서 핀을 A0 핀으로 설정합니다. 디지털 핀의 경우는 1, 2같은 숫자를 썼지만, 아날로그 핀은 A0, A1과 같이 앞에 ‘A’를 붙여 줍니다.
  • 3~5 줄 : 수위 센서의 값을 시리얼 모니터로 확인하기 위해서 9600 baud rate로 Serial.begin()을 사용합니다. 디지털 핀의 경우, 입력모드인지 출력모드인지 설정해주기 위해 pinMode()함수를 사용했던 것과 다르게, 아날로그 입력은 pinMode()설정이 필요없습니다.
  • 8 줄 : analogRead()함수를 이용해서 수위 센서의 값을 받아옵니다.
  • 10~11 줄 : 8줄에서 입력받은 센서 값을 시리얼 모니터에 출력합니다.
  • 13 줄 : 500ms 동안 쉽니다.

3. 결과

이번 실험은 수위 센서를 물에 담궈야합니다.
이때 핀이 있는 위쪽에 물이 닿게 되면 어떤 일이 벌어질지 모르니, 아래쪽의 센서 부분에만 물이 닿도록 합니다.

그림 3 : 수위 센서를 물에 담근 모습
[그림 3 : 수위 센서를 물에 담근 모습]

그림 3과 같이 수위 센서를 물에 담그고, 시리얼 모니터를 열어보면 수위에 대한 값이 출력 됨을 확인할 수 있습니다.
물을 더 넣어보면 값이 증가하는 것도 확인할 수 있을 것 입니다.

그림 4 : 시리얼 모니터 결과
[그림 4 : 시리얼 모니터 결과]

안녕하세요.
오늘 아두이노와 피에조 부저(Piezo Buzzer)를 이용해서 음악을 연주해보려고 합니다.

그림 1 : 부저 윗 부분
[그림 1 : 부저 윗 부분]

그림 2 : 부저 아랫 부분
[그림 2 : 부저 아랫 부분]

그림 1과 2에서 보시는 것처럼 부저에는 2개의 핀이 있습니다.
오늘도 간단한 작업이 될 것 같은 느낌이네요!

1. 회로 연결

회로 연결은 너무나 간단합니다. 따라서 회로도를 생략하고 연결된 그림만 보시겠습니다.

그림 3 : 부저 연결 회로
[그림 3 : 부저 연결 회로]

그림 3에서 보시는 바와 같이 부저의 (+)표시된 핀은 아두이노의 디지털 8번 핀에 연결하고, 나머지 한 핀은 아두이노의 GND(그라운드)에 연결합니다.
혹시 반대로 연결하게 되면 소리가 나지 않으니 주의하시길 바랍니다.

2. 스케치

const int BUZZER_PIN = 8;

const int C = 261;    //도
const int D = 294;    //레
const int E = 330;    //미
const int F = 349;    //파
const int G = 392;    //솔
const int A = 440;    //라
const int B = 494;    //시

void setup() {
}

void loop() {
  tone(BUZZER_PIN, C);
  delay(500);

  tone(BUZZER_PIN, D);
  delay(500);

  tone(BUZZER_PIN, E);
  delay(500);

  tone(BUZZER_PIN, F);
  delay(500);

  tone(BUZZER_PIN, G);
  delay(500);

  tone(BUZZER_PIN, A);
  delay(500);

  tone(BUZZER_PIN, B);
  delay(500);

  noTone(BUZZER_PIN);
}
  • 1 줄 : 부저를 8번 핀으로 정의합니다.
  • 3~9 줄 : 도부터 시까지의 음을 정의합니다. 각 음에 사용된 숫자는 해당 톤의 헤르츠(Hz) 값을 의미합니다.
  • 15 줄 : tone() 함수를 이용해서 부저 핀에 도 소리를 출력합니다. 이 함수는 두개의 인자를 받는데, 첫번째 인자가 핀 번호이고, 두번째 인자가 주파수입니다.
  • 16 줄 : delay() 함수를 이용해서 500ms 쉽니다. 즉, 도 소리를 500ms 만큼 출력하게 됩니다.
  • 18~34 줄 : 15~16줄과 같은 원리로 ‘레’부터 ‘시’까지 출력합니다.
  • 36 줄 : noTone() 함수를 이용해서 부저 핀의 소리를 끕니다.


3. 응용

기본적인 사용방법을 알아봤으니, 이제 응용을 해볼 차례입니다.
‘학교 종이 땡땡땡’을 연주하는 코드를 작성해보죠.

const int BUZZER_PIN = 8;

const int C = 261;    //도
const int D = 294;    //레
const int E = 330;    //미
const int F = 349;    //파
const int G = 392;    //솔
const int A = 440;    //라
const int B = 494;    //시

typedef struct  {  
  int tone;
  unsigned long delay;
} TAD; //Tone And Delay

TAD music[] = 
  {
    {G, 100}, {G, 100}, {A, 100}, {A, 100}, {G, 100}, {G, 100}, {E, 200},
    {G, 100}, {G, 100}, {E, 100}, {E, 100}, {D, 200}, {G, 100}, {G, 100},
    {A, 100}, {A, 100}, {G, 100}, {G, 100}, {E, 200}, {G, 100}, {E, 100},
    {D, 100}, {E, 100}, {C, 200}
  };

int musicLen;

void setup() {
  musicLen = sizeof(music) / sizeof(TAD);
}

void loop() {
  for(int i = 0; i < musicLen; i++) {
    tone(BUZZER_PIN, music[i].tone);
    delay(music[i].delay * 5);

    noTone(BUZZER_PIN);
    delay(30);
  }

  noTone(BUZZER_PIN);
  delay(1000);
}
  • 1~9 줄 : 위의 스케치와 동일합니다.
  • 11~14 줄 : TAD라는 이름의 구조체를 정의합니다. 이 구조체에는 음을 나타내는 tone 변수와 음의 지속 시간을 나타내는 delay 변수가 있습니다.
  • 16~22 줄 : TAD 구조체를 배열로 사용해서 음악을 구성합니다.
  • 24 줄 : 음악 배열의 길이를 담을 변수입니다.
  • 26~28 줄 : 음악 베열의 길이를 구합니다.
    • sizeof(music)을 하면 music 배열에 할당된 바이트 크기를 반환합니다.
    • sizeof(TAD)를 하면 TAD 구조체 하나가 가지는 바이트 크기를 반환합니다.
    • 따라서, sizeof(music) / sizeof(TAD) = (music 배열 전체의 바이트) / (TAD 구조체의 바이트) 가 되고, 이는 music 배열에서 TAD 구조체가 몇개 있는지를 구하게 됩니다.
  • 31~37 줄 : music배열을 하나씩 차례대로 읽어서 톤을 출력합니다.
    • 32~33 줄 : music[i]에 해당하는 음을 해당 딜레이 만큼 출력합니다.
    • 35~36 줄 : 각 음을 출력하고 잠깐 동안 아무 소리를 내지 않게 함으로써 연주하는 듯한 느낌을 줍니다.
  • 39~40 줄 : 음악을 다 연주한 후 1초 동안 아무런 소리를 내지 않도록 합니다.

이렇게 ‘학교 종이 땡땡땡’을 연주하는 스케치를 만들어봤습니다.
여기에서 얼마든지 응용해서 다른 음악을 연주하게도 할 수 있을 것 같습니다.

안녕하세요. 오늘은 소리 센서를 사용하는 방법을 알아보고자 합니다.

소리 센서는 말 그대로 소리를 탐지하는 센서입니다.
여기에서 소리를 탐지한다는 것은 소리의 크기만 탐지하는 것이지, 음의 높낮이 등의 정보는 얻을 수 없음에 유의하시기 바랍니다.

그림 1 : 소리 센서
[그림 1 : 소리 센서]

이번 실험에서는 소리 센서로 입력받은 값을 시리얼 모니터로 출력합니다.
시리얼 모니터의 사용법을 잘 모르시는 분들은 시리얼 모니터와 가변저항 포스팅을 참고하시기 바랍니다.

1. 회로 연결

이번에는 회로도 없이 바로 연결된 사진을 보시겠습니다.

그림 2 : 아두이노에 소리 센서 연결
[그림 2 : 아두이노에 소리 센서 연결]

아두이노 보드 핀 소리 센서
아날로그 0번 핀 A0
GND(그라운드) GND
VCC(5V) VCC

[표 1 : 아두이노 - 소리 센서 핀 연결]

표1에 나와있는 것처럼 각 핀들을 연결해주면 됩니다.
소리 센서 뿐만 아니라, 보통 센서들은 전원과 그라운드를 연결해줘야 하고, 추가적으로 입력을 받기 위한 핀이 한개 이상 존재합니다.
소리 센서는 단 하나의 입력 핀이 있네요. 이 핀(A0)을 아두이노 보드의 A0에 연결해주면 되겠습니다.

2. 스케치

이번에는 스케치도 정말 간단합니다.

const int SOUND_SENSOR_PIN = A0;
int sensorValue;

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(SOUND_SENSOR_PIN);
  Serial.println(sensorValue);
  delay(20);
}
  • 1 줄 : 입력 핀 A0를 상수로 정의합니다.
  • 5 줄 : 9600 baud rate로 Serial 통신을 시작합니다. 이는 소리 센서가 받아오는 입력 값을 보기 위한 용도로 시리얼 모니터를 쓰기 위함입니다.
  • 9 줄 : analogRead()함수를 이용해서 A0 핀으로부터 아날로그 입력을 받습니다. 값의 범위는 0~1023 사이 입니다.
  • 10 줄 : 소리 센서의 값을 시리얼 모니터에 출력합니다.
  • 11 줄 : 20ms 동안 대기합니다.



3. 결과

그림 3 : 소리 크기 측정 결과
[그림 3 : 소리 크기 측정 결과]

그림 3에서 보시는 바와 같이 시리얼 모니터를 통해 소리의 크기를 확인할 수 있습니다.
저는 현재 제 주변에서의 기본적인 소리의 크기가 17정도인 것 같고, 박수를 가볍게 치면 20정도의 값이 나오네요.

안녕하세요. 오늘은 시리얼 모니터와 가변저항을 사용하는 방법을 배워보겠습니다.

1. 시리얼 모니터

시리얼 모니터는 아두이노 보드와 PC간에 시리얼 데이터를 주고 받을 수 있는 별도의 분리된 창입니다.
아래의 그림 1과 같이 시리얼 모니터 버튼은 아두이노 소프트웨어의 오른쪽 상단에 돋보기 모양의 아이콘으로 있습니다.

그림 1 : 시리얼 모니터 버튼의 위치
[그림 1 : 시리얼 모니터 버튼의 위치]

시리얼 모니터 버튼을 누르면 그림 2와 같이 시리얼 모니터가 팝업 형태로 뜨게 됩니다.

그림 2 : 시리얼 모니터
[그림 2 : 시리얼 모니터]

여기에는 입력할 수 있는 인풋 필드와 출력을 위한 텍스트 필드, 그리고 데이터 전송 속도 설정인 baud를 선택하는 팝업 리스트를 볼 수 있습니다. 처음부터 모든 것을 다 알려고 하면 힘드니까, 오늘은 출력 부분과 baud 설정만 살펴보도록 하죠.

1-1. 시리얼 모니터 출력 부분

출력 부분은 말 그대로 아두이노에서의 보내는 시리얼 데이터를 출력하는 곳 입니다.
Serial.print() 또는 Serial.println()을 이용해서 시리얼 모니터에 출력할 수 있습니다.
이 둘은 함수의 인자로 들어온 변수 값을 출력하는 일을 하는데, Serial.println()은 마지막에 라인엔딩을 추가해서 줄내림을 해줍니다. 이 두 함수에 사용되는 인자는 아두이노에서 정의하고 있는 모든 데이터 타입이 가능합니다.

숫자를 출력할 경우에는 특별히 2번째 인자를 사용해서 숫자의 출력 포맷을 결정할 수 있습니다.
포맷에는 DEC, HEX, OCT, BIN 이렇게 4가지 종류가 있는데 각각은 다음과 같습니다.

  • DEC - 십진수로 표현합니다.
  • HEX - 16진수로 표현합니다.
  • OCT - 8진수로 표현합니다.
  • BIN - 2진수로 표현합니다.

백문이 불여일견이라고, 실제로 사용하는 방법을 살펴보도록 하죠.

int x = 0;    // variable

void setup() {
  Serial.begin(9600);      // open the serial port at 9600 bps:    
}

void loop() {  
  // print labels 
  Serial.print("NO FORMAT");       // prints a label
  Serial.print("\t");              // prints a tab

  Serial.print("DEC");  
  Serial.print("\t");      

  Serial.print("HEX"); 
  Serial.print("\t");   

  Serial.print("OCT");
  Serial.print("\t");

  Serial.print("BIN");
  Serial.println("\t"); 

  for(x=0; x< 64; x++){    // only part of the ASCII chart, change to suit

    // print it out in many formats:
    Serial.print(x);       // print as an ASCII-encoded decimal - same as "DEC"
    Serial.print("\t");    // prints a tab

    Serial.print(x, DEC);  // print as an ASCII-encoded decimal
    Serial.print("\t");    // prints a tab

    Serial.print(x, HEX);  // print as an ASCII-encoded hexadecimal
    Serial.print("\t");    // prints a tab

    Serial.print(x, OCT);  // print as an ASCII-encoded octal
    Serial.print("\t");    // prints a tab

    Serial.println(x, BIN);  // print as an ASCII-encoded binary
    //                             then adds the carriage return with "println"
    delay(200);            // delay 200 milliseconds
  }
  Serial.println("");      // prints another carriage return
}

위의 예제 코드는 아두이노 사이트의 Serial.print()문서에서 참고한 코드입니다.
0부터 시작해서 63까지의 값을 출력하는데, 순서대로 기본 포맷, 십진수, 16진수, 8진수, 2진수로 출력해줍니다.
실제로 실행해보면 다음과 같은 결과를 볼 수 있습니다.

그림 3 : 숫자 출력 포맷
[그림 3 : 숫자 출력 포맷]

1-2. 시리얼 모니터 baud 설정

그림 4 : baud 설정
[그림 4 : baud 설정]

그림 4와 같이 시리얼 모니터 창에는 baud를 설정할 수 있는 팝업 리스트가 있습니다.
baud rate보레이트라고 읽고, 이는 시리얼 통신의 속도를 의미합니다.
기본적으로 디버깅의 용도로 시리얼 모니터를 사용하는 경우에는 9600을 사용합니다.
필요에 따라 다른 baud를 사용하기도 하는데, 아직은 정확히 그 용도를 모르겠습니다.

시리얼 모니터를 사용할 때 주의해야할 점은, 아두이노 스케치(코드)에서 설정한 baud와 시리얼 모니터 창에서의 baud값이 같아야 서로 통신을 할 수 있다는 점입니다.
위에서 보여줬던 코드의 setup부분을 보면 Serial.begin(9600);을 쓰고 있습니다.
이는 앞으로 9600 baud rate로 시리얼 데이터를 송수신하겠다는 의미입니다.
따라서 아래 그림 5와 같이 시리얼 모니터에서도 baud rate를 9600으로 맞춰줘야 합니다.

그림 5 : 시리얼 모니터 baud 9600
[그림 5 : 시리얼 모니터 baud 9600]

2. 가변 저항

가변 저항은 말그대로 저항의 값이 바뀔 수 있는 저항을 의미합니다.
가변 저항의 종류에도 여러가지가 있지만, 오늘은 회전형 가변 저항을 알아 보겠습니다.

그림 6 : 회전형 가변 저항
[그림 6 : 회전형 가변 저항]

그림 6과 같이 연결 핀이 3개가 있고, 회전할 수 있는 기다란 막대가 하나 있습니다.
3개의 핀을 차례대로 1번, 2번, 3번 핀이라고 하겠습니다.
가변 저항의 전체 저항 값은 정해져있고, 회전 막대를 어느 방향으로 회전하냐에 따라, 1번과 2번 사이의 저항 값과 2번과 3번 사이의 저항 값이 변하게 됩니다.

즉, 다음과 같이 정리할 수 있습니다.
(전체 저항) = (1번과 2번 사이의 저항) + (2번과 3번 사이의 저항)

전체 저항 값이 고정되어 있기 때문에 1번과 2번 사이의 저항 값과 2번과 3번 사이의 저항 값은 회전 막대의 회전 정도에 따른 비율에 따라 저항 값이 결정됩니다.
이해를 돕기 위해 그림으로 살펴보도록 하겠습니다.

그림 7 : 가변 저항 0%
[그림 7 : 가변 저항 0%]

그림 7은 가변 저항을 가장 왼쪽으로 돌린 경우라고 볼 수 있습니다. 이러한 경우에 1-2번 사이의 저항 값은 전체 저항의 0%값이 되고, 2-3번 사이의 저항 값은 전체 저항의 100%가 됩니다.

그림 8 : 가변 저항 50%
[그림 8 : 가변 저항 50%]

그림 8은 가변 저항을 가운데 쯤으로 돌린 경우라고 볼 수 있습니다. 이러한 경우에 1-2번 사이의 저항 값과 2-3번 사이의 저항 값은 각각 50%씩 갖게 됩니다.

그림 9 : 가변 저항 100%
[그림 9 : 가변 저항 100%]

그림 9는 가변 저항을 가장 오른쪽으로 돌린 경우라고 볼 수 있습니다. 이러한 경우에 1-2번 사이의 저항 값은 전체 저항의 100%가 되고, 2-3번 사이의 저항 값은 전체 저항의 0%가 됩니다.

이렇듯 가변 저항은 1-2번 값이 커지면 2-3번의 값이 작아지고, 1-2번 값이 작아지면 2-3번 값이 커지는 성질을 가지고 있습니다.

3. 실습

기본적인 이론을 살펴봤으니 이제 가변저항과 시리얼 모니터를 이용한 실습을 해보도록 하겠습니다.

3-1. 회로

먼저 회로도를 살펴보겠습니다.
아두이노 보드에 가변 저항만 연결하면 되므로 회로는 정말 간단합니다.

그림 10 : 가변 저항 연결 회로도
[그림 10 : 가변 저항 연결 회로도]

그림 11 : 아두이노에 가변 저항 연결
[그림 11 : 아두이노에 가변 저항 연결]

가변 저항의 1번 핀을 그라운드에, 2번 핀의 값을 확인하기 위해 A0에, 3번 핀은 5V에 연결했습니다.
이렇게 함으로써 코드 상에서 1-2번 사이에 걸리는 전압을 확인할 수 있을 것 입니다.

3-2. 스케치

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);

  float voltage = sensorValue * (5.0 / 1023.0);
  
  Serial.print("sensorValue = ");
  Serial.print(sensorValue);
  Serial.print(", voltage = ");
  Serial.println(voltage);
}
  • 1~3 줄 : 9600 baud rate로 시리얼 통신을 시작합니다.
  • 6 줄 : 아두이노의 A0 핀에서 아날로그 값을 읽습니다.
  • 8 줄 : 6줄에서 읽은 센서 값을 전압으로 변환합니다. analogRead()의 반환 값이 0~1023의 범위이기 때문에 1023으로 나눠주게 되면 0에서 1사이의 값을 가지게 되고, 여기에 회로에서 연결한 5v 값을 곱해주면 0~5v 사이의 값을 얻을 수 있습니다.
  • 10~13 줄 : 센서 값과 전압 값을 출력합니다.


3-3. 결과

먼저, 스케치를 업로드하고 시리얼 모니터를 켭니다.
가변 저항을 왼쪽과 오른쪽으로 돌려보면, 그림 12과 같이 센서 값과 전압 값이 시리얼 모니터에 출력되는 것을 볼 수 있습니다.

그림 12 : 가변 저항 시리얼 모니터 결과
[그림 12 : 가변 저항 시리얼 모니터 결과]

안녕하세요. 오늘은 지난 시간에 배운 PWM을 활용해서 LED의 밝기를 조절하는 것을 해볼까 합니다.

1. PWM을 사용할 수 있는 핀

아두이노 보드의 모든 핀이 PWM을 지원하고 있는 것은 아닙니다. 어떤 보드이냐에 따라 PWM을 사용할 수 있는 핀이 달라지게 되는데요, 저는 제가 사용하고 있는 UNO 보드를 기준으로 설명 드리겠습니다.

그림 1 : UNO 보드 PWM 표시
[그림 1 : UNO 보드 PWM 표시]

아두이노 UNO보드의 경우 그림 1과 같이 디지털 핀 부분을 살펴보면 DIGITAL(PWM~)이라고 되어 있습니다.
여기에 배치되어 있는 핀들은 모두 디지털 핀들인데, 특히 ~(물결) 표시가 되어 있는 핀은 PWM핀이라는 의미입니다.

3, 5, 6, 9, 10, 11번 핀의 숫자 왼쪽을 보면 ~(물결) 표시가 되어 있는 것을 알 수 있습니다. 따라서 이 핀들이 PWM을 사용할 수 있는 핀입니다.

2. analogWrite()함수

위에서 우리가 사용하게 될 PWM 핀들이 모두 디지털 핀임을 알게 되었습니다. 그런데 우리는 digitalWrite()가 아닌 analogWrite()를 사용해야 한다는 점에 유의해 주세요.

digitalWrite()는 HIGH 또는 LOW의 값만 넣어 줄 수 있는 함수이고, analogWrite()는 0~255까지의 값을 넣어 줄 수 있는 함수입니다.(그리고 PWM 핀에서만 사용할 수 있는 함수임에 꼭 유의해주세요!)
analogWrite()를 호출해주면, 해당 핀은 정해진 duty cycle의 square wave1를 계속해서 출력하게 됩니다.

3. 회로

그림 2 : LED Fade 회로
[그림 2 : LED Fade 회로]

그림 2와 같이 회로를 구성합니다.
LED와 220옴 저항을 직렬로 연결하고 LED의 긴쪽(anode)을 디지털 3번 핀에 연결합니다. LED의 짧은 쪽(cathode)는 그라운드(GND) 핀에 연결합니다.

4. 코드

const int LED_PIN = 3;

int brightness = 0;
int fadeAmount = 5;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  analogWrite(LED_PIN, brightness);

  brightness += fadeAmount;

  if(brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }

  delay(30);
}
  • 1번 줄 : 3번 PWM핀을 사용합니다.
  • 6~8번 줄 : 3번 핀을 출력모드로 설정합니다.
  • 11번 줄 : 3번 핀에 brightness 값을 아날로그 출력으로 보냅니다.
  • 13번 줄 : brightness에 fadeAmount 값을 더해줍니다.
  • 15~17번 줄 : brightness값이 경계값(0또는 255)에 도달한 경우에 fadeAmount 값의 부호를 바꿔줘서 반대로 동작하게 해줍니다. 예를들어 점점 밝아지고 있는 상황에서는 fadeAmount값이 5일 것이고, brightness가 255에 도달하게 되면 경계값이므로 fadeAmount는 -5로 변하게 됩니다. 그 후로는 brightness값이 점점 줄어들면서 LED가 점점 어두워지고 brightness값이 0이 되면 다시 fadeAmount가 5가 되면서 점점 밝아지는 로직으로 변하게 됩니다. 이러한 동작을 무한 반복하게 됩니다.
  • 19번 줄 : 30ms 동안 대기합니다. (현재 LED의 밝기를 30ms 동안 유지하는 것입니다.)


5. 결과

그림 3 : LED fade 결과
[그림 3 : LED fade 결과]


  1. square wave를 업계에서 한글로 어떻게 번역해서 쓰고 있는지를 잘 모르겠네요. 어쨌든 0또는 1의 두가지 값만을 갖는 각진 형태의 파형을 말합니다.

안녕하세요. 오늘은 PWM(Pulse Width Modulation)에 대해 알아보고자 합니다.

이러한 기본 이론은 아두이노 뿐만 아니라 다른 곳에서도 사용될 수 있는 개념이므로 잘 알아두시는게 좋습니다.

PWM은 디지털 신호를 아날로그적인 의미로 해석하는 방법이라고 볼 수 있습니다. 우리가 알고있는 디지털 신호는 0(LOW)또는 1(HIGH)의 값만을 가지고 있습니다.
그런데 이런 이진값을 가지고 어떻게 아날로그 값처럼 보이게 할 수 있을까요?

답은 시간(주기)에 있습니다. 이를 전문용어(?)로 Duty Cycle이라고 부는데요, 한마디로 1을 유지하는 시간과 0을 유지하는 시간의 비율이라고 생각하시면 됩니다.

그림 1 : Pulse Width Modulation
[그림 1 : Pulse Width Modulation]

아두이노에서 analogWrite()함수를 사용할 때에 0~255사이의 정수 인자를 넣을 수 있습니다.

그림 1에서 0% Duty Cycle은 analogWrite(0)을 사용한 결과입니다. 0%라는 것은 1의 비율이 0%임을 의미합니다. 그래서 한 주기 동안 1이 한번도 나오지 않죠.
참고로 그림 1에서 초록색 수직선이 하나의 주기가 됩니다.

25% Duty Cycle은 analogWrite(64)를 사용한 결과가 됩니다. analogWrite()의 인자 범위가 최대 255이기 때문에 64 / 255가 대략 25가 나오게 됩니다. 여기에서는 1의 비율이 25%에 달합니다. 실제로 그림 1을 보면 1와 0의 비율이 25 : 75라는 것을 알 수 있습니다.

나머지 Duty Cycle도 마찬가지 원리로 설명이 가능합니다.
이렇게 한 주기동안 1과 0의 비율을 이용해서 디지털 신호를 마치 아날로그 신호인 것처럼 여러 단계의 값으로 사용할 수 있습니다.
PWM에 대한 이론적인 배경은 이것으로 끝내고 다음 시간에는 오늘 배운 이론을 바탕으로 LED를 점점 밝게, 점점 어둡게 하는 방법을 배워보겠습니다.

안녕하세요. 오늘은 LED를 깜빡이는 예제를 만들어 보겠습니다.

1. 필요한 하드웨어

  • 아두이노 보드
  • LED
  • 220옴 저항

1.1. LED

LED(Light Emitting Diode) 또는 발광 다이오드는 순방향 전압을 가했을 때 빛을 내는 반도체 소자입니다.
그림 1 : LED
[그림 1 : LED]

1.1.1. 정격 전압과 저항

저자는 일반적으로 많이 사용되는 LED를 사용하고 있는데요, 모든 전자부품에는 정격 전압이라는 것이 있습니다.
이게 뭐냐하면, 해당 전자 부품이 동작하는데에 필요한 적정한 값의 전압을 의미합니다.
해당 값보다 낮은 값을 할당해주면 제대로 동작하지 않을 수도 있고, 너무 높은 값을 할당하게 되면 부품이 파손될 수도 있습니다.

LED는 색상마다 정격 전압이 각각 다 다릅니다.
아래의 표는 제조사마다 내용이 달라질 수 있지만, 대략 이것과 비슷한 범위 안에 해당될 것 입니다.

색상 최소 전압 최대 전압 전류(일반) 전류(최대)
Red 1.8V 2.3V 20mA 50mA
Orange 2.0V 2.3V 30mA 50mA
Real Yellow 2.0V 2.8V 20mA 50mA
Emerald Green 1.8V 2.3V 20mA 50mA
Real Green 3.0V 3.6V 20mA 50mA
Sky Blue 3.4V 3.8V 20mA 50mA
Real Blue 3.4V 3.8V 20mA 50mA
Pink 3.4V 3.8V 20mA 50mA
White 3.4V 4.0V 20mA 50mA

[표 1 : LED 정격 전압 / 전류]

아두이노에서 제공하는 전압은 5V인데요, 적색 LED를 사용한다고 가정했을 때 LED에 걸리는 전압을 2V로 낮춰주기 위해서는 저항을 직렬로 연결해야 합니다. 그렇게해야 전압 강하가 일어나서 LED에 적정 전압이 걸리게 되죠.

필요한 저항을 구하는 식은 다음과 같습니다.

저항값 = (전원 전압 - LED 전압) / LED 전류


예를들어, 적색 LED를 사용한다고 했을 때 저항 값을 구해보죠.

  • 아두이노의 전원 전압 = 5V
  • LED 전압 = 2V
  • LED 전류 = 20mA

저항값 = (5 - 3) / 0.02 = 100[옴]

따라서 적색 LED를 사용할 때에는 100옴 이상의 저항을 사용하면 됩니다. 일반적으로 220옴 저항을 직렬 연결하면 무리없이 사용할 수 있습니다.

1.1.2. 방향성

LED는 PN접합이라는 구조로 되어 있습니다. 그래서 P형 부분에 +전압을 걸어줘야 하고, N형 부분에 -전압을 걸어줘야 합니다.
LED를 자세히 보면 두개의 다리가 길이가 다릅니다.

그림 2 : Anode / Cathode

[그림 2 : Anode / Cathode]

길이가 긴 쪽을 Anode라고 부르며 +전압을 걸어줘야하는 부분이고, 짧은 쪽을 Cathode라고 부르며 -전압을 걸어줘야하는 부분입니다.

주의 : 만약 전압을 반대로 걸어주게 되면 소자가 망가질 위험이 있습니다.

2. 회로 구성

위에서 설명한 것처럼 회로에서 LED와 저항을 직렬로 연결해줘야 합니다.
그림 3과 같이 회로를 구성합니다.

그림 3 : LED 회로
[그림 3 : LED 회로]

LED의 긴쪽을 아두이노 보드의 디지털 13번 핀에 연결하고 LED의 짧은 쪽을 저항과 직렬 연결하여 아두이노 보드의 GND(그라운드)에 연결합니다. 이 때, 저항을 13번 핀 쪽에 연결할지, 그라운드에 연결할지는 전혀 상관없습니다. 어느 쪽에 연결하든 직렬로만 연결하면 됩니다.

3. 코드

const int LED = 13;

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);   // LED를 켭니다
  delay(1000);               // 1초 동안 멈춥니다
  digitalWrite(LED, LOW);    // LED를 끕니다
  delay(1000);               // 1초 동안 멈춥니다
}
  • 1 줄 - 아두이노 보드의 디지털 13번 핀을 LED라는 상수로 정의합니다.
  • 3~5 줄 - LED 핀을 출력 모드로 설정합니다.
  • 7~12 줄 - 계속 반복 수행되는 코드입니다.
  • 8 줄 - LED 핀에 HIGH 값을 넣어 줍니다. HIGH 값을 넣는다는 것은 5V 전압을 가한다는 의미이므로 LED에 전류가 흐르게 되고 따라서 LED가 켜지게 됩니다.
  • 9 줄 - 1초 동안 멈춥니다.
  • 10 줄 - LED 핀에 LOW 값을 넣어 줍니다. LOW 값을 넣는다는 것은 전압을 가하지 않는다는 의미이므로 LED에 전류가 흐르지 않게 되고 따라서 LED가 꺼지게 됩니다.


4. 결과

결과는 연결된 회로의 LED가 1초 동안 켜졌다가 1초 동안 꺼졌다가를 반복해야 합니다.

그림 4 : 실제 연결한 회로
[그림 4 : 실제 연결한 회로]

+ Recent posts