Vibrómetro
-
amplificador (estamos usando 1k en lugar de 200 ohmios)
-
sensor (estamos usando 1k en lugar de 470 ohmios)
-
parlante y sensor
Problemas
- Se especifica "Current transfer ratio" 20% en el TCST2103 Datasheet. En realidad, es casi 80%. Estoy bajando la alimentación del emisor por 50%.
- Las fuentes de alimentación proveen demasiado voltaje. Causa demasiado calor en el amplificador. Solo necesitamos 9V. Los cargadores de laptops tiene 20V.
- El contenedor es poco rigido. La altura de la tela no es constante.
- Es difícil alinear la banderita. Podemos incluir un luz visible dentro del instrumento para ayudar.
- La tela tiene una resonancia no amortiguada a aproximadamente 10 Hz.
- La fuente de alimentación para el sensor no está completamente limpio.
- Hay una posibilidad de interacción entre el detector y el emisor porque están alimentado por el mismo cable sin aislamiento.
- Cuando el sistema del control del altura cambia el señal, es demasiado abrupto y causa un sonido "click". Debemos usar un filtro entre el microcontrolador y el amplificador.
- No hay datos diagnósticos para el usuario. Como minimo, podemos añadir unos LEDes para indicar si todo está bien. Mejor, podemos añadir una pantalla pequeña y podemos mostrar datos sobre la calidad de la señal y la posición de la banderita.
- El sistema no es mecánicamente simple. Tenemos que simplificar los cables y mejorar la robustez y simplicidad.
- El sistema no es completamente inmune a la luz externa. Podemos reconsiderar la idea de pulsar el emisor para mejorar la relación señal ruido.
Código
const int control_pin = 25;
const int bias_pin = 26;
const int amplitude = 255;
const int neutral = 127;
int control_dac_val = neutral;
void setup() {
pinMode(34, INPUT);
analogSetAttenuation(ADC_0db);
// Cuando control está 127, Vout = 0.
dacWrite(bias_pin, 118);
dacWrite(control_pin, control_dac_val);
}
void loop() {
#define BUFELEMS 32
#define SAMP_PERIOD_MS 32
int buf[BUFELEMS];
for (int i = 0; i < BUFELEMS; i++) {
buf[i] = analogRead(34);
delay(SAMP_PERIOD_MS);
}
int sum = 0;
for (int i = 0; i < BUFELEMS; i++) {
sum += buf[i];
}
const int adc_avg = sum / BUFELEMS;
const int adc_target = 2047;
int error = adc_avg - adc_target;
if (error > 100) error = 10;
if (error < -100) error = -10;
control_dac_val -= error;
if (control_dac_val <= 0) control_dac_val = 0;
if (control_dac_val >= 255) control_dac_val = 255;
dacWrite(control_pin, control_dac_val);
}