아두이노를 사용하다보면 반복되는 loof문을 탈출하고자 할때가 있다.
| 아두이노의 기본적인 구조는 setup문과 loof문으로 이루어져있다. |
void setup() { // 셋업 내용 } void loop() { // 반복할 내용 } |
그중에서도 loop문 안쪽의 내용은 무한 반복되는 정보이다.
이는 센서값을 지속적으로 리딩하거나 특정한 딜레이를 일정하게 유지하면서 반복하기에는 유용하나
즉각적인 반응을 원하는 코딩에서는 이를 구현하는데 어려움이 있다.
간단한 예시로
아두이노 , 조이스틱 , 리니어 스텝모터, 스텝모터 드라이버를 이용하여서 조이스틱의 반응에 따라서 리니어 스텝모터의
작동 방향을 제어 하려고 한다.
조건 ⓐ 조이스틱의 X값이 > 500 |
조건 ⓑ 조이스틱의 X값이 < 500 |
스텝모터 정방향 회전 |
스텝모터 역방향 회전 |
다음과 같이 상하로 움직이는데는 루프문의 반복문이 영향을 받지 않는다.
하지만, 일정한 딜레이 이후에 조이스틱의 X값이 500이상을 유지할경우
스텝모터의 정방향 회전은 X값이 500보다 작아지기 전까지 지속적으로 반복할것 이다.
이경우 모터가 헛돌게 되며 굉음을 내게 되고 원하는 동작을 구현할수 없게 된다.
이를 해결하기 위해서 루프문 안쪽에 case문과 if문으로 작성해보려고 한다.
앞에서부터 설명후 전체적인 소스 코드는 마지막에 첨부 하려고 한다.
변수 초기화 및 초기 설정 |
void loop(){ int a = analogRead(A0); // 조이스틱의 아날로그 값을 불러온다. int v=0; // 구별하기 위한 변수 초기화 if(a>500) v|=1; // 조이스틱 X축의 값이 500 이상일 경우 V의 값에 1를 축적 if(a<500) v|=2; // 조이스틱 X축의 값이 500 이상일 경우 V의 값에 2를 축적 int aa=0; // 구별하기 위한 변수 초기화 int bb=0; // 구별하기 위한 변수 초기화 |
스위치문으로 나누어서 자식함수로 뿌려줄 준비 |
switch(v){ case 0: break; //통과 case 1: aa=1; bb=0; break; //레일 위 이동 case 2: aa=0; bb=1; break; //레일 아래 이동 } |
자식함수 (레일 위 이동) |
//레알 위 이동 if(!!aa&&!bb){ if(mode!=1){ mode=1; digitalWrite(dirPin, LOW); for(int x = 0; x < stepsPerRevolution2; x++) { digitalWrite(stepPin, HIGH); delayMicroseconds(1000); digitalWrite(stepPin, LOW); delayMicroseconds(1000); }delay(500); }} |
if(!!aa&&!bb) 조건을 만족하게 되면 해당 자식함수가 실행이 되고, mode값의 1을 저장시켜 다시 반복 시킬수 없게 반복분을 탈출 시킵니다. |
자식함수 (레일 아래 이동) |
//레일 아래 이동 if(!!aa&&bb){ if(mode!=2){ mode=2; digitalWrite(dirPin,HIGH); for(int x = 0; x < stepsPerRevolution2; x++) { digitalWrite(stepPin, HIGH); delayMicroseconds(1000); digitalWrite(stepPin, LOW); delayMicroseconds(1000); }delay(500);}}} |
if(!!aa&&bb) 조건을 만족하게 되면 해당 자식함수가 실행이 되고, mode값의 1을 저장시켜 다시 반복 시킬수 없게 반복분을 탈출 시킵니다. |
전체적인 소스코드 |
void setup(){ pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); Serial.begin(9600); delay(200); } void loop(){ int a = analogRead(A0); int v=0; if(a>500) v|=1; if(a<500) v|=2; int aa=0; int bb=0; switch(v){ case 0: break; //통과 case 1: aa=1; bb=0; break; //레일 위 이동 case 2: aa=0; bb=1; break; //레일 아래 이동 } //레알 위 이동 if(!!aa&&!bb){ if(mode!=1){ mode=1; digitalWrite(dirPin, LOW); for(int x = 0; x < stepsPerRevolution2; x++) { digitalWrite(stepPin, HIGH); delayMicroseconds(1000); digitalWrite(stepPin, LOW); delayMicroseconds(1000); }delay(500); }} //레일 아래 이동 if(!!aa&&bb){ if(mode!=2){ mode=2; digitalWrite(dirPin,HIGH); for(int x = 0; x < stepsPerRevolution2; x++) { digitalWrite(stepPin, HIGH); delayMicroseconds(1000); digitalWrite(stepPin, LOW); delayMicroseconds(1000); }delay(500);}}} |
'③ 아두이노 - Arduino' 카테고리의 다른 글
| 아두이노 - 5. 서보모터 제어 (SG-50) (0) | 2023.02.12 |
|---|---|
| 아두이노 - 4. 5V DC모터 제어 (0) | 2023.02.12 |
| 아두이노 - 3. LED 제어 (0) | 2023.02.12 |
| 아두이노 - 2. 아두이노 핀맵 및 PWM (0) | 2023.02.11 |
| 아두이노 - 1. 아두이노란? (0) | 2023.02.11 |
댓글