自作MLAチューナ
MLAチューナ 電源はArduino USBコネクタから供給 |
MLAアンテナマッチングにNanoVNAのSWRが最小になるようにバリコンを合わせてから電波を出していました。調整と切替に手間がかかるのでMLAチューナと切替器を製作しました。
目的の周波数にバリコンをチューニングする半自動のMLAチューナを製作、JA2GQP局ブログ アンテナアナライザーの記事を参考にしました。【http://ja2gqp.blogspot.com/search?q=antenna+analyzer】
MLAチューナとMLAアンテナを接続、ロータリーエンコーダで周波数を選択してエンコーダSWを押すとモータがバリコンを駆動しSWRが2以下でモータを停止するプログラムになっています。続いて左右ボタンによりSWRマッチング位置を見つけます。
接続図
接続図 |
自作SMA切替器
SMA L型コネクタX3 |
SMA L型コネクタ3個をはんだで固定、SMA中心端子とトグルスイッチ端子をはんだ付けして切替器を作成しました。
FTDX3000・MLA・MLAチューナ |
切替器にFTDX3000・MLA・MLAチューナのSMAコネクタを接続。
FTDX3000側は変換コネクタ(M-SMA)にSMAコネクタ付きケーブルを接続しています。
回路図
プログラム
#include "OLED_SSD1306.h" // https://github.com/askn37/OLED_SSD1306#start-of-content
#include <EF_AD9850.h>
#include <Rotary.h> // https://github.com/brianlow/Rotary
#include <Arduino.h>
EF_AD9850 AD9850(8,7,5,6); //CLK ,FQ_UP,RESET,DATAの順にArduinoのピン番号を記載
OLED_M091P oled;
#define ENC_A 2
#define ENC_B 3
Rotary r = Rotary(ENC_A,ENC_B);
#define ENC_SW 4
#define IN1 9
#define IN2 10
#define PWM 11
#define STBY 12
#define SW1 A2
#define SW2 A3
int SPEED=150;
int scan=0;
int FWD ;
int REV ;
int REV1 ;
int REV2 ;
long freq = 14074000;
float VSWR;
float VSWRold;
char disp_buf[16];
char* modeText[11] = {
"7074000",
"14074000",
"18100000",
"21074000",
"24915000",
"28074000",
"50313000",
"MOTOR ",
};
int modePointer = 0;
String units = modeText[modePointer];
void setup() {
pinMode(A0, INPUT);
pinMode(A1, INPUT);
analogReference(DEFAULT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(PWM,OUTPUT);
pinMode(STBY, OUTPUT);
pinMode(SW1, INPUT_PULLUP);
pinMode(SW2, INPUT_PULLUP);
digitalWrite( STBY, HIGH );
// Configure interrupt and enable for rotary encoder.
r.begin();
attachInterrupt(digitalPinToInterrupt(ENC_A),rotary_encoder,CHANGE);
attachInterrupt(digitalPinToInterrupt(ENC_B),rotary_encoder,CHANGE);
//pinMode(2, INPUT_PULLUP); r.begin()で行われる
//pinMode(3, INPUT_PULLUP);
pinMode(ENC_SW, INPUT_PULLUP);
oled.begin();
oled.mirror(); //左右表示反転
oled.flip(); //上下表示反転
oled.setCursor (10, 3);
oled.print("V"); //VSWR
oled.setCursor (5, 3);
oled.print("R"); //REV
oled.setCursor (0, 3);
oled.print("F"); //FWD
delay(100);
STOP();
AD9850.init();//AD9850の初期化
AD9850.reset();//AD9850リセット
updateDisplay();
}
void loop() {
updateDisplay();
AD9850.wr_serial(0x00,freq); //周波数をセット
delay(10);
REV = analogRead(A0);
FWD = analogRead(A1);
VSWR = ((float)FWD + (float)REV) / ((float)FWD - (float)REV);
VSWR = abs(VSWR);
oled.setCursor(11, 3);
oled.print(" ");
oled.setCursor(11, 3);
oled.print(VSWR);
oled.setCursor (6, 3);
oled.print(" ");
oled.setCursor (6, 3);
oled.print(REV);
oled.setCursor (1, 3);
oled.print(" ");
oled.setCursor (1, 3);
oled.print(FWD);
if( scan == 2){ //モーターマニュアル動作モード
if (digitalRead(SW1) == LOW ){
SPEED=150;
RIGHT();
delay(10);
STOP();
}
else if (digitalRead(SW2) == LOW ){
SPEED=150;
LEFT();
delay(10);
STOP();
}
}
if (digitalRead(ENC_SW) == LOW ){ //スキャン開始
scan=1;
SPEED=150;
}
if( scan == 1){ //スキャン開始モード
if (digitalRead(SW1) == LOW ){
SPEED=150;
RIGHT();
delay(20);
SPEED=0;
}
else if (digitalRead(SW2) == LOW ){
SPEED=150;
LEFT();
delay(20);
SPEED=0;
}
RIGHT();
delay(50);
if(REV < 20){
Match0();
}
}
}
void Match0() {
SPEED=0;
}
void Match1() {
while(10 < REV1){
LEFT();
delay(20);
SPEED=0;
delay(10);
REV1 = analogRead(A0);
oled.setCursor (6, 3);
oled.print(REV1);
}
}
void Match2() {
while(REV2-3 < REV1){
SPEED=70;
LEFT();
delay(20);
STOP();
delay(10);
REV1 = analogRead(A0);
LEFT();
delay(20);
STOP();
delay(10);
REV2 = analogRead(A0);
oled.setCursor (6, 3);
oled.print(REV2);
}
SPEED=0;
}
void getmode() {
switch (modePointer) {
case 0: freq = 7074000; break;
case 1: freq = 14074000; break;
case 2: freq = 18100000; break;
case 3: freq = 21074000; break;
case 4: freq = 24915000; break;
case 5: freq = 28074000; break;
case 6: freq = 50313000; break;
case 7: scan=2 ; break;
}
}
void updateDisplay() {
getmode();
units = modeText[modePointer];
oled.setCursor(0, 2);
oled.print(units);
}
void rotary_encoder(){
unsigned char result = r.process();
if (result) {
if (result == DIR_CW) {
if (modePointer < 7) modePointer++;
}
if (result == DIR_CCW) {
if (modePointer > 0) modePointer--;
}
}
}
void LEFT() {
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(PWM,SPEED);
}
void RIGHT() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(PWM,SPEED);
}
void STOP() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
}
0 件のコメント:
コメントを投稿