AJUSTE
AUTOMATICO DE ANTENAS LOOP MAGNETICA - ARDUINO
Veja tambem a segunda e melhor montagem deste ajuste AQUI
Tenho uma loop magnetica construida faz algum tempo, uso um controle
eletronico manual para ajusta-la. Há alguns anos atras
montei um
ajuste automático eletronico, fiz um video mostrando
os
resultados, mas queria resolver o problema de ter alta SWR durante o
ajuste. Não tive exito e acabei deixando de lado a ideia e a
montagem.
Tempos depois tive contato por Email com um colega da Alemanha (OM
Detlef DD1EG) , que
comentou :
o
tempo de SWR alta, era pequeno, que os radios modernos possuem um
controle de redução de potencia em função
da estacionaria e que fazendo ajuste manual demoraria muito mais
tempo.
Resolvi voltar a briga.
Existem muitas formas de fazer um ajuste de loops, semi automatico ou
automatico. Alem das formas de ajuste.
Como esta minha loop :
Ver artigo de como montei LOOPy2ohh
Eu trabalhei sempre com capacitores variaveis de
recepção, com duas seções ligadas em
serie, que permitiu um ajuste entre
cerca de 11MHz e 28,7MHz. 
Este é o capacitor da minha loop fixa.

Este é o capacitor (Alps de recepção) da minha
outra antena loop magnetica - portatil (clone da ALEXLOOP). Montagem
mecânica - ferramentaria LIMA - Celso PY2XT
Já o acionamento eletrico ficou por conta de um motor de passo,
com redução de 1:69 (mecanica), um motor simples e barato
comprado da China. Dados do motor
Ainda o acoplamento isolado entre motor e capacitor foi feito com um
tubo plastico, fixado por parafusos, sem embreagem.

Motor
de passo e acoplamento isolado
O maior problema encontrado foi a folga mecanica do motor. O motor
parado apresenta uma folga relativamente grande. O ideal seria colocar
uma especie de freio, que impediria do motor girar facilmente,
apesar que dependendo da montagem o alinhamento de eixos, peso das
partes movimentadas (parte movel, buchas ou rolamentos do capacitor)
dificultariam este movimento. Para acionamentos controlados por passo
estes problemas ficam mais evidentes, pois seriam necessarios alguns
passos para que o motor, vença a folga e inicie o movimento
desejado. O ideal seria um controle que não dependesse do numero
de passos dados ou um sistema mecanico sem folgas.
As chaves limite de capacitor aberto e capacitor fechado foram
improvisadas e após centenas de idas e vindas ainda
funcionam bem.
A ponte de SWR ou ROE é um poto importante neste equipamento,
tanto a montagem como o ajuste.

Usamos dois toroides Amidon T50-10 com 9 espiras de secundario.

Inicio dos testes
Inicialmente fiz um sketch para o arduino controlar o motor, temos duas
possiblidades passo normal e meio passo (metade do percurso
angular do
passo normal).
A ideia inicial :
Usar o passo normal abrir totalmente o capacitor variavel ...
E usar o meio passo para ajustar o capacitor variavel para obter uma
estacionaria de 1:1.
O esquema completo é este :

Para saber mais sobre full step (passo completo) e half step (meio
passo) neste link explico
melhor.
1.Inicialmente adaptei um sketch para medir quantos passos daremos no
passo completo e no meio passo. Assim poderemos saber qual é a
resolução em "graus por passo" do nosso sistema.
Obtivemos o seguinte resultado :
- passo completo cerca de 7 segundos 1034 passos.
Resolução
em 180 graus = 180/1034=0.174 graus por passo.
- meio passo cerca de 12 segundos 2588 passos.
Resolução em 180 graus = 180/2588= 0,0618 graus por passo.
Segundo o datasheet do motor a resolução
é de 5,625 graus dividido por 64 =
0,0879 graus por passo ou seja 2048 passos para 180 graus (meia volta
do eixo do motor).
2. Com ajuda de um receptor de banda corrida pudemos medir a frequencia
maxima e minima de sintonia da antena. Minimo = 11600kHz e maxima =
28960kHz. Portanto a banda de sintonia da antena é de
28960-11600= 17360kHz.
Com esta banda de sintonia temos:
Para atuação do motor com resultados pelo datasheet temos
0,0979
graus por passo ou 2048 passos, o que resulta em 17360/ 2048 = 8kHz por
passo em media.
Com passo completo temos 1034 passos, assim 17360/1034=16,79Khz por
passo.
Com meio passo temos 2588 passos, assim 17360/2588=6,71kHz por passo.
3. Agora medimos o numero de passos para obter SWR 1:1, usamos detectar
somente a tensão refletida quando igual a zero (ou seja SWR =
1:1), obtivemos estes dados :
10m 28185kHz 269 passos
15m 21185khz 804 passos
20m 14133khz 1650 passos
14000kHz 1623 passos
O que gera este grafico :

