Arduino와 함께 마이크 사용


18

편집 : 나는이 문제에 대해 꽤 오랫동안 조사 해왔다. 그것은 내가 생각했던 것보다 훨씬 어려운 프로젝트로 판명되었습니다. 이를 위해서는 고가의 하드웨어 (마이크 및 앰프)와 마이크로 컨트롤러의 정교한 오디오 분석이 필요합니다. 앰프 회로를 갖춘 완전한 마이크조차도 원하는 결과를 얻지 못합니다 (이 제품에 대한 의견에 따라)


나는 Arduino를 완전히 처음 사용하지만 프로그래밍에 익숙합니다. 내장하기 위해 VU의 m , I는 아두 이노의 아날로그 0 핀 마이크로폰을두고 직렬 연결을 통해 값을 표시 할.

나는이 회로를 봤다.

간단한 오디오 프리 앰프

... 그리고 나는이 결과로 그것을 만들려고했습니다.

(이제 Oli Glaser가 제안한 회로를 사용하고 있습니다)

직렬 모니터의 값은 음악 볼륨에 따라 변경되지 않습니다.

Arduino의 아날로그 입력에서 볼륨을 측정하는 가장 쉬운 방법은 무엇입니까?

또한 TDA2822M 이 있지만이 프로젝트에 도움이되는지 모르겠습니다. 마이크의 캡션에 XF-18D가 표시 됩니다.

편집 : 내 arduino 코드 :

void setup() {
  Serial.begin(9600); 
}

void loop() {
  Serial.println(analogRead(0));
  delay(300);
}

직렬 출력 : 1023 1022 1022 1022 1022 1023 1022 등

마이크가 전혀 작동하는지 어떻게 확인할 수 있습니까? 방향성이 있습니까?

편집 : 나는 지금 S9014 트랜지스터를 사용하고 있습니다. ADC와 직렬 연결이 작동합니다 (포텐쇼미터로 테스트했습니다).

직렬 출력은 이제 약 57입니다.

또한 멀티 미터 또는 오실로스코프 가 없습니다 . 지금 멀티 미터가 있습니다.


회로의 출력에서 ​​오디오 파형을 볼 수있는 범위를 확인 했습니까?
HikeOnPast

우와, 왜 회로도에서 3V3 및 5V 핀이 단락됩니까? 문제가 될 수 있습니다.
코너 울프

아니, 난 그냥 회로도를 제대로 그리지 않았다.
토스트 :

답변:


14

"가장 쉬운"방법은 단순히 ADC로 신호와 샘플을 적용하는 것입니다. 결과를 버퍼에 저장 한 후 원하는대로 표시합니다 (귀하의 경우 RS232를 통해 PC로 전송)
신호의 RMS 레벨을 원하면 PC로 전송하기 전이나 후에 어느 시점에서이를 계산해야합니다.

그림과 같은 증폭 회로는 이상적이지 않지만 기본 VU 미터에는 합리적으로 작동해야합니다. 편집-방금 C2를 발견했습니다. 트랜지스터에서 DC 바이어스를 차단하고 신호가 접지 아래로 스윙하므로 이것을 제거하십시오.

편집-여기 증폭 트랜지스터에 대한 더 나은 회로가 있습니다.

일렉 트릿 앰프

이것은 사용되는 트랜지스터에 대해별로 신경 쓰지 않아야하며 출력 바이어스는 약 2.5V이어야합니다.
입력 분배기 (R3 및 R4)의 정확한 값은 그다지 중요하지 않으며 1 : 4의 비율입니다. 예를 들어 400k 및 100k 또는 40k 및 10k 등을 사용할 수 있습니다 (이러한 각 값의 위 또는 아래로 이동하지 마십시오). C2는> 10uF 여야합니다. C1은> 1uF 여야합니다 (회로도에서 C1을 대체합니다)
R1 및 R2는이 값이어야합니다.
바이어스 저항기가있는 일렉 트릿 (회로도의 R1) 만 있으면됩니다.

한 가지 문제는 Arduino 3.3V와 5V 라인이 함께 묶여있는 것입니다.이 회로도 오류라고 가정하고 있지만 실제 회로의 경우 작동하지 않으며 무언가를 손상시킬 수 있습니다.
문제를 정확히 파악하려면 코드와 PC쪽에 보이는 것을 보는 것이 도움이됩니다. 또한 어떤 트랜지스터를 사용하고 있습니까?

오실로스코프가있는 경우 마이크 / 트랜지스터가 올바르게 작동하는지 확인할 수 있습니다. 그렇지 않은 경우 멀티 미터를 사용하여 더 기본적인 테스트를 수행 할 수 있습니다 (예 : + 5V 존재 확인, 트랜지스터베이스가 ~ 0.6V인지 확인, 테스트 콜렉터가 + 5V에 고정되어 있지 않거나 신호가없는 접지인지 확인)

