Loading

公開日 2026年1月22日  最終更新日 2026年1月22日 by JE2UFF_Toshi

 

おはようございます。流石に大寒波到来で、今朝は冷え込んでいます。現在の気温は-2℃で、風もそこそこ有りますから体感温度はかなり低いですね。お空も天気もご機嫌斜めの状況です。お空は大寒波のように長引かなければ良いのですが。

 

昨日は磁気嵐の影響で10m~17mまで殆どまともに受信出来ない状態でした。17mや15mで少しだけアジアが入っていますが、信号は極端に弱い。

20mは比較的信号は沢山見えますが、未交信局は少なくEUの入り口辺りまでしか見えません。

20m

しかもコールしてもQSO出来るとは限らないので、ワッチしていても暇になるので、昨年作ったアンテナ切替器の気になる部分の修正をCopilotと一緒に実施しました。

 

現状の問題は時々データパケットを取りこぼす事が有ると言うことです。取りこぼしても前の状態を保持しているので、現状のアンテナ群では特に問題は無いのですが、今後アンテナを追加したりすると問題となるので、コンディションが悪い時間を利用して対処しました。

 

CI-Vって簡単そうで意外と奥が深く、素人が作ったコードなので、カットアンドトライで作り上げているため、以下の課題がありました。

  1. 表示が切り替わらない時がある
  2. 切り替わるがタイミングが遅い
  3. ???表示になるときがある

本来であれば切り替わらない事が有ると大きな問題なのですが、幸いなことに40m~10mは同じアンテナを使用しているので、切り替わらなかったとしても選択しているアンテナは同じなので問題とはならない。

しかし、今度トラディショナルとWARCを別のアンテナにしたりすると、大きな問題となったりする。

これらの問題は、もう一度バンドを切り替えて戻せば以降問題無く動作する。

 

コードをCopilotに読み込ませて、上記の課題がナゼ発生するのかを解析させました。

コードを解析して貰った所

  1. 毎loopで受信データを捨てている
  2. 毎loop2秒間だけ受信データを取り込む方式だった
  3. パケット境界がズレるとデコードに失敗する

当初、VFOでいきなり周波数を動かしたときなど多くのパケットが一気に流れてくるので、パケットの切れ目が分からなく成ったりしてミスデコードが多かったので2秒間だけ読み込んだデータを基準にデコード処理をしていた。

良かれと思い実施していた内容が、実は課題の原因になっていることが分かったので、これらの部分を修正した。

対応柵として

  1. 毎loop捨てていたデータを捨てないようにした
  2. 常時受信バッファを読み続ける方式に変更(MicroPythonなのでリングバッファ方式を採用)
  3. 終端のFDを見つけたら1パケットを確定させる

 

変更の一部として、受信バッファデータを受信バッファを常時監視する方式に変更しました。

rx_buffer = []

def read_civ_packets():
  global rx_buffer
  packets = []

  while uart1.any():
    b = uart1.read(1)
    if not b:
      break

    rx_buffer.append(b[0])

    # パケット終端 FD を検出
    if b[0] == 0xFD:
      # FE FE で始まる位置を探す
      for i in range(len(rx_buffer)):
        if rx_buffer[i] == 0xFE and rx_buffer[i+1] == 0xFE:
          packet = rx_buffer[i:]
          packets.append(packet)
          rx_buffer = [] # バッファクリア
          break

  return packets

 

そしてloop内を若干変更して、取りこぼしゼロ、遅延ゼロ、???ゼロのコードになりました。

コードをmain.pyに変更してRaspberry Pi picoに書込再起動すると、動作がキビキビして動くようになりました。効果有りかなと喜んでいたのですが・・・

実際にバンドを切り替えたり、コンディションが未だ良い20mでQSOをしたりしていると、有る点に気が付きました。

 

今までは取りこぼしが多かったと言うよりも、切り替えた後の2秒間のデータのみを保持していたので全然気が付かなかったのですが、遅延ゼロにした関係で送信時に表示が???になることが分かりました。

これはコード自体が受信時のデータを受ける前提で書かれているため、送信時のコマンドは一切解読はしておりません。従って送信コマンドが来ても受け付けないので???表示になってしまいます。

いろいろ考えたのですが、アンテナ切替器なので受信時に切り替えてから使用するのが一般であり、逆に送信周波数表示迄してしまうと、CWのスプリット運用などでは表示がちらつき意味を成さない事になります。

また、受信時に切替を行い確認後に送信に移るので、送信コマンドは無視する仕様を追加しました。

送信コマンドを無視するフィルタは以下になります。

for msg in packets:
  # コマンド判定
  if len(msg) > 6:
    cmd = msg
    subcmd = msg[5]

  # RX 周波数 (1C 03) 以外は無視
  if not (cmd == 0x1C and subcmd == 0x03):
    if DEBUG:
      print("Ignore non-RX packet:", msg)
    continue

これによりTXコマンドは完全に無視され、送信時に表示が???になるのが無くなりました。

全体的に非常に良くなったので、更なるおかしな部分が無いか、これでまたしばらく使ってデバッグをしていこうと思います。

 

コンディションが悪いのが幸いして、このようにコードの解析修正をしたりするのが出来ました。たまには何も聞こえないと言う状況も無線デトックスになり良いかもしれませんね。

 

にほんブログ村 その他趣味ブログ アマチュア無線へ にほんブログ村 ↑ブログランキング参加中。クリックでランキングが上がりますので、ご支援をお願いします。

 

ABOUT ME
JE2UFF_Toshi
年々若者のアマチュア無線人口が減る中、何時までも現役でやり続けたく、若き日の想い出を胸に、熱き思いを忘れないように「燃えよDX」と言うタイトルを付けました。単身赴任以降、過熱するDXスロットゲームに違和感を覚え、主力だったHFのアンテナも下ろしてしまったこともあり、燃えるような情熱からいろんな楽しみ方が有るんだ。そう思えるようになって、タイトルもむせん見聞録に変更しコツコツマイペースでやってます。 最近は6mの面白さのハマっています。 更に、長年勤めた会社も退職しサンデー毎日なった事をきっかけに、更にタイトルをきょうも無線日和に変更し、まだまだ続けますよ。
部材購入に困った時は!

digital-dxer.comからのお知らせ

アマチュア無線をやってて困ったことないですか?
何か作りたいが工具が無い、アンテナ作りたいけど材料が無い

そんな時、工具から小さな小物材料、はたまた無線機からアンテナまで何でも簡単購入ができるYahoo!ショッピングが便利です。
クリックすれば後は到着を待つだけ、近くて簡単便利なYahoo!ショッピング。