A variação de capacitancia não é linear !
Obtivemos o seguintes resultados, apos diversas medidas
10m 13kHz/passo
15m 15khz/passo
20m 5kHz/passo
Como a variação de capacitancia não é
linear, resolvemos ainda medir a banda passante, que mantivesse a SWR
em 1:1, apos diversas medidas:
10m 10kHz
15m 35kHz
20m 8kHz
Resultado :
Para um bom funcionamento o valor de kHz por passo deve ser menor que a
metade da banda passante (com SWR=1:1).
Assim a banda de 15m esta dentro desta caracteristica a de 20m quase
atende e a de 10m não atende.
Isto justifica a dificuldade em acertar a SWR em 10m.
Observação :
Com a minimo de ajuste possivel 0,0618 graus por
passo, ainda fica dificil acertar a loop.
O ideal é que esta antena funcionasse até os 13800kHz,
ajudando muito na sintonia, outro ponto é o diametro do tubo que
quanto maior diminui a banda passante. Um tubo de menor diametro
ajudaria tambem.
3. Sabendo a frequencia seria possivel abrir o capacitor variavel e dar
o numero de passos para obter SWR 1:1 ?
Fiz varios experimentos e consegui bons resultados, sabendo da folga do
motor, parti sempre de um ponto, no caso capacitor aberto, o que faz
que na abertura do capacitor a folga fique sempre zerada no mesmo
sentido.
Usei os dados obtidos para calcular o numero de passos a partir de uma
frequencia desejada, assim:
10m frequencias acima de 28185kHz (frequencia base tem 269 passos) tem
13kHz por passo a mais ou se for menor que 28185kHz
diminuimos 13kHz para cada passo.
Já para 15m a frequencia base foi 21185kHz com 806 passos e
15kHz por passo.
Em 20m a frequecia base foi de 14133kHz com 1650 passos e 5kHz por
passo.
exemplo : desejamos operar em 14300kHz ... 14300-14133=167 e 167/5=33,4
seriam 33 passos a mais dos 1650 passos ... 1650+33 = 1683 passos.
funcionou bem, mas por não ser linear, não foi possivel
obter uma formula que descrevesse esta não linearidade, assim
seria necessario formulas ou tabelas.
Conclusão :
Funciona mas não atende. Não é possivel fazer o
movimento nos dois sentidos pois existe a folga atrapalhando.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Video deste
prototipo ===prototype video
4. O sistema que funcionou e atende o desejado, dentro das
limitações impostas (motor muito simples, sistema
mecanico precário, limitações do arduino, ajustes
na ponte de SWR). É o de trabalhar ajustando para obter a SWR
1:1, medindo a frequencia, caso ele seja alterada o sistema vai para a
direção certa até obter a SWR desejada.
Para medir a frequencia usamos um prescaler com 74HC4017, pois o
arduino mede até uns 6MHz diretamente.

