본문 바로가기
system/SBC

[Galileo-Gen2] 아두이노 HC SR04 초음파 거리센서 및 SG90 서보모터 제어

by lifeseed 2014. 10. 25.

1. HC SR04 테스트

 

갈리레오 보드에서 아두이노를 이용하여 HC SR04 초음파 거리센서 테스트를 해보았다.

 

HC SR04 Spec

 

•  Working Voltage  : DC 5 V
•  Working Current  : 15mA
•  Working Frequency : 40Hz
•  Max Range : 4m
•  Min Range : 2cm
•  MeasuringAngle : 15 degree
•  Trigger Input Signal  : 10uS TTL pulse
•  Echo Output Signal  : Input  TTL  lever  signal  and  the  range  in proportion
•  Dimension  : 45*20*15mm  

 

기존의 거리 센서를 동작하는 아두이노 코드를 이용하였다.

 

사용된 코드의 정보는 다음과 같다.

 

/*
 HC-SR04 Ping distance sensor:
 VCC to arduino 5v
 GND to arduino GND
 Echo to Arduino pin 7
 Trig to Arduino pin 8
 
 This sketch originates from Virtualmix: http://goo.gl/kJ8Gl
 Has been modified by Winkle ink here: http://winkleink.blogspot.com.au/2012/05/arduino-hc-sr04-ultrasonic-distance.html
 And modified further by ScottC here: http://arduinobasics.blogspot.com.au/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html
 on 10 Nov 2012.
 */

 

 

아래 첨부된 코드는 원 코드에서 거리가 변할 때만 UART로 출력하도록 수정되었다.

 

  1. #define echoPin 7 // Echo Pin
  2. #define trigPin 8 // Trigger Pin
  3. #define LEDPin 13 // Onboard LED
  4.  
  5. int maximumRange = 200; // Maximum range needed
  6. int minimumRange = 0; // Minimum range needed
  7. long duration, distance, prev_dist; // Duration used to calculate distance
  8.  
  9. void setup() {
  10.  Serial.begin (9600);
  11.  prev_dist = -1;
  12.  pinMode(trigPin, OUTPUT);
  13.  pinMode(echoPin, INPUT);
  14.  pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
  15. }
  16.  
  17. void loop() {
  18.   /* The following trigPin/echoPin cycle is used to determine the
  19.    distance of the nearest object by bouncing soundwaves off of it. */
  20.   digitalWrite(trigPin, LOW);
  21.   delayMicroseconds(2);
  22.  
  23.   digitalWrite(trigPin, HIGH);
  24.   delayMicroseconds(10);
  25.    
  26.   digitalWrite(trigPin, LOW);
  27.   duration = pulseIn(echoPin, HIGH);
  28.    
  29.   //Calculate the distance (in cm) based on the speed of sound.
  30.   distance = duration/58.2;
  31.    
  32.   if (distance >= maximumRange || distance <= minimumRange){
  33.     /* Send a negative number to computer and Turn LED ON
  34.     to indicate "out of range" */
  35.     distance = prev_dist;
  36.     digitalWrite(LEDPin, HIGH);
  37.   }
  38.   else
  39.   {
  40.     digitalWrite(LEDPin, LOW);
  41.   }
  42.  
  43.   if(distance != prev_dist)
  44.   {
  45.     /* Send the distance to the computer using Serial protocol, and
  46.     turn LED OFF to indicate successful reading. */
  47.     Serial.println(distance);
  48.     prev_dist = distance;
  49.   }
  50.    
  51.   //Delay 50ms before next reading.
  52.   delay(50);
  53. }
  54.  

 

 

2. SG90 서보모터 Test

갈릴레오용 아두이노 코드에 서보모터 라이브러리와 예제가 포함되어 있다.

.\arduino-1.5.3-Intel.1.0.4\libraries\Servo\examples\Sweep\  이 경로에 포함된 예제파일을 실해하면 그대로 동작한다.

 

사용된 서보모터 SG90 Spec은 다음과 같다.

 

•  Weight: 9 g
•  Dimension: 22.2 x 11.8 x 31 mm approx.
•  Stall torque: 1.8 kgf·cm
•  Operating speed: 0.1 s/60 degree
•  Operating voltage: 4.8 V (~5V)
•  Dead band width: 10 µs
•  Temperature range: 0 ºC – 55 ºC 

 

 

 

 

 

<동작코드>

0 ~ 180도의 값을 인자로 받아 서보를 제어하는 코드 이다.

숫자를 입력후 s 를 입력하여 저장된다.

a 를 누를 경우 0 ~ 180도 180 ~ 0도로 값을 증가 시키며 움직인다.

 

 

  1. // Sweep
  2. // by BARRAGAN <http://barraganstudio.com>
  3. // This example code is in the public domain.
  4.  
  5.  
  6. #include <Servo.h>
  7.  
  8. Servo myservo;  // create servo object to control a servo
  9.                 // a maximum of eight servo objects can be created
  10.  
  11. int pos = 0;    // variable to store the servo position
  12.  
  13. void setup()
  14. {
  15.   myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  16.   myservo.write(0);
  17.  
  18.   Serial.begin(115200);
  19.   Serial.println("Ready");
  20. }
  21.  
  22.  
  23. void loop()
  24. {
  25.   static int v = 0;
  26.  
  27.   if ( Serial.available()) {
  28.     char ch = Serial.read();
  29.  
  30.     switch(ch) {
  31.       case '0'...'9':
  32.         v = v * 10 + ch - '0';
  33.         Serial.println(v);
  34.         break;
  35.       case 's':
  36.         myservo.write(v);
  37.         v = 0;
  38.         Serial.println(v);
  39.         break;
  40.       case 'a':
  41.         for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees
  42.         {                                  // in steps of 1 degree
  43.           myservo.write(pos);              // tell servo to go to position in variable 'pos'
  44.           delay(15);                       // waits 15ms for the servo to reach the position
  45.         }
  46.         for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees
  47.         {                                
  48.           myservo.write(pos);              // tell servo to go to position in variable 'pos'
  49.           delay(15);                       // waits 15ms for the servo to reach the position
  50.         }      
  51.       break;
  52.     }
  53.   }  
  54. }