bookmark_border[358] PythonによるNanoVNA制御(続き)

コマンドプロンプトから直接コマンドを打ち込むことでNanoVNAから情報を得ることができるPythonソフト「nanovna.py」を色々と試してみたところ、指定した周波数範囲でのSWRデータをPCで表示させる方法がようやくわかりました。

まずnanovna.pyが格納されているディレクトリに移り、そこで「開始周波数」「終了周波数」「表示するパラメータ(ここではSWR)」を指定するのですが、それらをファイル名の後に列記すれば良いのですね。例えば50MHz~54MHzの範囲でSWRを表示するためのコードは以下の通りです。

py nanovna.py -S 50e6 -E 54e6 -W

ここで、「-S 50e6」は開始周波数50MHz、「-E 54e6」は終了周波数54MHz、「-W」はSWR表示を表します。

その結果、PC上の表示は下の様になります。アンテナはHFV5です。

グラフは最適なスケールに自動調整されているようですが、マニュアルで調整できるかどうかは現時点では不明です。横軸の周波数も10^7の表示になっていて10MHz単位ですので見難いですね。

ただ本来の課題はそこではなく、知りたいのは指定周波数に対するSWR値の生データで、このソフトを使って実際のデータを取得できるのか、また「NanoVNAServer」という別ソフトもPythonコードが開示されているようでこちらを解析する必要があるか・・・いずれにせよ、当局にはPythonの知識が全く不足しており、そちらの習得が先決と思われます。

bookmark_border[357] PythonによるNanoVNA制御

SWR情報はNanoVNAから取るのが良いだろうということで、Pythonで書かれたNanoVNA制御用ソフト「nanovna.py」をネットからダウンロードして動かしてみました。このソフトはコマンドラインからコマンドを打ち込むことができますので、一つずつ動作を確認するのに良さそうです。
ヘルプにはこの様なコマンドが表示されました。

プロット系のコマンドを試して見ると、確かにPC画面上に波形が表示されます。しかし・・・周波数設定ができません。

オプションコマンドの「-S START」と「-E STOP」の部分だと思いますが、どうやってもNanoVNAに周波数が設定されません。このプログラムを動かしてNanoVNAの表示を見ると、STARTが1MHz、STOPが900MHzとなっていてどうやらこれがこのソフトのデフォルト値の様ですが、それを「-S」や「-E」を使って変更する方法がわからず、もう少しネットで調べる必要があります。もしくはソースの内容を見ていくのが良いのかも知れませんが、それにはもっとPythonのことを勉強しなければなりません。

この状態で「-W」コマンドでSWRをPC上に表示させると下の様になります。ちなみにアンテナはHFV5をつないでいます。

 

bookmark_border[353] PythonによるリレーON/OFF

前回はPCのコマンドプロンプトからリレー制御用の実行ファイルを起動させてON/OFFできることが確認できましたので、今回はそのファイルをPythonから実行させてみました。ネットで調べてみると、外部のexeファイルを実行させるには「subprocess」というパッケージを使うと良さそうです。

一応Pythonでコードを書いてみたのですが、うまく行きません。exeの後ろにつく引数をどうやって指定すれば良いのか・・・ブログ記事によってはそのまま列記すれば良さそうな感じなのですが、エラーは出ないもののリレーが動きません。

色々と試行錯誤を繰り返し、ようやくexeファイル名と引数をカンマでつなげることで動作することが確認できました。引数は「デバイス固有コード」「ON/OFFの指定」「リレーの指定」の3つありますので、それらをカンマでつなげています。

※白抜き部分はデバイス固有コードです。

exeファイルを置いてある場所が深いところにあるためパスが長くなり見難くなりましたが、「relay_switch」「relay_number」というパラメータを作り、前者はON/OFF(open/close)指定用、後者はリレー(01/02)指定用に充てました。また、「result」や最後のPrint文は特に必要無いのですが、正常にプログラムが動作していることを確認したくて入れています。

GUIのプログラムを組めば、ボタンクリックでリレーを制御できますね。

ここまでたどり着いたところで、今後どう検討を進めて行こうか迷っています。

