bookmark_border[396] Python Tkinter

SD330アンテナのコントロールソフトを実現させるため、色々なところにつまずきながらPythonの勉強を進めています。

今はGUIを構成するための「Tkinter」の習得を目指しているのですが、これがなかなかの曲者で、「mainloop」内でプログラムを回してGUI表示やボタン押下検出などを行いながら、NanoVNAから取り出したSWR値をリアルタイムで表示させるのに苦労しています。これがうまく行かないと、リレー制御の部分にまともに取り掛かることができません。

「SWR取得」機能は一つの関数として定義して、mainloop内でボタン押下をトリガに起動させるところまではできましたが、SWRが2を超えている場合はリレーON状態を保ちつつ、SWRが2以下になるまで連続して「SWR取得」機能を動かすループの中では、逐一SWR値を表示することができないという問題に直面しています。

おそらく何かうまい方法があるのでしょうが、悩みながらひとつひとつ解決していくことに意義があるなどと勝手に思っています。所詮趣味の世界ですので、あせらずに楽しもうと思います。

bookmark_border[392] Pythonコーディング難航

SD330コントローラ用ソフトウェアについて、個々の機能は一応準備したつもりでそれを1本のプログラムに纏めようとしていますが難航しています。

各々のボタンが押されたときのイベント処理や変数の取り込み方、引渡し方など、スムーズに実行するには結構ノウハウが必要な様です。

GUIプログラムのループの中で、ボタン押下や周波数入力などのアクションを認識してリレーやNanoVNAを立ち上げ、刻一刻と変わっていくSWR値を取り込んで表示させ、更にその値に応じてリレーを制御するというリアルタイムでの処理を実現するには、Webで紹介されているようなサンプルコードの応用だけでは済まず、まだまだPythonや関連機能に関する勉強が必要であることを感じます。

ただ、この様に具体的にプログラミングを通じて自然とPythonの使い方も覚えてくるので、学習方法としては効率的かなと思っています。

bookmark_border[386] SD330コントローラ用GUI試作

試しにSD330コントローラ(オートチューナ)用のGUIを作ってみました。PythonのTkinterという標準モジュールを使っています。

少し見難いですが、上段と中段はそれぞれFT8/FT4のQRGを並べており、ボタンをクリックするだけでオートチューニング動作に入るように考えています。また下段は周波数を設定してチューニングしたり、UP/DOWNボタンを押してマニュアルでチューニングできるようにしています。NanoVNAのOSC動作を止めるためのボタンも付けました。

なぜかこれを見ているうちにTR-7300を思い出してしまいました。

なお、下段のSWR表示は2以下で「緑」、3以上で「赤」、その間は「黄」になるように色を設定しようと思っています。「赤」では完全にチューニング不能、「黄」ではマニュアル操作でもう少し追い込める可能性あり、「緑」はマニュアル操作不要というイメージです。

最終的にはあまりPC画面上で邪魔をしないようにコンパクトに纏めたいと思いますが、Pythonはインタープリタで動くため、コーディングしながらその都度画面で状態を確認できて便利ですね。

あとはコントローラのメイン部分のプログラミングが残っていますので、また時間をみてコードの勉強をしながら進めていこうと思います。

bookmark_border[361] NanoVNAからのSWR取得

NanoVNAから反射係数のデータを取得できることがわかりましたので、センター周波数とスパンをマニュアル入力し、反射係数からSWRを導き出す簡単なプログラムを組んでみました。

nanovna.pyをそのまま使わせていただき、コマンド入力処理部分はコメントアウトし無効化したうえで新たに下記のコードを追加して、初めに反射係数表示を試しました。

なお、最初は周波数セット後すぐにデータ取得しようとしましたが、前のデータが残っていたようでしたので、データ取得前に0.2秒の「待ち」を入れています。待ち時間を変えてみましたが、0.05秒では短かすぎ、0.1秒ではギリギリのようでした。

センター周波数に50.313MHz、スパンに1MHzを入力した結果は以下のとおりです。ちゃんと複素数表示されていますね。測定数はデフォルトの101に固定しています。アンテナはHFV5を使っています。

次に反射係数からSWRを求める式を入れました。

式はおなじみのSWR =(1+|反射係数|)/(1-|反射係数|)です。先ほどの反射係数表示のコマンドはコメントアウトし、SWR表示のコマンドを追加しています。

その結果は以下のとおりです。

実際に使いたいのは真ん中(50番目)の値ですので、それを取り出す式と表示コマンドを追加しました。Pythonでは順番は0から始まるとのことですので50番目は「49」を指定することになります。また小数点以下2桁まで表示するのにフォーマット関数を使っています。

その結果、この様にセンター周波数に対応したSWR値を得ることができました。

ちなみに下はNanoVNAを50Ωで終端したときのものです。当然ながらSWRはほぼ1ですね。

NanoVNAからのSWRの取得には結構遠回りして難航しましたが、ようやくここまでたどり着くことができました。PCによるリレー制御とSWR計算が実現しましたが、今後、更にSD330コントロールのアルゴリズムやGUIを考える必要があり道半ばという感じです。

またリレーとプッシュスイッチを格納するスイッチボックスの作成も必要です。
悩ましいのは、周波数情報をリグから取るかPCでマニュアル入力するかですが、リグ接続の場合JTDXとのバッティングをどの様に回避すれば良いかがわからないため、取り敢えずマニュアル入力で行こうと思います。

ちなみにSWRデータはリグからではなくNanoVNAから取りますので、高SWR状態でTX ONする必要がなくリグへの負担は無くなりますが、同軸切替が必要となりますのでその点は自動化が難しいですね。当局の場合は元々リグとNanoVNAの切替に同軸スイッチを使っており、接続はそのままでOKです。

bookmark_border[359] NanoVNA USB接続エラー

最近は毎日のようにNanoVNAをいじっていますが、何とPCとのUSB接続がエラーになってしまいました。デバイスマネージャで見るとドライバが不調の様で、一旦ドライバを削除してPCを再起動してみましたがダメです。

NanoVNA用に専用のドライバをインストールした記憶が無いのでおそらくWindows標準のものと思いますが、エラーが消えません。当然のことながらCOMポートも表示されず、PCのアプリからも接続できない状態です。

他のPCで接続できるかどうかはまだ試していませんが、もしかするとnanovna.pyから色々とコマンドを打ち込んでいたため、NanoVNA側の設定がおかしくなってしまったのかも知れません。

ちなみに、nanovna.pyからは「-e」オプションを使うことでNanoVNAに対してダイレクトにコマンドを打ち込むことができそうで、コマンドもネットに情報が載っていたため試してみようと思った矢先にこの様な事態に陥りました。なおNanoVNA単体では特に問題無さそうです。

週末に落ち着いて対処しようと思いますが、QSLカードの印刷も予定しており週末は慌ただしく過ぎてしまいそうです。