본문 바로가기
대한상공회의소 스마트팩토리 교육/IoT 디바이스 개발

[IoT 디바이스 개발] 아두이노«독학-1» : Blink 예제 / Fading 예제 / millis 함수

by 나는영하 2022. 1. 23.

※ 주의사항 

본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!

감사합니다😁

 

안녕하세요!!

"IoT 디바이스 개발" 과목을 오늘부로 처음 배우기 시작했습니다.

앞으로 약 100시간 동안 수업을 진행할텐데 수업을 진행하면서 사용할 장비와 자재들을 소개하겠습니다.!! 

실습 장비 : Arduino Mega R3(좌) / 실습 자재 : 아두이노 키트_EK100(중) / 아두이노 키트 구성품(우) 

앞으로 아두이노 메가와 함께 여러 실습을 진행하면서 배운 지식들을 본 블로그에 공유하겠습니다!!😁

그리고 본 과정에서 수업으로 들은 내용은 글 제목에 "아두이노«수업»" 이라는 문구를 사용하고

수업과 별개로 책("아두이노 배우면서 사물인터넷(IoT) 직접 코딩하기")을 보면서

혼자 익힌 내용들은 "아두이노«독학»" 이라는 문구로 나누어 구분짓겠습니다

 

오늘은 아래와 같은 내용을 확인해보겠습니다.

 

Blink 예제

Fading 예제

millis 함수


1. 간단한 LED 회로 구성 후 LED Blink 동작 수행 (Digital I/O)

간단한 LED 회로 구성(좌) / LED 점멸 동작을 위한 코딩(우)

※ 회로 구성시 주의사항

 저항은 상관 없지만 다이오드의 경우 극성이 존재합니다!!(다리가 긴 쪽이 +, 짧은 쪽이 - 입니다)

 

 1) 사용함수 

pinMode, digitalWrite, delay

- pinMode : 아두이노에 있는 핀을 디지털 입력 또는 출력으로 설정하는 함수! // pinMode(pin, mode)

- digitalWrite : 디지털 핀에 High or Low를 출력하는 함수! // digitalWrite(pin, value)

- delay : 1/1000초 즉 1ms 단위로 지연을 시켜주는 함수!! //delay(ms)

 

 2) 동작수행

Line 2 : 13번 핀을 출력으로 설정한다는 의미로 사용됨

Line 6, 8 : 각각 High(5V), Low(0V)를 출력해서 LED를 점등하고 소등 시킴

Line 7, 9 : 1000ms 즉 1초간 램프의 점등과 소등의 행동을 지연시킴

 

위와 같이 구성하고 컴파일 후 업로드를 하면

13번 핀에 5V가 연결되어있는 초록색 LED가 1초 주기로 점멸하게 됩니다!!

 


 

2. Analog I/O를 통한 LED Fading 동작 수행

LED Fading 동작 수행 소스코드

Analog I/O 명령어는 위에서 사용한 Digital I/O 명령어와는 다른점이 있습니다.

Digital 신호는 0과 1값의 신호만 받아서 사용을 하지만 Analog 신호는 0~255 사이의 값을 사용합니다. 

 

 1) 사용함수 

analogWrite, delay

- analogWrite : 설정된 핀에 0 ~ 255 사이의 범위 값을 출력하는 함수.

- delay : 지연동작 수행

 

 2) 동작수행

Line 1 : 'ledPin' 이란 변수명를 선언하고 값 11을 저장합니다. (11번 핀)

Line 7 : for 문을 사용해서 fadeValue 값이 0에서부터 255까지 5씩 증가하는 반복문 구성

Line 8 : 11번 핀을 fadeValue에 저장된 값을 출력하여 줌(fadeVlaue = led의 세기를 의미함)

Line 9 : 0.03s 지연시킵니다. 

※ analogWrite와 PWM

analogWrite 함수는 PWM핀을 통해 0V 또는 5V의 사각 파형을 내보냅니다.

PWM은 Pulse Width Modulation의 약자이며 파형 폭 조절을 의미합니다.

즉 0과 5V로만 구성된 파형 → 0~255 사이의 범위를 가지는 파형으로 변할 수 있는 방법은

5V의 비율이 높을수록 255에 가깝고 0V의 비율이 높을수록 0에 가까워서 LED가 어두워지는 것입니다.


 

3. LED Blink + fading 다중 기능 구현 및 문제점

위의 1번과 2번에서 배운 LED Blink와 LED fading 기능을 한 코딩소스에 결합해서 다중기능을 하도록 만들어봤습니다.

왼쪽의 방식대로 다중기능을 구현한다면 동작 루틴이 13번핀의 LED가 한번 2초 주기로 한번 깜빡이고

11번 핀의 LED가 Fading 동작을 수행할 것입니다.

오른쪽의 방식대로 다중기능을 구현한다면 동작 루틴이 13번핀의 LED가 켜지고 동시에 11번 핀의 LED도 같이 점점 밝아집니다. 그리고 13번 핀의 LED가 꺼지면 동시에 11번 핀의 LED도 같이 점점 어두워 집니다. 

 

발생하는 문제점은 무엇일까요???😥

먼저 왼쪽의 방식은 각각의 동작이 독립적으로 수행하지 않고 순차적으로 수행한다는 점입니다.

오른쪽의 방식은 각각의 동작 루틴 주기를 정확히 맞출 수 없다는 점입니다.

(13번핀이 켜지고 꺼지기까지 약간의 딜레이가 발생합니다)

 

이를 해결하기 위해 millis 함수를 배워서 적용해 보겠습니다.


 

4. millis 함수를 사용한 독립 루틴의 주기적인 작업 처리

4-1. millis 함수 적용 예제

첫번째로 배웠던 LED Blink 동작과 동일한 동작을 수행하는 코드입니다.

delay 함수 대신 millis 함수를 사용했습니다.

 

 1) 사용함수 

pinMode, digitalWrite, millis

- millis : 아두이노가 구동된 이후 부터 현재 시간을 1/1000초 단위로 알려주는 함수

 

 2) 동작수행

Line 1 : 'ledPin' 변수를 선언하고 13의 값을 입력합니다.

(const는 변수 앞에 붙어서 값과 주소를 변경할 수 없도록 해줍니다.)

Line 14 : 'currentMillis' 실수형 변수에 millis 함수의 값을 저장해 줍니다. 

Line 16~17 : 아두이노 기준 현재 시간에서 기준 시간을 뺀 값이 1초 보다 크거나 같으면

'previousMillis'변수에 'currentMillis'변수 값을 저장해 줍니다.

Line 19~22 : Line16에서 수행한 조건문이 참이면 LED의 출력값을 정해줍니다.

Line 24 : 13번 핀에 'ledState' 값을 출력해서 LED를 점등하거나 소등시킵니다.

 

4-2. millis 함수를 사용해서 다중기능구현(Blink + fading) 문제점 해결하기

blink 함수부(좌) / fading 함수부(우)

- setup()과 loop() 함수부에 각각 blink_setup, fading_setup, blink_loop, fading_loop의 사용자정의 함수를 선언하고

아래쪽에 사용자 정의 함수 입력하는것을 알 수 있습니다.(객체지향)

- 그외의 내용들은 위쪽의 내용들을 결합한 부분으로 크게 어렵지 않게 이해할 수 있습니다.

댓글