Conversor de RF a CC y control de servos.

Hola
Ayuda por favor. Tengo algunas dudas.

Tengo un conversor de RF a CC. La salida del converso va de 0-5v. Esta CC me indica los db de la señal de RF.
Mi intención es introducir esta señal a un pin analógico y hacer que dos servos muevan una antena para obtener el mayor voltaje posible. He estado mirando otros proyectos y normalmente tienen dos sensores o mas para poder comparar datos.

He pensado en mandar la señal a dos pines digitales una para cada uno. ¿esta bien?

¿Es posible moverlos solo con una sola señal?

¿Existe algún comando que compare datos del pin en el tiempo para saber si el valor sube o baja?

Tu tienes una señal en DB que expresas en tensión.
Dicha señal será mas alta cuando tu ángulo sea el óptimo y tengas la mejor recepción, asi que lo que vas a tener que hacer es comenzar un barrido y buscar un máximo hasta que éste decaiga.. y entonces volver e ir achicando el barrido hasta no hacerlo mas.

Porque hablas de dos servos? Se supone que con uno mueves radialmente tu antena los 360 grados.

Necesito dos servos porque uno es horizontal y otro vertical. Seria para orientar una antena hacia la señal de video que transmite un avion rc asi que la busqueda debe de ser continua.

Para controlar el azimuth entonces.
No lo dijiste, dijiste antena, no antena direccional.
Bueno, doble barrido entonces.. localizar lo mejor en un eje plano de tierra y luego el azimuth

Lo que haría sería comenzar con el plano de tierra obtener lo mejor y luego barrer con el azimuth y luego intentar seguirlo ya que sabemos que el RC no va poder hacer cosas bruscas... asi que hasta puedes predecir el siguiente punto y corregir levemente.

Interesante!!

Bajo mi ignorancia he hecho este código:

#include <Servo.h>

Servo servoMotor;
Servo servoMotor2;
 
void setup() {
Serial.begin(9600);
servoMotor.attach(9);
servoMotor2.attach(8);
}

void loop() {
  
  // lee la entrada analógica desde el pin 0
  int valor_sensor = analogRead(A0);
  // muestra el valor que se leyó
  float voltaje = valor_sensor; 
      delay (50); 
   // lee la entrada analógica desde el pin 1
  int valor_sensor1 = analogRead(A1);
  float voltaje2 = valor_sensor1; 
  // muestra el valor que se leyó

int pos = 0; 

    if (voltaje<voltaje2) pos=+10; servoMotor.write(pos);
  delay(1);
     
Serial.println (pos);
}

Mi duda es ¿como logro guardar la posición del servo sin que empiece desde 0 otra vez para ir ajustando desde la ultima posición?

Tu tienes que buscar el máximo en la barrida. Cada barrida debe darte un máximo, asi que establece un movimiento tal que gires hasta encontrarlo. Luego ese máximo será para un motor una referencia. Luego haras lo mismo para el otro.
En el siguiente paso porque el objeto a seguir se ha desplazado, te mueves unos grados a izq y derecha no desde 0, y lo mismo con el otro eje.
En resumidas cuentas, arrancas con un barrido grande y luego usarás una ventana limitada.

Hola.

He seguido con el proyecto y ahora me encuentro en que no se como evitar valores en el servo. Osea que no pase de unos grados. ¿Alguna ayuda?. Paso el codigo:

#include <Servo.h>

  int pos;
  int resta;
  int resta2;
  Servo servoMotor;
  Servo servoMotor2;

void setup() {

  Serial.begin(9600);
  servoMotor.attach(9);
  servoMotor2.attach(8); 
  pos=90;
}

void loop(){
   
  int v1 = analogRead(A0);
  delay (300); 
  int v2 = analogRead(A1);

  resta = v1 - v2;   
  Serial.println (resta);  
    
  while (resta > 1 && pos<180 && pos>0)
    {
    pos ++;
    Serial.print ("A");
    Serial.println (pos);
    int v1 = analogRead(A0);
    delay (300); 
    int v2 = analogRead(A1);
    resta = v1 - v2;    
    servoMotor.write(pos);
    }
   
  while (resta < 1 && pos<180 && pos>0)
    {
    pos --;
    Serial.print ("B");
    Serial.println (pos);
    int v1 = analogRead(A0);
    delay (300); 
    int v2 = analogRead(A1);
    resta = v1 - v2;
    servoMotor.write(pos);   
    }
Serial.println (pos);
}

ahora me encuentro en que no se como evitar valores en el servo

Puedes ser mas claro?

¿Como puedo hacer un margen que valla de 0 a 90, por ejemplo, y que al llegar a uno de los limites no siga hacia ese limite indefinidamente y continúe haciendo las rutinas de comparación en los voltajes?

Porque lees en el pin A0 y en el pin A1, de dónde extraes 2 señales RF a DC si hablaste de solo una?

Lo que hago es medir la misma señal con un retardo de 300 milisegundos para si sube o baja el nivel del voltaje.

Mi idea es ir cogiendo valores de la señal del conversor por dos entradas analógicas. Esos valores se toman en momentos distintos he puesto 300 milisegundos los resto y los comparo con 1. Si es mayor va hacia un lado y si es menor va hacia el otro. Para las pruebas conecto un potenciometro a los pines anlogicos simulando el conversor. Cuando voy girando el potenciometro hacia un lado aumentando o disminuyendo el voltaje parece que va bien.
El problema esta en que cuando llega a 0 o a 180 sigue aumentando la posicion del servo sin parar y no se como hacer para que retroceda. No se si me explico.

He encontrado un enfoque diferente al que te propuse antes.
El código lo adapté para que funcione con lo que tu dispones.

