아두이노프로세싱 프로그래밍

아두이노 타이머로 저글링하는 코딩을 해보자

coding art 2019. 3. 25. 19:14
728x90




아주 기본적인 아두이노 타이머 코딩을 한번 해 보았다. 하지만 코딩을 하면서도 그 의미를 파악하기 쉽지 않았으며 일주일 정도 독학을 해보았다. ? 이해가 잘 안되니까? 독학하면 이해가 잘 되나? 그런 건 아니지만 아두이노 기본적인 코딩을 좀 하니까 이모 저모 생각하다 보면 저절로 이해가 되지 않을까 하는 기대를 품었었다. 1년 전에도 아나콘다 설치 실패 후 3달 후에 성공했던 적도 있었고 라즈베리 파이 보드에 OpenCV 설치도 근 1년 후 성공한 기억이 있다.

 

뭐든지 합리적으로 이해하려고 해도 잘 안되는 경우가 있는데 이럴 때 무대뽀로 해보는 것도 나쁘지 않다.

 

아두이노 보드에는 CPU 보드가 있다는 것은 삼척동자와 동순이도 다 알 것이다. 하지만 삼척 동자/동순이들도 하나를 더 알아야 하는데 CPU 가 내부적으로 사용하는 타이머들이 있다는 점이다. AVR 코딩까지 하는 마이크로 컨트롤러 선수급이라면 당연히 알겠지만 필자와 같이 아두이노 코딩을 취미로 독학하는 경우에는 당연히 모를 수밖에.

 

아두이노 코드에서 쉽게 타이머 코드를 사용하는 방법은 delay() 명령과 아울러 if 제어문과 결부하여 millis() 명령을 사용하는 방법이며 이미 독자들에게도 소개를 했었다. millis() 명령 사용법에 관해서는 의외로 블로그 방문자가 많았던 기억이 있다. 이는 독자들이 아두이노 CPU 사용법을 깊이 있게 추구한다는 의미로 보인다.

아두이노 타이머 사용에 있어서 주의를 기울여야 할 점은 우리가 IDE에서 작성한 순차적으로 작동하는 실행 코드 중에 아두이노 CPU 가 알아서 실행하여 결과를 리턴해 주는 기능이 있다는 사실이다. 이런 코딩 기술을 뒤져 보니까 callback 이라 하는데 아직 대략적으로 껍데기만 이해하고 있다. 그래서 그 기능을 알아보기 위해 위와 같이 디지털 핀 6번에서 LEDON OFF 하는 회로와 아울러 아날로그 포트 A0에서 가변 저항 값을 읽어 들이는 간단한 배선의 회로를 준비하였다. 가변저항의 범위는 대략 910KΩ 이지만 아두이노는 01023까지의 정수 값으로 읽어 들인다. 요 정도의 정밀도를 10 비트 ADC 라고들 한다.


 

지난번 블로그에서도 한번 소개하였지만 pinMode 지정 후 digitalWrite 명령을 사용하여 LED를 껌뻑거리게 코딩할 수 있다. 대개 그렇게 배웠다. 하지만 Timer.h 라이브러리 class 명령인 oscillate를 사용하여도 유사한 코딩이 가능하다는 점이다. 이번 연습 예제에 6번 핀에서 1초에 한번씩 껌뻑이는 코드를 넣었다.

 

동시에 1.234초마다 한번씩 아날로그 포트 A0에서 가변저항 값을 읽어 들이는 every 라는 명령도 넣어 두었다. 즉 아두이노가 1초마다 뭔가를 하고 또 1.234초마다 뭔가를 하도록 setup()에 프로그램 하였다. 얘들은 loop()에서 update 명령을 사용하면 아두이노 CPU 내부와 내통하여 작동한다. 내통이란 음모를 꾸민다는 의미가 아니라 코드와 CPU 가 내부적으로 알아서 통신한다는 의미이다.

 

걔네들이 실제로 내통하는지 필자도 의심스러워서 loop()를 돌 때 마다 +1 만큼 씩 덧셈하여 카운트 값을 0.5초마다 시리얼 모니터에 출력하는 간단한 코딩을 추가 하였다.

 

이 코드를 실행하면 LED 1초에 한번씩 껌뻑이고 시리얼 모니터를 보면 1,2,3,... 증가하는데 일정한 값 즉 1.234초마다 한번씩 가변 저항 값을 읽어 01023 사이의 값을 출력해 준다.

 

타이머의 callback 기능 없이 이러한 아두이노 코드를 작성한다면 불가능한 것은 아니지만 등골이 휠 수 있다. 15초면 쉽지만 1초 와 1.234초라면 if 제어문과 millis 명령만을 사용하여 만만치 않을 것이다. 하지만 타이머 라이브러리와 callback 명령을 사용하면 이런 방식으로 여러 개 아마도 10개까지 ON OFF 타이머 저글링 하면서 장난을 놀 수 있을 듯하다.

   


 

//timer_excersize_04

#include "Timer.h"
Timer t;
int pin = 6;
int count = 0;

void setup()  {

 Serial.begin(9600);
 pinMode(pin, OUTPUT);
 t.oscillate(pin, 1000, LOW);
 t.every(1234, takeReading);
}

void takeReading()  {
  Serial.println(analogRead(0));
}

void loop()  {
 t.update();
 count =  count + 1;
 Serial.println(count);
 delay(500);
}//끝