공대생과 공부하기/전기공학 실험 보고서

[전기전자공학 실험] 아두이노 타이머(Timer) 기초 : 결과보고서

전기과 팡팡이 2019. 9. 23. 21:39
728x90

 


<실험 결과>

1) 실험에서 작성한 각 프로그램의 작성, 실행 및 디버깅 과정을 순서대로 자세히 기술한다.

2) 프로그램 실행 후 회로가 어떻게 동작 하는 지와, 관련된 측정 결과로 최대한 정확히 묘사해 기술한다.

<결과 분석>

3) 위 결과를 얻기 위해 사용한 핵심 함수들과 사용한 이유를 설명하고, 소스코드 각 라인이 어떤 역할을 했으며, 어떻게 실험 결과로 이어졌는지 구체적으로 분석 기술한다.

 

[타이머를 이용한 LED 제어]

 

<실험순서>

- 아두이노 우노 보드 디지털 ouput 핀 중 하나에 출력이 OFF이면 LED가 켜지고, 출력이 ON이면 LED가 꺼지도록 회로를 구성한다.

- 아두이노 타이머 기능과 SimpleTimer 라이브러리를 활용하여, LED가 1초에 한 번 toggle 되고, 동시에 시리얼모니터에는 연속적으로 디지털 ouput 출력값이 출력되도록 프로그램을 작성한다.

- 컴파일 및 업로드한 후 그 결과를 확인한다.

 

<코드>

#include <SimpleTimer.h> 
#define LED 13 
SimpleTimer timer; 
boolean ledOn=false; 

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
  timer.setInterval(1000, toggle);
} 

void loop() { 
  timer.run(); 
  Serial.print("LED SIGNAL: "); 
  Serial.println(digitalRead(LED));
}

void toggle() { 
  if(ledOn==true) {
    digitalWrite(LED,LOW);
  } 
  else { 
    digitalWrite(LED,HIGH); 
  } 
  ledOn=!ledOn; 
}

 

1)

 프로그램의 작성은 다운받은 SimpleTimer 라이브러리를 예제 코드에서 불러온 후 라이브러의의 function을 이용하였다. 코드는 위와 같으며, 컴파일하여 코드 오류가 없음을 확인하고 우노 보드에 프로그램을 업로드 하였다.

2)

 회로가 프로그램이 업로드되고 바로 실행이 되며, 하드웨어를 이용한 결과 확인은 D13 핀에 연결된 LED로 확인할 수 있다. 소프트웨어를 이용한 것은 시리얼 모니터를 이용하여 ON/OFF를 1/0으로 그 값을 확인할 수 있다. LED는 1초마다 ON -> OFF, OFF -> ON을 반복한다.우노 보드의 내장 LED 또한 외부 LED와 같이 동작한다. 시리얼 모니터에서는 LED의 toggle에 따라 1과 0의 값을 주기적으로 toggle하여 출력한다.

3)

 이 회로의 동작을 millis() 함수를 사용해서 똑같이 구현할 수 있으나 코드가 길어진다. SimpleTimer 라이브러리를 이용해 코드를 간결하게 구현했다. 전체적인 코드의 흐름은 boolean 변수를 이용해서 이 변수에 따라 LED의 값이 toggle 되는 것이다. ledOn을 false로 초기화 시켜두었으며, timer.setInterval() 함수는 설정한 시간마다 지정된 함수를 실행시키는 함수이다. 코드에서는 이 함수가 1초마다 toggle() 함수를 실행시킨다. void toggle()은 사용자 지정함수로써 사용자가 작성한 코드대로 동작한다. 이 사용자 지정함수에서는 if~else 문을 사용하여 ledOn==true 이면 LED는 OFF, false이면 LED는 ON이 된다. 이 구문을 벗어나고 나면 ledOn=!ledOn; 으로 반전된 값(false or true)을 boolean 변수인 ledOn에 대입하고, toggle() 함수의 실행이 끝난다. 이 동작에서 처음 시작은 boolean ledOn=false; 로 초기화 되어 있으므로 LED가 ON이 되면서 ON/OFF를 1초마다 반복하게 된다.

 

[타이머를 이용한 스위치/LED 멀티태스킹]

 

<실험순서>

- 아두이노 우노 보드의 적당한 디지털 input 핀을 선정한 후, 스위치를 누르면 ON, 떼면 OFF가 입력되도록 회로를 구성한다.

- 또한 추가로 적당한 output 핀을 선정한 후, 출력이 ON이면 LED가 켜지고, 출력이 OFF이면 LED가 꺼지도록 회로를 구성한다.

- 아두이노의 타이머 기능과 SimpleTimer 라이브러리를 활용하여, 스위치 입력을 매 0.1초 마다 한 번 인식하고, 스위치를 누르고 있는 동안에는 LED가 0.5초에 한 번 toggle 되고, 떼고 있는 동안에는 2초에 한 번 toggle 되도록 프로그램을 작성한다.

- 컴파일 및 업로드한 후 스위치를 눌렀다 떼며 그 결과를 확인한다.

 

<코드>

#include <SimpleTimer.h>
#define LED 13
#define SWITCH 8
SimpleTimer timer;
int SWsignal;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(SWITCH, INPUT);
  Serial.begin(9600);
  timer.setInterval(500, toggleON);
  timer.setInterval(2000, toggleOFF);
  timer.setInterval(100, notify);
}

void loop() {
  timer.run();
}

