Sonntag, 4. November 2012

Time machine: Microphone.



Зачем фотографу микрофон? Чтобы сфотографировать бурные авиации. :) Если без шуток, то очень нужная возможность при съёмке воды, взрывов и всего того что создаёт звуковые волны. Примеры снимков я покажу в самой последней статье про «Машину Времени» - МВ.
В сети можно найти с десяток различных примеров как подключить микрофон к Arduino. Большинство из них - усилитель на одном транзисторе с парой конденсаторов и резисторов. Как для фотографии этого было бы достаточно. Ведь для фотографии не нужен супер усилитель High Fidelify(HiFi) или High-end качества. Я отказался от «простой» схемы. Выбор схемы определила не цена, а микрофон. Зачем нужен усилитель «с лучшими параметрами»? У меня дома три различных электретных микрофона и для МВ я купил ещё один китайский(2$) у всех разная чувствительность. Опыт мой враг. Пару лет назад я разрабатывал индустриальный микшер для фирмы Thales. Микрофонов было всего 4 типа, микрофоны были от правильных производителей с высокой чувствительностью. Даже у них разброс чувствительности отличался на порядок. Чтобы как то удовлетворить китайские микрофоны я потратил один доллар на интегрированный усилитель с постоянным усилением в 20дБ, меньшего размера чем транзистор. :) После небольших поисков выбор пал на усилитель фирмы Maxim MAX9812. В пробной схеме я поставил вариант с питанием 3.3V. В заключительной схеме будет стоять чип на 5V. Вся схема занимает очень мало места на плате и при желании усилитель можно выключить.


Пока плата сделана для удобства с выводами. Можно всё попробовать в Breadboard.

Маленькая тестовая программа проверки работы усилителя.

#include <PCD8544.h>
#include <Encoder.h>
Encoder myEnc(3, 4);
volatile long newPosition = 0;
volatile long oldPosition  = 0;


// A custom glyph (a smiley)...
static const byte glyph[] = { B00010000, B00110100, B00110000, B00110100, B00010000 };
static PCD8544 lcd;

static const byte LCD_WIDTH = 84;
static const byte LCD_HEIGHT = 48;

const int analogInPin = A7;
int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)
int sensorMAX = 0;
unsigned long time =0;

void setup() {
  // PCD8544-compatible displays may have a different resolution...
  lcd.begin(84, 48);
  
  // Add the smiley to position "0" of the ASCII table...
  lcd.createChar(0, glyph);
  //Serial.begin(9600); 
}


void loop() {
  
  newPosition = myEnc.read();
  
  sensorValue = analogRead(analogInPin); 
  if (sensorValue > sensorMAX) sensorMAX = sensorValue;
  if (millis() > time){
  sensorMAX = 0; 
  time = millis() + 3000;
  }
  
  lcd.setCursor(0, 2);
  lcd.clearLine();
  lcd.print(sensorValue, DEC);

  lcd.setCursor(0, 3);
  lcd.clearLine();
  lcd.print(sensorMAX, DEC); 
 
  lcd.setCursor(30, 0);
  //lcd.clearLine();
  lcd.drawColumn(84, map(sensorValue, 0, 1023, 0, LCD_HEIGHT)); 
    
  //delay(10);                        // wait 100ms for next reading
  
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lcd.setCursor(0, 0);
    lcd.print("Encoder");
    lcd.setCursor(0, 1);
    lcd.clearLine();
    //Serial.println(newPosition);
    lcd.print(newPosition, DEC);
  }
}

После некоторых проб выяснилось что усиления в 20дБ не достаточно. Китайский микрофон не очень хорош. :( Для комфортной работы нужен ещё один каскад усиления, но об этом в другой раз.

Успешных вам кадров.

© Andrew Buckin.
Shutterstock Dreamstime
Fotostream http://www.flickr.com