ここから行うSi5351Aからのデジタル信号の送信は、ラズパイでの操作となります。Si5351Aとラズパイの接続は確認されており、Python3が利用可能であること、またライブラリーとして「adafruit_si5351」が利用できることが前提となります。
ここから紹介するPythonコードは全てhttps://github.com/imaoca/si5351aに置いてあります。今後ソースコードが更新されて、以降の説明と行番号が変わってくる可能性もありますがそこはご容赦ください。
「carrier.py」はSi5351Aが指定した周波数の電波を出すためのプログラムです(リスト1)。
10 si5351.pll_a.configure_integer(36) 12 si5351.clock_0.configure_integer(si5351.pll_a, 30) 13 si5351.outputs_enabled = True
リスト1に示した10行目のpll_aの設定で36となっていますが、これはPLLの周波数を設定しています。今回のモジュールでは25MHzの水晶発振子が搭載されていたので、PLL_Aの周波数は25MHzの36倍で900MHzとなります。また次の行のClock_0の設定ですが、30となっています。これはCLK0の出力周波数を決める値ですが、900MHzを30で割って、30MHzがCLK0の出力周波数となります。次の行のoutputsの設定ですが、値をTrueにすると出力を開始します。このプログラムは一瞬で終了しますがキャリアは出続けます。RFあるいは電波用語で変調されていない電波のことをキャリアといいます。日本語では搬送波といい、物を運ぶ人のことですね。
次に「disable.py」ですが、これは出力されているキャリアを停止させるプログラムです。carrier.pyでTrueに設定したところをFalseとしています(リスト2)。
10 si5351.outputs_enabled = False
「bpsk.py」はデジタル変調するプログラムです。carrier.pyの後に実行するとデジタル変調された電波が出力されます。このプログラムを停止させるとデジタル変調は止まりますが、キャリアの出力は止まりません。先ほどのdisable.pyでキャリアは止まります(リスト3)。
5 while True: 6 i = I2C.read_byte_data(0x60, 16) 7 I2C.write_byte_data(0x60, 16, i | 0x10) # CLK0_INV=1 8 time.sleep(0.02) 9 i = I2C.read_byte_data(0x60, 16) 10 I2C.write_byte_data(0x60, 16, i & 0xEF) # CLK0_INV=0 11 time.sleep(0.02)
今回用いるデジタル変調はbpskと呼ばれるもので、180度位相を変えることで0/1を伝える変調方式です。それでは次の表1を見てください。
表1はSkyworksの「Manually Generating an Si5351 Register Map -- AN619」から引用したレジスタサマリーの一部です。16番目のレジスタの4番目のビットに「CLK0_INV」とありますよね。このビットを0/1と書き換えることでCLK0の出力の位相を180度変えられるのです。
それでは再びbpsk.pyのソースコードに戻りますが、0.02秒ごとに位相を180度切り替えているのが分かると思います。ここでは等時間間隔で0と1を送り続けるプログラムであることを確認してください。
Copyright © ITmedia, Inc. All Rights Reserved.