AJUSTE AUTOMATICO DE ANTENAS LOOP MAGNETICA 2 - ARDUINO
Potencia maxima permitida 20W.

Ola amigos
Vamos a segunda parte do trabalho:
Modifquei a ponte de SWR e inclui um amplificador de RF para medir a frequencia, pois em 28MHz estava apresentando medidas falsas.
Calibrei a o medidor de potencia via software, com uma carga fantasma e calculei os valores.
Video da nova montagem

Esquema

Descrição do funcionamento do programa :

Ao ligar o aparelho ele ajusta para a parte mais alta da banda de 10m, abrindo o capacitor totalmente (zero) até atingir o limite switch (ehfim2). Este retorno se dá da forma mais rapida possivel.
Após abrir o capacitor, e usa ela como referencia (30Mhz) ele entra no loop do programa.
No loop ele mede a frequencia em kHz e compara com a anterior.

Se for uma frequencia baixa ele ignora e retorna.

Caso seja a mesma frequencia, dentro de +6 kHz e -6 kHz, tambem ignora e retorna.


Caso a diferença seja maior que 6kHz, o ajuste sera subindo a frequencia (abrindo o capacitor). Neste caso o operador subiu a frequencia ou mudou para uma banda mais alta.

Caso a diferença seja menor que 6kHz, o ajuste sera baixando a frequencia (fechando o capacitor). Neste caso o operador desceu a frequencia ou mudou para uma banda inferior.

Nos casos de alteração de frequencia maior ou menor que 6kHz, o motor /capacitor se move no modo de ajuste fino (half step ou meio passo) até encontrar uma medida de SWR abaixo do especificado em programa (ROE=1.05). Caso o capacitor esteja totalmente aberto ou fechado no ajuste ele ira para a condição inicial (zero) e retorna ao loop do programa.
Caso atinja o objetivo de SWR volta a condição inicial do loop do programa, mostarndo no display a medida de frequencia, SWR e de potencia.

Como medimos
A frequencia : link frequencimetro ,... prescaler , ...outro frequencimetro ... retiramos o sinal da saida de RF do radio, internamente na ponte de SWR com um capacitor de 6p8 ceramico. o sinal vai para um amplificador de RF simples com o 2N3904 e segue para o prescaler e finalmente para o arduino.

Amplificador de RF montado - como shield do arduino proprio para montagem rapida.

A estacionaria - ROE - usamos uma ponte de SWR, o circuito foi baseado na ponte do medidor de SWR e potencia com PIC do Francesco IK3OIL. Fizemos apenas alterações no esquema para poder ler sinais mais fracos QRP, pois o descrito é para 100W e nosso equipamento não pode passar de 20W.
A alteração principal foi usar um toroide de lampada economica, equivalente ao FT37-43. Diminuir o numero de espiras para 25. E alterar o sistema de aterramento via trimer ceramico (usamos um de 47pF max. amarelo) e o capacitor (33pF) e resistor do conjunto (4k7).

Este foi a ponte de ROE ou SWR usada para medir a estacionaria eretirar o sinal de RF para medir a frequencia.


Outra vista da ponte - a descrição da ponte estará em nova postagem.

A potencia medimos via a tensão de incidencia da ponte de SWR. esta tensão é proporcional a tensão de RF ... assim usando a formula
Potencia (W) = Vp * Vp /2*R
Vp é a tensão retificada de meia onda e R é a carga resistiva.
Usamos no programa uma formula derivada desta
Potencia (W) = (((Vinc) * (Vinc)) - 0.25 )*k ....
onde :
K é coeficiente de ajuste do valor obtido para o real, no nosso caso é de 194/200 ou seja quase 1 e levandoi em conta o divisor resistivo 47/2k2 que dá cerca de 4% (cerca de 8 pontos em 194) resolvemos manter como 1. O valor deste coeficiente é obtido com a calibração de valores obtidos com a leitura de tensão VP em uma carga de 50 Ohms, com a aplicação d potencia em valores distintos. Como explicado pelo IK3OIL no link acima.
 Vinc = ((Vinc1 * 5.0) / 1024.0) + 0.5;
Vinc1 é a tensão medida pelo arduino ...e Vinc a tensão Vp transformada em Volts de RF.
Na formula de Vinc a leitura digital varia de 0 a 1024 que se refere de zero a 5V ... assim transforma a leitura digital em analogica, o 0,5V que se somam ao resultado é a compensação da perda da tensão de barreira do diodo.
Para não mostar a potencia como 0,25W quando Vinc for zero, o software soma este valor somente quando a potencia for maior que zero.

Esta foi a ponte de ROE SWR que montei como descrita pelo Francesco IK3OIL para 100W, usei dois toroides de lampada economica e 35 voltas de fio , o sinal de RF era pequeno e resolvi montar para menor potencia com um toroide e 25 voltas, acertei o valor do resistor e do capacitor de balanceamento (zero de retorno).

Conclusão :

Este ajuste automatico funciona bem, mas pode ter seu desempenho melhorado, com uma antena com uma cobertura de banda menor e com a construção usando um tubo de menor diametro, obtendo uma banda mais larga dentro de 1:1 de estacionaria.
Outras melhorias seriam uma maior rigidez do sistema de acionamento, com menor folga, de giro no eixo do motor e um acoplamento melhor entre capacitor e motor.
Um motor com maior precisão tambem seria uma boa opção.
Para cada caso é necessario um bom planejamento de montagem.

Este equipamento pode ser montado junto a antena, alimentado por bateria por exemplo, não necessitaria de um display (nem a medição de potencia) e entre antena e radio teria apenas o cabo coaxial.

Duvidas e sugestões mandem um Email.

