Monthly FB NEWS 月刊FBニュース 月刊FBニュースはアマチュア無線の電子WEBマガジン。ベテランから入門まで、楽しく役立つ情報が満載です。

ものづくりやろう!

第六回 SWR表示器の製作

JH3RGD 葭谷安正

はじめに

先日シャックの模様替えをしました。机の横に棚を置いて、机と棚の上に190cm長の化粧板を渡して使用可能な面積を大きくし、そこに無線機を置きなおしました。操作性はよくなりましたが、その時にアンテナチューナを落下させてしまいました。チューナはマッチングがとれ大丈夫でしたが、パワー計とSWR計が機械的ショックで動きがおかしくなってしまいました。SWRを計測するのに必要な進行波電圧と反射波電圧を検出する回路は、該当端子にマルチメータをあてて直流電圧を計測したところ動いていることが判明。またパワー出力もこの進行波電圧の端子からもらっていることが回路図からわかり、どうやら故障個所はメータの模様。このメータは電力計とSWR計を兼ねているメータで、今は販売していないのではと思い、ネットでの検索もしていません。このチューナにはIC-705とTS-120をつないでいますので、IC-705を使うときはIC-705のSWR表示機能を使えばよいのですが、TS-120ではトランシーバ上でSWRを表示できませんのでマッチングのためにSWR計が動いてくれるとありがたい状態です。進行波電圧と反射波電圧の測定回路が生きているのですから、とりあえず手持ちのArduinoのAD変換端子から両電圧を読み込み、ArduinoにSWRを計算・表示させることができます。そこで、Arduinoを使ったSWR表示器を作りました。あくまでもメータを入手するまでの仮の回路として使用していますが、このまま永続的な使用になりそうです。作るというよりは、配線とソフトウェア製作になります。インターネット上にもたくさん参考資料がありました。

SWRの測定回路

進行波・反射波・電力取得用端子
アンテナチューナFC-700の回路図を眺めて、どの端子を使えばSWRや出力電力の情報を取得できるのか確認しました。図1はFC-700の取扱説明書中に記載のあったSWRと電力表示に関係する回路図です。これをたどっていくと、トランシーバからの送信出力はJ01から入り、CMカップラユニットを通過してマッチング回路に入り、アンテナに接続されます。


図1 CMカップラユニットの回路図

SWRの測定には、進行波の電圧と反射波の電圧が必要になります。進行波の電圧は、T101で高周波結合されて、進行波成分がダイオードD102とRC回路で整流されます。図1中の①端子にその電圧が出てきます。

また、反射波の電圧も同様にダイオードD011とRC回路で整流されます。図1中の②端子にその電圧が出てきます。この2つの直流成分をメータに導いてSWRを表示しています。そこでこれをマイコンで計算する場合はArduinoのAD変換器で、端子①、端子②の電圧を読み取り、SWR(ρ)はつぎの定義式で計算して求めればよいことになります。


電力表示については、回路図から図1中の①端子の電圧を電力に換算して表示してことがわかります。また、送信出力が15ワット以下と150ワット以下をプッシュスイッチで切り替えて選択していますが、最大出力が15ワットでも150ワットでも同じメータで表示できるようメータ直前に進行波出力の電圧を調整するための回路が挿入されており(R501,VR501とR502,VR502)、2つの回路の出力をプッシュスイッチで選択しています。私の使用方法ではこのチューナに接続する無線機の出力はいずれも10ワット以下ですので最大出力15ワットの回路だけで十分です。そこで150ワット用の出力端子は使用しないことにし、このため図1中の端子③から電力に比例する電圧情報Arduinoで読み込み、その値から出力電力をArduinoで計算して表示することにしました。計算式は加減乗除と絶対値の計算ですからArduinoにまかせてしまいます。

SWR表示器の構成と接続図

SWR表示器の構成と接続図を図2に示します。SWR値や出力電力を表示するために液晶表示器(LCD)を使いました。部品箱にLCD用のI2CインターフェースがありましたのでLCDとこれをブレッドボードで接続して使用することにしました。


