아두이노 real-time structure

2018. 7. 20. 23:22HARDWARE/Arduino

Arduino Uno에서 real-time structure를 구현하는 방법에 대해 알아보겠습니다. Arduino에서 void loop의 경우 loop 안에 수행해야 할 명령어가 적은 경우 수행 시간이 짧지만 수행해야 할 명령어가 많은 경우는 수행 시간이 길어집니다. 즉, 일정한 sampling period를 가지고 연산을 하는 것이 아니게 됩니다. 하지만 real-time 제어를 하기 위해서는 일정 주기로 계측하고, 연산하여 명령을 해주는 일정한 sampling period를 가지는 loop가 필요하게 됩니다.

그림. 1 Real-time structure

다음과 같이 코드를 실행하게 되면 표 1과 같이 일정한 Interval에 한 번씩 if 문 안에서 연산을 하게 됩니다. Interval 시간을 조정하면 조정한 시간이 바로 sampling period가 되겠습니다.

unsigned long currentMillis = millis(); 

if(currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
  }

표. 1

하지만 sampling period가 작아지면 연산이 빠른 주기로 되겠지만 어느 이하의 주가기 되면 한계에 부딪히게 됩니다. 아래와 같은 코드를 통해서 sampling period가 몇 이하부터는 연산이 불가능한지 알아볼 수 있습니다. 실시간으로 t=currentMillis - previousMillis 를 출력하면, 4 이하는 출력이 안되는 것을 확인할 수 있습니다. 즉, 4ms 이하는 Arduino uno 입장에서 연산이 어렵다는 것을 의미합니다.


const int Pin = 7;
long interval = 100;
int ledState = LOW;
long previousMillis = 0;

void setup(){
pinMode(Pin, OUTPUT);
Serial.begin(9600);
}

void loop(){
unsigned long currentMillis = millis(); 
// unsigned 32비트 양수 정수
if(currentMillis previousMillis >= interval) {
int t=currentMillis - previousMillis;
Serial.println(t);
previousMillis = currentMillis;
if (ledState == LOW) { ledState =HIGH; }
else { ledState = LOW; }
digitalWrite(Pin, ledState);
  }
}

일정한 sampling period로 코드를 실행하기 위해서 다수의 센서 입력과 복잡한 제어 연산을 수행하기 위해서는 최소 real-time을 꼭 체크하기를 권장합니다.

[출처] Real-time structure|작성자 엠에스리