본문 바로가기

메이커 Maker

아두이노 타이머 튜토리얼

반응형

아두이노나 ESP32로 만능 타이머를 만드려고 한다. 모드 선택 기능으로 알람이 울리는 시간 간격을 설정하고, 포모도로 기능을 넣는다. OLED에 현재 상태를 보여주고, 반복 횟수와 필요한 정보를 기록한다. 

 

우선 튜토리얼을 본다. 다른 유용한 타이머 제작 기사는 다음 링크를 참고한다.

 

아두이노 타이머 제작 튜토리얼

 

아두이노 개발 플랫폼은 2005년 처음 개발될 당시, 예술 디자인 작업에 특화된 간단한 프로그래밍 가능 장치로 구상되었습니다. 목표는 심도 있는 프로그래밍 전문 지식 없이도 아두이노 타이머 기능을 활용하여 간단한 전자 장치를 설계하고 사용할 수 있도록 지원하는 인터페이스를 만드는 것이었습니다. 이러한 단순함 덕분에 전 세계의 전자공학 초보자와 취미 활동가들에게 빠르게 보급되었고, 오늘날 아두이노는 아두이노 타이머 프로젝트 제작 , 프로토타입 개발, 개념 증명 디자인 제작 등에 널리 사용되고 있습니다.

 

아두이노로 시작하는 것도 좋지만, 궁극적으로는 AVR, ARM, PIC , STM 등과 같은 핵심 마이크로컨트롤러 로 넘어가 각각의 응용 프로그램을 프로그래밍하는 것이 좋습니다. 이는 매우 유익한 과정입니다.

 

왜냐하면 대부분의 표준 아두이노 타이머 코드는 digitalWrite(), analogWrite(), delay()와 같은 내장 함수에 의존하기 때문에, 아두이노를 사용할 때 저수준 머신 언어에서 어떤 일이 일어나는지 제대로 이해하지 못하는 경우가 많기 때문입니다.

 

아두이노 타이머 함수를 그대로 따라하는 대신, 레지스터를 조작하여 프로그램 로직에 따라 비트를 높거나 낮게 설정하는 임베디드 C 프로그래밍과 아두이노 타이머 인터럽트를 활용하게 될 것입니다. 이 튜토리얼에서는 아두이노 타이머 함수 , 레지스터 수준 프로그래밍, 그리고 Timer1 오버플로 인터럽트를 사용한 실용적인 아두이노 타이머 카운터 구현에 대한 포괄적인 가이드를 제공합니다.

 

아두이노 UNO 타이머 코드를 처음 접하는 초보자든 , 복잡한 타이밍 응용 프로그램을 개발하려는 사용자든, 이 튜토리얼은 기본적인 타이머 개념부터 푸시 버튼 컨트롤과 LCD를 사용한 완벽하고 작동하는 회로 구현까지 필요한 모든 것을 다룹니다.

 

이 아두이노 타이머 튜토리얼에서는 다음 내용을 배우게 됩니다.

  • Timer1 레지스터를 사용하여 아두이노 타이머 인터럽트를 프로그래밍하는 방법
  • delay() 함수를 사용하지 않고 효율적인 아두이노 타이머 코드를 작성하는 방법
  • 타이머/카운터 제어 레지스터(TCCR) 및 프리 스케일러 설정 이해하기
  • LED 제어 및 LCD 디스플레이를 갖춘 실용적인 아두이노 타이머 프로젝트 제작 방법
  • 타이머 오버플로우 인터럽트 서비스 루틴(ISR)을 생성하는 방법
  • 정확한 타이밍 제어를 위한 프리로더 값 계산 방법

 

LED 및 LCD 제어 기능을 갖춘 아두이노 타이머 인터럽트 시스템

 

  • 제작 시간: 3-5시간 | 가격: 15-25달러 | 난이도: 중급
  • 학습 내용: Timer1 인터럽트를 프로그래밍하고 정확한 타이밍을 위해 레지스터를 구성하는 방법.
  • 응용 분야: 대화형 LCD 디스플레이를 갖춘 정밀 타이밍 시스템 구축

 

목차

임베디드 전자공학에서 타이머란 무엇인가요?

아두이노 타이머 레지스터

아두이노 타이머 인터럽트

필수 구성 요소

회로도

아두이노 타이머 인터럽트와 delay() 함수 비교

아두이노 UNO 타이머 프로그래밍

자주 묻는 질문

