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.
#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.
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);
}
¿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?
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);
}
}
}
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.
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.