BASIC4MCU | 질문게시판 | 아두이노 자율주행 자동차 질문있습니다.
페이지 정보
작성자 라이언 작성일2020-12-09 22:54 조회5,917회 댓글3건본문
#include <SoftwareSerial.h>
#include <Servo.h>
//모터 PIN 설정
#define LEFT_A1 6
#define LEFT_B1 11
#define RIGHT_A2 3
#define RIGHT_B2 5
#define IR_TRIG 9
#define IR_ECHO 8
int servoPin = 10;
void setup() {
Serial.begin(9600);
pinMode(LEFT_A1, OUTPUT);
pinMode(RIGHT_A2, OUTPUT);
pinMode(LEFT_B1, OUTPUT);
pinMode(RIGHT_B2, OUTPUT);
pinMode(IR_TRIG, OUTPUT);
pinMode(IR_ECHO, INPUT);
}
void loop() {
float duration, distance;
digitalWrite(IR_TRIG, HIGH);
delay(10);
digitalWrite(IR_TRIG, LOW);
duration = pulseIn(IR_ECHO, HIGH);
distance = ((float)(340 * duration) / 10000) / 2;
Serial.print("\nDIstance : ");
Serial.println(distance);
if(distance < 20) {
Serial.println("stop");
stop();
Serial.println("backward");
backward();
int rnd = random(0,2);
if(rnd == 0){
Serial.println("right");
right();
}else{
Serial.println("left");
left();
}
}else{
Serial.println("forward");
forward();
}
}
void forward(){
digitalWrite(LEFT_A1, HIGH);
digitalWrite(LEFT_B1, LOW);
digitalWrite(RIGHT_A2, HIGH);
digitalWrite(RIGHT_B2, LOW);
}
void backward(){
digitalWrite(LEFT_A1, LOW);
digitalWrite(LEFT_B1, HIGH);
digitalWrite(RIGHT_A2, LOW);
digitalWrite(RIGHT_B2, HIGH);
delay(500);
}
void left(){
digitalWrite(LEFT_A1, LOW);
digitalWrite(LEFT_B1, HIGH);
digitalWrite(RIGHT_A2, HIGH);
digitalWrite(RIGHT_B2, LOW);
delay(1000);
}
void right(){
digitalWrite(LEFT_A1, HIGH);
digitalWrite(LEFT_B1, LOW);
digitalWrite(RIGHT_A2, LOW);
digitalWrite(RIGHT_B2, HIGH);
delay(1000);
}
void stop(){
digitalWrite(LEFT_A1, LOW);
digitalWrite(LEFT_B1, LOW);
digitalWrite(RIGHT_A2, LOW);
digitalWrite(RIGHT_B2, LOW);
delay(1000);
}
아두이노 자율주행 자동차 코드입니다. 제가원하는건 직진을 쭉하다가 벽이보이면 초음파센서로 감지하여 다른곳으로 이동해야하는데 직진 조금하다말고 벽이없는데도 갑자기 멈춰서 빙글돌고 다른쪽으로 가버립니다. 뭐가문제일까요?
댓글 3
조회수 5,917master님의 댓글
master 작성일
1.
delay(10);
트리거 딜레이를 10ms로 주면 안됩니다.
10ms가 아닌 10us를 줘야합니다.
초음파센서 예제를보면 us 딜레이 함수를 사용하는 예제를 쉽게 찾을 수 있습니다.
2.
void forward(){
digitalWrite(LEFT_A1, HIGH);
digitalWrite(LEFT_B1, LOW);
digitalWrite(RIGHT_A2, HIGH);
digitalWrite(RIGHT_B2, LOW);
delay(100); // <-- 추가하세요
}
20cm 이상일 때에는 forward() 함수가 실행 되는데 딜레이가 없으므로
초음파센서 트리거 주기가 아주 짧아집니다.
거리측정 오차가 발생하지 않으려면 50ms~100ms를 주는 것이 좋습니다.
라이언님의 댓글
라이언
10ms가아닌 delayMicroseconds(10); 로 바꾸었는데 조금가다가 빙글 도네요..
master님의 댓글
master 작성일
Serial.print("\nDIstance : ");
Serial.println(distance);
거리값을 시리얼모니터로 측정하고 있으므로 거리값이 제대로 측정되는지 체크하면 되겠죠