└ 기술 요약 및 GitHub 저장소

정밀하고 유연한 시간 제어 회로를 제작하세요

 

임베디드 전자공학에서 타이머란 무엇인가요?

 

아두이노 타이머 인터럽트 는 정확한 시간 간격을 측정하는 하드웨어 기반 타이밍 메커니즘입니다. 모든 마이크로컨트롤러에는 클럭 발진기가 있으며, 아두이노 우노는 16MHz로 작동하여 처리 속도를 결정합니다. 클럭 주파수가 높을수록 처리 속도가 빨라집니다. 아두이노 타이머 함수는 클럭 주파수에 따라 증가하는 카운터를 사용합니다.

 

아두이노 우노에서 각 카운트는 1/16,000,000초(62나노초)가 걸리므로, 아두이노 타이머 코드를 사용하면 62나노초마다 명령이 실행됩니다. 미리 프로그래밍된 함수의 작동 방식을 이해하려면 그 원리를 살펴봐야 합니다. 예를 들어 `delay()` 함수는 아두이노에 사용되는 ATmega 마이크로컨트롤러의 타이머 카운터 레지스터 비트를 설정합니다. 이 아두이노 타이머 튜토리얼에서는 `delay()` 함수의 한계를 극복하기 위해 타이머 레지스터를 프로그래밍하는 방법을 보여줍니다.

 

아두이노 UNO의 타이머 기능:

 

아두이노 UNO에는 서로 다른 기능을 위해 사용되는 타이머가 세 개 있습니다.

 

타이머0: 8비트 타이머이며 delay(), millis()와 같은 타이머 함수에 사용됩니다.

 

타이머1: 이것은 16비트 타이머이며 서보 라이브러리에서 사용됩니다.

 

타이머2: 8비트 타이머이며 tone() 함수에서 사용됩니다.

 

아두이노 타이머 레지스터

 

타이머 설정을 변경하려면 타이머 레지스터를 사용합니다.

 

1. 타이머/카운터 제어 레지스터(TCCRnA/B):

 

이 레지스터는 타이머의 주요 제어 비트를 저장하며 타이머의 프리 스케일러를 제어하는 ​​데 사용됩니다. 또한 WGM 비트를 사용하여 타이머 모드를 제어할 수 있습니다.

 

프레임 형식:

 

TCCR1A 7 6 5 4 3 2 1 0
  COM1A1 COM1A0 COM1B1 COM1B0 COM1C1 COM1C0 WGM11 WGM10

 

TCCR1B 7 6 5 4 3 2 1 0
  ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10

 

 

프리스케일러:

 

TCCR1B의 CS12, CS11, CS10 비트는 프리 스케일러 값을 설정합니다. 프리 스케일러는 타이머의 클럭 속도를 설정하는 데 사용됩니다. 아두이노 우노는 1, 8, 64, 256, 1024의 프리 스케일러 값을 가지고 있습니다.

 

CS12 CS11 CS10 사용
0 0 0 시계 타이머 없음 정지
0 0 1 클릭 입출력 /1 사전 스케일링 없음
0 1 0 CLK i/o /8 (프리스케일러에서)
0 1 1 CLK i/o /64 (프리스케일러에서)
1 0 0 CLK i/o /256 (프리스케일러에서)
1 0 1 CLK i/o /1024 (프리스케일러에서)
1 1 0 T1 핀에 외부 클록 소스가 연결되어 있습니다. 클록은 하강 에지에서 작동합니다.  
1 1 1 T1 핀에 외부 클록 소스가 연결되어 있습니다. 클록은 상승 에지에서 작동합니다.

 

 

2. 타이머/카운터 레지스터(TCNTn)

 

이 레지스터는 카운터 값을 제어하고 프리로더 값을 설정하는 데 사용됩니다.

 

필요한 시간(초)에 대한 프리로더 값 계산 공식:

 

TCNTn = 65535 – (16x10 10 x시간(초) / 프리스케일러 값)

 

타이머1의 프리로더 값을 2초 동안 계산하려면 다음과 같이 하십시오.

 

TCNT1 = 65535 – (16x10 10 x2 / 1024) = 34285

 

아두이노 타이머 인터럽트

 

우리는 이전에 아두이노 인터럽트 에 대해 배웠고 , 타이머 인터럽트가 소프트웨어 인터럽트의 일종이라는 것을 알았습니다. 아두이노에는 다양한 타이머 인터럽트가 있으며, 이에 대해서는 아래에서 설명합니다.

 

