- 필요한 재료
- 사운드 센서 작동
- 오실로스코프에서 오디오 주파수 측정
- 휘슬 감지기 Arduino 회로도
- Arduino로 주파수 측정
- 휘슬 감지를위한 Arduino 프로그래밍
- Arduino 휘슬 감지기 작동
어렸을 때 저는 손뼉을 치면 작동되는 장난감 음악 자동차에 매료되었습니다. 그리고 자라면서 저는 우리 집에서 조명과 팬을 전환하는 데 동일한 도구를 사용할 수 있는지 궁금했습니다. 게으른 나 자신을 스위치 보드로 걸어가는 대신 손뼉을 치면서 팬과 조명을 켜는 것이 멋질 것입니다. 그러나이 회로는 시끄러운 라디오 또는 이웃의 잔디 깎는 기계와 같은 환경의 시끄러운 소음에 반응하기 때문에 종종 오작동합니다. 박수 스위치를 만드는 것도 재미있는 프로젝트이지만.
그때 회로가 휘파람을 감지하는 휘슬 감지 방법 을 발견했습니다. 다른 소리와 달리 휘파람은 특정 기간 동안 일정한 주파수를 가지므로 음성이나 음악과 구별 될 수 있습니다. 따라서이 튜토리얼에서는 Sound Sensor와 Arduino를 연결하여 휘슬 소리를 감지하는 방법을 배우고 휘슬이 감지되면 릴레이를 통해 AC 램프를 토글합니다. 그 과정에서 마이크를 통해 사운드 신호를 수신하는 방법과 Arduino를 사용하여 주파수를 측정하는 방법도 배웁니다. 흥미롭게 들리니 Arduino 기반 홈 오토메이션 프로젝트를 시작하겠습니다 .
필요한 재료
- Arduino UNO
- 사운드 센서 모듈
- 릴레이 모듈
- AC 램프
- 전선 연결
- 브레드 보드
사운드 센서 작동
이 홈 오토메이션 프로젝트의 하드웨어 연결 및 코드에 대해 알아보기 전에 사운드 센서를 살펴 보겠습니다. 이 모듈에서 사용되는 사운드 센서는 다음과 같습니다. 시중에서 구할 수있는 대부분의 사운드 센서의 작동 원리는 모양이 약간 변경 될 수 있지만 이와 유사합니다.
우리가 알고 있듯이 사운드 센서의 기본 구성 요소는 마이크 입니다. 마이크는 음파 (음향 에너지)를 전기 에너지로 변환하는 변환기 유형입니다. 기본적으로 마이크 내부의 다이어프램은 출력 핀에서 전기 신호를 생성하는 대기의 음파에 진동합니다. 그러나 이러한 신호는 매우 낮은 크기 (mV)이므로 Arduino와 같은 마이크로 컨트롤러에서 직접 처리 할 수 없습니다. 또한 기본적으로 사운드 신호는 기본적으로 아날로그이므로 마이크의 출력은 가변 주파수의 사인파이지만 마이크로 컨트롤러는 디지털 장치이므로 구형파에서 더 잘 작동합니다.
이러한 낮은 신호 사인파를 증폭하여 구형파로 변환하기 위해 모듈은 위에 표시된대로 온보드 LM393 비교기 모듈을 사용합니다. 마이크에서 출력되는 저전압 오디오는 증폭기 트랜지스터를 통해 비교기의 한 핀에 공급되고, 기준 전압은 전위차계가 포함 된 전압 분배기 회로를 사용하여 다른 핀에 설정됩니다. 마이크의 오디오 출력 전압이 사전 설정된 전압을 초과하면 비교기는 5V (작동 전압)로 높아지고 그렇지 않으면 비교기는 0V에서 낮게 유지됩니다. 이렇게하면 낮은 신호 사인파가 고전압 (5V) 구형파로 변환 될 수 있습니다. 아래의 오실로스코프 스냅 샷은 노란색 파가 낮은 신호 사인파이고 파란색이 출력 구형파 인 경우를 동일하게 보여줍니다. 그만큼감도는 모듈의 전위차계를 변경하여 제어 할 수 있습니다.
오실로스코프에서 오디오 주파수 측정
이 사운드 센서 모듈은 대기의 음파를 음파의 주파수와 동일한 주파수 인 구형파로 변환합니다. 따라서 구형파의 주파수를 측정하여 대기에서 소리 신호의 주파수를 찾을 수 있습니다. 예상대로 작동하는지 확인하기 위해 아래 비디오와 같이 사운드 센서를 내 스코프에 연결하여 출력 신호를 조사했습니다.
내 스코프의 측정 모드를 켜서 주파수를 측정 하고 Play 스토어 의 Android 애플리케이션 (Frequency Sound Generator)을 사용하여 알려진 주파수의 사운드 신호를 생성했습니다. 위의 GID에서 볼 수 있듯이 스코프는 상당히 정확한 정확도로 사운드 신호를 측정 할 수 있었으며 스코프에 표시된 주파수 값은 내 휴대폰에 표시된 값과 매우 비슷합니다. 이제 모듈이 작동하고 있음을 알았 으므로 Arduino와 Sound 센서를 연결해 보겠습니다 .
휘슬 감지기 Arduino 회로도
사운드 센서를 사용 하는 Arduino Whistle Detector Switch 회로 의 전체 회로도 가 아래에 나와 있습니다. 회로는 Fritzing 소프트웨어를 사용하여 그려졌습니다.
사운드 센서와 릴레이 모듈은 Arduino의 5V 핀에 의해 전원이 공급됩니다. 사운드 센서의 출력 핀은 Arduino의 디지털 핀 8에 연결됩니다. 이는 해당 핀의 타이머 속성 때문이며 프로그래밍 섹션에서 이에 대해 자세히 설명합니다. 릴레이 모듈은 UNO 보드의 내장 LED에도 연결된 핀 13에 의해 트리거됩니다.
AC 공급 측에서 중성선은 릴레이 모듈의 Common (C) 핀에 직접 연결되고 위상은 AC 부하 (전구)를 통해 릴레이의 NO (Normally Open) 핀에 연결됩니다. 이렇게하면 릴레이가 트리거 될 때 NO 핀이 C 핀과 연결되어 전구가 빛납니다. 그렇지 않으면 blub은 꺼진 상태로 유지됩니다. 연결이 이루어지면 내 하드웨어는 다음과 같이 보입니다.
경고: AC 회로로 작업하면 위험 할 수 있으며 활선을 취급하는 동안주의하고 단락을 방지 할 수 있습니다. 전자 제품에 익숙하지 않은 사람들에게는 회로 차단기 또는 성인 감독이 권장됩니다. 경고를 받았습니다 !!
Arduino로 주파수 측정
들어오는 구형파의 주파수를 읽는 우리의 스코프와 유사하게 주파수를 계산하기 위해 Arduino를 프로그래밍해야합니다. 펄스 인 기능을 사용하여 주파수 카운터 자습서에서이 작업을 수행하는 방법을 이미 배웠습니다. 그러나이 튜토리얼에서는 정확한 결과를 얻기 위해 주파수를 측정하기 위해 Freqmeasure 라이브러리 를 사용할 것 입니다. 이 라이브러리는 핀 8의 내부 타이머 인터럽트를 사용하여 펄스가 ON으로 유지되는 시간을 측정합니다. 시간이 측정되면 공식 F = 1 / T를 사용하여 주파수를 계산할 수 있습니다. 그러나 라이브러리를 직접 사용하고 있기 때문에 주파수 측정 방법에 대한 레지스터 세부 정보 및 수학에 들어갈 필요가 없습니다. 라이브러리는 아래 링크에서 다운로드 할 수 있습니다.
- pjrc의 주파수 측정 라이브러리
위의 링크는 zip 파일을 다운로드 한 다음 Sketch- > Include Library-> Add.ZIP Library 경로를 따라 Arduino IDE에이 zip 파일을 추가 할 수 있습니다.
참고: 라이브러리를 사용하면 타이머가이 라이브러리에 의해 점유되므로 UNO의 핀 9 및 10에서 analogWrite 기능이 비활성화됩니다. 또한 다른 보드를 사용하면이 핀이 변경됩니다.
휘슬 감지를위한 Arduino 프로그래밍
데모 비디오 가 포함 된 전체 프로그램 은이 페이지 하단에서 찾을 수 있습니다. 이 제목에서는 프로그램을 작은 조각으로 나누어 설명하겠습니다.
언제나처럼 우리는 필요한 라이브러리를 포함하고 필요한 변수를 선언함으로써 프로그램을 시작합니다. 위의 제목에 설명 된대로 이미 FreqMeasure.h 라이브러리를 추가했는지 확인하십시오. 변수 상태는 LED의 상태를 나타내며 변수 주파수와 연속성은 측정 된 주파수와 연속성을 각각 출력하는 데 사용됩니다.
#포함
void 설정 기능 내에서 디버깅을 위해 9600 전송 속도로 직렬 모니터를 시작합니다. 그런 다음 FreqMeasure.begin () 함수를 사용 하여 주파수 측정을 위해 핀 8을 초기화합니다. 또한 핀 13 (LED_BUILTIN)이 출력됨을 선언합니다.
void setup () { Serial.begin (9600); FreqMeasure.begin (); // 기본적으로 핀 8에서 측정 pinMode (LED_BUILTIN, OUTPUT); }
무한 루프 안에서 우리는 FreqMeasure.available () 함수를 사용하여 8 번 핀을 계속 듣습니다 . 들어오는 신호가 있으면 FreqMeasure.read ()를 사용하여 주파수를 측정합니다 . 노이즈로 인한 오류를 피하기 위해 100 개의 샘플을 측정하고 그 평균을 취했습니다. 동일한 작업을 수행하는 코드는 아래와 같습니다.
if (FreqMeasure.available ()) { // 여러 읽기를 함께 평균 sum = sum + FreqMeasure.read (); 개수 = 개수 + 1; if (count> 100) { frequency = FreqMeasure.countToFrequency (sum / count); Serial.println (주파수); 합계 = 0; 카운트 = 0; } }
여기 에서 Serial.println () 함수를 사용하여 휘파람의 주파수 값을 확인할 수 있습니다. 제 경우 수신 된 값은 1800Hz에서 2000Hz입니다. 대부분의 사람들의 휘파람 주파수는이 특정 범위에 속합니다. 그러나 음악이나 음성과 같은 다른 소리도이 주파수에 속할 수 있으므로 구별하기 위해 연속성을 모니터링합니다. 주파수가 3 회 연속되면 휘슬 음으로 확인합니다. 따라서 주파수가 1800에서 2000 사이이면 연속성이라는 변수를 증가시킵니다.
if (frequency> 1800 && frequency <2000) {연속성 ++; Serial.print ("연속성->"); Serial.println (연속성); 빈도 = 0;}
연속성 값이 3에 도달하거나 초과하면 state라는 변수를 토글하여 LED의 상태를 변경합니다. 상태가 이미 참이면 거짓으로 변경하고 그 반대의 경우도 마찬가지입니다.
if (연속성> = 3 && state == false) {state = true; 연속성 = 0; Serial.println ("조명 켜짐"); 지연 (1000);} if (연속성> = 3 && state == true) {state = false; 연속성 = 0; Serial.println ("조명 꺼짐"); 지연 (1000);}
Arduino 휘슬 감지기 작동
코드와 하드웨어가 준비되면 테스트를 시작할 수 있습니다. 연결이 올바른지 확인하고 모듈의 전원을 켭니다. 직렬 모니터를 열고 휘파람을 시작하면 연속성 값이 증가하고 마지막으로 램프를 켜거나 끌 수 있습니다. 직렬 모니터의 샘플 스냅 샷은 다음과 같습니다.
직렬 모니터에 표시등이 켜졌다 고 표시되면 13 번 핀이 하이가되고 릴레이가 램프를 켜도록 트리거됩니다. 마찬가지로 직렬 모니터에 조명 꺼짐 이라고 표시되면 램프가 꺼집니다 . 작동을 테스트 한 후에는 12V 어댑터를 사용하여 설정에 전원을 공급하고 휘슬을 사용하여 AC 가전 제품을 제어 할 수 있습니다.
이 프로젝트 의 전체 작업은 아래 링크 된 비디오에서 찾을 수 있습니다. 튜토리얼을 이해하고 새로운 것을 배우기를 바랍니다. 작업을 수행하는 데 문제가 있으면 댓글 섹션에 남겨 두거나 다른 기술 요구 사항에 대해서는 포럼을 사용하십시오.