非職業的技師の覚え書き

JK1EJPの技術的検討事項を中心に記録を残します。

RS-HFIQ(11)Quisk(Linux版)設定

前回に引き続きRaspberry Pi 400上でQuiskを立ち上げます。

追加インストール

Linux標準装備のテキストエジッタだけでは心許ないため、Pi 400にVisual Studio CodeVSCode)をインストールしました。下記コマンドで簡単にインストールできました。

sudo apt install code

また、Windows PC上のVSCodeにRemote-SSH拡張を導入し、Pi 400のファイルを遠隔編集できるようにしました。VSCodeにこのような拡張機能があるとは知りませんでした。当面は、Pi 400ネイティブのVSCodeに出番は無いかもしれません。

Visual Studio Code on a Windows PC with SSH connection to Raspberry Pi 400.

Quiskのハードウェア設定

RS-HFIQ用ハードウェアファイルの転送

Pi 400にインストールしたQuiskのフォルダに、Windows PC上で検討してきたRS-HFIQ用のハードウェアファイルをまとめたフォルダを転送し、Linuxに適合させる修正を加えます。
フォルダrshfiqの中身は以下の3つのファイルです。

  1. hardware_rshfiq.py: RFフロントエンドのLOやPTTを制御するRS-HFIQ向け専用のCAT関数群
  2. widgets_rshfiq.py: RS-HFIQ専用のQuisk GUI拡張(内臓テスト機能用GUI
  3. lib_rshfiq.py: 内臓テスト機能用ライブラリ

USBデバイスの探索

RS-HFIQのシリアルCATおよびIQオーディオ信号はUSBでPi 400に接続します。Quiskに接続先を設定するためには、それらデバイスの番号あるいは名前を事前に調べる必要があります。

lsusb
ターミナル ウィンドウを起動して、まず、USBデバイスを検索しました。

$ lsusb
Bus 002 Device 002: ID 2109:0817 VIA Labs, Inc. USB3.0 Hub             
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 04d9:0007 Holtek Semiconductor, Inc. Raspberry Pi Internal Keyboard
Bus 001 Device 006: ID 1a86:7523 QinHeng Electronics CH340 serial converter
Bus 001 Device 005: ID 0d8c:8810 C-Media Electronics, Inc. USB Advanced Audio Device
Bus 001 Device 003: ID 2109:2817 VIA Labs, Inc. USB2.0 Hub             
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Pi 400内部の接続デバイスも、外部の接続デバイスも、論理的(電気的)には区別が無いため混在して出力されます。
Bus 002がUSB3.0、Bus 001がUSB2.0のようです。RS-HFIQ関連のUSB接続をまとめた外部ハブをPi 400のUSB3.0ポートに物理的に挿入したのですが、USB2.0のデバイスしかないためか論理的接続先はBus 001のUSB2.0になっているようです。
Bus 001のUSB2.0のデバイスはHubを除くと、下記の3つです。

  1. Device 004: Holtek Semiconductor, Inc. Raspberry Pi Internal Keyboard
  2. Device 005: C-Media Electronics, Inc. USB Advanced Audio Device
  3. Device 006: QinHeng Electronics CH340 serial converter

USB Sound CardにはHobbyPCB社推奨のStarTech社ICUSBAUDIO2Dを使用しています。StarTech社ホームページの技術仕様から、搭載しているチップセットは「Cmedia CM6533」であることが確認できます。Device 005は、StarTech社の名前ではなくUSBオーディオチップメーカの台湾C-Media社の名前で検索されていますが、USB Sound Cardと見て間違いないでしょう。問い合わせに応答するのは機器ではなくその中のチップになるため、搭載されているチップを把握しておく必要があります。
一方、RS-HFIQのコントローラであるArduino Nanoが搭載しているUSBチップは、ホームページの回路図からはFT232RLとなっていますが、検索したデバイスの中にFT232RLはありません。おそらく、RS-HFIQのArduino NanoはFT232RLの代わりにCH340を搭載した互換品なのでしょう。RS-HFIQのUSBシリアルデバイスはDevice 006と見て間違いないと思われます。
ちなみに、同じHobbyPCB社から先日購入したIQ KeyerのArduino Nanoのパッケージに添付されたバーコードを検索したところ、互換品のGeekcreit社のATmega328P Nano V3 Moduleが検索されたため、RS-HFIQも同様の互換品を採用しているものと推定されます。

dmesg
ここでdmesgにより、Linuxカーネルが起動時に出力したメッセージからRS-HFIQと接続するシリアルポート番号を調べます。

$ dmesg
(前略)
[   11.760118] usbcore: registered new interface driver usbserial_generic
[   11.760223] usbserial: USB Serial support registered for generic
[   11.772218] usbcore: registered new interface driver ch341
[   11.772305] usbserial: USB Serial support registered for ch341-uart
[   11.772448] ch341 1-1.2.3:1.0: ch341-uart converter detected
[   11.788004] usb 1-1.2.3: ch341-uart converter now attached to ttyUSB0
(後略)

usbserialとしてch341-uart converterが検出され、シリアルポート番号ttyUSB0が振られたことが確認できます。hardware_rshfiq.pyファイルのシリアルポート番号をttyUSB0に変更します。

serialport.port = "/dev/ttyUSB0"

これで、シリアルポートオープン試行のtry - except例外処理をクリアーして、Quiskが立ち上がるようになります。ここからは、Quisk上でのSound設定に移ります。

オーディオデバイスの探索

LinuxのSoundの扱いには不慣れです。LinuxのようなOSは、ユーザーアプリの1つが直接ハードウェアにアクセスすることを良しとしないため、デバイスドライバもしくはオーディオサーバを介してアクセスることになります。Quiskは、PulseAudio、PortAudio、または ALSA を使用してサウンド カードにアクセスできるとのこと。至れり尽くせりですが、選択肢の多さは初心者には混乱の元でもあります。

aplay -l
まず、再生デバイスのリストを検索しました。

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: vc4hdmi0 [vc4-hdmi-0], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: vc4hdmi1 [vc4-hdmi-1], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Device [USB Advanced Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Device [USB Advanced Audio Device], device 1: USB Audio [USB Audio #1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Pi 400は映像と共に音声も扱えるHDMIポートを2つ備えているため、card 0とcard 1はHDMIになっています。ちなみに、Pi 400ではオーディオジャックが廃されているため、音声出力はHDMIを利用するか、Sound Cardを追加する必要があります。
card 2が2つあり、USB Advanced Audio Deviceの名前を持つの2つのデバイス(device 0とdevice 1)があります。これがUSB Sound Cardで、片方が入力デバイス、もう片方が出力デバイスと思いますが、この時点では割り付けは不明です。

arecord -l
次に、録音デバイスのリストを検索しました。

$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 2: Device [USB Advanced Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

マイク入力用(QSD用)のデバイスは、card 2のdevice 0であろうとの当たりが付きました。ヘッドフォン出力用(QSE用)のデバイスは、残るcard 2のdevice 1ということになります。

cat /proc/asound/cards
次に、cardsファイルの中身を調べました。

$ cat /proc/asound/cards
 0 [vc4hdmi0       ]: vc4-hdmi - vc4-hdmi-0
                      vc4-hdmi-0
 1 [vc4hdmi1       ]: vc4-hdmi - vc4-hdmi-1
                      vc4-hdmi-1
 2 [Device         ]: USB-Audio - USB Advanced Audio Device
                      Speed Dragon USB Advanced Audio Device at usb-0000:01:00.0-1.2.2, full speed

有用な追加情報は得られませんでした。

python portaudio.py
次に、Quiskに附属するユーティリティプログラムportaudio.pyを用いて、使用可能な PortAudio 名のリストを検索しました。

$ python portaudio.py
(前略)
Version 1246720
Version Text b'PortAudio V19.6.0-devel, revision 396fe4b6699ae929d3a685b3ef8a7e97396139a4'
NumDev 4
Device  0, host api b'ALSA'
    Name b'USB Advanced Audio Device: Audio (hw:2,0)'
    Max inputs 2,  Max outputs 2
Expression 'ret' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1812
    Speeds for 2-channel paInt32:   44100   48000 
Device  1, host api b'ALSA'
    Name b'USB Advanced Audio Device: Audio #1 (hw:2,1)'
    Max inputs 0,  Max outputs 2
    Speeds for 2-channel paInt32:   44100   48000 
Device  2, host api b'ALSA'
    Name b'pulse'
    Max inputs 32,  Max outputs 32
    Speeds for 2-channel paInt32:   44100   48000   96000   192000 
Device  3, host api b'ALSA'
    Name b'default'
    Max inputs 32,  Max outputs 32
    Speeds for 2-channel paInt32:   44100   48000   96000   192000 
Close 0

Device 1「USB Advanced Audio Device: Audio #1 (hw:2,1)」がステレオ出力(Max inputs 0, Max outputs 2)、すなわちヘッドフォン出力用(QSE用)のデバイスであることが確認できました。残念ながら、Speedsは48KHzまでとなっています。96KHzはWindowsしかサポートしていないのかもしれません。
また、Device 0「USB Advanced Audio Device: Audio (hw:2,0)」がステレオ入力(Max inputs 2, Max outputs 2)、すなわちマイク入力用(QSD用)のデバイスであることも確認できます。ただし、Device 0がステレオ出力も備えていることは謎です。エラーも出ているようです。
StarTech社ICUSBAUDIO2Dに搭載されるC-Media社CM6533チップのブロック図を下記に示します。

Block diagram of C-Media CM6533 chip in StarTech ICUSBAUDIO2D.

このチップは入力から出力へのパススルー経路を持っていることが分かります。もしかしたら、このパススルー経路によってDevice 0が出力も備えていると認識されているのかもしれません。

QuiskのHardware設定

Quisk → Config → *RS-HFIQ* → Hardware設定画面にて、Hardware file path に hardware_rshfiq.py ファイルのパスを設定し、Widget file path に widgets_rshfiq.py ファイルのパスを設定します。

Hardware settings for Quisk.

QuiskのSound設定

Quisk → Config → *RS-HFIQ* → Sound設定画面にて、I/Q Rx Sample Input として「alsa: USB Advanced Audio Device USB Audio (hw:2,0)」をプルダウンから選択します。
また、I/Q Tx Sample Output として「alsa: USB Advanced Audio Device USB Audio #1 (hw:2,1)」をプルダウンから選択します。
注意点として、Rateは48000から変更しないようにします。試しに98000に変更したところ、Quiskがハングアップし、プロセスのKillもできなくなりました。

Sound settings for Quisk.

RS-HFIQ内臓テスト機能による受信テスト

RS-HFIQ内臓テスト機能も問題なくPi 400上で制御できました。

LO - 1KHz

LO(= 7020KHz)に対して、-1KHzの内臓テスト信号BIT(= 7019KHz)を発生させ、Quiskで受信しました。Windows版と同様に、約-40dBc(= -20 + 60 dB)のイメージが発生することが確認できました。

Receive test by Quisk with RS-HFIQ built-in test function (for LO - 1KHz).

LO + 1KHz

LO(= 7020KHz)に対して、+1KHzの内臓テスト信号BIT(= 7021KHz)を発生させ、Quiskで受信しました。Windows版と同様に、約-40dBc(= -20 + 60 dB)のイメージが発生することが確認できました。

Receive test by Quisk with RS-HFIQ built-in test function (for LO + 1KHz).

気付き

Windows版QuiskではBIT(Built-In Test)制御パネルを開いた状態でも間欠的にI/Qサンプリングが並列稼働しましたが、Linux版QuiskでBIT制御パネルを開くとI/Qサンプリングが完全に停止しました。BIT制御パネルで内臓テスト機能の設定を行った後にパネルを閉じると、I/Qサンプリングを再開しました。サンプリングが停止しているのか、あるいはGUIの更新が停止しているだけなのかは不明です。モニタ音を出力できるようになれば明確になると思います。
Windows版Quisk(96KHzサンプリング)よりLinux版Quisk(48KHzサンプリング)の方がLOノイズが小さくなりました。RS-HFIQ内部のQSDの前段にLNAがあるため、アンテナ(ダミーロード)からLOノイズが放射されているとは考え難く、RS-HFIQの筐体あるいはケーブルから放射されていたLOノイズが配置の変化によって小さくなっただけではないかと考えています。
サンプリング周波数が影響したかどうかは不明です。ただし、バンド両端の角状のアーティファクトは消えました。その理由も不明です。また、48KHzサンプリングの帯域は24KHz幅(例えば7008~7032KHz)になるはずですが、約40KHz幅(例えば7000~7040KHz)の帯域の平坦なノイズフロアが表示されます。ノイズだけでなく、7020KHzのLOに対して7000KHzのBIT信号を注入すると、信号強度を損なうことなく表示します。謎は深まるばかりです・・・。

今回はLinux版Quiskの受信テストまで行いました。次回は送信テストに進みたいと思います。