타이머 오버플로우 인터럽트:

 

타이머가 최대값(예: 16비트 65535)에 도달하면 타이머 오버플로우 인터럽트가 발생합니다. 따라서 타이머 인터럽트 마스크 레지스터 TIMSKx의 TOIEx 비트가 활성화되면 ISR 인터럽트 서비스 루틴이 호출됩니다.

 

ISR 형식:

 

ISR(TIMERx_OVF_vect)
{
}

 

 

출력 비교 레지스터(OCRnA/B):

 

여기서 출력 비교 일치 인터럽트가 발생하면 인터럽트 서비스 ISR(TIMERx_COMPy_vect)이 호출되고 TIFRx 레지스터의 OCFxy 플래그 비트가 설정됩니다. 이 ISR은 TIMSKx 레지스터에 있는 OCIExy의 활성화 비트를 설정함으로써 활성화됩니다. 여기서 TIMSKx는 타이머 인터럽트 마스크 레지스터입니다.

 

타이머 입력 캡처:

 

다음으로, 타이머 입력 캡처 인터럽트가 발생하면 인터럽트 서비스 ISR(TIMERx_CAPT_vect)이 호출되고 TIFRx(타이머 인터럽트 플래그 레지스터)의 ICFx 플래그 비트가 설정됩니다. 이 ISR은 TIMSKx 레지스터의 ICIEx 활성화 비트를 설정함으로써 활성화됩니다.

 

필수 구성 요소

아두이노 UNO

푸시 버튼(2)

LED (모든 색상)

10k 저항(2), 2.2k(1)

16x2 LCD 디스플레이

회로도

 

아두이노 타이머 회로도

 

 

 

 

아두이노 UNO와 16x2 LCD 디스플레이 간의 회로 연결

 

16x2 LCD 아두이노 UNO
VSS 접지
VDD +5V
V0 LCD의 명암 조절을 위한 전위차계 중앙 핀
RS 8
RW 접지
이자형 9
디4 10
디5 11
디6 12
디7 13
에이 +5V
케이 접지

 

 

10K 풀다운 저항이 있는 푸시 버튼 두 개가 아두이노의 2번 핀과 4번 핀에 연결되어 있고, LED는 2.2K 저항을 통해 아두이노의 7번 핀에 연결되어 있습니다.

 

설치 모습은 아래 이미지와 같습니다.

 

 

아두이노 타이머용 회로 하드웨어

 

아두이노 타이머 인터럽트와 delay() 함수 비교

 

Arduino의 `delay()` 함수 대신 `timer` 함수를 사용하는 이유는 무엇일까요 ?

 

 사용하기 사용우승자

특징 delay() 함수 아두이노 타이머 인터럽트 권장 기능
코드 실행 다른 모든 코드를 차단합니다. 논블로킹, 멀티태스킹 타이머 인터럽트
정도 ±4 마이크로초 정확도 ±1 마이크로초 정확도 타이머 인터럽트
여러 작업 여러 개의 타이머를 지원하지 않습니다. 여러 타이머를 동시에 실행할 수 있습니다. 타이머 인터럽트
학습 곡선 사용하기 매우 쉽습니다 레지스터에 대한 지식이 필요합니다. delay() 함수
전문가용 생산 과정에서 거의 사용되지 않음 업계 표준 관행 타이머 인터럽트

 

 

아두이노 UNO 타이머 프로그래밍

 

이 아두이노 타이머 카운터는 타이머 오버플로우 인터럽트를 사용하여 특정 시간 동안 LED를 깜빡이는 방법을 보여줍니다. 푸시 버튼을 이용해 프리로더 값(TCNT1)을 조정하여 상호작용 가능한 아두이노 타이머 카운터 프로젝트를 구현해 봅니다. 전체 아두이노 UNO 타이머 코드는 자세한 설명과 함께 제공됩니다. 이 실습 중심 접근 방식을 통해 직접 구현해 보면서 아두이노 타이머 인터럽트 프로그래밍을 배울 수 있습니다.

 

이 프로젝트에서는 프리로더 값을 표시하기 위해 16x2 LCD를 사용 하므로 액정 라이브러리가 사용됩니다.

 

#include<LiquidCrystal.h>

 

 

아두이노 7번 핀에 연결된 LED 애노드 핀은 ledPin 으로 정의됩니다 .

 

#define ledPin 7

 

