- 멀티 태스킹이란?
- Arduino에서 delay ()를 건너 뛰는 이유는 무엇입니까?
- millis ()를 사용하는 이유는 무엇입니까?
- 필요한 구성 요소
- 회로도
- 멀티 태스킹을위한 Arduino UNO 프로그래밍
멀티 태스킹은 효율성, 유연성, 적응성과 생산성을 향상 하나 이상의 프로그램을 동시에 실행할 수있는 혁명 컴퓨터를 주도하고있다. 임베디드 시스템에서 마이크로 컨트롤러는 멀티 태스킹도 처리 할 수 있으며 현재 명령을 중단하지 않고 두 개 이상의 작업을 동시에 수행 할 수 있습니다.
이 튜토리얼 에서는 Arduino 가 Arduino millis 함수를 사용 하여 멀티 태스킹 을 수행 하는 방법 을 배웁니다. 일반적으로 delay () 함수는 LED Blinking과 같은주기적인 작업을 위해 Arduino에서 사용되지만이 delay () 함수는 일정 시간 동안 프로그램을 중지하고 다른 작업을 수행 할 수 없도록합니다. 따라서이 기사에서는 delay () 함수의 사용을 피하고 millis () 로 대체 하여 둘 이상의 작업을 동시에 수행 하고 Arduino를 멀티 태스킹 컨트롤러로 만드는 방법을 설명합니다. 자세히 알아보기 전에 멀티 태스킹을 절제하는 것으로 시작하겠습니다.
멀티 태스킹이란?
멀티 태스킹이란 단순히 동시에 하나 이상의 작업이나 프로그램을 실행하는 것을 의미합니다. 거의 모든 운영 체제는 멀티 태스킹 기능을 갖추고 있습니다. 이러한 종류의 운영 체제를 MOS (멀티 태스킹 운영 체제)라고합니다. MOS는 모바일 또는 데스크톱 PC 운영 체제 일 수 있습니다. 컴퓨터에서 멀티 태스킹의 좋은 예는 사용자가 이메일 응용 프로그램, 인터넷 브라우저, 미디어 플레이어, 게임을 동시에 실행할 때와 사용자가 응용 프로그램을 사용하지 않으려는 경우 닫히지 않으면 백그라운드에서 실행되는 경우입니다. 최종 사용자는 이러한 모든 응용 프로그램을 동시에 사용하지만 OS는이 개념을 약간 다릅니다. OS가 멀티 태스킹을 관리하는 방법에 대해 논의 해 보겠습니다.
그림에서 볼 수 있듯이 CPU는 시간을 세 부분으로 나누고 각 부분을 각 작업 / 응용 프로그램에 할당합니다. 이것이 대부분의 시스템에서 멀티 태스킹이 수행되는 방식입니다. 개념은 시간 분포가 약간 다르다는 점을 제외하고 Arduino Multitasking에 대해 거의 동일합니다. Arduino는 저주파로 실행되고 RAM은 랩톱 / 모바일 / PC와 비교되므로 각 작업에 주어진 시간도 다릅니다. Arduino에는 널리 사용되는 delay () 함수 도 있습니다. 하지만 시작하기 전에 어떤 프로젝트에서도 delay () 함수를 사용하지 말아야 하는 이유에 대해 논의 해 봅시다 .
Arduino에서 delay ()를 건너 뛰는 이유는 무엇입니까?
Arduino의 참조 문서를 고려하면 두 가지 유형의 지연 함수가 있습니다. 첫 번째는 delay () 이고 두 번째는 delayMicroseconds () 입니다. 두 기능은 지연 생성 측면에서 동일합니다. 유일한 차이점은 delay () 함수에서 전달 된 매개 변수 정수가 밀리 초 단위라는 것입니다. 즉, delay (1000) 을 작성하면 지연 시간이 1000 밀리 초, 즉 1 초가됩니다. 마찬가지로 delayMicroseconds () 함수에서 전달 된 매개 변수는 마이크로 초 단위입니다. 예를 들어 delayMicroseconds (1000) 를 작성하면 지연 시간은 1000 마이크로 초, 즉 1 밀리 초가됩니다.
요점 은 두 기능 모두 지연 기능에서 경과 된 시간 동안 프로그램을 일시 중지합니다. 따라서 1 초의 지연을 제공하면 프로세서는 1 초가 경과 할 때까지 다음 명령으로 이동할 수 없습니다. 마찬가지로 지연이 10 초이면 프로그램은 10 초 동안 중지되고 프로세서는 10 초가 경과 할 때까지 다음 명령을 진행할 수 없습니다. 이로 인해 속도 및 명령 실행 측면에서 마이크로 컨트롤러의 성능이 저하됩니다.
지연 기능 의 단점 을 설명하는 가장 좋은 예 는 두 개의 푸시 버튼을 사용하는 것입니다. 두 개의 푸시 버튼을 사용하여 두 개의 LED를 토글하려고한다고 생각해보십시오. 따라서 하나의 푸시 버튼을 누르면 해당 LED가 2 초 동안 켜집니다. 마찬가지로 두 번째를 누르면 LED가 4 초 동안 켜집니다. 그러나 delay ()를 사용할 때 사용자가 첫 번째 버튼을 누르면 프로그램이 2 초 동안 중지되고 사용자가 2 초 지연 전에 두 번째 버튼을 누르면 마이크로 컨트롤러는 프로그램이 그대로 입력을 받아들이지 않습니다. 정지 단계에서.
Arduino의 공식 문서는 지연 () 함수 설명에 대한 참고 및 경고에서이를 명확하게 언급합니다. 더 명확하게하기 위해 이것을 살펴보고 이것을 확인할 수 있습니다.
millis ()를 사용하는 이유는 무엇입니까?
지연 사용으로 인한 문제를 극복하기 위해서는 개발자가 습관화 되면 사용하기 쉬운 millis () 함수를 사용해야하며, 명령어 실행에 지연없이 100 % CPU 성능을 사용합니다. millis () 는 Arduino 보드가 프로그램을 동결하지 않고 현재 프로그램을 실행하기 시작한 이후로 경과 한 밀리 초를 반환하는 함수입니다. 이 시간 숫자는 약 50 일 후에 오버플로됩니다 (즉, 0으로 돌아 감).
Arduino에 delayMicroseconds ()가있는 것처럼, micros () 와 같은 millis ()의 마이크로 버전도 있습니다 . micros와 millis의 차이점은 50 일인 millis ()에 비해 micros ()는 약 70 분 후에 오버플로된다는 것입니다. 따라서 응용 프로그램에 따라 millis () 또는 micros ()를 사용할 수 있습니다.
delay () 대신 millis () 사용:
시간 및 지연에 millis ()를 사용하려면 시간을 시작하기 위해 작업이 발생한 시간을 기록하고 저장 한 다음 정의 된 시간이 경과했는지 간격을 확인해야합니다. 따라서 언급했듯이 현재 시간을 변수에 저장하십시오.
부호없는 긴 currentMillis = millis ();
필요한 시간이 지 났는지 알아 보려면 두 개의 변수가 더 필요합니다. currentMillis 변수에 현재 시간을 저장 했지만 타이밍 기간이 언제 시작되었고 기간이 얼마나되었는지도 알아야합니다. 따라서 Interval 및 previousMillis 가 선언됩니다. 간격은 시간 지연을 알려주고 previosMillis는 이벤트가 마지막으로 발생한 시간을 저장합니다.
unsigned long previousMillis; 서명되지 않은 장기 = 1000;
이를 이해하기 위해 간단한 LED 깜박임의 예를 들어 보겠습니다. 기간 = 1000은 LED가 1 초 또는 1000ms 동안 깜박임을 알려줍니다.
const int ledPin = 4; // 연결된 LED 핀 번호 int ledState = LOW; // LED 상태를 unsigned 로 설정하는 데 사용됩니다 . long previousMillis = 0; // LED가 마지막으로 깜박 인 시간을 저장합니다. const long period = 1000; // ms에서 깜박이는 기간 void setup () { pinMode (ledPin, OUTPUT); // ledpin을 출력으로 설정 } void loop () { unsigned long currentMillis = millis (); // 현재 시간 저장 if (currentMillis-previousMillis> = period) {// 1000ms 통과 여부 확인 previousMillis = currentMillis; // 마지막으로 LED를 깜박 인 시간을 저장 if (ledState == LOW) {// LED가 꺼져 있으면 켜고 그 반대의 경우도 마찬가지입니다. ledState = HIGH; } else { ledState = LOW; } digitalWrite (ledPin, ledState); // ledState가 다시 깜박이도록 LED 설정 } }
여기, 진술
Arduino의 인터럽트는 다른 마이크로 컨트롤러와 동일하게 작동합니다. Arduino UNO 보드에는 GPIO 핀 2와 3에 인터럽트를 연결하기위한 두 개의 개별 핀이 있습니다. 인터럽트 및 사용 방법에 대해 자세히 알아볼 수 있는 Arduino 인터럽트 자습서 에서 자세히 다루었 습니다.
여기서는 두 개의 작업을 동시에 처리하여 Arduino 멀티 태스킹을 보여줍니다 . 작업에는 LED의 ON / OFF 상태를 제어하는 데 사용되는 푸시 버튼과 함께 서로 다른 시간 지연으로 두 개의 LED가 깜박이는 것이 포함됩니다. 따라서 세 가지 작업이 동시에 수행됩니다.
필요한 구성 요소
- Arduino UNO
- 3 개의 LED (모든 색상)
- 저항 (470, 10k)
- 점퍼
- 브레드 보드
회로도
Arduino Millis () 기능 의 사용을 보여주는 회로도 는 매우 쉽고 아래와 같이 부착 할 부품이 많지 않습니다.
멀티 태스킹을위한 Arduino UNO 프로그래밍
멀티 태스킹을 위해 Arduino UNO를 프로그래밍하려면 위에서 설명한 millis () 작동 방식의 논리 만 필요합니다. 멀티 태스킹을 위해 Arduino UNO를 프로그래밍하기 전에 millis ()를 사용하여 로직을 명확하게하고 millis ()에 익숙해 지도록 밀리 스를 사용하여 깜박이는 LED를 반복 해서 연습하는 것이 좋습니다 . 이 튜토리얼에서 인터럽트는 멀티 태스킹을 위해 동시에 millis ()와 함께 사용됩니다. 버튼은 인터럽트가 됩니다. 따라서 인터럽트가 발생할 때마다 즉, 푸시 버튼을 누르면 LED가 ON 또는 OFF 상태로 전환됩니다.프로그래밍은 LED와 푸시 버튼이 연결된 핀 번호를 선언하는 것으로 시작됩니다.
int led1 = 6; int led2 = 7; int toggleLed = 5; int pushButton = 2;
다음으로 향후 사용을 위해 LED 상태를 저장하는 변수를 작성합니다.
int ledState1 = 낮음; int ledState2 = 낮음;
위의 깜박임 예제에서 설명한 것처럼 period 및 previousmillis에 대한 변수는 LED에 대한 지연을 비교하고 생성하도록 선언됩니다. 첫 번째 LED는 1 초마다 깜박이고 다른 LED는 200ms 후에 깜박입니다.
부호없는 long previousMillis1 = 0; const long period1 = 1000; 부호없는 long previousMillis2 = 0; const long period2 = 200;
누름 버튼을 여러 번 누르는 것을 방지하기 위해 디 바운스 지연 을 생성하는 데 또 다른 millis 함수가 사용됩니다. 위와 비슷한 접근 방식이 있습니다.
int debouncePeriod = 20; int debounceMillis = 0;
세 변수 인터럽트로서 누름 버튼의 상태를 저장하기 위해 사용되는 LED와 푸시 버튼의 상태를 토글.
bool buttonPushed = false; int ledChange = LOW; int lastState = HIGH;
핀이 INPUT 또는 OUTPUT으로 작동 할 핀의 동작을 정의합니다.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT); pinMode (toggleLed, OUTPUT); pinMode (pushButton, INPUT);
이제 ISR 및 인터럽트 모드 정의와 함께 인터럽트를 연결하여 인터럽트 핀을 정의합니다. 실제 디지털 핀을 특정 인터럽트 번호로 변환하기 위해 attachInterrupt () 함수를 선언 할 때 digitalPinToInterrupt (pin_number) 를 사용하는 것이 좋습니다.
attachInterrupt (digitalPinToInterrupt (pushButton), pushButton_ISR, CHANGE);
인터럽트 서브 루틴이 작성되고 buttonPushed 플래그 만 변경됩니다. 그 주, 인터럽트 서브 루틴이 때문에 여분의 지시를 작성하고 최소화하려고 최대한 짧게해야한다.
void pushButton_ISR () { buttonPushed = true; }
루프는 루프가 반복 될 때마다 경과 된 시간 값을 저장하는 currentMillis 변수에 millis 값을 저장하는 것으로 시작됩니다.
부호없는 긴 currentMillis = millis ();
멀티 태스킹에는 총 3 가지 기능이 있으며, 1 초에 1 개의 LED 점멸, 200ms에 두 번째 LED 점멸, 누름 버튼을 누르면 LED를 OFF / ON으로 전환 합니다. 따라서이 작업을 수행하기 위해 세 부분을 작성합니다.
첫 번째 는 경과 시간을 비교하여 1 초마다 LED 상태를 전환하는 것입니다.
if (currentMillis-previousMillis1> = period1) { previousMillis1 = currentMillis; if (ledState1 == LOW) { ledState1 = HIGH; } else { ledState1 = 낮음; } digitalWrite (led1, ledState1); }
마찬가지로 두 번째로 200ms마다 경과 된 밀리 초를 비교하여 LED를 토글합니다. 설명은이 기사의 앞부분에서 이미 설명했습니다.
if (currentMillis-previousMillis2> = period2) { previousMillis2 = currentMillis; if (ledState2 == LOW) { ledState2 = HIGH; } else { ledState2 = LOW; } digitalWrite (led2, ledState2); }
마지막으로 상기 buttonPushed 플래그를 감시하고,이 20ms의 바운스 지연을 생성 한 후에는 인터럽트로 연결된 푸시 버튼에 대응 LED의 상태를 토글.
if (buttonPushed = true) // ISR이 호출되었는지 확인 { if ((currentMillis-debounceMillis)> debouncePeriod && buttonPushed) // 여러 번 누르지 않도록 20ms의 디 바운스 지연 생성 { debounceMillis = currentMillis; // 마지막 디 바운스 지연 시간 저장 if (digitalRead (pushButton) == LOW && lastState == HIGH) // 푸시 버튼을 누른 후 LED 변경 { ledChange =! ledChange; digitalWrite (toggleLed, ledChange); lastState = LOW; } else if (digitalRead (pushButton) == HIGH && lastState == LOW) { lastState = HIGH; } buttonPushed = false; } }
이것으로 Arduino millis () Tutorial을 마칩니다. millis ()를 습관적으로 사용 하려면 다른 응용 프로그램에서이 논리를 구현하는 연습을하십시오. 모터, 서보 모터, 센서 및 기타 주변 장치를 사용하도록 확장 할 수도 있습니다. 의심스러운 경우 포럼에 글을 쓰거나 아래에 의견을 남겨주세요.
아두 이노에서 millis 함수를 사용하는 방법을 보여주는 완전한 코드와 비디오 는 아래와 같습니다.