図2 SWR表示器の構成と接続図

事前調整

ArduinoのAD変換部を使ってSWRや電力を求めるために、事前に簡単なプログラム(リスト1)を作成して、電圧と電力の関係やデータ変動についてチェックをおこないました。チューナとSWR表示器との接続は図2のようにArduinoとI2Cボード、LCDをワイヤー線で接続しました。またチューナの端子①、端子②、端子③にミノムシクリップを使用して簡易的に接続し、そのミノムシクリップの反対側はブレッドボード経由でArduinoと接続できました。この状態で次のリスト1に示すプログラムを使用してつぎの項目のチェックをおこないました。

リスト1 データ変動確認用プログラム


(1) 進行波の電圧(端子①)の安定化
(2) 進行波の電圧と出力電力の関係

・「(1)進行波の電圧(端子①)の安定化」について
リスト1のプログラムを動かして、Arduinoで読み込んだデータが変動しているので、そのデータ変動を抑えるためにデータ平均を行いましたが、何個のデータの平均をとれば変動を抑えられるかについて確認できたことを記載します。リスト1のプログラムが測定していることは、進行波電圧測定用の端子電圧(端子①の電圧値、変数Vfsに格納)、反射波電圧測定用の端子電圧(端子②の電圧値、変数Vrsに格納)、電力測定用の端子電圧(端子③の電圧値、変数Vpwrに格納)を、リスト2行目のCntの数値件のデータの平均値を表示し続けています。このプログラムを動かし、無線機のモードをCWに設定し、5秒程度電鍵をONにしたままの状態にするとLCD上に上記3つの端子電圧の平均値が表示されます。この平均値を目視チェックしたところ、平均する個数が少ない場合に電圧変動がかなり見受けられました。これは進行波や反射波などの交流成分をダイオードで直流化してもその上に高周波成分が残っているためでないかと推測しました(オシロがあれば検証できるのですが、私のオシロ、壊れてしまっていますので・・・)。

このため、複数データを読み込み、その平均値を求めることで変動抑制をしてみました。これはデジタル信号処理でローパスフィルタに相当するものです。

平均するデータの数と平均後の値の変動を示したのが次の表1です。表1の中で、加算平均するデータ件数が5個まではディスプレイ上の値が変動していることが目視確認できました。それ以上の個数のデータ平均では小数点第2桁目がたまに変動するくらいで大きな変動はありませんでした。表1のデータから、10個以上のデータを平均したものを使用することでノイズ成分が除去できることが確かめられました。

表1 データ平均数とデータ変動の確認表


・「(2)進行波の電圧と出力電力の関係」について
リスト1のプログラムを動かして、進行波電圧と出力電力の関係について確認できたことを記載します。

表2 出力電力と端子電圧との関係


表2はIC-705の出力可変ダイアルを回して1ワットから10ワットまで変化させた時、進行波電圧端子の電圧と電力端子の電圧がいくらになるかということを測定しました。本来ならば標準信号発生器などの校正用機器を基準にして、出力電力と端子電圧の関係を求めればよいのですが、そのような機器が手元にありませんので、基準出力をIC-705として端子電圧を測定したものです。表は7.001MHzの無変調信号(CW信号)を入力しました。また、電圧値はすべて出力を固定したときに、50個のデータの平均を連続して観測し、またアンテナのSWRはIC-705のSWR計を基準にしてSWR=1.0の状態(反射電圧、すなわち端子②の電圧が0V)で進行波電圧端子の電圧と電力端子の電圧を表にまとめました。

表1の進行波電圧端子の電圧をx、IC-705の出力電力設定値をyとして散布図(x-yグラフ)を描くと図3のようになりました。Arduinoで出力電力を表示するためには、端子③の電圧(端子①電圧とほぼ同じ)からこの図の関係を使って、出力電力を端子③電圧から求めます。図3から、電力と電圧の関係は二次関数で近似できそうですのでExcelの近似機能を使って近似式を求めると図3中に見える次のような式になります。