다음으로, 아두이노 UNO에 연결된 LCD 핀(RS, E, D4, D5, D6, D7)을 사용하여 액정(Liquid Crystal) 클래스에 접근하기 위한 객체를 선언합니다.

 

LiquidCrystal lcd(8,9,10,11,12,13);

 

그다음 프리로더 값을 3035로 설정하고 4초 동안 유지하세요. 프리로더 값 계산 공식은 위에 나와 있습니다.

 

float value = 3035;

 

다음으로 void setup() 함수에서 먼저 LCD를 16x2 모드로 설정하고 몇 초 동안 환영 메시지를 표시합니다.

 

  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("ARDUINO TIMERS");
  delay(2000);
  lcd.clear();

 

 

다음으로 LED 핀을 출력 핀으로 설정하고 푸시 버튼을 입력 핀으로 설정합니다.

 

  pinMode(ledPin, OUTPUT);
  pinMode(2,INPUT);
  pinMode(4,INPUT);

 

다음으로 모든 인터럽트를 비활성화하십시오.

 

noInterrupts();

 

다음으로 Timer1이 초기화됩니다.

 

TCCR1A = 0;

TCCR1B = 0;

 

프리로더 타이머 값이 설정되었습니다(초기값은 3035).

 

TCNT1 = value;

 

그런 다음, 프리 스케일러 값 1024가 TCCR1B 레지스터에 설정됩니다.

 

TCCR1B |= (1 << CS10)|(1 << CS12);

 

타이머 오버플로우 인터럽트는 타이머 인터럽트 마스크 레지스터에서 활성화되어 ISR을 사용할 수 있습니다.

 

TIMSK1 |= (1 << TOIE1);

 

마침내 모든 인터럽트가 활성화되었습니다.

 

interrupts();

 

이제 타이머 오버플로우 인터럽트에 대한 ISR(인터럽트 서비스 루틴)을 작성하세요. 이 ISR은 digitalWrite 함수를 사용하여 LED를 켜고 끄는 역할을 합니다 . 타이머 오버플로우 인터럽트가 발생할 때마다 LED의 상태가 변경됩니다.

 

ISR(TIMER1_OVF_vect)                   
{
  TCNT1 = value;                               
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1); 
}

 

 

void loop() 함수 내에서는 푸시 버튼 입력을 이용하여 preloader 값을 증가시키거나 감소시키고, 그 값을 16x2 LCD에 표시합니다.

 

  if(digitalRead(2) == HIGH)
  {
    value = value+10;             //Incement preload value
  }
  if(digitalRead(4)== HIGH)
  {
    value = value-10;            //Decrement preload value
  }
  lcd.setCursor(0,0);
  lcd.print(value);
}

 

자주 묻는 질문

 

⇥ 어떤 용도에 어떤 아두이노 타이머 함수를 사용해야 할까요?

 

아두이노 타이머 함수는 타이머 유형에 따라 다릅니다. timer0(8비트)은 delay()와 millis() 함수를 사용하고, timer1(16비트)은 서보 제어 및 장시간 작동에 가장 적합하며, timer2(8비트)는 tone() 함수를 사용합니다. LED 제어와 관련된 많은 아두이노 프로젝트에서는 유연성과 타이밍 정확도를 높이기 위해 timer1을 선택합니다. 오버플로 인터럽트를 사용하면 timer1을 간단하게 구현할 수 있습니다.

 

⇥ 초보자가 할 수 있는 아두이노 타이머 프로젝트에는 어떤 것들이 있을까요?

 

몇 가지 기본적인 아두이노 타이머 프로젝트로는 LED 깜빡임(딜레이 없음), 시계 표시, PWM 모터 제어, 센서 데이터 지연 로깅, 멀티태스킹, 실시간 데이터 로깅 등이 있습니다. 처음 시작하는 경우라면 timer1 오버플로우 인터럽트를 이용한 기본적인 LED 제어부터 시작해 보고, 차차 LCD 디스플레이와 버튼을 활용한 다양한 타이머 프로젝트에 도전해 볼 수 있습니다.

 

⇥ 아두이노 UNO에는 타이머가 몇 개 있으며, 각각의 차이점은 무엇인가요?

 

