정보나눔

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

아두이노 블루투스 rc카 초음파센서 장애물 질문
이상문 | 2020-10-28

제가 아두이노로 rc카를 만들고 있는데 제가 하고 있는 작업이 전방에 초음파센서가 장애물을 감지하였을때 부저가 울리고 LED가 켜지고 모터가 정지되는 것인데 그다음에 계속 부저가 울리면서 모터가 작동을 하지 않습니다. 모터가 정지를 한다음에 후진을 하고싶은데 계속 부저만 울리고 모터에는 작동이 안되네요..

 

 

 

#include <SoftwareSerial.h> //블루투스 통신을 위한 SoftwareSerial 라이브러리
#include <Servo.h> // 서보모터를 제어하기 위한 라이브러리

SoftwareSerial BTSerial(2, 4); // SoftwareSerial(RX,TX)

Servo servo;

// 왼쪽 모터 핀
#define M1_PWM   5   // DC모터1 PWM 핀
#define M1_DIR1  7 // DC모터1 DIR1 핀
#define M1_DIR2  8 // DC모터1 DIR2 핀

//오른쪽 모터 핀
#define M2_PWM   6   // DC모터2 PWM 핀
#define M2_DIR1  11 // DC모터2 DIR1 핀
#define M2_DIR2  12 // DC모터2 DIR2 핀

#define F_TRIG 13   // 전방 초음파 센서 TRIG 핀
#define F_ECHO 10  // 전방 초음파 센서 ECHO 핀
#define FL_TRIG A4  // 전방좌측 초음파 센서 TRIG 핀
#define FL_ECHO A3  // 전방좌측 초음파 센서 ECHO 핀
#define FR_TRIG 3   // 전방우측 초음파 센서 TRIG 핀
#define FR_ECHO 4   // 전방우측 초음파 센서 ECHO 핀
#define L_TRIG  6  // 좌측 초음파 센서 TRIG 핀
#define L_ECHO  5  // 좌측 초음파 센서 ECHO 핀
#define R_TRIG  2   // 우측 초음파 센서 TRIG 핀
#define R_ECHO  A5  // 우측 초음파 센서 ECHO 핀

#define SERVO  9 // 서보모터 핀

#define LED  13 // LED 제어 핀

#define BUZZER 3 // 부저 제어 핀

int SENSORLED = 9;
int LIGHT = 8;

const int MIN_LIGHT = 200;
const int MAX_LIGHT = 900;

int value = 90; // 각도를 조절할 변수 value (servo)
int val = 0;

// 블루투스 (앱인벤터)
void BluetoothMove() {
  if (Serial.available()) // 시리얼 모니터에 데이터가 입력되면
  {
    char numbers;  // 입력된 데이터를 담을 변수 numbers
    numbers = BTSerial.read(); // 시리얼모니터로 입력된 데이터 numbers로 저장
    numbers = Serial.read();

    switch(numbers)
    {
      case '1' : // DC모터 속도 100로 제어
      analogWrite(M1_PWM, 100);
      analogWrite(M2_PWM, 100);
      Serial.println(numbers);
      delay(10); 
      break;

      case '2' : // DC모터 속도 255로 제어
      analogWrite(M1_PWM, 255);
      analogWrite(M2_PWM, 255);
      Serial.println(numbers);
      delay(10); 
      break;

      case 'F' : // 앞으로 전진, 서보 모터 중앙
      digitalWrite(M1_DIR1, HIGH);
      digitalWrite(M1_DIR2, LOW);   
      digitalWrite(M2_DIR1, HIGH);
      digitalWrite(M2_DIR2, LOW);
      analogWrite(M1_PWM, 150);
      analogWrite(M2_PWM, 150);
      value = 90; 
      Serial.println(numbers);
      Serial.println(value);
      servo.write(value);
      delay(10);
      break;

      case 'S' :  // DC모터 정지
      digitalWrite(M1_DIR1, LOW);
      digitalWrite(M1_DIR2, LOW);   
      digitalWrite(M2_DIR1, LOW);
      digitalWrite(M2_DIR2, LOW);
      Serial.println("모터STOP");
      delay(10); 
      break;

      case 'R' :  // 서보모터 오른쪽 회전   
      for (int i = 0; i < 60; i++) {
        value += 2;
        if(value >= 180)
         value = 90;}
      Serial.println(numbers);
      Serial.println(value);
      servo.write(value);
      delay(10);
      break;

      case 'L' :  // 서보모터 왼쪽 회전
      for (int i = 0; i < 60; i++) {
        value -= 2;
        if(value <= 45)
         value = 90;}
      Serial.println(numbers);
      Serial.println(value);
      servo.write(value);
      delay(10);
      break;

      case 'B' :  // 뒤로 후진, 서보 모터 중앙
      digitalWrite(M1_DIR1, LOW);
      digitalWrite(M1_DIR2, HIGH);   
      digitalWrite(M2_DIR1, LOW);
      digitalWrite(M2_DIR2, HIGH);
      analogWrite(M1_PWM, 150);
      analogWrite(M2_PWM, 150);
      value = 90; 
      Serial.println(numbers);
      Serial.println(value);
      servo.write(value);
      delay(10); 
      break;

      case '3' :  // LED 켜기
      digitalWrite(LED, HIGH); 
      break;

      case '4' :  // LED 끄기
      digitalWrite(LED, LOW); 
      break;
    }
  }
}

