BASIC4MCU | 질문게시판 | 아두이노 라인트레이싱에관해 질문드려봅니다.
페이지 정보
작성자 촙아두 작성일2020-11-08 21:30 조회12,061회 댓글1건본문
#define motor2 2
#define motor3 3
#define motor4 4
#define motor6 6
#define line1 22
#define line2 24
#define line3 26
void setup() {
analogReference(DEFAULT);
Serial.begin(9600);
pinMode(motor2, OUTPUT);
pinMode(motor3, OUTPUT);
pinMode(motor4, OUTPUT);
pinMode(motor6, OUTPUT);
pinMode(line1, INPUT);
pinMode(line2, INPUT);
pinMode(line3, INPUT);
}
double linetracing(void){
int i;
i=0;
while(i<1){
int l_s = digitalRead(22);
int c_s = digitalRead(24);
int r_s = digitalRead(26);
if((l_s == 0)&&(r_s == 0))
{ // 전진
analogWrite(motor2, 0);
analogWrite(motor3, 254);
analogWrite(motor4, 246);
analogWrite(motor6, 0);
}
else if((l_s == 1)&&(r_s == 0) )
{ // 우
analogWrite(motor2,0);
analogWrite(motor3,254);
analogWrite(motor4,0);
analogWrite(motor6,246);
}
else if((l_s == 0)&&(r_s == 1) )
{ // 좌
analogWrite(motor2,254);
analogWrite(motor3,0);
analogWrite(motor4,246);
analogWrite(motor6,0);
}
else if((l_s == 1)&&(r_s == 1) )
{ // 전진
analogWrite(motor2,0);
analogWrite(motor3,254);
analogWrite(motor4,246);
analogWrite(motor6,0);
}
else
{
i++;
break;
}
}
}
void loop() {
linetracing();
int i;
i=0;
int l_s = digitalRead(22);
int c_s = digitalRead(24);
int r_s = digitalRead(26);
int count = 0;
if((l_s == 1)&&(r_s == 1))
{
count++;
delay(300);
}
if(count==0)
{
linetracing();
}
else if(count==1)
{
linetracing();
}
else if(count==2) // 프로그램
{ // 전진
analogWrite(motor2,0);
analogWrite(motor3,254);
analogWrite(motor4,246);
analogWrite(motor6,0);
delay(1000);
analogWrite(motor2,0);
analogWrite(motor3,254);
analogWrite(motor4,0);
analogWrite(motor6,0);
delay(1800);
while(1)
{
int l_s = digitalRead(22); int c_s = digitalRead(24); int r_s = digitalRead(26);
if((l_s == 1)||(r_s == 1)||(c_s == 1))
{
break;
} // 원운동하기
analogWrite(motor2,0);
analogWrite(motor3,115);
analogWrite(motor4,245);
analogWrite(motor6,0);
} // 좌회전
analogWrite(motor2,254);
analogWrite(motor3,0);
analogWrite(motor4,245);
analogWrite(motor6,0);
delay(1000);
}
else if(count==3)
{
linetracing();
}
}
우선 linetracing() 이라는 함수를 만든 뒤 loop문에 적용시켜봤습니다. 아무런 조건이 없이 평소에는linetracing()을 작동시키다가
만약 왼쪽센서와 오른쪽센서가 동시에 불이 들어왔을 때 카운트가 0일때는 그대로 linetracing() 한번더 동시에 감지되면 linetracing()
그리고 두번째로 감지되었을 때 저기있는 프로그램을 적용시키고 싶습니다. 하지만 제가 걱정되는 건 두번째 감지 이후 프로그램이 작동 되는 동안
계속해서 왼쪽오른쪽센서가 감지될 수 밖에 없는 환경에 놓여 있습니다. 이 때 궁금한 게 else if(count==3)은 저 프로그램이 끝날때까지 작동을 안하는건가요?
아니면 저 프로그램이 끝나지 않았음에도 만약 count==3 이 만족한다면 그대로 적용이 되는건가요?
저는 프로그램이 끝난 뒤 count==3을 작동시키고 싶은데 그러려면 어떻게 하는게 좋을까요?
그리고 if((l_s == 1)&&(r_s == 1))
{
count++;
delay(300);
}
여기서 만약 왼쪽센서와 오른쪽센서를 0.3초이상 감지했을 때 카운트를 하고싶다하면 어떻게 해야할 지 이게 맞는함수인지 궁금합니다.
댓글 1
조회수 12,061master님의 댓글
master 작성일
알고리즘은 타인이 체크해주기 어렵습니다.
구동하면서 알고리즘을 수정해야 하는 경우가 많기 때문이죠
잘 만들어보세요
체크하기 쉽도록 코드를 정리해드리죠
int motor2=2,motor3=3,motor4=4,motor6=6;
int line1=22,line2=24,line3=26;
//
int l_s,c_s,r_s;
//
void setup(){
analogReference(DEFAULT);
Serial.begin(9600);
pinMode(motor2,OUTPUT); pinMode(motor3,OUTPUT); pinMode(motor4,OUTPUT); pinMode(motor6,OUTPUT);
}
//
void motor_F() { analogWrite(motor2, 0); analogWrite(motor3,254); analogWrite(motor4,246); analogWrite(motor6, 0); } // 전진
void motor_R() { analogWrite(motor2, 0); analogWrite(motor3,254); analogWrite(motor4, 0); analogWrite(motor6,246); } // 우
void motor_R2(){ analogWrite(motor2, 0); analogWrite(motor3,254); analogWrite(motor4, 0); analogWrite(motor6, 0); }
void motor_L() { analogWrite(motor2,254); analogWrite(motor3, 0); analogWrite(motor4,246); analogWrite(motor6, 0); } // 좌
void motor_O() { analogWrite(motor2, 0); analogWrite(motor3,115); analogWrite(motor4,245); analogWrite(motor6, 0); } // 원운동하기
//
void sw_in(){ l_s=digitalRead(22); c_s=digitalRead(24); r_s=digitalRead(26); }
//
double linetracing(void){
while(1){
sw_in();
if ((l_s==0)&&(r_s==0)){ motor_F(); } // 전진
else if((l_s==1)&&(r_s==0)){ motor_R(); } // 우
else if((l_s==0)&&(r_s==1)){ motor_L(); } // 좌
else if((l_s==1)&&(r_s==1)){ motor_F(); } // 전진
else { return; }
}
}
//
void loop(){
int i=0,count=0;
linetracing();
sw_in();
if((l_s==1)&&(r_s==1)){ count++; delay(300); }
//
if(count<2){ linetracing(); }
else if(count==2){ // 프로그램
motor_F(); delay(1000); // 전진
motor_R2(); delay(1800); // 약한 우
while(1){
sw_in();
if((l_s==1)||(r_s==1)||(c_s==1)){ break; }
motor_O(); // 원운동하기
}
motor_L(); delay(1000); // 좌회전
}
else if(count==3){ linetracing(); }
}