2018. 7. 20. 23:22ㆍHARDWARE/Arduino
Arduino Uno에서 real-time structure를 구현하는 방법에 대해 알아보겠습니다. Arduino에서 void loop의 경우 loop 안에 수행해야 할 명령어가 적은 경우 수행 시간이 짧지만 수행해야 할 명령어가 많은 경우는 수행 시간이 길어집니다. 즉, 일정한 sampling period를 가지고 연산을 하는 것이 아니게 됩니다. 하지만 real-time 제어를 하기 위해서는 일정 주기로 계측하고, 연산하여 명령을 해주는 일정한 sampling period를 가지는 loop가 필요하게 됩니다.
다음과 같이 코드를 실행하게 되면 표 1과 같이 일정한 Interval에 한 번씩 if 문 안에서 연산을 하게 됩니다. Interval 시간을 조정하면 조정한 시간이 바로 sampling period가 되겠습니다.
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
}
하지만 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|작성자 엠에스리
'HARDWARE > Arduino' 카테고리의 다른 글
[자율주행RC] 00. 준비할 사항 (0) | 2018.09.15 |
---|---|
[아두이노] constrain 함수 - 변수 범위 제한 (0) | 2018.08.14 |
arduino PWM 주파수 변경 (0) | 2018.07.20 |
arduino port manipulation (0) | 2018.07.20 |
HC-06 블루투스 설정 / 문자열 전송 (0) | 2018.07.20 |