정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 블루투스 + 자율주행 동작 문의
이승현 | 2020-01-22

안녕하세요^^

자율주행 + 블루투스 조합해서 코딩을 하고자 합니다

블루투스로 특정 버튼을 누르면 자율 주행을 하게 하고 싶은데, 동작 해보니 한번 작동하고 계속 오른쪽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();
      }
}
}

이전글   |    아두이노 4x4 멤브레인 키패드 라이브러리 오류... 2020-01-17
다음글   |    pulseIn()함수 사용 관련 2020-01-22