PCからのリレー制御はこれで何とかなりそうですが、問題はSWR情報をどの様にPCに取り込むかです。リグから入れるかNanoVNAから入れるか・・・たとえ低出力であっても高SWR状態でリグから電波を出したくないので(そもそもその状態でTX ONできるかどうかもわかっていないのですが)、リグからは周波数情報だけを取り込み、PythonでNanoVNAを制御してそこからSWR情報を取ることができれば、それが理想です。

NanoVNA制御用ソースコードもいくつか公開されているようですが、内容を理解するには更にPythonの勉強が必要ですので、「PCによるSD330オートチューナ」の実現までまだまだ先は長そうです。

bookmark_border[351] PCからのリレー制御

SD330アンテナのオートチューニング化を目指して・・・・今度はPCから外部USBデバイスの制御について試してみようということで、Amazonで送料込み数百円程度のUSBリレーを見つけ購入しました。

取扱説明書は添付されておらず、基板に印字されている型名を頼りにネットで制御アプリを探してダウンロードしました。コネクタはUSB2.0 Type Bで当方に手持ちが無かったため、取り敢えずPCからリグにつないでいるケーブルを外して接続しました。

アプリを立ち上げて色々やってみると・・・カチカチと動きました。リレーは2ヶ搭載されており、ON状態でグリーンのLEDが点灯します。

ちなみにアプリはこのようなものです。黒塗りした部分には、このデバイスの固有コードが表示されています。

しばらくこれで遊んでいたのですが、これでは自動化にはなりませんので、次にコマンドラインから各リレーのON/OFFが制御できるソフトを起動させてみました。コマンドプロンプトから実行させてみると正常にリレーが作動します。

なお、白抜きになっている部分には上述の「デバイス固有コード」が入ります。引数としては「デバイス固有コード」「ON/OFFの指定」「リレーの指定」の3つになります。

次の課題として、この引数付きのexeファイルをPythonからどのようにして実行するかということですが、もしかするとexeを介さずにダイレクトにPythonから制御するソフトがあるかも知れませんので、これについてはまた調べていきたいと思います。

bookmark_border[349] Python シリアル通信

Pythonお試しの続きです。

開発環境が整ったところで、今回はシリアル通信の方法について調べました。これには「pySerial」というパッケージが必要で、コマンドプロンプトから

pip install pyserial

と入力するとPCにインストールされます。

なおPython用の各種パッケージは「https://pypi.org/」サイトで管理・配布されているようで、「pip install パッケージ名」を実行するとこのサイトからパッケージを探し自動でPCにインストールしてくれて大変便利です。画面上でpipの新バージョンのインストールを促されましたので、メッセージに従いpipをアップデートしました。

次に、仮想COMポート設定用のフリーソフト「com0com」をインストールしました。これは2つの仮想COMポートをクロスケーブルで接続したように見せる仕組みで仮想ループバックができるため、実際に外部デバイスを接続しなくてもPC内部で閉じた検証が可能となります。

更に、シリアル通信用ターミナルソフト「Tera Term」をインストールしました。VS CodeやTera Termの黒いターミナル画面を見ていると、昔PCからモデムに対してATコマンドを送ったときのことを思い出して懐かしい感じです。

これでPythonによるシリアル通信の実験準備は完了です。ブログ記事に載っていたサンプルプログラムを動かし、VS CodeとTera Termの間でメッセージの送受信ができることを確認しました。

(送信用サンプルプログラム)

これを実行するとTera Termのターミナル画面には「This is a COM test message.」と表示されました。

(受信用サンプルプログラム)

初めにVS Codeでこのプログラムを実行すると、0.1秒毎にデータを受信するループに入って受信待ちになり、Tera Termのターミナル画面から何か文字を入力するとその文字がVS Codeのターミナル画面に順次表示されます。そしてEnterを押すとプログラムは終了しました。

この様に少しずつではありますが、実際にプログラムを動かして結果を確認していくと仕組みが理解できて楽しいです。

次回は・・・実際にUSB経由で外部デバイスを制御してみたいと思います。