제가 아두이노로 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();
}
|