아두이노 UNO에서 타이머를 코딩할 때는 Timer0(8비트 [0-255]), Timer1(16비트 [0-65535]), Timer2의 세 가지 타이머를 사용할 수 있습니다. Timer1은 대부분의 프로젝트에서 가장 긴 지속 시간을 제공하고, 특정 시간 간격을 필요로 하는 애플리케이션에서 가장 높은 수준의 정밀도를 제공하므로, 시간 매핑이 필요한 프로젝트에서는 이 세 가지 타이머 중 하나를 선택하여 사용할 수 있습니다.

 

⇥ 아두이노 타이머 프로그래밍을 배우는 가장 좋은 방법은 무엇일까요?

 

아두이노 타이머 튜토리얼을 효과적으로 활용하는 가장 좋은 방법은 먼저 타이머 레지스터(TCCR, TCNT, TIMSK)를 이해하고, 대부분의 강의에서 제공하는 간단한 LED 기반 프로젝트를 통해 타이머 프로그래밍을 연습하고, 프리 스케일러 계산법과 ISR 함수 사용법을 배우는 것입니다. 몇 가지 실습 프로젝트를 만들고 오실로스코프로 검증하며, 각 레지스터에 대한 설명이 담긴 관련 데이터시트를 읽고, Timer1의 기초부터 시작하여 여러 개의 타이머를 사용하는 고급 프로젝트까지 단계적으로 학습해 나가세요 .

 

⇥ 아두이노 타이머 인터럽트가 제대로 작동하지 않는 이유는 무엇인가요?

 

아두이노 타이머 인터럽트 오류의 가장 흔한 원인은 다음과 같습니다. 잘못된 프리 스케일러 설정, 잘못된 프리로더 설정, 인터럽트 활성화 비트(TIMSK1)를 켜는 것을 잊은 경우, 타이머를 사용하는 다른 라이브러리와의 충돌, 그리고 잘못된 ISR 구문입니다. 타이머 설정 시에는 항상 noInterrupts() 함수를 사용하여 인터럽트를 비활성화하고, 설정해야 하는 레지스터를 정확히 파악하며, ISR 함수가 타이머 벡터(TIMER1_OVF_vect)와 동일한 이름을 사용하고 올바르게 정의되었는지 다시 한번 확인하십시오.

 

전체 코드는 아래와 같습니다.

 

#include<LiquidCrystal.h>            //LCD display library
#define ledPin 7
LiquidCrystal lcd(8,9,10,11,12,13);
float value = 3035;                   //Preload timer value (3035 for 4 seconds)
void setup()
{
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("ARDUINO TIMERS");
  delay(2000);
  lcd.clear();
  pinMode(ledPin, OUTPUT);
  pinMode(2,INPUT);
  pinMode(4,INPUT);
  noInterrupts();                       // disable all interrupts
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = value;                        // preload timer
  TCCR1B |= (1 << CS10)|(1 << CS12);    // 1024 prescaler 
  TIMSK1 |= (1 << TOIE1);               // enable timer overflow interrupt ISR
  interrupts();                         // enable all interrupts
}
ISR(TIMER1_OVF_vect)                    // interrupt service routine for overflow
{
  TCNT1 = value;                                // preload timer
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);  //Turns LED ON and OFF
}
void loop()
{
  if(digitalRead(2) == HIGH)
  {
    value = value+10;             //Incement preload value
  }
  if(digitalRead(4)== HIGH)
  {
    value = value-10;            //Decrement preload value
  }
  lcd.setCursor(0,0);
  lcd.print(value);
}

 

 

기술 개요 및 GitHub 저장소

 

이 프로젝트는 시스템 아키텍처, 구성 요소 및 작동 원리에 대한 기술적 개요를 제공합니다. 하드웨어 회로도, 소프트웨어 흐름 및 구현에 대한 자세한 내용도 포함되어 있습니다. 소스 코드와 지원 파일은 협업을 위해 GitHub 저장소에서 확인할 수 있습니다.

 

다운로드 버튼

 

이처럼 타이머를 사용하여 아두이노 프로그램에서 지연 시간을 만들 수 있습니다. 아래 영상 에서 푸시 버튼을 이용해 프리로더 값을 증가시키거나 감소시켰을 때 지연 시간이 어떻게 변하는지 확인해 보세요.

 

정밀하고 유연한 시간 제어 회로를 제작하세요

 

다양한 플랫폼에서 구현되는 여러 타이머 방식을 살펴보면서 시간 기반 제어 시스템에 대한 탄탄한 기초를 다지세요.

 

튜토리얼의 출처는 여기입니다. 이 링크를 따라가세요.

 

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