2022年9月6日火曜日

MLAマグネチックループアンテナチューナ製作

自作MLAチューナ
MLAチューナ 電源はArduino USBコネクタから供給

















NanoVNA
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 件のコメント:

コメントを投稿

Raspberry Pi Donkey Car スマートカー

  2020年に製作したDonkey Car スマートカー について記事にしました。 Donkey CarはRaspberry Pi のカメラからコースを ディープラーニングさせ自動走行を行います。(動画は白線上を自動走行)   動画