본문 바로가기
system/SBC

[Galileo-Gen2] 아두이노 블루투스 + 서보모터 + 초음파 거리센서 거리측정

by lifeseed 2014. 11. 5.

이번에는 Galileo Gen2 아두이노를 이용하여 앞서 Test한 세가지 Device 조합으로 거리측정 장비를 구현해 보았다.

 

기본 컨셉은 서보위에 거리 센서를 장착하고 블루투스로 명령을 내려 각도를 변환하여 거리를 측정하는 것이다.

 

 

1. 연결도

사용된 핀 : 5V, Gnd, 0,1,7,8,9 번핀

 

1) 블루투스 (HC-06)

Tx :: 아두이노 0번 (Rx) 핀 연결

Rx :: 아두이노 1번 (Rx) 핀 연결

Vcc 및 Gnd는 각각 5V, Gnd 연결

-> Serial1 을 이용하여 UART 입출력을 할 수 있다.

 

2) 서보모터 (SG90)

Orange Line :: 9번 핀 연결

Red & Brown Pin에 각각 5V, Gnd 연결

 

3) 초음파 거리 센서 (HC-SR04)

Echo Pin : 7번핀 연결

Trig Pin : 8번핀 연결 

Vcc 및 Gnd는 각각 5V, Gnd 연결

 

2. Device 연결

- 초음파 거리 센서를 서보모터에 장착하였다.

 

 

3. 동작

1) 스마트 폰의 blueterm 어플을 다운받아 블루투스 페어링을 한다.

 

2) 그리고 아래 코드를 아두이노IDE를 통하여 컴파일 후 다운로드 한다.

 

3) blueterm 앱에서 a 를 입력하면 10도로 움직이면서 거리 값을 읽어온다.

 

 

 

 

<코드>

// Servo Define
#include <Servo.h>
 
Servo myservo;  // create servo object to control a servo
                // a maximum of eight servo objects can be created
int pos = 0;    // variable to store the servo position

 

// HC-SR04 Define
#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED

int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance, prev_dist; // Duration used to calculate distance

int getDistance(void)
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  
  //Calculate the distance (in cm) based on the speed of sound.
  distance = duration/58.2;
  
  if (distance >= maximumRange || distance <= minimumRange){
    /* Send a negative number to computer and Turn LED ON
    to indicate "out of range" */
    distance = prev_dist;
    digitalWrite(LEDPin, HIGH);
  }
  else
  {
    digitalWrite(LEDPin, LOW);
  }
 
  if(distance != prev_dist)
  {
    /* Send the distance to the computer using Serial1 protocol, and
    turn LED OFF to indicate successful reading. */
    Serial1.println(distance);
    prev_dist = distance;
  }
 
  return distance; 
}
 
void setup()

  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo.write(0);
  
  prev_dist = -1;
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
 
  Serial1.begin(115200);
  Serial1.println("Ready");
}
 
 
void loop()
{
  static int v = 0;

  if ( Serial1.available()) {
    char ch = Serial1.read();

    switch(ch) {
      case 'a':
        for(pos = 0; pos < 180; pos += 10)  // goes from 0 degrees to 180 degrees
        {                                  // in steps of 1 degree
          myservo.write(pos);              // tell servo to go to position in variable 'pos'
          delay(500);                       // waits 15ms for the servo to reach the position 
          getDistance();
        } 
        for(pos = 180; pos>=1; pos-=10)     // goes from 180 degrees to 0 degrees
        {                               
          myservo.write(pos);              // tell servo to go to position in variable 'pos'
          delay(500);                       // waits 15ms for the servo to reach the position 
          getDistance();
        }       
      break;
    }
  } 
}

 

 

아두이노 0번 1번 핀과 연결되는 UART는 Serial1 을 통해 입출력되며, 코드에서 각 색깔별로 Device 동작을 구분하였다.

- HC-SR04

- SG90