Go Down

Topic: Conversor de RF a CC y control de servos. (Read 493 times) previous topic - next topic

Maniaquera

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?

surbyte

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.

Maniaquera

#2
Sep 28, 2017, 10:35 pm Last Edit: Sep 28, 2017, 10:40 pm by Maniaquera
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.

surbyte

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!!

Maniaquera

#4
Sep 30, 2017, 12:50 am Last Edit: Sep 30, 2017, 12:56 am by Maniaquera
Bajo mi ignorancia he hecho este código:
Code: [Select]
#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?

surbyte

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.


Maniaquera

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:
Code: [Select]
#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);

 

surbyte

Quote
ahora me encuentro en que no se como evitar valores en el servo
Puedes ser mas claro?

Maniaquera

¿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?

surbyte

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?

Maniaquera

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

Maniaquera

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.

surbyte

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.

Code: [Select]
#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);                 
      }                                         
  }
}



surbyte

Pero porque va a valer cero?

Code: [Select]
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.

Maniaquera


Go Up