y=15.055x2+8.2992x+0.0011


図3 端子①電圧と出力電力の関係

この式で、xは①端子電圧に相当し、yは出力電力に相当します。端子③の電圧が測定できれば、この式のxに端子③の電圧をいれることで、その時の出力電力がわかるわけでArduinoのプログラム中にこの式を入れます。(図3では「端子①電圧・・・」と記載してありますが、端子①の電圧と端子③の電圧は、表2のようにほぼ同じ値でしたのでこのような説明をさせていただきました。)

この式を使ってyを計算により求めたものが表3です。表3の2列目の数値をxとしてもとめたのが表3の3列目の出力電力の推定値です。1列目の数値(IC-705の出力設定値)の近似値であることが確認できます。

表3 式yによる電圧から電力の推定値を求める


またSWRを測定するためには4ワット以上の出力電力がないと誤差が大きいようであることも判明しました。

プログラム

以上をもとにSWRと出力電力を求めるプログラムを作成しました。ソースプログラムは参考として記事の最後に記載しました。

配線

ArduinoとLCD、そしてチューナをつなぐことがメインになります。


SWR表示器
ArduinoとLCDを接続しました(図4)。これをケースにいれるのですが適当なケースがないので段ボール箱に格納しました。


図4 組み込み前のArduinoとLCD


図5 ArduinoとLCDの組み込み(1)

図5のように段ボール箱にLCDが入るように切り抜き、内部にはArduinoを入れるため、構造物で梁をつくりました。


図6 ArduinoとLCDの組み込み(2)


図7 ArduinoとLCDの組み込み(3)

外部に線を引き出し、できあがりです。


図8 ArduinoとLCDの組み込み(4)


図9 SWR表示器結線終了

電源はUSB端子を使います。実はこの箱はパドル(CW ONE)が入っていた箱です。

チューナ内配線
加工前のチューナ内の状況です。


図10 チューナ内部


図11 チューナ内部の仮配線

事前調整の時には図11のようにミノムシクリップでつかんで行いました。下部黄色のミノムシクリップは電力測定のための端子③です。上部黄色が端子①(進行波測定用電圧端子①)、緑色が端子②(反射波測定用電圧端子)、赤色がグランドです。このままでは危険ですので、安全のためちゃんと半田付けします。図12のような端子を作成し、この端子に結線を集約して外部に出しました。


図12 配線用端子

図13がチューナ内配線を端子へ集約したものです。


図13 チューナ内部配線(1)

集約した端子からは、チューナの既存の穴を利用してそこから外部に配線を引き出しました。


図14 チューナ内部配線(2)

チューナのふたをします。あとは表示部との結合です。


図15 チューナ内部配線(3)

チューナの上にブレッドボードをテープで貼り付け、そこにSWR表示器からの配線とチューナからの配線を結合しました。


図16 LCDとTunerの結線


図17 チューナとSWR表示器

動作
動作時の表示例を図18に示します。
LCDの上段には、P:電力(反射電力) Swr:SWR値を表示します。
LCDの下段には、SWR値を視覚化するため四角(■)を表示しました。
LCD16文字表示できますので、SWR値が3の時8文字目まで■が表示されるようにプログラミングしました。指定時間(現プログラムでは10秒)経過するとLCDが消えます。


図18 SWR表示器の表示例


図19 指定時間経過後のスリープ状態

問題点
運用してみるといくつかの問題がでてきました。一番困ったことは、「バンドによっては大きな誤差がある」ことです。製作したSWR表示器は7MHz、10MHz、18MHzではIC-705のSWR値と比較的近い値を表示するのですが、14MHzでは大きく異なってしまいます。原因不明です。いつか直したいと思いながらずっとそのままです。コロナが収束する前に原因究明と対策を施したいと思いますが、いつになることやら。

ソースリスト(参考)