La idea es que tengas dos bases con antenas, una tendra tu conversor RF a dc y la otra sola la antena.
Con una barrres de 0 a 180 y con la otra solo mueves el servo a la posicion máxima.
Es simple. Dos torres con dos antenas. Una con el sensor RF y la otra es la que se queda en la posicion.
Este no es el enfoque que imaginé pero luego me pongo a pensar como seguir el RC con dos motores como te dije al comienzo.

#include < Servo.h >  

const int servoScanPin  =  8;
const int servoTrackPin =  9;
const int rfInput     = A0;     // 

// creo los objetos servo
Servo servoScan;
Servo servoTrack;


int i               = 0;
int j               = 0;
int direccion       = 1;
int RF              = 0;
float RFFiltered    = 0;
float RFMax         = 0;
float k             = 0.2;          // Filtro pasa bajos valor entre 0 y 1. Valor altos es menos filtrado
float RFProfile[180];
int posMax          = 0;


void setup() {
    Serial.begin(9600);             // Inicializo puerto Serie
    servoScan.attach(servoScanPin);  
    servoScan.write(0);
    servoTrack.attach(servoTrackPin);
    servoTrack.write(90);
}

void loop() {               //potential issue - RF filtering does not account for step position. Problem may be negligible due to low filter level

  for (i=0; i=179; i = i + direccion) {         // ciclo de barrida corresponde a los pasos del servo (180 grados)
      servoScan.write(i);                       // Posiciono el servo
      delay(50);                                // Espero a que se posicione

      for (j=0; j=5; j++) {                     // Sampleo la entrada RF
          RF = analogRead(rfInput);
          RFFiltered = k*RF + (1-k)*RFFiltered;  // Filtro pasabajos digital para los valores RFdc
      }
      RFProfile[i] = RFFiltered;                 // ingreso el valor RF en el vector

      if (RFProfile[i] >= RFMax) {               // busco el máximo
          RFMax = RFProfile[i];        
          posMax = i;                 }          // Posicion el servo a esta ubicación que es la máxima
    
      if (i == 179 || i == 0)       {            // estos son los limites 0 y 179
          servoTrack.write(posMax);              // muevo el servo a la posicion maxima
          direccion *= -1;                       // cambio el sentido de giro
          RFMax = 0;                             // Reseteo el valor Máximo
          delay(100);                 
      }                                          
  }
}

Pero porque va a valer cero?

 for (j=0; j=5; j++) {                     // Sampleo la entrada RF
          RF = analogRead(rfInput);
          RFFiltered = k*RF + (1-k)*RFFiltered;  // Filtro pasabajos digital para los valores RFdc
      }

lee la entrada rfInput conectada a tu detector RF al pin A0 creo te pedi que mires y cambies si corresponde.

lee el valor lo pone en RF y luego esa linea es un filtro pasabajos digital.

No lo cambies porque funciona.

Si me he dado cuenta. Perdón.

Repito son dos antenas.. Una busca la mejor sintonia y ese dato se lo pasa a la segunda.
Luego me pondre con un código que tenga dos servos y posicione como una antena parabolica que gira en la base y en azimuth

Le he estado intentando hacer funcionar toda la mañana y la verdad que no se si estaré haciendo algo mal pero no me funciona. El sketch se carga bien y el pineado es correcto, las lecturas de voltaje las hace bien y la conversión también pero ninguno de los servos continua haciendo el seguimiento solo se ponen a 0 y 90 y hay termina. Muevo el potenciometro y nada. Si pongo

  for (i=0; i=179; i = i + direccion) {         // ciclo de barrida corresponde a los pasos del servo (180 grados)
      servoScan.write(i);                       // Posiciono el servo
      delay(50);                                // Espero a que se posicione
Serial.println (i);

pone que "i" vale 179 cuando tendría que valer la primera vez 1 ¿no?

Hasta ahora me doy cuenta con tu comentario.
Como pretendes que una lectura que polar o sea depende del ángulo sea simulada con un potenciometro que te da una respuesta constante en cada ángulo donde la interrogas?

Por lo visto no tienes idea de cómo funciona!!
Esto es asi... supongamos que tu Radio Control esta justo a los 90 grados.
Tu conversor RF dará respuesas muy bajas a ambos lados de esa posición de 90 y a medida que se aproxime a 90 imagina esto:

Esta es la antena que emite y se ve el lóbulo que es lo que buscas. Pero solo veras ese lóbulo cuando estes apuntando al emisor. Mientras recibes ruido o nada.

Entonces un potenciómetro no sirve para simularlo.

Tengo una pregunta. Que servos estas usando, necesito saber la respuesta que tienen a una orden. O sea cuanto demoran en posicionarse.
Se me ocurre un modo de hacerlo basado en tiempos y tareas. Lo estoy concibiendo a ver que resulta.
Esto hecho con dos Servos como te dije originalmente, uno mueve horizontal y el otro vertical.

Los servos:

0.3 segundos/60 grados

El tema del potenciometro:

El converso tendrá conectada una antena direccional y el transmisor (avión) una omni.

Cuando apunte la antena del conversor al avión directamente me dará un voltaje, imaginemos 2V, que va conectado a la entrada analógica. Si muevo la antena este bajara tanto como disminuya la potencia de la señal y subirá al volver a apuntar a al avión. Como el avión esta en movimiento el valor nunca sera fijo.

Por tanto, si uso un potenciometro conectado a la entrada analógica y aumento o disminuyo el valor continuamente se varia el voltaje, que es el valor por el cual tengo mayor o menor potencia simulada o no de señal. Los servos se deberían mover para intentar llegar siempre a obtener el mayor voltaje aunque no estén apuntando a nada ya que no hace falta. Todo esto es para testar.

Pienso que debería valer.