Mittwoch, 26. Dezember 2012

Time machine: Analog.


Этот модуль попал в «Машину времени» по необходимости. Статья будет небольшой. Как я уже писал ранее, после проб с микрофоном, усиления 20дБ оказалось мало. Микрофон я купил не самый лучший, но это не означает, что его нельзя использовать. Пришлось поставить ещё один каскад усиления. Чтобы в будущем не испытывать неудобств в регулировании и не зависить от качества микрофона, поставил схему усилителя с программированным уровнем усиления на цифровом потенциометре с SPI интерфейсом(TPL0501). SPI у меня пока не занят. :) Так как я не собираюсь заниматься в «Машине времени» обработкой сигналов, отказался от использования АЦП и применил аналоговый компаратор с последующей обработкой по прерыванию, что позволит сократить код и уменьшить время реакции на событие. Для регулирования порога срабатывания компаратора установил ещё один цифровой потенциометр.

Плата аналогового усилителя сделана для макетирования, схема немного избыточна, в конечном устройстве будет стоять только то, что нужно.


Для тестирования написал маленькую программу.

#include <PCD8544.h>
volatile long newPosition = 0;
volatile long oldPosition  = 0;
#include <SPI.h>
//#include <WProgram.h>  // This include should go first, otherwise does not compile.
#include <Button.h>
#include <TicksPerSecond.h>
#include <RotaryEncoderAcelleration.h>

//static const byte glyph[] = { B00010000, B00110100, B00110000, B00110100, B00010000 };
static PCD8544 lcd;
static RotaryEncoderAcelleration rotor;

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

const int analogInPin = A7;
const int TPL0501_CS1 = A0;
const int TPL0501_CS2 = A1;
const int rotorPinA = A2;    // One quadrature pin
const int rotorPinB = A3;    // the other quadrature pin

int sensorValue = 0;        // value read from the Microphon
int sensorMAX = 0;
unsigned long time =0;

void setup() {

  lcd.begin(84, 48);
  //lcd.createChar(0, glyph);
  
  lcd.setCursor(0, 0);
  lcd.print("Value");

  lcd.setCursor(0, 2);
  lcd.print("MAX Value");

  lcd.setCursor(0, 4);
  lcd.print("Encoder");
  
  pinMode (TPL0501_CS1, OUTPUT);
  pinMode (TPL0501_CS2, OUTPUT);
  
  digitalWrite(TPL0501_CS1,HIGH);
  digitalWrite(TPL0501_CS2,HIGH);
  
  SPI.begin(); 
  Pot_value_SET(TPL0501_CS1, 0);
  
  rotor.initialize(rotorPinA, rotorPinB);
  rotor.setMinMax(0, 255);
  rotor.setPosition(0);
}

long lastRotor = 0;

void loop() {
  
  rotor.update();
  long pos = rotor.getPosition();
  
  sensorValue = analogRead(analogInPin);
  //Serial.print("analogInPin"); 
  if (sensorValue > sensorMAX) sensorMAX = sensorValue;
  if (millis() > time){
  sensorMAX = 0; 
  time = millis() + 3000;
  }
  
  lcd.setCursor(0, 1);
  lcd.clearLine();
  lcd.print(sensorValue, DEC);

  lcd.setCursor(0, 3);
  lcd.clearLine();
  lcd.print(sensorMAX, DEC);
 
  lcd.setCursor(0, 5);
  lcd.clearLine();
  lcd.print(pos, DEC);  
 
  //lcd.setCursor(80, 0);
  //lcd.drawColumn(84, map(sensorValue, 0, 1023, 0, LCD_HEIGHT)); 
    
  delay(10);                     
}

int Pot_value_SET(int Chip, int value) {
  // take the SS pin low to select the chip:
  digitalWrite(Chip,LOW);
  //  send in the value via SPI:
  SPI.transfer(value);
  // take the SS pin high to de-select the chip:
  digitalWrite(Chip,HIGH);
}





Описание «железа» на этом можно закончить. В будущем планирую оснастить «Машину времени» Bluetooth и сделать Android APPs и Shell для PC, но этим я займусь, когда будут реализованы основные функции. Теперь я отвлекусь от «железа» и займусь подготовкой кода.
PS:
Конечно можно было не затевать схему с программированным усилителем, а поставить усилитель- ограничитель. Но. Поживем - попробуем. :)
PPS:
К проекту подключился мой коллега программист Евгений Глушко. Пока я буду заниматься сведением общей схемы. Женя обещал подготовить первый релиз программы.

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

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

Keine Kommentare:

Kommentar veröffentlichen