또한 RS232가 올바르게 작동하는지 확인해야하므로 테스트 값을 전송하는 간단한 코드를 작성하는 것이 좋습니다.

요청한 정보를 제공 할 수있는 경우보다 구체적인 도움을받을 수있는 도구를 알려주십시오.

편집-샘플링이 너무 느리면 다음과 같은 피크 감지 회로가 필요합니다.

피크 감지

이 회로를 트랜지스터와 Arduino 핀 (마이너스 C2) 사이에 넣으십시오.

다이오드는 거의 모든 다이오드 일 수 있습니다. 캡 및 저항 값은 지침 일 뿐이며 조금 변경 될 수 있습니다. 이 값은 신호 레벨에 따라 전압이 변경되는 데 걸리는 시간을 나타냅니다. RC 상수를 사용하여이를 계산할 수 있습니다 (예 : 위의 예에서 RC 상수는 1e-6 * 10e3 = 10ms입니다. 전압은 원래 값의 90 % 감소하기 위해 약 2.3 시간 상수가 필요하므로 위의 예에서 전압이 1V에서 시작하고 신호를 제거하면 약 23ms 후에 0.1V로 떨어집니다.

편집 -좋아, 내가 큰 문제를 발견했다고 생각합니다. 귀하의 S9012의 트랜지스터는이다 PNP 트랜지스터 합니다 (S9015처럼),이 회로 NPN 트랜지스터가 필요합니다. S9014은 당신이 하나를 사용해야합니다, 그래서 NPN 트랜지스터이다.

"104"로 표시된 커패시터는 거의 확실히 0.1uF 세라믹 커패시터입니다. 값 (pF)은 처음 2 개 숫자 다음에 마지막 숫자로 설정된 숫자 0입니다. 따라서 104의 경우 값은 10 + 4 0 또는 100,000pF입니다. 100,000pF는 100nF 또는 0.1uF입니다.

편집-스코프 또는 멀티 미터가
없으면 여기에서 삶이 매우 어려워집니다 (가능한 한 빨리 둘 중 하나를 잡아야 함). 그러나 일렉 트릿 / 트랜지스터 회로를 테스트하는 데 사용할 수있는 몇 가지 기본 PC 사운드 카드 오실로스코프가 있습니다. Visual Analyzer 는 아주 좋은 예입니다.

시각 분석기

C2를 교체하는 경우 (엄격히 필요하지는 않지만 좋은 아이디어 임) 신호를 PC에 직접 공급하고 소프트웨어에서 마이크와 증폭이 올바르게 작동하는지 확인할 수 있어야합니다. PC에 사용중인 라인이 있지만 마이크 입력은 일반적으로 최대 2V IIRC에 적합합니다. 또한 일렉 트릿을 직접 테스트 할 수도 있습니다. 트랜지스터 비트를 제거하고 R1과 C1을 유지하고 C1의 다른 쪽에서 신호를 받으십시오.
이 방법은 DC 레벨을 테스트 하지 않고 AC (소운 카드 입력의 DC 차단 캡으로 인해) 만 AC (오디오) 신호가 관심 대상입니다.

이 작업을 시도하면 스크린 샷을 게시하여 현재 상황을 파악할 수 있습니다.


3.3V와 5V는 서로 연결되어 있지 않습니다. 이 소프트웨어를 처음 사용하는 것은 죄송합니다. 내 코드를 질문에 넣을 것이지만 잘못 될 수있는 것은 없습니다. 또한, 오늘 포토 레지스터를 사용하고 vu 미터가 보이기를 원할 때 6 개의 LED에 값을 표시하는 프로젝트를 만들었고 직렬 연결을 테스트했습니다. 오실로스코프 나 멀티 미터가 없습니다. 트랜지스터에는 캡션 "S9012 H 331"이 있으며 "S9014 C 331"및 S9015도 있습니다.
토스트

@Toast-C2에 대한 편집 참조, 이것을 제거하고 직접 연결하십시오.
Oli Glaser

Kristoffon이 그의 답변에서 설명 한대로 C2를 제거하고 부품을 추가했습니다. 여전히 같은 결과입니다.
Toast

1
전위차계 또는 가변 전압 소스가있는 경우 입력 회로와 상관없이 0-5V 입력을 ADC 입력에 적용하여 코드를 테스트 할 수 있습니다. 회로를 분리하고 오실로스코프를 사용하여 동작을 확인하거나 코드를 분리하고 예측 가능하지만 가변적 인 입력을 제공하여 코드를 검증하는 두 가지 작업을 한 번에 디버깅하려고합니다.
HikeOnPast 1

1
@OliGlaser 나는 회로에 혼란스러워한다. "일렉 트릿"은 마이크인가요? 마이크의 다른 와이어는 어디에 있습니까? GND 또는 VCC? 해당 회로에 5 또는 3.3V를 연결합니까? EDIT주석 스레드를 읽지 않고도 이해할 수 있도록 블록을 제거 하고 편집 할 수 있습니까? 나는 또한 초보자이며 문제가 어떻게 해결되었으며 게시 한 회로를 그대로 사용할 수 있는지 이해하지 못합니다.
Tomáš Zato-복권 모니카

4

회로가 작동한다고 가정하면 오디오 신호는 kHz 범위에 있고 Arduino에는 DC 레벨에 적합한 ADC가 있습니다. 신호의 DC 구성 요소는 0이므로 고정 된 전압에 뜬다. ADC가 읽고있는 것은 고정 전압입니다.

이를 해결하기 위해 ADC와 커패시터 및 저항에 연결하는 출력과 다이오드를 직렬로 배치합니다.

캡은 수신되는 피크 값으로 충전되는 반면 신호가 종료되면 저항이 캡을 방전합니다.

--|>|---*---- adc
        *---- resistor -----*----ground
        \----- capacitor ---/

편집 : 직렬 커패시터로 인해 바이어스가 없기 때문에 ADC 입력이 실제로 플로팅됩니다. 내 솔루션을 시도하려면 C2를 삭제하십시오.


좋아, 나는 이것을 회로에 추가했고 직렬 모니터의 신호는 이제 458입니다 (그러나 잡음이있을 때 여전히 변경되지 않습니다).
토스트

I는 "H S9012 331", "331 S9014 C"까지 트랜지스터를 교환 값이 56 인
토스트

1
Arduino ADC는 오디오를 충분히 빠르게 샘플링 할 수 있습니다. 나는 그것들을 사용하지 않지만 라이브러리 기능으로 10ksps (최대 5kHz 대역폭)가 가능하다고 생각합니다. 이는 lo-fi 자료에 적합합니다 (실제로 ATMega가 정상적으로 사용되면 더 빨리 샘플링 할 수 있다고 확신합니다)
Oli Glaser

@Toast-얼마나 빨리 샘플링하고 있습니까? 매우 느리면 피크 감지기가 좋습니다. 그래도 소프트웨어에서이 작업을 수행 할 수 있습니다.
Oli Glaser

2
@Kristoffon-Arduino는 아니지만 오디오를 샘플링하고 여러 번 재생하기 위해 유사한 8 비트 마이크로 (예 : PIC16F, 18F 등)를 사용했습니다. 10ksps는 쉽게 수행 할 수 있습니다. 이 AVR ADC 문서 를 인용하려면 :When using single-ended mode, the ADC bandwidth is limited by the ADC clock speed. Since one conversion takes 13 ADC clock cycles, a maximum ADC clock of 1 MHz means approximately 77k samples per second. This limits the bandwidth in single-ended mode to 38.5 kHz, according to the Nyquist sampling theorem.
Oli Glaser

4

1022, 1023의 측정 값은 기본적으로 Arduino의 ADC에서 풀 스케일입니다. 다이어그램에 표시된 것처럼 결함이없는 직렬 커패시터를 설치했다고 가정하면이 레벨은 변경 한 전압 (예 : AC) 만 커플 링 할 수 있으므로 사용자가 만든 마이크 회로에서 나올 수 없습니다.

결과적으로 ATMEGA 자체에서 누설 전류를 읽는 것으로 생각됩니다. 다른 (연결되지 않은) 아날로그 핀에서 동일한 결과를 얻을 수 있습니다.

일부 고가의 저항 (10K ~ 100K)으로 매우 "가벼운"전압 분배기를 만들어이를 사용하여 아날로그 입력을 기준 전압의 절반으로 바이어 싱하십시오 (포텐쇼미터를 사용하여 추가 테스트 기능 제공). 입력이없는 판독 값은 512 부근에 있어야합니다.

일단 ADC 입력이 적절하게 바이어스되면,이를 통해 변화가 있는지 확인하기 위해 작업을 시작할 수 있습니다. 대역폭이 약간 부족한 경우 고주파 성분의 앨리어싱을 얻을 수 있지만, 너무 많은 문제가되지 않는 전체 볼륨을 추정하기 만하면됩니다.


맞습니다. 과부하가 걸린 것 같습니다. OP는 아날로그 스피커를 판독하기 위해 작은 스피커를 연결하는 것을 생각해 보았습니다. vu 미터를 만들었을 때 헤드폰 잭에서 라인을 기본적으로 AnalogRead로 똑바로 가져 와서 결과를 매핑했습니다.
Hellonearthis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.