void toggleON() {
  if(SWsignal==HIGH) {
    if(digitalRead(LED)==HIGH) {
      digitalWrite(LED,LOW);
    }
    else {
      digitalWrite(LED,HIGH);
    }
  }
}

void toggleOFF() {
  if(SWsignal==LOW) {
    if(digitalRead(LED)==LOW) {
      digitalWrite(LED,HIGH);
    }
    else {
      digitalWrite(LED,LOW);
    }
  }
}

void notify() {
  SWsignal=digitalRead(SWITCH);
  Serial.print("SWsignal:");
  Serial.println(SWsignal);
}

 

 

1)

<타이머를 이용한 LED 제어> 실험과 마찬가지로 위 코드처럼 프로그램을 작성, 실행 및 디버깅의 과정을 마쳤다.

2)

스위치는 풀다운되도록 저항을 GND에 연걸하여 open 상태에서는 LOW의 값을 갖는다. 프로그램 실행 후, 우노 보드는 0.1초 마다 스위치의 신호를 읽는다. 이 신호에 따라 LED의 출력이 변화한다.

스위치가 open 상태라면 초기에 LED는 OFF인 상태에서 2초 뒤에 ON으로 toggle 되며, open 상태가 유지된다면 다시 2초 뒤에 OFF로 toggle 된다.

스위치가 short 상태라면 초기에 LED는 ON인 상태에서 0.5초 뒤에 OFF로 toggle 된다. 마찬가지로 short 상태가 유지된다면 0.5초 뒤에 다시 ON으로 toggle 된다.

그러나 스위치의 신호를 0.1초 마다 읽어들인다는 것은 연속적인 값이 아닌 그 시간의 단면적인 값을 읽어들이는 것이다. 즉, 0.1초 보다 짧은 시간에 스위치의 신호가 바뀌었다가 복귀한다면, 우노 보드는 그 값을 읽지 못하므로 회로의 동작에 영향이 가지 않는다.

위 오실로스코프 파형을 보면 y축을 기준으로 좌측은 스위치가 ON, 우측은 OFF인 상태로 한칸에 500ms의 값을 갖는다. ON 측에서는 1초에 한주기로 500ms 마다 약 0V와 5V를 왔다갔다하고, OFF 측에서는 4초에 한 주기로 2000ms 마다 약 0V와 5V를 왔다갔다하는 구형파로 나타난다. 따라서 앞서 말한 동작이 그대로 오실로스코프의 파형으로 나타나고 있다.

3)

pinMode() 함수로 LED와 스위치를 각각 OUTPUT과 INPUT으로 설정했다.

읽어들인 스위치 신호값을 육안으로 관찰하기 위해서 Serial.begin(9600)과 Serial.print()를 사용했다.

timer.setInterval() 함수를 3개를 사용하여 0.1초 마다 스위치 신호를 읽는 함수 / 0.5초 마다 LED가 toggle하는 함수 / 2초 마다 LED가 toggle 하는 함수를 실행하게 하였다.

timer.run()으로 타이머를 활성화시켜서 시간에 따른 동작이 가능하게 하였다.

void notify()는 스위치 신호를 읽어들이는 함수로 사용했다. digitalRead(SWITCH)로 읽어들인 신호값을 SWsignal 변수에 넣고, 그 값을 확인하기 위해서 notify() 안에 Serial.print()로 넣었다.

void toggleON()과 void toggleOFF()는 같은 동작을 하는 함수지만, 동작하는 시간이 다르기에 두 함수로 나누어 사용했다. 이 두 함수에서 if문 안에 다시 if~else문을 넣어서 0.1초 간격으로 읽어들인 SWsignal 값이 HIGH/LOW일 때, LED의 출력이 toggle 되게 하였다.

위의 코드에서는 void setup() 안에 timer.setInterval()을 넣었는데, void loop() 안에서 if~else 문을 사용해서 timer.setInterval()을 넣었다면 같은 동작을 하는 toggleON(), toggleOFF() 두개로 나누지 않고 하나의 함수로 동일한 동작을 구현할 수 있었을 것이다.

 


 아래의 코드는 <타이머를 이용한 스위치/LED 멀티태스킹>에서의 동작을 라이브러리를 사용하지 않고 동일한 동작을 구현한 것입니닷. 주요 함수는 millis()


const int ledPin = LED_BUILTIN;
const int SW = 7;
int ledState = LOW;
unsigned long previousMillis =0;
unsigned long previousMillisA =0;

void setup(){
  pinMode(ledPin,OUTPUT);
  pinMode(SW, INPUT);
}

void loop(){
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis >= 100){
    previousMillis = currentMillis;
    if(digitalRead(SW)==LOW){
      unsigned long currentMillisA = millis();
      if(currentMillisA - previousMillisA >= 2000){
        previousMillisA = currentMillisA;    
        if(ledState == LOW){
          ledState = HIGH;
        }else{
          ledState = LOW;
      }
      digitalWrite(ledPin,ledState);
    }
  }
  else{
    unsigned long currentMillisA = millis();
    if(currentMillisA - previousMillisA >= 500){
      previousMillisA = currentMillisA;
      if(ledState == LOW){
        ledState = HIGH;
      }
      else{
        ledState = LOW;
      }
      digitalWrite(ledPin,ledState);
    }
  }

 

타이머를 이용한 스위치/LED 멀티태스킹 동작

 

유익하셨다면 좋아요와 구독 꾹 부탁드립니다 ㅎㅎ