-
사운드 값을 이용한 서보 모터 제어하기Arduino/사운드 센서 2020. 10. 29. 17:54
아래는 서보 모터에 대한 내용이다. 서보 모터에 대한 부분을 잘 모르면 참고하자.
designatedroom87.tistory.com/247
사운드 센서에 대한 내용은 아래를 참고하자.
designatedroom87.tistory.com/250?category=899521
서보 모터는 아두이노의 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