BASIC4MCU | 질문게시판 | 초음파관해서 다시 질문 드려봅니당 ㅠㅠ
페이지 정보
작성자 촙아두 작성일2020-11-05 01:33 조회9,792회 댓글2건본문
#define motor2 2
#define motor3 3
#define motor4 4
#define motor6 6
#define line1 22
#define line2 24
#define line3 26
#define echo 50
#define trig 30
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);
pinMode(30, OUTPUT);
pinMode(50, INPUT);
}
double getUltrasonicSensor(void){
unsigned long duration;
delay(100);
digitalWrite(30,HIGH);
delayMicroseconds(10);
digitalWrite(30,LOW);
duration = pulseIn(50, HIGH, 30000UL);
return duration * 0.17;
}
int flag(){
if(getUltrasonicSensor() <= 120) return 1;
return 0;
}
void loop() {
int i;
i=0;
while(i<1){
int l_s = digitalRead(22);
int c_s = digitalRead(24);
int r_s = digitalRead(26);
if(flag()) // 120mm 이하의 거리를 만났을 때
{ // 좌회전
analogWrite(motor2,0);
analogWrite(motor3,254);
analogWrite(motor4,0);
analogWrite(motor6,0);
delay(1800);
while(1)
{
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);
if(flag()==0)
break;
}
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,0);
analogWrite(motor4,246);
analogWrite(motor6,0);
}
else if((l_s == 0)&&(r_s == 1) )
{ // 좌회전
analogWrite(motor2,0);
analogWrite(motor3,254);
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;
}
}
}
저의 생각은 120mm이하 물체를 초음파센서가 감지 이후에 좌회전 하고 while(1)과 if문이((라인트레이싱 좌측or우측or중간센서가 감지되자마자) )
만족한다면 break;를 통해 while 문을 빠져나가서 좌회전을 합니다.
하지만 while(1)만 참이고 if문이(라인트레이싱 좌측or우측or중간센서가 감지되자마자) 만족하지 않을 때 원운동하는 프로그램을 만들었습니다.
하지만 실제로 동작시켜보았을 땐 좌회전 이후에 직진을 한다던가 또 좌회전을 한다던가.. 뜻대로 동작이 되지 않네요.. 무엇이 문제일까요?
댓글 2
조회수 9,792master님의 댓글
master 작성일
while(1){
if((l_s == 1)||(r_s == 1)||(c_s == 1)){ break; } // 원운동하기
루프 안에서 스위치 상태를 체크하려면
루프 안에서 스위치를 계속 읽어야 합니다.
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; } // 원운동하기
촙아두님의 댓글
촙아두
감사합니다!