정보나눔

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

블루투스 안드로이드 통신 관련 질문입니다.
김학현 | 2016-02-01

#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..문자를 입력 받고 계속 함수를 실행 하고 싶음

 

 

 

이전글   |    BLE로 블루투스를 이용하려면 codebender?를 안써도 쓸 수 있나요?... 2016-02-01
다음글   |    블루투스 안드로이드 통신 관련 질문입니다. (2) ... 2016-02-03