foto prescaler : Montamos o 74HC4017, em posição inseto
morto, sobre um soquete torneado. Facilita o uso em outros
aparelhos.
Nos testes mostrou um bom fucionamento em 20m, necessitou de ajustes no
software em 15m e teve um funcionamento razoavel em 10m.
Explicações para isto acontecer :
Em 20m temos uma potencia no radio maior, uma relação
entre banda (8kHz) com 1:1 de SWR, para uma
resolução do motor/capacitor (5kHz/passo).
Como a relação 8/5 é maior que 0,5 temos uma
condição ideal para atingir o desejado.
Já em 15m a potencia do radio cai e a relação entre banda (35kHz) com 1:1 de SWR, para uma
resolução do motor/capacitor (15kHz/passo).Como a
relação 35/15 é maior que 0,5 temos uma
condição ideal para atingir o desejado. Aqui ocorre que a
"velocidade" dos passos é muito grande (15kHz) o que dificulta o
tempo de leitura da SWR.
Em 10m as condições pioraram a potencia do radio caiu
consideravelmente, o nivel de tensão de RF para o contador de
frequencia caiu (necessitamos de um amplificador de RF) e a
relação entre banda (10kHz) com 1:1 de SWR, para uma
resolução do motor/capacitor (13kHz/passo).Como a
relação 10/13 é menor que 0,5 temos uma
condição que impossibilita atingir o desejado em
toda a banda, com o agravante de uma "velocidade" dos
passos alta (13kHz/passo).
Conclusão:
Caso alguem queira construir um destes controles deve levar em conta os
seguintes pontos:
1. O ideal é que a LOOP não tenha uma frequencia de
trabalho muito grande. Procurar deixar o capacitor com um valor minimo
e maximo , ou dimensionar o indutor para que em
função dos valores do capacitor atendam as frequencias
desejadas.
2. Que a LOOP tenha um DIP não muito forte ou seja que apresente
SWR 1:1 em uma banda maior. Isto se consegue com um tubo mais fino, na
construção e no design.
3. Que o sistema de sintonia, motor, acoplamento, limite switch tenham
uma rigidez mecanica boa.
4. Que na medida do possível o motor tenha um passo menor e/ou
uma redução maior.
5. Que o motor / redutor não apresentem folga radial quando
parado.
6. Cuidados na construção, ajuste e blindagem da ponte de
SWR.
7. Em termos de software os ajustes de variaveis, que influem da
resolução e funcionamento são: o tempo entre
um passo e outro, o motor tem uma inercia que depende do tempo e
da frequencia de acionamento. O valor minimo
de detecção da SWR que depende da leitura e
conversão das medidas, alem da tonada de decisão.
Como o ajuste
é independente do operador, este sistema
pode ser construido de tal forma a ficar um uma caixa proximo a antena. Requer apenas
uma bateria ou dois fios de alimentação. Não seria
necessario o display. podendo tambem ser usada uma versão mais
simples do arduino (sem USB).
Devido a constantes alterações : a versão da IDE
do Arduino usada foi a 1.6.1 e
a biblioteca do FreqCounter
(library) usada esta neste link
A medição de potencia esta prevista funciona, mas
apresenta bug.
Como não sou um programador de C e o codigo pode ser
simplificado.
Sugestões, dúvidas podem me escrever...
73 de py2ohh feb/2020
Sketch :
// 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; //esta variavel implica em aumento de tempo geral -
min.value for my //motor
const int fim1 = 4;
const int fim2 = 6;
int ehfim1 = LOW ;
int ehfim2 = LOW ;
float ROE = 1.1 ; // esta variavel pode ser modificada
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));
frqin0 = abs((frqin));
if ((frqin > 20900) && (frqin < 22000)) {
ROE = 1.3;
}
else {
ROE = 1.1;
}
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();
pwr = (Vinc) * (Vinc) * (81 / 100);
imprime();
delay(2000);
break;
case 4 :
frq2 = (frqin);
frq20 = abs(frq2);
avanca();
pwr = (Vinc) * (Vinc) * (81 / 100);
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.1) {
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);
}
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.1) {
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);
}
void imprime()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("F kHz
P ");
lcd.setCursor(2, 0);
lcd.print(frq20);
//lcd.setCursor(12, 0);
//lcd.print(passo);
lcd.setCursor(0, 1);
lcd.print("SWR :1/ W");
lcd.setCursor(4, 1);
lcd.print(SWR);
lcd.setCursor(11, 1);
lcd.print(pwr);
}