73 de py2ohh miguel feb/2020


Sketch  (IDE 1.6.1) ---  library counter

programa para o arduino

// entrada do frequencimetro pino 5 digital
#include <FreqCounter.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
float  frq;
float frqin;
float frq2 = 30000;
int frqin0;
int frq20;
float pwr;
int flat;
const int motorPin1 = 8;
const int motorPin2 = 9;
const int motorPin3 = 10;
const int motorPin4 = 11;
float Vinc, Vref = 0, SWR;
int delayTime = 5;
const int fim1 = 4;
const int fim2 = 6;
int ehfim1 = LOW ;
int ehfim2 = LOW ;
float ROE = 1.01 ;
int inicio = LOW ;
// Inicializa o display no endereco 0x27 -this adress depends LCD type
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  Serial.begin(9600);
  lcd.begin (16, 2);
  lcd.setBacklight(HIGH);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  AUTO MAGLOOP  ");
  lcd.setCursor(0, 1);
  lcd.print(" PY2OHH  QRP_BR ");
  delay(3000);
  pinMode(motorPin1, OUTPUT); // motor passo
  pinMode(motorPin2, OUTPUT); //motor de passo
  pinMode(motorPin3, OUTPUT); //motor de passo
  pinMode(motorPin4, OUTPUT); //motor de passo
  pinMode(fim1, INPUT);
  pinMode(fim2, INPUT);
  Zero();
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  imprime();
}

void loop() {
  FreqCounter::f_comp = 7; // Cal Value / Calibrate with professional Freq Counter
  delay(100);
  FreqCounter::start(10);  // values of 10, 100 or 1000 ms are practicable for a resolution of 100, 10 and 1 Hz
  while (FreqCounter::f_ready == 0)  {
    frq = (FreqCounter::f_freq);
  }

  frqin = (int(frq));

  if (frqin < 11000 ) flat = 1;

  if ((frqin < (frq2 + 5) || frqin > (frq2 - 5)) && (frqin > 11000))  flat = 2;

  if ((frqin > frq2 + 6) && (frqin > 11000))  flat = 3;

  if ((frqin < frq2 - 6) && (frqin > 11000)) flat = 4;

  switch (flat) {
    case 1 :
      break;
    case 2 :
      break;
    case 3 :
      frq2 = (frqin);
      frq20 = abs(frq2);
      recua();
      Vinc = ((Vinc * 5.0) / 1024.0) + 0.5;
      pwr = (((Vinc) * (Vinc)) - 0.25 ) ;
      if (pwr > 0 ) (pwr = pwr + 0.25);
      imprime();
      delay(2000);
      break;
    case 4 :
      frq2 = (frqin);
      frq20 = abs(frq2);
      avanca();
      Vinc = ((Vinc * 5.0) / 1024.0) + 0.5;
      pwr = (((Vinc) * (Vinc)) - 0.25 ) ;
      if (pwr > 0 ) (pwr = pwr + 0.25);
      imprime();
      delay(2000);
      if (digitalRead(fim1) == HIGH) {
        Zero() ;
      }
      break;
    default : break;
  }


}
void Zero()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   AGUARDE    ");
  lcd.setCursor(0, 1);
  lcd.print("   ZERANDO    ");
  while (ehfim2 == LOW )    {
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {
      (inicio = HIGH);
      break;
    }
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    delay(5);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {
      (inicio = HIGH);
      break;
    }
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    delay(5);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {
      (inicio = HIGH);
      break;
    }
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, HIGH);
    delay(5);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {
      (inicio = HIGH);
      break;
    }
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
    delay(5);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {
      (inicio = HIGH);
      break;
    }
  }

}

void  avanca() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   AVANTE    ");
  Vinc = analogRead(2);
  Vref = analogRead(3);
  SWR = (Vinc + Vref) / (Vinc - Vref);
  while (SWR > 1.01) {
    if (digitalRead(fim1) == HIGH) {
      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
    if (digitalRead(fim1) == HIGH) {
      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);

    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
    if (digitalRead(fim1) == HIGH) {
      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);

    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, HIGH);
    if (digitalRead(fim1) == HIGH) {
      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);

    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    if (digitalRead(fim1) == HIGH) {
      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);

    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    if (digitalRead(fim1) == HIGH) {
      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);

    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    if (digitalRead(fim1) == HIGH) {
      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);


    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    if (digitalRead(fim1) == HIGH) {
      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    if (digitalRead(fim1) == HIGH) {
      break;
    }
    delay(delayTime);



  }
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  Vinc = analogRead(2);
}



void recua() {
  // while (ehfim2 = LOW) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   VOLTA     ");
  Vinc = analogRead(2);
  Vref = analogRead(3);
  SWR = (Vinc + Vref) / (Vinc - Vref);
  while (SWR > 1.01) {

    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {

      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {

      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {

      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {

      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {

      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);

    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, HIGH);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {

      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {

      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }
    delay(delayTime);
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
    ehfim2 = digitalRead(fim2);
    if (ehfim2 == HIGH) {

      break;
    }
    Vinc = analogRead(2);
    Vref = analogRead(3);
    SWR = (Vinc + Vref) / (Vinc - Vref);
    if (SWR < ROE) {
      break;
    }

    delay(delayTime);


  }
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  Vinc = analogRead(2);
}

void imprime()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("F      kHz P    ");
  lcd.setCursor(2, 0);
  lcd.print(frq20);
  lcd.setCursor(0, 1);
  lcd.print("SWR     :1/    W");
  lcd.setCursor(4, 1);
  lcd.print(SWR);
  lcd.setCursor(11, 1);
  lcd.print(pwr);
}