ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 사운드 값을 이용한 서보 모터 제어하기
    Arduino/사운드 센서 2020. 10. 29. 17:54

    아래는 서보 모터에 대한 내용이다. 서보 모터에 대한 부분을 잘 모르면 참고하자.

    designatedroom87.tistory.com/247

     

    서보 모터의 기본적인 연결 및 동작

    서보 모터는 3개의 선으로 구성되어 있는데, 아래의 세 선이 서보 모터에 연결된 선이다. 이 선 색을 중심으로 보면 서보 모터의 가운데는 VCC에, 갈색은 GND에, 주황색 선은 출력선이다. 위에서 말

    designatedroom87.tistory.com

    사운드 센서에 대한 내용은 아래를 참고하자.

    designatedroom87.tistory.com/250?category=899521

     

    사운드 센서의 연결과 기본 출력

    네 선이 있는데, D0와 A0는 각 각 Digital Output과 Analog Output을 의미한다. 우리는 A0를 사용한다. A0선을 아두이노의 A1핀에 연결한다. 그리고 +는 빵판의 VCC에, -는 빵판의 GND에 연결한다. 빵판의 마지..

    designatedroom87.tistory.com

    서보 모터는 아두이노의 6번핀과 연결한다.

    소리 센서의 A0핀은 아두이노의 A1핀에 연결한다.

    우선 VCC와 GND를 연결한다.

    서보 모터를 연결한다. 각 각 VCC와 GND에 연결하고 나머지 한 선은 아두이노의 6번핀과 연결한다.

     

     

    사운드 센서를 빵판의 VCC와 GND에 연결한다. 빵판의 맨 아래에 있는 선이 사운드 센서 선이다.

    그리고 아두이노의 A1핀과 사운드 센서의 A0핀을 연결한다.

     

    서보 모터를 제어하기 전에 아래의 부분 예제들을 확인해보자.

     

    사운드의 평균값을 구하는 예제

    소스 코드

    더보기
    #define   DATA_CNT   50
    //  사운드 평균값 구하기
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      delay(2000);  //  2초 대기
      Serial.println(String("평균 소리값 : ") +avg());
    }
    
    void loop() {
      Serial.println(analogRead(A1));
    }
    
    int avg()
    {
      int var = 0;
      int total = 0;
    
      //  데이터 수집
      for (int i = 0; i < DATA_CNT; i++)
      {
        var = analogRead(A1);
    
        total += var;
    
        delay(100);
      }
    
      double _avg = (double)total / DATA_CNT;
    
      return (int)_avg;
    }

     

    위의 내용에 최대값과 최소값을 저장하는 부분을 추가하자.

    소스 코드

    더보기
    //  사운드 평균값 구하기
    #define   DATA_CNT   50
    
    int maxVal = 0;     //  최대값은 가장 작은 값으로 초기화
    int minVal = 1023;  //  최소값은 가장 큰 값으로 초기화
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      delay(2000);  //  2초 대기
      Serial.println(String("평균 소리값 : ") +avg());
    }
    
    void loop() {
      Serial.println(String("현재값 : ") +analogRead(A1));
      Serial.println(String("최대값 : ") +maxValue());
      Serial.println(String("최소값 : ") +minValue());
      Serial.println("----------------------------------");
      
      delay(500);
    }
    
    int avg()
    {
      int var = 0;
      int total = 0;
    
      //  데이터 수집
      for (int i = 0; i < DATA_CNT; i++)
      {
        var = analogRead(A1);
    
        total += var;
    
        delay(100);
      }
    
      double _avg = (double)total / DATA_CNT;
    
      return (int)_avg;
    }
    
    int maxValue()
    {
      int sori = analogRead(A1);
    
      if (maxVal < sori)
        maxVal = sori;
    
        return maxVal;
    }
    
    int minValue()
    {
      int sori = analogRead(A1);
    
      if (minVal > sori)
        minVal = sori;
    
        return minVal;
    }
    
    void maxminValue()
    {
      int sori = analogRead(A1);
    
      if (sori > maxVal)      maxVal = sori;
      else if (sori < minVal) minVal = sori;
    }

     

     

    사운드 센서의 평균값을 중심으로 입력값이 평균값을 중심으로 임의의 범위 값이면

    서보 모터를 제어

    소스 코드

    더보기
    #include <Servo.h>
    
    #define   OPEN    1
    #define   CLOSE   0
    
    Servo servo;
    int ave = 0;          //  사운드 센서의 평균값
    const int offSet = 5; //  오차값
    bool state = CLOSE;   //  sevro close 상태임을 표시
    
    void setup() 
    {
        servo.attach(6);  //  서보 모터를 6번핀에 연결
        servo.write(0);
      //delay(1000);
      //servo.write(180);
      Serial.begin(9600);
      delay(2000);
      ave = avg(A1);      //  사운드 센서의 평균값을 구한다.
      Serial.println(String("평균값:")+ave);
      delay(1000);
    }
    
    void loop() {
     int current_val=analogRead(A1);
     
     Serial.println(current_val);
    
     // 사운드 센서의 값이 평균값을 기준으로 범위에 내에 서보 모터를 제어
     if(current_val > ave + offSet || current_val < ave - offSet)
     {
      if(state == OPEN)
      {
        servo.write(10);
        Serial.println("open->close");
        state = CLOSE;
      }
      else
      {
        servo.write(170);
        Serial.println("close->open");
        state = OPEN;
      }
      delay(2000);
     }
     delay(100);
    }
    
    int avg(int analogPin){
      int var=0, total=0;
      for(int i=0; i<30;i++){
        var=analogRead(analogPin);
        total=total+var;
        delay(100);
      }
    
      float _avg=(float)total/30;
    
      return (int)_avg;
    }

     

    'Arduino > 사운드 센서' 카테고리의 다른 글

    사운드 센서의 연결과 기본 출력  (0) 2020.10.28

    댓글

Designed by Tistory.