안녕하세요^^
자율주행 + 블루투스 조합해서 코딩을 하고자 합니다
블루투스로 특정 버튼을 누르면 자율 주행을 하게 하고 싶은데, 동작 해보니 한번 작동하고 계속 오른쪽or 왼쪽으로 회전만 하네요.. 코딩이 잘못된 것인지 혹시 방법이 없는 지 문의 드립니다.
#include <SoftwareSerial.h>
#include <Servo.h>
#define IN1 5
#define IN2 6
#define IN3 3
#define IN4 4
int trigerPin = 10; // 초음파센서 TRIG - D13
int echoPin = 9; // 초음파센서 ECHO - D12
float distance; // 초음파 센서 거리값 변수
int servoPin = 8; // 서보모터 연결 포트
Servo servo;
SoftwareSerial mybt(2,7);
void forward() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void back() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void left() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void right() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void stop() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void setup() {
//모터를 컨트롤하는 출력핀을 설정해줍니다..
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(trigerPin, OUTPUT); // 초음파 센서 초기화
pinMode(echoPin, INPUT);
Serial.begin(9600);
servo.attach(servoPin); // 서보모터 연결 지정
servo.write(90); // 초기값으로 정면 응시
delay(1000);
mybt.begin(9600);
}
float getDistanceCM() { // 초음파 센서 거리 측정 함수(단위:cm)
digitalWrite(echoPin, LOW);
digitalWrite(trigerPin, LOW);
delayMicroseconds(2);
digitalWrite(trigerPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigerPin, LOW);
distance = pulseIn(echoPin, HIGH) / 58; //거리값 계산 후 저장
Serial.print(distance);
Serial.println();
return distance;
}
// 거리값 정확도를 위한 평균치 계산(1회 이상~ 10회 미만으로 조정 해보기)
float getStableDistanceCM() {
int CmSum = 0;
for (int i = 0; i < 8; i++) {
CmSum += getDistanceCM(); //예, 'sum = sum + cm' 과 동일
}
return CmSum / 8;
}
void loop() {
while(mybt.available()){
char data = mybt.read();
if(data=='w'){
if ( getStableDistanceCM() < 50 ) { //초음파 센서에서 25cm이하로 장애물 감지
stop();
delay(300);
servo.write(180); // 서보모터 좌회전 후 측정 거리값 변수에 저장
delay(500);
int leftDistance = getStableDistanceCM();
delay(300);
servo.write(0); // 서보모터 우회전 후 측정 거리값 변수에 저장
delay(500);
int rightDistance = getStableDistanceCM();
delay(300);
servo.write(90); // 서보모터 중앙으로 원위치
delay(500);
back(); // 0.5초간 후진
delay(500);
if (leftDistance > rightDistance) {
left();
} else {
right();
}
delay(500);
}else{
forward();
}
}
}
else if(data=='f'){
forward();
}
else if(data=='b'){
back();
}
else if(data=='l'){
left();
}
else if(data=='r'){
right();
}
else if(data=='s'){
stop();
}
}
}
|