記事の中に記載していない下記の機能をいれてあります。
・省エネのため、タイマーを利用して出力がなくなってから10秒経過(Ktimeの値)するとLCDのバックライトがoffになります。バックライトのないLCDではこの機能が働きません。
・最大電力が150ワットを計測できるようにプログラム構造を準備してあります。(チューナとArduinoの配線を追加する必要があります)



#include <LiquidCrystal_I2C.h>
#include <MsTimer2.h>
#define Cnt 100
#define Ktime 10000
boolean timeron = true ;
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  MsTimer2::set(Ktime, flash); // タイマー時間を Ktime msにセット
  timeron = false;
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);lcd.print("SWR display     ");
  lcd.setCursor(0,1);lcd.print("for FC-700      ");
  delay(5000);
}

// the loop routine runs over and over again forever:
void ftimeron() {  // Timer start
  MsTimer2::start();
  lcd.backlight();
  timeron = true;
}

void flash() {  // Timer stop
  //lcd.noCursor();
  MsTimer2::stop();
  timeron = false;
}

void loop() {
  int i, v1, v2, IVpwr;
  float const1 = 5.0 / 1023.0;
  float Vfs, Vrs, Vf, Vr, Vp, Vpwr, Vpwr2, swr, aswr ;
  float Vfmax, Vfmin, Vrmax, Vrmin;
  char FF=255;
  while (!timeron) { // Timer offから Timer Onへの切替条件
    lcd.noBacklight();
    Vf = const1 * analogRead(A0);
    if (Vf > 0.05) {
      ftimeron();
    }
    delay(300);
  } // end of **while(!timeron){

  while (timeron) { // Timer on 時の処理内容
    Vf = const1 * analogRead(A0);
    Vpwr = const1 * analogRead(A3);
    delay(10);
    if (Vf > 0.05) {
      Vfs = 0; Vrs = 0; Vpwr = 0; Vpwr2 = 0;
      for (i = 0; i < Cnt; i++) {
        Vfs  = Vfs + const1 * analogRead(A0);
        Vrs  = Vrs + const1 * analogRead(A1);
        Vpwr = Vpwr + const1 * analogRead(A3);
        Vpwr2 = 0; //Vpwr2= Vpwr2+const1*analogRead(A5);
      }
      swr = (Vfs + Vrs) / (Vfs - Vrs);
      if (Vpwr > Vpwr2) {
        Vpwr = Vpwr / Cnt;
        IVpwr = int(15.055 * Vpwr * Vpwr + 8.2992 * Vpwr + 0.0011 + 0.5);
      }
      else {
        Vpwr = Vpwr2 / Cnt;
        IVpwr = int(15.055 * Vpwr * Vpwr + 8.2992 * Vpwr + 0.0011 + 0.5);//式変更の必要あり
      }  // end of **if (Vpwr > Vpwr2)
    }  // end of **if (Vf > 0.05) {
    lcd.setCursor(0, 1) ; lcd.print("                  ");
    if (!isnan(swr)) {
      lcd.setCursor(0, 0);
      lcd.print("                ");
      lcd.setCursor(0, 0);
      aswr = abs(swr);
      lcd.print("P:" + String(IVpwr) + "("); lcd.print((IVpwr * (1.0 - (aswr - 1) / (aswr + 1))), 1); lcd.print(")");
      lcd.print(" Swr:"); lcd.print((abs(swr)), 1);
      int k = min((swr - 1) * 5, 16);
      lcd.setCursor(0, 1);
      lcd.print("                       ");
      for (i = 0; i < min(k, 16); i++) {
        lcd.setCursor(i, 1); lcd.print(FF);//lcd.print(">");
      }
      delay(100);
    }
  }  // end of **if (Vf>0.05)
}  // end of  **while(timeron)

ものづくりやろう! バックナンバー

2021年11月号トップへ戻る

次号は 12月 1日(水) に公開予定

サイトのご利用について

©2021 月刊FBニュース編集部 All Rights Reserved. 発行元: 月刊FBニュース編集部