Этот модуль попал в «Машину времени» по необходимости. Статья будет небольшой. Как я уже писал ранее, после проб с микрофоном, усиления 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