void sensor1()
{
   unsigned long duraction;
   float distance;
  
  digitalWrite(F_TRIG, LOW);
  digitalWrite(F_ECHO, LOW);
  delayMicroseconds(2);
  digitalWrite(F_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(F_TRIG, LOW);
  duraction = pulseIn(F_ECHO, HIGH);
  distance = duraction / 29.0 / 2.0;
  Serial.print(distance);
  Serial.println("cm");
if(distance<10)
 {
  digitalWrite(M1_DIR1, LOW);
  digitalWrite(M1_DIR2, HIGH);   
  digitalWrite(M2_DIR1, LOW);
  digitalWrite(M2_DIR2, HIGH);
  analogWrite(M1_PWM, 150);
  analogWrite(M2_PWM, 150);
  delay(1000);
  tone(BUZZER, 8000, 2000);
  digitalWrite(LED, 1);
  delay(2000);
  digitalWrite(LED, 0);
  delay(2000);
 }

  digitalWrite(FL_TRIG, LOW);
  digitalWrite(FL_ECHO, LOW);
  delayMicroseconds(2);
  digitalWrite(FL_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(FL_TRIG, LOW);
  duraction = pulseIn(FL_ECHO, HIGH);
  distance = duraction / 29.0 / 2.0;
  Serial.print(distance);
  Serial.println("cm");
if(distance<10)
 {
  digitalWrite(M1_DIR1, LOW);
  digitalWrite(M1_DIR2, HIGH);   
  digitalWrite(M2_DIR1, LOW);
  digitalWrite(M2_DIR2, HIGH);
  analogWrite(M1_PWM, 150);
  analogWrite(M2_PWM, 150);
  delay(1000);
  tone(BUZZER, 8000, 2000);
  digitalWrite(LED, 1);
  delay(2000);
  digitalWrite(LED, 0);
  delay(2000);
 }

  digitalWrite(FR_TRIG, LOW);
  digitalWrite(FR_ECHO, LOW);
  delayMicroseconds(2);
  digitalWrite(FR_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(FR_TRIG, LOW);
  duraction = pulseIn(FR_ECHO, HIGH);
  distance = duraction / 29.0 / 2.0;
  Serial.print(distance);
  Serial.println("cm");
if(distance<5)
 {
  digitalWrite(M1_DIR1, LOW);
  digitalWrite(M1_DIR2, HIGH);   
  digitalWrite(M2_DIR1, LOW);
  digitalWrite(M2_DIR2, HIGH);
  analogWrite(M1_PWM, 150);
  analogWrite(M2_PWM, 150);
  delay(1000);
  tone(BUZZER, 8000, 2000);
  digitalWrite(LED, 1);
  delay(2000);
  digitalWrite(LED, 0);
  delay(2000);
 } 

  digitalWrite(L_TRIG, LOW);
  digitalWrite(L_ECHO, LOW);
  delayMicroseconds(2);
  digitalWrite(L_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(L_TRIG, LOW);
  duraction = pulseIn(L_ECHO, HIGH);
  distance = duraction / 29.0 / 2.0;
  Serial.print(distance);
  Serial.println("cm");
  delay(1000);
if(distance<5)
 {
  tone(BUZZER, 8000, 2000);
  digitalWrite(LED, 1);
  delay(2000);
  digitalWrite(LED, 0);
  delay(2000);
 } 

  digitalWrite(R_TRIG, LOW);
  digitalWrite(R_ECHO, LOW);
  delayMicroseconds(2);
  digitalWrite(R_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(R_TRIG, LOW);
  duraction = pulseIn(R_ECHO, HIGH);
  distance = duraction / 29.0 / 2.0;
  Serial.print(distance);
  Serial.println("cm");  
if(distance<10)
 {
  tone(BUZZER, 8000, 2000);
  digitalWrite(LED, 1);
  delay(2000);
  digitalWrite(LED, 0);
  delay(2000);
 } 
}

void sensor2() {
  val = analogRead( LIGHT );
  val = map( val , MIN_LIGHT , MAX_LIGHT , 0 , 255 );
  val = constrain( val , 0 , 255 );
  analogWrite( SENSORLED , val );
}

void setup() {
  
  // 블루투스 시리얼 세팅 및 시작
  Serial.begin(9600);
  BTSerial.begin(9600);

  // 서보모터 PIN 설정
  pinMode(9, OUTPUT);
  servo.attach(9);
  
  // DC모터 PIN 설정
  pinMode(M1_PWM, OUTPUT);
  pinMode(M2_PWM, OUTPUT);
  pinMode(M1_DIR1, OUTPUT);
  pinMode(M1_DIR2, OUTPUT);
  pinMode(M2_DIR1, OUTPUT);
  pinMode(M2_DIR2, OUTPUT);

  // 초음파센서 및 부저 PIN 설정
  pinMode(F_TRIG, OUTPUT);
  pinMode(F_ECHO, INPUT);
  pinMode(FL_TRIG, OUTPUT);
  pinMode(FL_ECHO, INPUT);
  pinMode(FR_TRIG, OUTPUT);
  pinMode(FR_ECHO, INPUT);
  pinMode(L_TRIG, OUTPUT);
  pinMode(L_ECHO, INPUT);
  pinMode(R_TRIG, OUTPUT);
  pinMode(R_ECHO, INPUT);

  pinMode(BUZZER, OUTPUT);
  
  // LED 출력모드 설정
  pinMode(LED, OUTPUT); 

  Serial.print("LGT RC CAR is ready to start");
}

void loop() {
  BluetoothMove();
  sensor1();
  sensor2();
}

이전글   |    3W 700mA LED 를 아두이노 같은 보드에서 켜고 싶다면..?저항 설정 방법은?... 2020-10-27
다음글   |    앱 인벤터와 아두이노 블루투스 다중 연결... 2020-10-28