ADI社のRF Agile Transceiver(SDR)をLIBIIOを使って、UNITYで波形表示
はじめに
以前からRTL-SDRを使ってUNITYで遊んでいたが、ADIのRF Agile Transceiverというものが周波数範囲が広くてより応用ができそうなので、こちらで遊んでみました。
対象はZYNQ+AD9161のボード
まずは
下記からWINDOWS用のドライバをインストール
ボードとPCをUSBとETHERNETで接続する
必要に応じてPCとボード側のIPアドレスを設定します。
UNITYではPluginsのフォルダに「libiio-sharp.dll」を入れる。
下記のコードでアクセスできました。
こんな簡単にアクセスできるとは便利な世の中です。
ではサンプルコードをもとにもう少し付け加えてきます。
サンプルコードでコンソール出力の部分をデバッグ出力に変更すれば動作はそのままできそうです。
と思って実行したら、止まらなくなってしまいました。
どーもデータ受信で止まっているようなので、そこはコメントにして先に進めます。
そもそもステップ実行の仕方を知らないので、下記で確認
また設定を比較できるように下記からADIのオシロスコープをダウンロードしてインストール、実行しておきます。2つのアプリからアクセスしても特に問題なく動作するようです。
下記にC#用のわかりやすい説明があった
色々見てみると下記のような構成っぽい
"ad9361-phy"
altvoltage1: TX_LO (output)
voltage0: (input)
voltage3: (output)
altvoltage0: RX_LO (output)
voltage2: (output)
temp0: (input)
voltage0: (output)
voltage2: (input)
out: (input)
"cf-ad9361-dds-core-lpc"
voltage0: (output)
voltage1: (output)
altvoltage3: TX1_Q_F2 (output)
altvoltage1: TX1_I_F2 (output)
altvoltage0: TX1_I_F1 (output)
altvoltage2: TX1_Q_F1 (output)
"cf-ad9361-lpc"
voltage0: (input)
voltage1: (input)
ひとつづつ調べて、それぞれをプロパティで作成しました。
読み込みをすることで実際に設定される値が確認できます。範囲外の値を書き込んでも、読み込むと正常範囲内の値に修正されているので、内部で値チェックをやってくれているようです。
UNITYのインスペクタで表示
インスペクターで表示することで、コードで編集しなくても初期値を簡単に設定できるとよいと思い、やってみました。こういうところがUNITYのいいところです。
IIOオシロスコープ側で設定を読み込むことで正常に制御できているか確認します。
上記で設定した値になっているのが確認できました。
次はIQデータの読み込みと表示
ここはサンプルコードをみながらやってみます。バイトをint16にするのはポインタでやりたいのだが、C言語のように簡単にはできないようで、下記を見ながらunsafeを使って型変換できた。なお、playerのセッティングでunsafeを許可しないとだめ。
やっと表示ができました。グラフは以前ブログに書いたものを使用。
IとQのデータを表示しているはずなのだが、なぜかほぼ重なってる・・・???
90度ずれていなければならないので、何かおかしい。
下記のように2つをenableにしなければらなかった。STEPも4になった
下記の通りIとQの両方が出るようになりました。
ADIのRF Agile TransceiverをUNITYで表示するところまでできました。
今後はスペアナみたいにFFTして表示をしたいところです。