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. La parlante se ajusta una vez por segundo. El filtro de DAC puede bloquear frecuencias mas que 1 Hz.
  • 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.
  • En lugar del amplificador, podemos usar una fuente de alimentación controlable. Puede ser mas sencillo. No necesitamos variar el voltaje rápidamente.

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);
}