#include
int echoPin = 13;
int trigPin = 12;
#define PIN_RX 2
#define PIN_TX 3
#define PIN_A1 10
#define PIN_B1 11
#define PIN_A2 8
#define PIN_B2 9
int tmpPin = A5;
SoftwareSerial btSerial(PIN_RX, PIN_TX);
char val;
void setup(){
Serial.begin(9600);
btSerial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(PIN_A1, OUTPUT);
pinMode(PIN_A2, OUTPUT);
pinMode(PIN_B1, OUTPUT);
pinMode(PIN_B2, OUTPUT);
btSerial.println("Arduino RC Car is ready to start");
}
void loop()
{
int tempValue = analogRead(tmpPin); // 센서로 부터 자료값을 받는다.
float tempVlot = tempValue * 5.0 / 1024.0;
float celsiusTemp = (tempVlot - 0.5) *100;
while( !btSerial.available() );
while( btSerial.available() )
{
val = btSerial.read();
Serial.print(val);
if(val == '4') //left
{
btSerial.println("left");
left();
}
else if(val == '6') //right
{
btSerial.println("right");
right();
}
else if(val == '8') //forward
{
btSerial.println("forward");
forward();
}
else if(val == '2') //backward
{
btSerial.println("backward");
backward();
}
else if(val == '0') //stop
{
btSerial.println("stop");
stop();
}
else if(val == '1') //temperature
{
temperature();
}
else if(val == '3') //SONAR
{
btSerial.println("Auto Sonar Start!");
sonar();
}
}
}
void forward()
{
digitalWrite(PIN_A1, LOW);
digitalWrite(PIN_B1, HIGH);
digitalWrite(PIN_A2, HIGH);
digitalWrite(PIN_B2, LOW);
}
void backward()
{
digitalWrite(PIN_A1, HIGH);
digitalWrite(PIN_B1, LOW);
digitalWrite(PIN_A2, LOW);
digitalWrite(PIN_B2, HIGH);
}
void left()
{
digitalWrite(PIN_A1, HIGH);
digitalWrite(PIN_B1, LOW);
digitalWrite(PIN_A2, HIGH);
digitalWrite(PIN_B2, LOW);
}
void right()
{
digitalWrite(PIN_A1, LOW);
digitalWrite(PIN_B1, HIGH);
digitalWrite(PIN_A2, LOW);
digitalWrite(PIN_B2, HIGH);
}
void stop()
{
digitalWrite(PIN_A1, LOW);
digitalWrite(PIN_B1, LOW);
digitalWrite(PIN_A2, LOW);
digitalWrite(PIN_B2, LOW);
}
void temperature()
{
int tempValue = analogRead (tmpPin); // 센서로 부터 자료값을 받는다.
float tempVlot = tempValue * 5.0 / 1024.0;
float celsiusTemp = (tempVlot - 0.5) *100;
float fahrenheitTemp = (celsiusTemp *9.0/5.0)+32.0;
btSerial.print("Celsius: ");
btSerial.println(celsiusTemp);
btSerial.print("Fahrenheit: ");
btSerial.println(fahrenheitTemp);
}
void turn_right()
{
digitalWrite(PIN_A1, LOW);
digitalWrite(PIN_B1, HIGH);
digitalWrite(PIN_A2, LOW);
digitalWrite(PIN_B2, HIGH);
delay(500); //0.5초(500밀리초)동안 유지합니다.
}
void sonar()
{
float duration, distance;
digitalWrite(trigPin, LOW);
digitalWrite(echoPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
duration = pulseIn(echoPin, HIGH); // echoPin 이 HIGH를 유지한 시간을 저장 한다.
distance = ((float)(340 * duration) / 10000) / 2;
Serial.print(distance);
Serial.println("cm");
delay(500);
if (distance < 30) // 만약 30cm 안에 장애물이 감지되면,
{
turn_right(); // 오른쪽으로 회전합니다.
}
else // 아닐경우,
{
forward(); // 계속 전진합니다.
}
}
현재 RC카를 만들고 있는데.. 블루투스 통신으로 조종에 있어서 문제가 생겨 질문 올립니다.
제가 원하는 방향은 '3'을 입력 받으면 distance가 30 미만이면 turn_right() 함수를 이용하고 아무것도 해당되지 않으면 forward()함수를 이용하는 것인데
시리얼 통신으로 테스트 해본 결과
349.95cm // 3을 입력 할때만 거리가 나옴. 현재 49.95cm
37.70cm // 현재 7.70cm
329.70cm
39.49cm
320.57cm
0 // 0은 stop
3을 입력받을때 만 거리가 나와서 제가 원하는 장애물 피하기를 하지 못하게 됩니다 .
어떻게 하면 한번만 입력하고 계속 거리가 나오게 할 수 있을까요?
예를 들자면.
329.7cm
26.5cm
55.2cm
어디 부분을 고치면 이런 식으로 될까요? 이렇게 거리가 꾸준하게 나오면 이 치수대로
함수를 사용할 수 있게되서 장애물 피하기가 될거 같은데
맞는 아이디어 인가요?
요약 하자면
1.문자를 입력 받으면 딱 한번 함수를 실행 하는 것 같음.
2. 이러한 문제 떄문에 장애물 피하기 기능을 사용 하지 못함.
3..문자를 입력 받고 계속 함수를 실행 하고 싶음
|