Diferencia entre revisiones de «Vibrómetro»

De fabwiki
Ir a la navegación Ir a la búsqueda
Sin resumen de edición
Sin resumen de edición
 
(No se muestran 2 ediciones intermedias del mismo usuario)
Línea 2: Línea 2:


<gallery>
<gallery>
Ic_vs_displ_tcst2103.png
Vibrometro control.jpg | amplificador (estamos usando 1k en lugar de 200 ohmios)
Vibrometro control.jpg | amplificador (estamos usando 1k en lugar de 200 ohmios)
Sensor colores.jpg | sensor (estamos usando 1k en lugar de 470 ohmios)
Sensor colores.jpg | sensor (estamos usando 1k en lugar de 470 ohmios)
Línea 27: Línea 28:
const int control_pin = 25;
const int control_pin = 25;
const int bias_pin = 26;
const int bias_pin = 26;
const int amplitude = 255;
const int neutral = 127;


int control_dac_val = neutral;
void setup() {
  Serial.begin(115200);
 
  dacWrite(bias_pin, 150);


void setup() {
   pinMode(34, INPUT);
   pinMode(34, INPUT);
   analogSetAttenuation(ADC_0db);
   analogSetAttenuation(ADC_0db);
}


  // Cuando control está 127, Vout = 0.
int dac = 127;
  dacWrite(bias_pin, 118);
  dacWrite(control_pin, control_dac_val);
}


void loop() {
void loop() {
   #define BUFELEMS 32
   int x = analogRead(34);
  #define SAMP_PERIOD_MS 32
  if (x > 2500) dac++;
 
   if (x < 1500) dac--;
  int buf[BUFELEMS];
   if (dac < 0) dac = 0;
  for (int i = 0; i < BUFELEMS; i++) {
   if (dac > 255) dac = 255;
    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;
   dacWrite(control_pin, dac);
 
  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;
   Serial.print("0 5000 ");
   if (control_dac_val >= 255) control_dac_val = 255;
  Serial.print(dac * 10);
   dacWrite(control_pin, control_dac_val);
   Serial.print(" ");
   Serial.println(x);
   delay(1);
}
}
</syntaxhighlight>
</syntaxhighlight>

Revisión actual - 00:40 7 oct 2026

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;

void setup() { 
  Serial.begin(115200);

  dacWrite(bias_pin, 150);

  pinMode(34, INPUT);
  analogSetAttenuation(ADC_0db);
}

int dac = 127;

void loop() {
  int x = analogRead(34);
  if (x > 2500) dac++;
  if (x < 1500) dac--;
  if (dac < 0) dac = 0;
  if (dac > 255) dac = 255;

  dacWrite(control_pin, dac);

  Serial.print("0 5000 ");
  Serial.print(dac * 10);
  Serial.print(" ");
  Serial.println(x);
  delay(1);
}